/
linguist.ts
170 lines (145 loc) · 3.54 KB
/
linguist.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/** A utility class for language-specific behaviour. */
export class Linguist {
/** Tries to match the given filename to a supported language based on its file extension. */
static detect(filename: string): Language | undefined {
for (const language of SUPPORTED_LANGUAGES) {
if (language.fileExtensions.filter((ext) => filename!.endsWith(`.${ext}`)).length > 0) {
return language
}
}
}
}
/** Represents a programming language. */
export interface Language {
/** The name of the programming language. */
name: string
/** The extensions used by files written in the language. */
fileExtensions: string[]
/** The style used for single-line comments. */
lineCommentStyle?: LineCommentStyle
/** The style used for multi-line comments. */
blockCommentStyle?: BlockCommentStyle
}
/** Identifies the characters used to denote comments in a language. */
interface CommentStyle {
/** The characters used to mark the start of a comment. */
start: string
}
/** Describes single-line comments in a programming language. */
interface LineCommentStyle extends CommentStyle {
start: string
}
/** Describes multi-line comments in a programming language. */
interface BlockCommentStyle extends CommentStyle {
/** The characters used to extend a comment over several lines. */
continuation: string
/** The characters used to mark the end of a multi-line comment. */
end: string
}
export enum CommentStyleFamily {
C = "c",
HTML = "html",
Python = "python",
}
const cStyleComments = {
lineCommentStyle: { start: "//" },
blockCommentStyle: { start: "/*", continuation: "*", end: "*/"},
}
const htmlStyleComments = {
blockCommentStyle: { start: "<!--", continuation: "", end: "-->"},
}
const pythonStyleComments = {
lineCommentStyle: { start: "#" },
}
export const CSharp: Language = {
name: "C#",
fileExtensions: ["cs", "csx"],
...cStyleComments,
}
export const Go: Language = {
name: "Go",
fileExtensions: ["go"],
...cStyleComments,
}
export const HTML: Language = {
name: "HTML",
fileExtensions: ["htm", "html"],
...htmlStyleComments,
}
export const Java: Language = {
name: "Java",
fileExtensions: ["java"],
...cStyleComments,
}
export const JavaScript: Language = {
name: "JavaScript",
fileExtensions: ["js", "jsx"],
...cStyleComments,
}
export const Kotlin: Language = {
name: "Kotlin",
fileExtensions: ["kt", "kts"],
...cStyleComments,
}
export const Python: Language = {
name: "Python",
fileExtensions: ["py"],
...pythonStyleComments,
}
export const Ruby: Language = {
name: "Ruby",
fileExtensions: ["rb"],
...pythonStyleComments,
}
export const Rust: Language = {
name: "Rust",
fileExtensions: ["rs"],
...cStyleComments,
}
export const Strings: Language = {
name: "Strings",
fileExtensions: ["strings"],
...cStyleComments,
}
export const StringsDict: Language = {
name: "StringsDict",
fileExtensions: ["stringsdict"],
...htmlStyleComments,
}
export const Swift: Language = {
name: "Swift",
fileExtensions: ["swift"],
...cStyleComments,
}
export const TypeScript: Language = {
name: "TypeScript",
fileExtensions: ["ts", "tsx"],
...cStyleComments,
}
export const XML: Language = {
name: "XML",
fileExtensions: ["xml"],
...htmlStyleComments,
}
export const YAML: Language = {
name: "YAML",
fileExtensions: ["yml", "yaml"],
...pythonStyleComments,
}
export const SUPPORTED_LANGUAGES: Language[] = [
CSharp,
Go,
HTML,
Java,
JavaScript,
Kotlin,
Python,
Ruby,
Rust,
Strings,
StringsDict,
Swift,
TypeScript,
XML,
YAML,
];