@blcklab/yuirinx 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +47 -64
  2. package/dist/cjs/core/index.cjs +36 -7
  3. package/dist/cjs/index.cjs +37 -8
  4. package/dist/cjs/languages/c.cjs +1 -1
  5. package/dist/cjs/languages/cpp.cjs +1 -1
  6. package/dist/cjs/languages/csharp.cjs +1 -1
  7. package/dist/cjs/languages/css.cjs +2 -2
  8. package/dist/cjs/languages/dart.cjs +1 -1
  9. package/dist/cjs/languages/go.cjs +1 -1
  10. package/dist/cjs/languages/java.cjs +1 -1
  11. package/dist/cjs/languages/javascript.cjs +65 -6
  12. package/dist/cjs/languages/jsx.cjs +65 -6
  13. package/dist/cjs/languages/kotlin.cjs +1 -1
  14. package/dist/cjs/languages/markdown.cjs +30 -6
  15. package/dist/cjs/languages/php.cjs +1 -1
  16. package/dist/cjs/languages/python.cjs +1 -1
  17. package/dist/cjs/languages/ruby.cjs +1 -1
  18. package/dist/cjs/languages/rust.cjs +1 -1
  19. package/dist/cjs/languages/scss.cjs +2 -2
  20. package/dist/cjs/languages/sql.cjs +1 -1
  21. package/dist/cjs/languages/swift.cjs +1 -1
  22. package/dist/cjs/languages/tsx.cjs +65 -6
  23. package/dist/cjs/languages/typescript.cjs +65 -6
  24. package/dist/esm/core/create-highlighter.js +132 -0
  25. package/dist/esm/core/errors.js +10 -0
  26. package/dist/esm/core/escape.js +17 -0
  27. package/dist/esm/core/grammar.js +103 -0
  28. package/dist/esm/core/index.js +4 -536
  29. package/dist/esm/core/renderer.js +215 -0
  30. package/dist/esm/core/tokenizer.js +107 -0
  31. package/dist/esm/core/types.js +0 -0
  32. package/dist/esm/index.js +8 -558
  33. package/dist/esm/languages/bash.js +9 -21
  34. package/dist/esm/languages/c.js +2 -82
  35. package/dist/esm/languages/cpp.js +2 -82
  36. package/dist/esm/languages/csharp.js +2 -82
  37. package/dist/esm/languages/css.js +2 -64
  38. package/dist/esm/languages/dart.js +2 -82
  39. package/dist/esm/languages/dockerfile.js +3 -12
  40. package/dist/esm/languages/go.js +2 -82
  41. package/dist/esm/languages/graphql.js +8 -20
  42. package/dist/esm/languages/html.js +2 -44
  43. package/dist/esm/languages/ini.js +2 -5
  44. package/dist/esm/languages/java.js +2 -82
  45. package/dist/esm/languages/javascript.js +2 -229
  46. package/dist/esm/languages/json.js +2 -5
  47. package/dist/esm/languages/jsx.js +2 -229
  48. package/dist/esm/languages/kotlin.js +2 -82
  49. package/dist/esm/languages/markdown.js +32 -11
  50. package/dist/esm/languages/nginx.js +2 -5
  51. package/dist/esm/languages/php.js +3 -83
  52. package/dist/esm/languages/plaintext.js +1 -2
  53. package/dist/esm/languages/python.js +10 -25
  54. package/dist/esm/languages/ruby.js +9 -24
  55. package/dist/esm/languages/rust.js +2 -82
  56. package/dist/esm/languages/scss.js +2 -64
  57. package/dist/esm/languages/shared/c-family.js +55 -0
  58. package/dist/esm/languages/shared/css.js +48 -0
  59. package/dist/esm/languages/shared/ecmascript.js +261 -0
  60. package/dist/esm/languages/shared/helpers.js +52 -0
  61. package/dist/esm/languages/shared/markup.js +41 -0
  62. package/dist/esm/languages/shell.js +1 -115
  63. package/dist/esm/languages/sql.js +11 -32
  64. package/dist/esm/languages/svelte.js +2 -44
  65. package/dist/esm/languages/swift.js +2 -82
  66. package/dist/esm/languages/toml.js +2 -5
  67. package/dist/esm/languages/tsx.js +2 -229
  68. package/dist/esm/languages/typescript.js +2 -229
  69. package/dist/esm/languages/vue.js +2 -44
  70. package/dist/esm/languages/xml.js +2 -44
  71. package/dist/esm/languages/yaml.js +2 -5
  72. package/dist/esm/singleton.js +24 -0
  73. package/dist/esm/themes/index.js +3 -188
  74. package/dist/esm/themes/yuirinx-aurora.js +1 -2
  75. package/dist/esm/themes/yuirinx-noir.js +1 -2
  76. package/dist/esm/themes/yuirinx-pearl.js +1 -2
  77. package/dist/types/core/errors.d.cts +1 -1
  78. package/dist/types/core/errors.d.ts +1 -1
  79. package/dist/types/core/index.d.cts +1 -1
  80. package/dist/types/core/index.d.ts +1 -1
  81. package/dist/types/core/types.d.cts +5 -1
  82. package/dist/types/core/types.d.ts +5 -1
  83. package/dist/types/singleton.d.cts +1 -1
  84. package/dist/types/singleton.d.ts +1 -1
  85. package/package.json +4 -4
