@tikz-editor/lang-tikz 0.5.0
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.
- package/README.md +21 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +142 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# @tikz-editor/lang-tikz
|
|
2
|
+
|
|
3
|
+
CodeMirror 6 language support for TikZ source code.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { EditorState } from "@codemirror/state";
|
|
7
|
+
import { EditorView } from "@codemirror/view";
|
|
8
|
+
import { tikz } from "@tikz-editor/lang-tikz";
|
|
9
|
+
|
|
10
|
+
new EditorView({
|
|
11
|
+
state: EditorState.create({
|
|
12
|
+
doc: "\\draw (0,0) -- (1,1);",
|
|
13
|
+
extensions: [tikz()],
|
|
14
|
+
}),
|
|
15
|
+
parent: document.body,
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This package includes syntax parsing, highlighting, line comments, and folding.
|
|
20
|
+
It does not include tikz-editor's autocomplete, diagnostics, color swatches, or
|
|
21
|
+
number scrubbing helpers.
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { LRLanguage, LanguageSupport, foldNodeProp, foldInside, foldService, syntaxTree } from "@codemirror/language";
|
|
2
|
+
import { styleTags, tags as t } from "@lezer/highlight";
|
|
3
|
+
import { parser } from "@tikz-editor/lezer-tikz";
|
|
4
|
+
const tikzHighlighting = styleTags({
|
|
5
|
+
Comment: t.lineComment,
|
|
6
|
+
// Environment delimiters
|
|
7
|
+
"BeginTikz EndTikz BeginScope EndScope": t.keyword,
|
|
8
|
+
// Path commands and definition-style commands
|
|
9
|
+
"DrawCmd PathCmd FillDrawCmd FillCmd PatternCmd ClipCmd ShadeCmd ShadeDrawCmd UseAsBoundingBoxCmd MatrixCmd ColorletCmd DefineColorCmd DefCmd LetDefCmd NewCommandCmd RenewCommandCmd TikzSetCmd TikzStyleCmd PgfkeysCmd": t.keyword,
|
|
10
|
+
// \node and \coordinate commands
|
|
11
|
+
"NodeCmd CoordinateCmd": t.keyword,
|
|
12
|
+
// Inline keywords in path context only (avoid styling style names like `every node`)
|
|
13
|
+
"NodeItem/NodeKw CoordinateOperation/CoordinateKw ToOperation/ToKw EdgeOperation/EdgeKw EdgeFromParentOperation/EdgeKw": t.keyword,
|
|
14
|
+
// Shape/operation keywords: circle, rectangle, arc, etc.
|
|
15
|
+
"CircleKw RectangleKw EllipseKw ArcKw GridKw ParabolaKw SinKw CosKw PlotKw SvgKw": t.typeName,
|
|
16
|
+
// Modifier keywords: at, bend, cycle, controls, and
|
|
17
|
+
"AtKw BendKw CycleKw ControlsKw AndKw": t.keyword,
|
|
18
|
+
// Foreach / let / in — loop constructs
|
|
19
|
+
"ForeachCmd ForeachKw LetKw InKw": t.keyword,
|
|
20
|
+
// Font size commands
|
|
21
|
+
FontSizeCmd: t.keyword,
|
|
22
|
+
// Unknown commands (\somecommand) — meta color (#404740)
|
|
23
|
+
CommandName: t.meta,
|
|
24
|
+
// Literals
|
|
25
|
+
Number: t.literal,
|
|
26
|
+
QuotedSvg: t.string,
|
|
27
|
+
// Identifiers in option lists — labelName (#219, blue)
|
|
28
|
+
"OptionPart/*/Identifier": t.labelName,
|
|
29
|
+
"OptionPart/NodeKw StylePayloadPart/NodeKw": t.labelName,
|
|
30
|
+
"StylePayloadPart/IdentifierLike/Identifier": t.labelName,
|
|
31
|
+
"StylePayloadPart/OptionPunct": t.punctuation,
|
|
32
|
+
// Node text uses a dedicated grammar branch so prose is not highlighted as TikZ syntax.
|
|
33
|
+
"NodeTextGroup/NodeTextPart/NodeTextChunk NodeTextGroup/NodeTextPart/NodeTextPunct": t.string,
|
|
34
|
+
"NodeTextDollarMath/NodeTextMathPart/NodeTextChunk NodeTextDollarMath/NodeTextMathPart/NodeTextPunct NodeTextDollarMath/NodeTextMathPart/CommandName": t.special(t.string),
|
|
35
|
+
"NodeTextDollarMath/Dollar NodeTextDollarMath/DoubleDollar": t.regexp,
|
|
36
|
+
// General identifiers (fallback) — className (#167, dark teal)
|
|
37
|
+
Identifier: t.className,
|
|
38
|
+
// Coordinates get a distinct look
|
|
39
|
+
"Coordinate/( Coordinate/)": t.special(t.paren),
|
|
40
|
+
"CoordPart/Number": t.literal,
|
|
41
|
+
// Brackets
|
|
42
|
+
"( )": t.paren,
|
|
43
|
+
"[ ]": t.squareBracket,
|
|
44
|
+
"{ }": t.brace,
|
|
45
|
+
// Operators
|
|
46
|
+
PathOperator: t.operator,
|
|
47
|
+
GroupPathOperator: t.operator,
|
|
48
|
+
RelativePrefix: t.operator,
|
|
49
|
+
LetPunct: t.operator,
|
|
50
|
+
// Punctuation
|
|
51
|
+
"OptionPunct GroupPunct": t.punctuation,
|
|
52
|
+
"MatrixRowSepCmd EscapedAmpersandCmd": t.punctuation,
|
|
53
|
+
StraySymbol: t.punctuation,
|
|
54
|
+
// Errors
|
|
55
|
+
"⚠": t.invalid,
|
|
56
|
+
});
|
|
57
|
+
const tikzEnvironmentFolding = foldService.of((state, lineStart) => {
|
|
58
|
+
const line = state.doc.lineAt(lineStart);
|
|
59
|
+
const text = line.text;
|
|
60
|
+
const beginMatch = text.match(/\\begin\{([^}]+)\}/);
|
|
61
|
+
if (beginMatch?.index === undefined)
|
|
62
|
+
return null;
|
|
63
|
+
const beginIndex = beginMatch.index;
|
|
64
|
+
const tree = syntaxTree(state);
|
|
65
|
+
if (tree.resolveInner(line.from + beginIndex + 1).name === "Comment")
|
|
66
|
+
return null;
|
|
67
|
+
const envName = beginMatch[1];
|
|
68
|
+
const beginToken = `\\begin{${envName}}`;
|
|
69
|
+
const endToken = `\\end{${envName}}`;
|
|
70
|
+
let depth = 1;
|
|
71
|
+
const from = line.from + beginIndex + beginMatch[0].length;
|
|
72
|
+
let searchPos = beginIndex + beginMatch[0].length;
|
|
73
|
+
while (true) {
|
|
74
|
+
const nextBegin = text.indexOf(beginToken, searchPos);
|
|
75
|
+
const nextEnd = text.indexOf(endToken, searchPos);
|
|
76
|
+
if (nextBegin !== -1 && (nextEnd === -1 || nextBegin < nextEnd)) {
|
|
77
|
+
if (tree.resolveInner(line.from + nextBegin + 1).name !== "Comment") {
|
|
78
|
+
depth++;
|
|
79
|
+
}
|
|
80
|
+
searchPos = nextBegin + beginToken.length;
|
|
81
|
+
}
|
|
82
|
+
else if (nextEnd !== -1) {
|
|
83
|
+
if (tree.resolveInner(line.from + nextEnd + 1).name !== "Comment") {
|
|
84
|
+
depth--;
|
|
85
|
+
if (depth === 0) {
|
|
86
|
+
return { from, to: line.from + nextEnd };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
searchPos = nextEnd + endToken.length;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (let i = line.number + 1; i <= state.doc.lines; i++) {
|
|
96
|
+
const searchLine = state.doc.line(i);
|
|
97
|
+
let lineSearchPos = 0;
|
|
98
|
+
const lineText = searchLine.text;
|
|
99
|
+
while (true) {
|
|
100
|
+
const nextBegin = lineText.indexOf(beginToken, lineSearchPos);
|
|
101
|
+
const nextEnd = lineText.indexOf(endToken, lineSearchPos);
|
|
102
|
+
if (nextBegin !== -1 && (nextEnd === -1 || nextBegin < nextEnd)) {
|
|
103
|
+
if (tree.resolveInner(searchLine.from + nextBegin + 1).name !== "Comment") {
|
|
104
|
+
depth++;
|
|
105
|
+
}
|
|
106
|
+
lineSearchPos = nextBegin + beginToken.length;
|
|
107
|
+
}
|
|
108
|
+
else if (nextEnd !== -1) {
|
|
109
|
+
if (tree.resolveInner(searchLine.from + nextEnd + 1).name !== "Comment") {
|
|
110
|
+
depth--;
|
|
111
|
+
if (depth === 0) {
|
|
112
|
+
return { from, to: searchLine.from + nextEnd };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
lineSearchPos = nextEnd + endToken.length;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
});
|
|
124
|
+
export const tikzLanguage = LRLanguage.define({
|
|
125
|
+
parser: parser.configure({
|
|
126
|
+
props: [
|
|
127
|
+
tikzHighlighting,
|
|
128
|
+
foldNodeProp.add({
|
|
129
|
+
TikzEnvironment: foldInside,
|
|
130
|
+
ScopeStatement: foldInside,
|
|
131
|
+
Group: foldInside,
|
|
132
|
+
})
|
|
133
|
+
],
|
|
134
|
+
}),
|
|
135
|
+
languageData: {
|
|
136
|
+
commentTokens: { line: "%" },
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
export function tikz() {
|
|
140
|
+
return new LanguageSupport(tikzLanguage, [tikzEnvironmentFolding]);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtH,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,gBAAgB,GAAG,SAAS,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,WAAW;IAEtB,yBAAyB;IACzB,uCAAuC,EAAE,CAAC,CAAC,OAAO;IAElD,8CAA8C;IAC9C,yNAAyN,EACvN,CAAC,CAAC,OAAO;IAEX,iCAAiC;IACjC,uBAAuB,EAAE,CAAC,CAAC,OAAO;IAElC,qFAAqF;IACrF,uHAAuH,EACrH,CAAC,CAAC,OAAO;IAEX,yDAAyD;IACzD,iFAAiF,EAAE,CAAC,CAAC,QAAQ;IAE7F,oDAAoD;IACpD,sCAAsC,EAAE,CAAC,CAAC,OAAO;IAEjD,uCAAuC;IACvC,iCAAiC,EAAE,CAAC,CAAC,OAAO;IAE5C,qBAAqB;IACrB,WAAW,EAAE,CAAC,CAAC,OAAO;IAEtB,yDAAyD;IACzD,WAAW,EAAE,CAAC,CAAC,IAAI;IAEnB,WAAW;IACX,MAAM,EAAE,CAAC,CAAC,OAAO;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM;IAEnB,uDAAuD;IACvD,yBAAyB,EAAE,CAAC,CAAC,SAAS;IACtC,2CAA2C,EAAE,CAAC,CAAC,SAAS;IACxD,4CAA4C,EAAE,CAAC,CAAC,SAAS;IACzD,8BAA8B,EAAE,CAAC,CAAC,WAAW;IAE7C,wFAAwF;IACxF,mFAAmF,EAAE,CAAC,CAAC,MAAM;IAC7F,qJAAqJ,EACnJ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACrB,2DAA2D,EAAE,CAAC,CAAC,MAAM;IAErE,+DAA+D;IAC/D,UAAU,EAAE,CAAC,CAAC,SAAS;IAEvB,kCAAkC;IAClC,2BAA2B,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,kBAAkB,EAAE,CAAC,CAAC,OAAO;IAE7B,WAAW;IACX,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,KAAK,EAAE,CAAC,CAAC,aAAa;IACtB,KAAK,EAAE,CAAC,CAAC,KAAK;IAEd,YAAY;IACZ,YAAY,EAAE,CAAC,CAAC,QAAQ;IACxB,iBAAiB,EAAE,CAAC,CAAC,QAAQ;IAC7B,cAAc,EAAE,CAAC,CAAC,QAAQ;IAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;IAEpB,cAAc;IACd,wBAAwB,EAAE,CAAC,CAAC,WAAW;IACvC,qCAAqC,EAAE,CAAC,CAAC,WAAW;IACpD,WAAW,EAAE,CAAC,CAAC,WAAW;IAE1B,SAAS;IACT,GAAG,EAAE,CAAC,CAAC,OAAO;CACf,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;IACjE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACpD,IAAI,UAAU,EAAE,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAElF,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,WAAW,OAAO,GAAG,CAAC;IACzC,MAAM,QAAQ,GAAG,SAAS,OAAO,GAAG,CAAC;IAErC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3D,IAAI,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAClD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAElD,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;YAChE,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACpE,KAAK,EAAE,CAAC;YACV,CAAC;YACD,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;QAC5C,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAClE,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAChB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;QAEjC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAE1D,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;gBAChE,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC1E,KAAK,EAAE,CAAC;gBACV,CAAC;gBACD,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;YAChD,CAAC;iBAAM,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACxE,KAAK,EAAE,CAAC;oBACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;wBAChB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;oBACjD,CAAC;gBACH,CAAC;gBACD,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;QACvB,KAAK,EAAE;YACL,gBAAgB;YAChB,YAAY,CAAC,GAAG,CAAC;gBACf,eAAe,EAAE,UAAU;gBAC3B,cAAc,EAAE,UAAU;gBAC1B,KAAK,EAAE,UAAU;aAClB,CAAC;SACH;KACF,CAAC;IACF,YAAY,EAAE;QACZ,aAAa,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;KAC7B;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,IAAI;IAClB,OAAO,IAAI,eAAe,CAAC,YAAY,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tikz-editor/lang-tikz",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "CodeMirror 6 language support for TikZ",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"package.json"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc -p tsconfig.json"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@codemirror/language": "^6.12.1",
|
|
28
|
+
"@lezer/highlight": "^1.2.3",
|
|
29
|
+
"@tikz-editor/lezer-tikz": "0.5.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"typescript": "^5.7.3"
|
|
33
|
+
}
|
|
34
|
+
}
|