@@ -1,232 +1,5 @@
1
- // src/languages/shared/helpers.ts
2
- function escapeRegex(value) {
3
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4
- }
5
- function words(values, flags = "") {
6
- return new RegExp(`\\b(?:${values.map(escapeRegex).join("|")})\\b`, flags);
7
- }
8
- var whitespaceRule = { type: "plain", pattern: /\s+/ };
9
- var punctuationRule = {
10
- type: "punctuation",
11
- pattern: /[()[\]{}.,;:]/
12
- };
13
- var operatorRule = {
14
- type: "operator",
15
- pattern: /(?:===|!==|>>>|<<=|>>=|=>|==|!=|<=|>=|&&|\|\||\?\?|\?\.|\+\+|--|\+=|-=|\*=|\/=|%=|\*\*|<<|>>|[+\-*/%=&|!<>^~?])+/
16
- };
17
- var numberRule = {
18
- type: "number",
19
- pattern: /\b(?:0[xX][\da-fA-F](?:_?[\da-fA-F])*|0[bB][01](?:_?[01])*|0[oO][0-7](?:_?[0-7])*|\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?)\b/
20
- };
21
- var doubleStringRule = {
22
- type: "string",
23
- pattern: /"(?:\\[\s\S]|[^"\\\r\n])*"?/
24
- };
25
- var singleStringRule = {
26
- type: "string",
27
- pattern: /'(?:\\[\s\S]|[^'\\\r\n])*'?/
28
- };
29
- var cLineCommentRule = {
30
- type: "comment",
31
- pattern: /\/\/[^\r\n]*/
32
- };
33
- var blockCommentRule = {
34
- type: (match) => match[0].startsWith("/**") ? "comment.documentation" : "comment",
35
- pattern: /\/\*[\s\S]*?(?:\*\/|$)/
36
- };
37
-
38
- // src/languages/shared/ecmascript.ts
39
- var JS_KEYWORDS = [
40
- "as",
41
- "async",
42
- "await",
43
- "break",
44
- "case",
45
- "catch",
46
- "class",
47
- "const",
48
- "continue",
49
- "debugger",
50
- "default",
51
- "delete",
52
- "do",
53
- "else",
54
- "export",
55
- "extends",
56
- "finally",
57
- "for",
58
- "from",
59
- "function",
60
- "get",
61
- "if",
62
- "import",
63
- "in",
64
- "instanceof",
65
- "let",
66
- "new",
67
- "of",
68
- "return",
69
- "set",
70
- "static",
71
- "switch",
72
- "throw",
73
- "try",
74
- "typeof",
75
- "var",
76
- "void",
77
- "while",
78
- "with",
79
- "yield"
80
- ];
81
- var TS_KEYWORDS = [
82
- "abstract",
83
- "any",
84
- "asserts",
85
- "bigint",
86
- "boolean",
87
- "declare",
88
- "enum",
89
- "implements",
90
- "infer",
91
- "interface",
92
- "is",
93
- "keyof",
94
- "module",
95
- "namespace",
96
- "never",
97
- "number",
98
- "object",
99
- "override",
100
- "private",
101
- "protected",
102
- "public",
103
- "readonly",
104
- "require",
105
- "satisfies",
106
- "string",
107
- "symbol",
108
- "type",
109
- "undefined",
110
- "unique",
111
- "unknown",
112
- "using"
113
- ];
114
- var BUILTINS = [
115
- "Array",
116
- "BigInt",
117
- "Boolean",
118
- "Date",
119
- "Error",
120
- "JSON",
121
- "Map",
122
- "Math",
123
- "Number",
124
- "Object",
125
- "Promise",
126
- "Proxy",
127
- "Reflect",
128
- "RegExp",
129
- "Set",
130
- "String",
131
- "Symbol",
132
- "WeakMap",
133
- "WeakSet",
134
- "console",
135
- "document",
136
- "globalThis",
137
- "process",
138
- "window"
139
- ];
140
- function createEcmaGrammar(options) {
141
- const keywordValues = options.typescript ? [...JS_KEYWORDS, ...TS_KEYWORDS] : JS_KEYWORDS;
142
- const rootRules = [
143
- cLineCommentRule,
144
- blockCommentRule,
145
- doubleStringRule,
146
- singleStringRule,
147
- { type: "string", pattern: /`/, push: "template" }
148
- ];
149
- if (options.jsx) {
150
- rootRules.push({
151
- type: "tag.punctuation",
152
- pattern: /<\/?/,
153
- push: "jsxTag"
154
- });
155
- }
156
- rootRules.push(
157
- {
158
- type: "regex",
159
- pattern: /\/(?![/*\s])(?:\\.|\[(?:\\.|[^\]\\])*\]|[^/\\\r\n])+\/[dgimsuvy]*/
160
- },
161
- numberRule,
162
- { type: "boolean", pattern: /\b(?:true|false)\b/ },
163
- { type: "null", pattern: /\b(?:null|undefined)\b/ },
164
- { type: "keyword", pattern: words(keywordValues) },
165
- { type: "builtin", pattern: words(BUILTINS) },
166
- { type: "decorator", pattern: /@[A-Za-z_$][\w$]*/ },
167
- { type: "function.call", pattern: /\b[A-Za-z_$][\w$]*(?=\s*\()/ },
168
- {
169
- type: "type",
170
- pattern: /\b[A-Z][A-Za-z\d_$]*(?=\s*(?:<|\[|\||&|[,)>]|$))/
171
- },
172
- { type: "property", pattern: /\b[A-Za-z_$][\w$]*(?=\s*:)/ },
173
- { type: "constant", pattern: /\b[A-Z][A-Z\d_]{2,}\b/ },
174
- { type: "variable", pattern: /\b[A-Za-z_$][\w$]*\b/ },
175
- operatorRule,
176
- punctuationRule,
177
- whitespaceRule
178
- );
179
- return {
180
- id: options.id,
181
- aliases: options.aliases,
182
- states: {
183
- root: { rules: rootRules },
184
- template: {
185
- fallbackType: "string",
186
- rules: [
187
- { type: "string", pattern: /`/, pop: true },
188
- { type: "string.escape", pattern: /\\[\s\S]/ },
189
- {
190
- type: "string.interpolation",
191
- pattern: /\$\{/,
192
- push: "templateExpression"
193
- },
194
- { type: "string", pattern: /[^\\`$]+/ },
195
- { type: "string", pattern: /[$\\]/ }
196
- ]
197
- },
198
- templateExpression: {
199
- rules: [
200
- { type: "string.interpolation", pattern: /}/, pop: true },
201
- { type: "punctuation", pattern: /{/, push: "templateExpression" },
202
- { include: "root" }
203
- ]
204
- },
205
- jsxTag: {
206
- rules: [
207
- { type: "tag.punctuation", pattern: /\/?>/, pop: true },
208
- whitespaceRule,
209
- { type: "attribute.value", pattern: /"(?:\\.|[^"\\])*"?/ },
210
- { type: "attribute.value", pattern: /'(?:\\.|[^'\\])*'?/ },
211
- { type: "punctuation", pattern: /{/, push: "jsxExpression" },
212
- { type: "operator", pattern: /=/ },
213
- { type: "tag", pattern: /[A-Za-z_$][\w$.-]*/ },
214
- punctuationRule
215
- ]
216
- },
217
- jsxExpression: {
218
- rules: [
219
- { type: "punctuation", pattern: /}/, pop: true },
220
- { type: "punctuation", pattern: /{/, push: "jsxExpression" },
221
- { include: "root" }
222
- ]
223
- }
224
- }
225
- };
226
- }
227
-
228
- // src/languages/javascript.ts
229
- var javascript = createEcmaGrammar({
1
+ import { createEcmaGrammar } from "./shared/ecmascript.js";
2
+ const javascript = createEcmaGrammar({
230
3
  id: "javascript",
231
4
  aliases: ["js", "mjs", "cjs"]
232
5
  });
@@ -1,8 +1,5 @@
1
- // src/languages/shared/helpers.ts
2
- var whitespaceRule = { type: "plain", pattern: /\s+/ };
3
-
4
- // src/languages/json.ts
5
- var json = {
1
+ import { whitespaceRule } from "./shared/helpers.js";
2
+ const json = {
6
3
  id: "json",
7
4
  aliases: ["jsonc"],
8
5
  states: {
@@ -1,232 +1,5 @@
1
- // src/languages/shared/helpers.ts
2
- function escapeRegex(value) {
3
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4
- }
5
- function words(values, flags = "") {
6
- return new RegExp(`\\b(?:${values.map(escapeRegex).join("|")})\\b`, flags);
7
- }
8
- var whitespaceRule = { type: "plain", pattern: /\s+/ };
9
- var punctuationRule = {
10
- type: "punctuation",
11
- pattern: /[()[\]{}.,;:]/
12
- };
13
- var operatorRule = {
14
- type: "operator",
15
- pattern: /(?:===|!==|>>>|<<=|>>=|=>|==|!=|<=|>=|&&|\|\||\?\?|\?\.|\+\+|--|\+=|-=|\*=|\/=|%=|\*\*|<<|>>|[+\-*/%=&|!<>^~?])+/
16
- };
17
- var numberRule = {
18
- type: "number",
19
- pattern: /\b(?:0[xX][\da-fA-F](?:_?[\da-fA-F])*|0[bB][01](?:_?[01])*|0[oO][0-7](?:_?[0-7])*|\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?)\b/
20
- };
21
- var doubleStringRule = {
22
- type: "string",
23
- pattern: /"(?:\\[\s\S]|[^"\\\r\n])*"?/
24
- };
25
- var singleStringRule = {
26
- type: "string",
27
- pattern: /'(?:\\[\s\S]|[^'\\\r\n])*'?/
28
- };
29
- var cLineCommentRule = {
30
- type: "comment",
31
- pattern: /\/\/[^\r\n]*/
32
- };
33
- var blockCommentRule = {
34
- type: (match) => match[0].startsWith("/**") ? "comment.documentation" : "comment",
35
- pattern: /\/\*[\s\S]*?(?:\*\/|$)/
36
- };
37
-
38
- // src/languages/shared/ecmascript.ts
39
- var JS_KEYWORDS = [
40
- "as",
41
- "async",
42
- "await",
43
- "break",
44
- "case",
45
- "catch",
46
- "class",
47
- "const",
48
- "continue",
49
- "debugger",
50
- "default",
51
- "delete",
52
- "do",
53
- "else",
54
- "export",
55
- "extends",
56
- "finally",
57
- "for",
58
- "from",
59
- "function",
60
- "get",
61
- "if",
62
- "import",
63
- "in",
64
- "instanceof",
65
- "let",
66
- "new",
67
- "of",
68
- "return",
69
- "set",
70
- "static",
71
- "switch",
72
- "throw",
73
- "try",
74
- "typeof",
75
- "var",
76
- "void",
77
- "while",
78
- "with",
79
- "yield"
80
- ];
81
- var TS_KEYWORDS = [
82
- "abstract",
83
- "any",
84
- "asserts",
85
- "bigint",
86
- "boolean",
87
- "declare",
88
- "enum",
89
- "implements",
90
- "infer",
91
- "interface",
92
- "is",
93
- "keyof",
94
- "module",
95
- "namespace",
96
- "never",
97
- "number",
98
- "object",
99
- "override",
100
- "private",
101
- "protected",
102
- "public",
103
- "readonly",
104
- "require",
105
- "satisfies",
106
- "string",
107
- "symbol",
108
- "type",
109
- "undefined",
110
- "unique",
111
- "unknown",
112
- "using"
113
- ];
114
- var BUILTINS = [
115
- "Array",
116
- "BigInt",
117
- "Boolean",
118
- "Date",
119
- "Error",
120
- "JSON",
121
- "Map",
122
- "Math",
123
- "Number",
124
- "Object",
125
- "Promise",
126
- "Proxy",
127
- "Reflect",
128
- "RegExp",
129
- "Set",
130
- "String",
131
- "Symbol",
132
- "WeakMap",
133
- "WeakSet",
134
- "console",
135
- "document",
136
- "globalThis",
137
- "process",
138
- "window"
139
- ];
140
- function createEcmaGrammar(options) {
141
- const keywordValues = options.typescript ? [...JS_KEYWORDS, ...TS_KEYWORDS] : JS_KEYWORDS;
142
- const rootRules = [
143
- cLineCommentRule,
144
- blockCommentRule,
145
- doubleStringRule,
146
- singleStringRule,
147
- { type: "string", pattern: /`/, push: "template" }
148
- ];
149
- if (options.jsx) {
150
- rootRules.push({
151
- type: "tag.punctuation",
152
- pattern: /<\/?/,
153
- push: "jsxTag"
154
- });
155
- }
156
- rootRules.push(
157
- {
158
- type: "regex",
159
- pattern: /\/(?![/*\s])(?:\\.|\[(?:\\.|[^\]\\])*\]|[^/\\\r\n])+\/[dgimsuvy]*/
160
- },
161
- numberRule,
162
- { type: "boolean", pattern: /\b(?:true|false)\b/ },
163
- { type: "null", pattern: /\b(?:null|undefined)\b/ },
164
- { type: "keyword", pattern: words(keywordValues) },
165
- { type: "builtin", pattern: words(BUILTINS) },
166
- { type: "decorator", pattern: /@[A-Za-z_$][\w$]*/ },
167
- { type: "function.call", pattern: /\b[A-Za-z_$][\w$]*(?=\s*\()/ },
168
- {
169
- type: "type",
170
- pattern: /\b[A-Z][A-Za-z\d_$]*(?=\s*(?:<|\[|\||&|[,)>]|$))/
171
- },
172
- { type: "property", pattern: /\b[A-Za-z_$][\w$]*(?=\s*:)/ },
173
- { type: "constant", pattern: /\b[A-Z][A-Z\d_]{2,}\b/ },
174
- { type: "variable", pattern: /\b[A-Za-z_$][\w$]*\b/ },
175
- operatorRule,
176
- punctuationRule,
177
- whitespaceRule
178
- );
179
- return {
180
- id: options.id,
181
- aliases: options.aliases,
182
- states: {
183
- root: { rules: rootRules },
184
- template: {
185
- fallbackType: "string",
186
- rules: [
187
- { type: "string", pattern: /`/, pop: true },
188
- { type: "string.escape", pattern: /\\[\s\S]/ },
189
- {
190
- type: "string.interpolation",
191
- pattern: /\$\{/,
192
- push: "templateExpression"
193
- },
194
- { type: "string", pattern: /[^\\`$]+/ },
195
- { type: "string", pattern: /[$\\]/ }
196
- ]
197
- },
198
- templateExpression: {
199
- rules: [
200
- { type: "string.interpolation", pattern: /}/, pop: true },
201
- { type: "punctuation", pattern: /{/, push: "templateExpression" },
202
- { include: "root" }
203
- ]
204
- },
205
- jsxTag: {
206
- rules: [
207
- { type: "tag.punctuation", pattern: /\/?>/, pop: true },
208
- whitespaceRule,
209
- { type: "attribute.value", pattern: /"(?:\\.|[^"\\])*"?/ },
210
- { type: "attribute.value", pattern: /'(?:\\.|[^'\\])*'?/ },
211
- { type: "punctuation", pattern: /{/, push: "jsxExpression" },
212
- { type: "operator", pattern: /=/ },
213
- { type: "tag", pattern: /[A-Za-z_$][\w$.-]*/ },
214
- punctuationRule
215
- ]
216
- },
217
- jsxExpression: {
218
- rules: [
219
- { type: "punctuation", pattern: /}/, pop: true },
220
- { type: "punctuation", pattern: /{/, push: "jsxExpression" },
221
- { include: "root" }
222
- ]
223
- }
224
- }
225
- };
226
- }
227
-
228
- // src/languages/jsx.ts
229
- var jsx = createEcmaGrammar({
1
+ import { createEcmaGrammar } from "./shared/ecmascript.js";
2
+ const jsx = createEcmaGrammar({
230
3
  id: "jsx",
231
4
  aliases: ["react"],
232
5
  jsx: true
@@ -1,85 +1,5 @@
1
- // src/languages/shared/helpers.ts
2
- function escapeRegex(value) {
3
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4
- }
5
- function words(values, flags = "") {
6
- return new RegExp(`\\b(?:${values.map(escapeRegex).join("|")})\\b`, flags);
7
- }
8
- var whitespaceRule = { type: "plain", pattern: /\s+/ };
9
- var punctuationRule = {
10
- type: "punctuation",
11
- pattern: /[()[\]{}.,;:]/
12
- };
13
- var operatorRule = {
14
- type: "operator",
15
- pattern: /(?:===|!==|>>>|<<=|>>=|=>|==|!=|<=|>=|&&|\|\||\?\?|\?\.|\+\+|--|\+=|-=|\*=|\/=|%=|\*\*|<<|>>|[+\-*/%=&|!<>^~?])+/
16
- };
17
- var numberRule = {
18
- type: "number",
19
- pattern: /\b(?:0[xX][\da-fA-F](?:_?[\da-fA-F])*|0[bB][01](?:_?[01])*|0[oO][0-7](?:_?[0-7])*|\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?)\b/
20
- };
21
- var doubleStringRule = {
22
- type: "string",
23
- pattern: /"(?:\\[\s\S]|[^"\\\r\n])*"?/
24
- };
25
- var singleStringRule = {
26
- type: "string",
27
- pattern: /'(?:\\[\s\S]|[^'\\\r\n])*'?/
28
- };
29
- var cLineCommentRule = {
30
- type: "comment",
31
- pattern: /\/\/[^\r\n]*/
32
- };
33
- var blockCommentRule = {
34
- type: (match) => match[0].startsWith("/**") ? "comment.documentation" : "comment",
35
- pattern: /\/\*[\s\S]*?(?:\*\/|$)/
36
- };
37
-
38
- // src/languages/shared/c-family.ts
39
- function createCLikeGrammar(options) {
40
- const rules = [
41
- cLineCommentRule,
42
- blockCommentRule,
43
- ...options.extraRules ?? [],
44
- doubleStringRule,
45
- singleStringRule
46
- ];
47
- if (options.preprocessor) {
48
- rules.push({ type: "meta", pattern: /#[ \t]*[A-Za-z_]\w*[^\r\n]*/ });
49
- }
50
- if (options.annotations) {
51
- rules.push({
52
- type: "annotation",
53
- pattern: /@[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*/
54
- });
55
- }
56
- rules.push(
57
- numberRule,
58
- { type: "boolean", pattern: /\b(?:true|false)\b/ },
59
- { type: "null", pattern: /\b(?:null|nullptr|nil)\b/ },
60
- { type: "keyword", pattern: words(options.keywords) }
61
- );
62
- if (options.builtins?.length) {
63
- rules.push({ type: "builtin", pattern: words(options.builtins) });
64
- }
65
- rules.push(
66
- { type: "function.call", pattern: /\b[A-Za-z_]\w*(?=\s*\()/ },
67
- { type: "type", pattern: /\b[A-Z][A-Za-z\d_]*\b/ },
68
- { type: "constant", pattern: /\b[A-Z][A-Z\d_]{2,}\b/ },
69
- { type: "variable", pattern: /\b[A-Za-z_]\w*\b/ },
70
- operatorRule,
71
- punctuationRule,
72
- whitespaceRule
73
- );
74
- return {
75
- id: options.id,
76
- ...options.aliases ? { aliases: options.aliases } : {},
77
- states: { root: { rules } }
78
- };
79
- }
80
-
81
- // src/languages/kotlin.ts
82
- var kotlin = createCLikeGrammar({
1
+ import { createCLikeGrammar } from "./shared/c-family.js";
2
+ const kotlin = createCLikeGrammar({
83
3
  id: "kotlin",
84
4
  aliases: ["kt", "kts"],
85
5
  keywords: [
@@ -1,21 +1,37 @@
1
- // src/languages/shared/helpers.ts
2
- var whitespaceRule = { type: "plain", pattern: /\s+/ };
3
-
4
- // src/languages/markdown.ts
5
- var markdown = {
1
+ import { whitespaceRule } from "./shared/helpers.js";
2
+ const atLineStart = (_match, context) => context.offset === 0 || /[\r\n]/.test(context.source[context.offset - 1] ?? "");
3
+ const markdown = {
6
4
  id: "markdown",
7
5
  aliases: ["md", "mdown"],
8
6
  states: {
9
7
  root: {
10
8
  rules: [
11
- { type: "meta", pattern: /```[^\r\n]*(?:\r?\n|$)/, push: "fence" },
12
- { type: "heading", pattern: /#{1,6}[ \t]+[^\r\n]*/ },
9
+ {
10
+ type: "meta",
11
+ pattern: / {0,3}```[^\r\n]*(?:\r?\n|$)/,
12
+ when: atLineStart,
13
+ push: "fence"
14
+ },
15
+ {
16
+ type: "heading",
17
+ pattern: / {0,3}#{1,6}[ \t]+[^\r\n]*/,
18
+ when: atLineStart
19
+ },
13
20
  {
14
21
  type: "heading",
15
- pattern: /[^\r\n]+\r?\n(?:===+|---+)[ \t]*(?:\r?\n|$)/
22
+ pattern: /[^\r\n]+\r?\n {0,3}(?:===+|---+)[ \t]*(?:\r?\n|$)/,
23
+ when: atLineStart
24
+ },
25
+ {
26
+ type: "quote",
27
+ pattern: / {0,3}>[ \t]?[^\r\n]*/,
28
+ when: atLineStart
29
+ },
30
+ {
31
+ type: "list",
32
+ pattern: / {0,3}(?:[-+*]|\d+[.)])[ \t]+/,
33
+ when: atLineStart
16
34
  },
17
- { type: "quote", pattern: />[ \t]?[^\r\n]*/ },
18
- { type: "list", pattern: /(?:[-+*]|\d+[.)])[ \t]+/ },
19
35
  { type: "important", pattern: /!\[[^\]\r\n]*\]\([^\r\n)]*\)/ },
20
36
  { type: "link", pattern: /\[[^\]\r\n]+\]\([^\r\n)]*\)/ },
21
37
  { type: "url", pattern: /https?:\/\/[^\s<>()]+/ },
@@ -31,7 +47,12 @@ var markdown = {
31
47
  fence: {
32
48
  fallbackType: "code",
33
49
  rules: [
34
- { type: "meta", pattern: /```[ \t]*(?:\r?\n|$)/, pop: true },
50
+ {
51
+ type: "meta",
52
+ pattern: / {0,3}```[ \t]*(?:\r?\n|$)/,
53
+ when: atLineStart,
54
+ pop: true
55
+ },
35
56
  { type: "code", pattern: /[^`]+/ },
36
57
  { type: "code", pattern: /`/ }
37
58
  ]
@@ -1,8 +1,5 @@
1
- // src/languages/shared/helpers.ts
2
- var whitespaceRule = { type: "plain", pattern: /\s+/ };
3
-
4
- // src/languages/nginx.ts
5
- var nginx = {
1
+ import { whitespaceRule } from "./shared/helpers.js";
2
+ const nginx = {
6
3
  id: "nginx",
7
4
  states: {
8
5
  root: {