@orangecheck/app-design 1.0.0 → 1.1.1
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 -5
- package/dist/chrome.d.mts +31 -42
- package/dist/chrome.d.ts +31 -42
- package/dist/chrome.js +502 -24
- package/dist/chrome.js.map +1 -1
- package/dist/chrome.mjs +497 -26
- package/dist/chrome.mjs.map +1 -1
- package/dist/code.d.mts +52 -0
- package/dist/code.d.ts +52 -0
- package/dist/code.js +534 -0
- package/dist/code.js.map +1 -0
- package/dist/code.mjs +522 -0
- package/dist/code.mjs.map +1 -0
- package/dist/components.d.mts +61 -117
- package/dist/components.d.ts +61 -117
- package/dist/components.js +2178 -106
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +2150 -110
- package/dist/components.mjs.map +1 -1
- package/dist/docs-DhnstueM.d.ts +219 -0
- package/dist/docs-DiR6s43s.d.mts +219 -0
- package/dist/family.js +2 -1
- package/dist/family.js.map +1 -1
- package/dist/family.mjs +2 -1
- package/dist/family.mjs.map +1 -1
- package/dist/format.d.mts +12 -0
- package/dist/format.d.ts +12 -0
- package/dist/format.js +65 -0
- package/dist/format.js.map +1 -0
- package/dist/format.mjs +58 -0
- package/dist/format.mjs.map +1 -0
- package/dist/hero-Dn37il-9.d.mts +31 -0
- package/dist/hero-Dn37il-9.d.ts +31 -0
- package/dist/index.d.mts +10 -3
- package/dist/index.d.ts +10 -3
- package/dist/index.js +2675 -131
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2621 -134
- package/dist/index.mjs.map +1 -1
- package/dist/mdx.d.mts +58 -0
- package/dist/mdx.d.ts +58 -0
- package/dist/mdx.js +1719 -0
- package/dist/mdx.js.map +1 -0
- package/dist/mdx.mjs +1692 -0
- package/dist/mdx.mjs.map +1 -0
- package/dist/primitives.d.mts +22 -5
- package/dist/primitives.d.ts +22 -5
- package/dist/primitives.js +51 -5
- package/dist/primitives.js.map +1 -1
- package/dist/primitives.mjs +51 -7
- package/dist/primitives.mjs.map +1 -1
- package/dist/session.d.mts +18 -0
- package/dist/session.d.ts +18 -0
- package/dist/session.js +432 -0
- package/dist/session.js.map +1 -0
- package/dist/session.mjs +401 -0
- package/dist/session.mjs.map +1 -0
- package/dist/styles/code.css +97 -0
- package/dist/styles/theme.css +2 -0
- package/dist/styles/tokens.css +40 -0
- package/dist/styles.css +1 -0
- package/dist/tool-shell-B1C7ahKE.d.ts +81 -0
- package/dist/tool-shell-BDx_N5ai.d.mts +81 -0
- package/dist/tools-BggNN5DV.d.ts +131 -0
- package/dist/tools-DFIxIj5p.d.mts +131 -0
- package/package.json +31 -2
package/dist/code.d.mts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
type TokenKind = 'keyword' | 'string' | 'number' | 'function' | 'type' | 'property' | 'comment' | 'tag' | 'url';
|
|
2
|
+
interface Token {
|
|
3
|
+
text: string;
|
|
4
|
+
kind?: TokenKind;
|
|
5
|
+
}
|
|
6
|
+
type CodeLine = Token[];
|
|
7
|
+
declare const TOKEN_CLASS: Record<TokenKind, string>;
|
|
8
|
+
type Grammar = 'js' | 'json' | 'shell' | 'python' | 'yaml' | 'diff' | 'plain';
|
|
9
|
+
declare const CODE_LANGS: readonly string[];
|
|
10
|
+
declare function grammarOf(lang?: string | null): Grammar;
|
|
11
|
+
declare function highlight(code: string, lang?: string | null): CodeLine[];
|
|
12
|
+
type DiffMark = 'add' | 'remove';
|
|
13
|
+
interface LineMarks {
|
|
14
|
+
highlight?: ReadonlySet<number>;
|
|
15
|
+
diff?: ReadonlyMap<number, DiffMark>;
|
|
16
|
+
}
|
|
17
|
+
declare function readDiff(code: string): {
|
|
18
|
+
code: string;
|
|
19
|
+
diff: Map<number, DiffMark>;
|
|
20
|
+
};
|
|
21
|
+
declare function parseLineRanges(spec: string | readonly number[] | undefined | null): Set<number>;
|
|
22
|
+
interface CodeMeta {
|
|
23
|
+
title?: string;
|
|
24
|
+
highlight?: string;
|
|
25
|
+
diff?: boolean;
|
|
26
|
+
lineNumbers?: boolean;
|
|
27
|
+
}
|
|
28
|
+
declare function parseCodeMeta(meta?: string | null): CodeMeta;
|
|
29
|
+
declare function escapeHtml(s: string): string;
|
|
30
|
+
declare function linesToHtml(lines: CodeLine[], marks?: LineMarks): string;
|
|
31
|
+
declare function highlightToHtml(code: string, lang?: string | null, opts?: {
|
|
32
|
+
highlight?: string | readonly number[];
|
|
33
|
+
diff?: boolean;
|
|
34
|
+
}): string;
|
|
35
|
+
|
|
36
|
+
interface HastNode {
|
|
37
|
+
type: string;
|
|
38
|
+
tagName?: string;
|
|
39
|
+
value?: string;
|
|
40
|
+
properties?: Record<string, unknown>;
|
|
41
|
+
children?: HastNode[];
|
|
42
|
+
data?: {
|
|
43
|
+
meta?: string | null;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
interface RehypeCodeOptions {
|
|
47
|
+
tokenize?: (code: string, lang: string | undefined) => CodeLine[] | null;
|
|
48
|
+
skip?: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
declare function rehypeCode(options?: RehypeCodeOptions): (tree: HastNode) => void;
|
|
51
|
+
|
|
52
|
+
export { CODE_LANGS, type CodeLine, type CodeMeta, type DiffMark, type LineMarks, type RehypeCodeOptions, TOKEN_CLASS, type Token, type TokenKind, escapeHtml, grammarOf, highlight, highlightToHtml, linesToHtml, parseCodeMeta, parseLineRanges, readDiff, rehypeCode };
|
package/dist/code.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
type TokenKind = 'keyword' | 'string' | 'number' | 'function' | 'type' | 'property' | 'comment' | 'tag' | 'url';
|
|
2
|
+
interface Token {
|
|
3
|
+
text: string;
|
|
4
|
+
kind?: TokenKind;
|
|
5
|
+
}
|
|
6
|
+
type CodeLine = Token[];
|
|
7
|
+
declare const TOKEN_CLASS: Record<TokenKind, string>;
|
|
8
|
+
type Grammar = 'js' | 'json' | 'shell' | 'python' | 'yaml' | 'diff' | 'plain';
|
|
9
|
+
declare const CODE_LANGS: readonly string[];
|
|
10
|
+
declare function grammarOf(lang?: string | null): Grammar;
|
|
11
|
+
declare function highlight(code: string, lang?: string | null): CodeLine[];
|
|
12
|
+
type DiffMark = 'add' | 'remove';
|
|
13
|
+
interface LineMarks {
|
|
14
|
+
highlight?: ReadonlySet<number>;
|
|
15
|
+
diff?: ReadonlyMap<number, DiffMark>;
|
|
16
|
+
}
|
|
17
|
+
declare function readDiff(code: string): {
|
|
18
|
+
code: string;
|
|
19
|
+
diff: Map<number, DiffMark>;
|
|
20
|
+
};
|
|
21
|
+
declare function parseLineRanges(spec: string | readonly number[] | undefined | null): Set<number>;
|
|
22
|
+
interface CodeMeta {
|
|
23
|
+
title?: string;
|
|
24
|
+
highlight?: string;
|
|
25
|
+
diff?: boolean;
|
|
26
|
+
lineNumbers?: boolean;
|
|
27
|
+
}
|
|
28
|
+
declare function parseCodeMeta(meta?: string | null): CodeMeta;
|
|
29
|
+
declare function escapeHtml(s: string): string;
|
|
30
|
+
declare function linesToHtml(lines: CodeLine[], marks?: LineMarks): string;
|
|
31
|
+
declare function highlightToHtml(code: string, lang?: string | null, opts?: {
|
|
32
|
+
highlight?: string | readonly number[];
|
|
33
|
+
diff?: boolean;
|
|
34
|
+
}): string;
|
|
35
|
+
|
|
36
|
+
interface HastNode {
|
|
37
|
+
type: string;
|
|
38
|
+
tagName?: string;
|
|
39
|
+
value?: string;
|
|
40
|
+
properties?: Record<string, unknown>;
|
|
41
|
+
children?: HastNode[];
|
|
42
|
+
data?: {
|
|
43
|
+
meta?: string | null;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
interface RehypeCodeOptions {
|
|
47
|
+
tokenize?: (code: string, lang: string | undefined) => CodeLine[] | null;
|
|
48
|
+
skip?: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
declare function rehypeCode(options?: RehypeCodeOptions): (tree: HastNode) => void;
|
|
51
|
+
|
|
52
|
+
export { CODE_LANGS, type CodeLine, type CodeMeta, type DiffMark, type LineMarks, type RehypeCodeOptions, TOKEN_CLASS, type Token, type TokenKind, escapeHtml, grammarOf, highlight, highlightToHtml, linesToHtml, parseCodeMeta, parseLineRanges, readDiff, rehypeCode };
|
package/dist/code.js
ADDED
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/code/highlight.ts
|
|
4
|
+
var TOKEN_CLASS = {
|
|
5
|
+
keyword: "oca-k",
|
|
6
|
+
string: "oca-s",
|
|
7
|
+
number: "oca-n",
|
|
8
|
+
function: "oca-f",
|
|
9
|
+
type: "oca-y",
|
|
10
|
+
property: "oca-p",
|
|
11
|
+
comment: "oca-c",
|
|
12
|
+
tag: "oca-g",
|
|
13
|
+
url: "oca-u"
|
|
14
|
+
};
|
|
15
|
+
var ALIASES = {
|
|
16
|
+
ts: "js",
|
|
17
|
+
typescript: "js",
|
|
18
|
+
tsx: "js",
|
|
19
|
+
js: "js",
|
|
20
|
+
javascript: "js",
|
|
21
|
+
jsx: "js",
|
|
22
|
+
mjs: "js",
|
|
23
|
+
cjs: "js",
|
|
24
|
+
json: "json",
|
|
25
|
+
jsonc: "json",
|
|
26
|
+
json5: "json",
|
|
27
|
+
bash: "shell",
|
|
28
|
+
sh: "shell",
|
|
29
|
+
shell: "shell",
|
|
30
|
+
zsh: "shell",
|
|
31
|
+
console: "shell",
|
|
32
|
+
terminal: "shell",
|
|
33
|
+
py: "python",
|
|
34
|
+
python: "python",
|
|
35
|
+
yaml: "yaml",
|
|
36
|
+
yml: "yaml",
|
|
37
|
+
diff: "diff"
|
|
38
|
+
};
|
|
39
|
+
var CODE_LANGS = Object.keys(ALIASES);
|
|
40
|
+
function grammarOf(lang) {
|
|
41
|
+
return lang && ALIASES[lang.toLowerCase()] || "plain";
|
|
42
|
+
}
|
|
43
|
+
function collector() {
|
|
44
|
+
const tokens = [];
|
|
45
|
+
const emit = (text, kind) => {
|
|
46
|
+
if (!text) return;
|
|
47
|
+
const last = tokens[tokens.length - 1];
|
|
48
|
+
if (last && last.kind === kind) last.text += text;
|
|
49
|
+
else tokens.push(kind ? { text, kind } : { text });
|
|
50
|
+
};
|
|
51
|
+
return { emit, tokens };
|
|
52
|
+
}
|
|
53
|
+
function at(re, src, i) {
|
|
54
|
+
re.lastIndex = i;
|
|
55
|
+
const m = re.exec(src);
|
|
56
|
+
return m ? m[0] : null;
|
|
57
|
+
}
|
|
58
|
+
var WS = /[ \t]+/y;
|
|
59
|
+
var NEWLINE = /\r?\n/y;
|
|
60
|
+
var JS_KEYWORDS = new Set(
|
|
61
|
+
"abstract as async await break case catch class const continue debugger declare default delete do else enum export extends finally for from function get if implements import in infer instanceof interface is keyof let module namespace new of override private protected public readonly return satisfies set static super switch this throw try type typeof unique var void while with yield".split(" ")
|
|
62
|
+
);
|
|
63
|
+
var JS_CONSTANTS = /* @__PURE__ */ new Set(["true", "false", "null", "undefined", "NaN", "Infinity"]);
|
|
64
|
+
var TS_PRIMITIVES = /* @__PURE__ */ new Set(["string", "number", "boolean", "bigint", "symbol", "object", "unknown", "any", "never"]);
|
|
65
|
+
var isConstant = (m) => /^[A-Z][A-Z\d_]+$/.test(m) && (m.includes("_") || m.length > 4);
|
|
66
|
+
var JS_LINE_COMMENT = /\/\/[^\n]*/y;
|
|
67
|
+
var JS_BLOCK_COMMENT = /\/\*[\s\S]*?(?:\*\/|$)/y;
|
|
68
|
+
var JS_TEMPLATE = /`(?:\\[\s\S]|[^\\`])*`?/y;
|
|
69
|
+
var JS_STRING = /'(?:\\.|[^\\'\n])*'?|"(?:\\.|[^\\"\n])*"?/y;
|
|
70
|
+
var JS_NUMBER = /(?:0[xX][\da-fA-F_]+|0[bB][01_]+|0[oO][0-7_]+|\d[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?\d+)?|\.\d[\d_]*(?:[eE][+-]?\d+)?)n?/y;
|
|
71
|
+
var JS_IDENT = /[A-Za-z_$][\w$]*/y;
|
|
72
|
+
var JS_DECORATOR = /@[A-Za-z_$][\w$.]*/y;
|
|
73
|
+
var JS_CALL_AFTER = /\s*(?:<[\w$\s,.[\]|&'"]*>)?\s*\(/y;
|
|
74
|
+
var JS_TAG = /<\/?(?=[A-Za-z])/y;
|
|
75
|
+
var JS_TAG_NAME = /[A-Za-z][\w$.:-]*/y;
|
|
76
|
+
var JS_PUNCT = /=>|\.\.\.|[{}()[\];,.<>=+\-*/%!?:&|^~#]/y;
|
|
77
|
+
var JSX_BEFORE = /* @__PURE__ */ new Set(["(", ",", "=", "?", ":", "{", "[", ";", ">", "&&", "||", "=>", "return"]);
|
|
78
|
+
function scanJs(src, emit, jsx) {
|
|
79
|
+
let i = 0;
|
|
80
|
+
let prev = "";
|
|
81
|
+
let tagDepth = 0;
|
|
82
|
+
let braceInTag = 0;
|
|
83
|
+
const sig = (t) => {
|
|
84
|
+
prev = t;
|
|
85
|
+
};
|
|
86
|
+
while (i < src.length) {
|
|
87
|
+
let m;
|
|
88
|
+
if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {
|
|
89
|
+
emit(m);
|
|
90
|
+
i += m.length;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {
|
|
94
|
+
emit(m, "comment");
|
|
95
|
+
i += m.length;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if ((m = at(JS_TEMPLATE, src, i)) || (m = at(JS_STRING, src, i))) {
|
|
99
|
+
emit(m, "string");
|
|
100
|
+
i += m.length;
|
|
101
|
+
sig('"');
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (jsx && tagDepth === 0 && (m = at(JS_TAG, src, i)) && (prev === "" || JSX_BEFORE.has(prev))) {
|
|
105
|
+
const name = at(JS_TAG_NAME, src, i + m.length);
|
|
106
|
+
if (name) {
|
|
107
|
+
emit(m);
|
|
108
|
+
emit(name, "tag");
|
|
109
|
+
i += m.length + name.length;
|
|
110
|
+
tagDepth = 1;
|
|
111
|
+
braceInTag = 0;
|
|
112
|
+
sig("tag");
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (jsx && tagDepth > 0 && braceInTag === 0) {
|
|
117
|
+
if (src.startsWith("/>", i) || src[i] === ">") {
|
|
118
|
+
const close = src[i] === ">" ? ">" : "/>";
|
|
119
|
+
emit(close);
|
|
120
|
+
i += close.length;
|
|
121
|
+
tagDepth = 0;
|
|
122
|
+
sig(">");
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if ((m = at(JS_IDENT, src, i)) && /^\s*=/.test(src.slice(i + m.length, i + m.length + 4))) {
|
|
126
|
+
emit(m, "property");
|
|
127
|
+
i += m.length;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (m = at(JS_IDENT, src, i)) {
|
|
131
|
+
emit(m, "property");
|
|
132
|
+
i += m.length;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (src[i] === "{") braceInTag = 1;
|
|
136
|
+
} else if (jsx && tagDepth > 0 && braceInTag > 0) {
|
|
137
|
+
if (src[i] === "{") braceInTag++;
|
|
138
|
+
else if (src[i] === "}") braceInTag--;
|
|
139
|
+
}
|
|
140
|
+
if (m = at(JS_DECORATOR, src, i)) {
|
|
141
|
+
emit(m, "function");
|
|
142
|
+
i += m.length;
|
|
143
|
+
sig("@");
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (m = at(JS_IDENT, src, i)) {
|
|
147
|
+
const end = i + m.length;
|
|
148
|
+
let kind;
|
|
149
|
+
if (prev !== "." && JS_CONSTANTS.has(m)) kind = "number";
|
|
150
|
+
else if (prev !== "." && JS_KEYWORDS.has(m)) kind = "keyword";
|
|
151
|
+
else if (at(JS_CALL_AFTER, src, end) !== null) kind = "function";
|
|
152
|
+
else if (prev !== "." && TS_PRIMITIVES.has(m)) kind = "type";
|
|
153
|
+
else if (isConstant(m)) kind = "number";
|
|
154
|
+
else if (/^[A-Z]/.test(m)) kind = "type";
|
|
155
|
+
emit(m, kind);
|
|
156
|
+
i = end;
|
|
157
|
+
sig(kind === "keyword" ? m : "id");
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (m = at(JS_NUMBER, src, i)) {
|
|
161
|
+
emit(m, "number");
|
|
162
|
+
i += m.length;
|
|
163
|
+
sig("0");
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (m = at(JS_PUNCT, src, i)) {
|
|
167
|
+
emit(m);
|
|
168
|
+
i += m.length;
|
|
169
|
+
sig(m === "." ? "." : m);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
emit(src[i]);
|
|
173
|
+
i++;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
var JSON_STRING = /"(?:\\.|[^\\"\n])*"?/y;
|
|
177
|
+
var JSON_KEY_AFTER = /\s*:/y;
|
|
178
|
+
var JSON_NUMBER = /-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/y;
|
|
179
|
+
var JSON_WORD = /true|false|null/y;
|
|
180
|
+
function scanJson(src, emit) {
|
|
181
|
+
let i = 0;
|
|
182
|
+
while (i < src.length) {
|
|
183
|
+
let m;
|
|
184
|
+
if ((m = at(JS_LINE_COMMENT, src, i)) || (m = at(JS_BLOCK_COMMENT, src, i))) {
|
|
185
|
+
emit(m, "comment");
|
|
186
|
+
} else if (m = at(JSON_STRING, src, i)) {
|
|
187
|
+
emit(m, at(JSON_KEY_AFTER, src, i + m.length) !== null ? "property" : "string");
|
|
188
|
+
} else if ((m = at(JSON_NUMBER, src, i)) || (m = at(JSON_WORD, src, i))) {
|
|
189
|
+
emit(m, "number");
|
|
190
|
+
} else {
|
|
191
|
+
m = src[i];
|
|
192
|
+
emit(m);
|
|
193
|
+
}
|
|
194
|
+
i += m.length;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
var SH_KEYWORDS = new Set(
|
|
198
|
+
"if then else elif fi for in do done case esac while until function return export local select time".split(" ")
|
|
199
|
+
);
|
|
200
|
+
var SH_PROMPT = /\$ (?=\S)/y;
|
|
201
|
+
var SH_COMMENT = /#[^\n]*/y;
|
|
202
|
+
var SH_SINGLE = /'[^']*'?/y;
|
|
203
|
+
var SH_DOUBLE = /"(?:\\.|[^\\"])*"?/y;
|
|
204
|
+
var SH_VAR = /\$(?:\{[^}\n]*\}?|[A-Za-z_][\w]*|[@*#?$!\d])/y;
|
|
205
|
+
var SH_URL = /https?:\/\/[^\s'"`)]+/y;
|
|
206
|
+
var SH_FLAG = /--?[A-Za-z][\w-]*/y;
|
|
207
|
+
var SH_ASSIGN = /[A-Za-z_][\w]*(?==)/y;
|
|
208
|
+
var SH_VALUE = /=[^\s|&;()<>'"`$]*/y;
|
|
209
|
+
var SH_WORD = /[^\s|&;()<>'"`$#]+/y;
|
|
210
|
+
var SH_OPERATOR = /\|\||&&|[|;&]|\$\(|[()<>]/y;
|
|
211
|
+
function scanShell(src, emit) {
|
|
212
|
+
let i = 0;
|
|
213
|
+
let command = true;
|
|
214
|
+
let lineStart = true;
|
|
215
|
+
while (i < src.length) {
|
|
216
|
+
let m;
|
|
217
|
+
if (m = at(NEWLINE, src, i)) {
|
|
218
|
+
emit(m);
|
|
219
|
+
i += m.length;
|
|
220
|
+
command = !/\\\s*$/.test(src.slice(0, i - m.length));
|
|
221
|
+
lineStart = true;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (m = at(WS, src, i)) {
|
|
225
|
+
emit(m);
|
|
226
|
+
i += m.length;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (lineStart && (m = at(SH_PROMPT, src, i))) {
|
|
230
|
+
emit(m, "comment");
|
|
231
|
+
i += m.length;
|
|
232
|
+
lineStart = false;
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
lineStart = false;
|
|
236
|
+
if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\s/.test(src[i - 1]))) {
|
|
237
|
+
emit(m, "comment");
|
|
238
|
+
i += m.length;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if ((m = at(SH_SINGLE, src, i)) || (m = at(SH_DOUBLE, src, i))) {
|
|
242
|
+
emit(m, "string");
|
|
243
|
+
i += m.length;
|
|
244
|
+
command = false;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (m = at(SH_OPERATOR, src, i)) {
|
|
248
|
+
emit(m);
|
|
249
|
+
i += m.length;
|
|
250
|
+
command = m !== ")" && m !== ">" && m !== "<";
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (m = at(SH_VAR, src, i)) {
|
|
254
|
+
emit(m, "type");
|
|
255
|
+
i += m.length;
|
|
256
|
+
command = false;
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (m = at(SH_URL, src, i)) {
|
|
260
|
+
emit(m, "url");
|
|
261
|
+
i += m.length;
|
|
262
|
+
command = false;
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
if (command && (m = at(SH_ASSIGN, src, i))) {
|
|
266
|
+
emit(m, "property");
|
|
267
|
+
i += m.length;
|
|
268
|
+
const v = at(SH_VALUE, src, i);
|
|
269
|
+
emit(v);
|
|
270
|
+
i += v.length;
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if ((m = at(SH_FLAG, src, i)) && !command) {
|
|
274
|
+
emit(m, "keyword");
|
|
275
|
+
i += m.length;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (m = at(SH_WORD, src, i)) {
|
|
279
|
+
if (command && SH_KEYWORDS.has(m)) emit(m, "keyword");
|
|
280
|
+
else if (command) {
|
|
281
|
+
emit(m, "function");
|
|
282
|
+
command = m === "sudo" || m === "npx" || m === "env" || m === "time";
|
|
283
|
+
i += m.length;
|
|
284
|
+
continue;
|
|
285
|
+
} else emit(m);
|
|
286
|
+
i += m.length;
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
emit(src[i]);
|
|
290
|
+
i++;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
var PY_KEYWORDS = new Set(
|
|
294
|
+
"and as assert async await break class continue def del elif else except finally for from global if import in is lambda match case nonlocal not or pass raise return try while with yield self cls".split(" ")
|
|
295
|
+
);
|
|
296
|
+
var PY_CONSTANTS = /* @__PURE__ */ new Set(["True", "False", "None"]);
|
|
297
|
+
var PY_TYPES = /* @__PURE__ */ new Set(["int", "str", "bool", "float", "bytes", "list", "dict", "tuple", "set", "object"]);
|
|
298
|
+
var PY_COMMENT = /#[^\n]*/y;
|
|
299
|
+
var PY_TRIPLE = /[rRbBuUfF]{0,2}(?:"""[\s\S]*?(?:"""|$)|'''[\s\S]*?(?:'''|$))/y;
|
|
300
|
+
var PY_STRING = /[rRbBuUfF]{0,2}(?:'(?:\\.|[^\\'\n])*'?|"(?:\\.|[^\\"\n])*"?)/y;
|
|
301
|
+
var PY_NUMBER = /(?:0[xX][\da-fA-F_]+|\d[\d_]*(?:\.[\d_]*)?(?:[eE][+-]?\d+)?j?)/y;
|
|
302
|
+
var PY_IDENT = /[A-Za-z_]\w*/y;
|
|
303
|
+
var PY_DECORATOR = /@[A-Za-z_][\w.]*/y;
|
|
304
|
+
var PY_CALL_AFTER = /\s*\(/y;
|
|
305
|
+
function scanPython(src, emit) {
|
|
306
|
+
let i = 0;
|
|
307
|
+
let prev = "";
|
|
308
|
+
while (i < src.length) {
|
|
309
|
+
let m;
|
|
310
|
+
if ((m = at(WS, src, i)) || (m = at(NEWLINE, src, i))) {
|
|
311
|
+
emit(m);
|
|
312
|
+
i += m.length;
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
if (m = at(PY_COMMENT, src, i)) {
|
|
316
|
+
emit(m, "comment");
|
|
317
|
+
} else if ((m = at(PY_TRIPLE, src, i)) || (m = at(PY_STRING, src, i))) {
|
|
318
|
+
if (/^[A-Za-z]+$/.test(m)) {
|
|
319
|
+
emit(m);
|
|
320
|
+
} else emit(m, "string");
|
|
321
|
+
prev = '"';
|
|
322
|
+
} else if (m = at(PY_DECORATOR, src, i)) {
|
|
323
|
+
emit(m, "function");
|
|
324
|
+
prev = "@";
|
|
325
|
+
} else if (m = at(PY_IDENT, src, i)) {
|
|
326
|
+
let kind;
|
|
327
|
+
if (PY_CONSTANTS.has(m)) kind = "number";
|
|
328
|
+
else if (prev !== "." && PY_KEYWORDS.has(m)) kind = "keyword";
|
|
329
|
+
else if (prev === "def" || at(PY_CALL_AFTER, src, i + m.length) !== null) kind = "function";
|
|
330
|
+
else if (prev === "class" || /^[A-Z][a-z]/.test(m) || PY_TYPES.has(m)) kind = "type";
|
|
331
|
+
else if (isConstant(m)) kind = "number";
|
|
332
|
+
emit(m, kind);
|
|
333
|
+
prev = kind === "keyword" ? m : "id";
|
|
334
|
+
} else if (m = at(PY_NUMBER, src, i)) {
|
|
335
|
+
emit(m, "number");
|
|
336
|
+
prev = "0";
|
|
337
|
+
} else {
|
|
338
|
+
m = src[i];
|
|
339
|
+
emit(m);
|
|
340
|
+
prev = m;
|
|
341
|
+
}
|
|
342
|
+
i += m.length;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
var YAML_KEY = /[ \t]*(?:- )?[\w.$/-]+(?=[ \t]*:(?:\s|$))/y;
|
|
346
|
+
var YAML_VALUE_WORD = /(?:true|false|null|yes|no|~|-?\d+(?:\.\d+)?)(?=\s*(?:#|$))/y;
|
|
347
|
+
function scanYaml(src, emit) {
|
|
348
|
+
let i = 0;
|
|
349
|
+
let lineStart = true;
|
|
350
|
+
while (i < src.length) {
|
|
351
|
+
let m;
|
|
352
|
+
if (m = at(NEWLINE, src, i)) {
|
|
353
|
+
emit(m);
|
|
354
|
+
i += m.length;
|
|
355
|
+
lineStart = true;
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
if (lineStart && (m = at(YAML_KEY, src, i))) {
|
|
359
|
+
const dash = m.match(/^([ \t]*(?:- )?)/)[1];
|
|
360
|
+
emit(dash);
|
|
361
|
+
emit(m.slice(dash.length), "property");
|
|
362
|
+
i += m.length;
|
|
363
|
+
lineStart = false;
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
lineStart = false;
|
|
367
|
+
if ((m = at(SH_COMMENT, src, i)) && (i === 0 || /\s/.test(src[i - 1]))) emit(m, "comment");
|
|
368
|
+
else if ((m = at(SH_SINGLE, src, i)) || (m = at(JSON_STRING, src, i))) emit(m, "string");
|
|
369
|
+
else if (m = at(YAML_VALUE_WORD, src, i)) emit(m, "number");
|
|
370
|
+
else if (m = at(SH_URL, src, i)) emit(m, "url");
|
|
371
|
+
else {
|
|
372
|
+
m = src[i];
|
|
373
|
+
emit(m);
|
|
374
|
+
}
|
|
375
|
+
i += m.length;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
function toLines(tokens) {
|
|
379
|
+
const lines = [[]];
|
|
380
|
+
for (const t of tokens) {
|
|
381
|
+
const parts = t.text.split(/\r?\n/);
|
|
382
|
+
parts.forEach((part, j) => {
|
|
383
|
+
if (j > 0) lines.push([]);
|
|
384
|
+
if (part) lines[lines.length - 1].push(t.kind ? { text: part, kind: t.kind } : { text: part });
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
return lines;
|
|
388
|
+
}
|
|
389
|
+
function highlight(code, lang) {
|
|
390
|
+
const src = code.replace(/\r?\n$/, "");
|
|
391
|
+
const grammar = grammarOf(lang);
|
|
392
|
+
const { emit, tokens } = collector();
|
|
393
|
+
const name = (lang ?? "").toLowerCase();
|
|
394
|
+
switch (grammar) {
|
|
395
|
+
case "js":
|
|
396
|
+
scanJs(src, emit, name === "tsx" || name === "jsx");
|
|
397
|
+
break;
|
|
398
|
+
case "json":
|
|
399
|
+
scanJson(src, emit);
|
|
400
|
+
break;
|
|
401
|
+
case "shell":
|
|
402
|
+
scanShell(src, emit);
|
|
403
|
+
break;
|
|
404
|
+
case "python":
|
|
405
|
+
scanPython(src, emit);
|
|
406
|
+
break;
|
|
407
|
+
case "yaml":
|
|
408
|
+
scanYaml(src, emit);
|
|
409
|
+
break;
|
|
410
|
+
default:
|
|
411
|
+
emit(src);
|
|
412
|
+
}
|
|
413
|
+
return toLines(tokens);
|
|
414
|
+
}
|
|
415
|
+
function readDiff(code) {
|
|
416
|
+
const diff = /* @__PURE__ */ new Map();
|
|
417
|
+
const lines = code.replace(/\r?\n$/, "").split(/\r?\n/);
|
|
418
|
+
const out = lines.map((line, i) => {
|
|
419
|
+
const c = line[0];
|
|
420
|
+
if (c === "+" || c === "-") {
|
|
421
|
+
diff.set(i + 1, c === "+" ? "add" : "remove");
|
|
422
|
+
return line.slice(1);
|
|
423
|
+
}
|
|
424
|
+
return c === " " ? line.slice(1) : line;
|
|
425
|
+
});
|
|
426
|
+
return { code: out.join("\n"), diff };
|
|
427
|
+
}
|
|
428
|
+
function parseLineRanges(spec) {
|
|
429
|
+
if (!spec) return /* @__PURE__ */ new Set();
|
|
430
|
+
if (typeof spec !== "string") return new Set(spec);
|
|
431
|
+
const out = /* @__PURE__ */ new Set();
|
|
432
|
+
for (const part of spec.split(",")) {
|
|
433
|
+
const m = part.trim().match(/^(\d+)(?:\s*-\s*(\d+))?$/);
|
|
434
|
+
if (!m) continue;
|
|
435
|
+
const a = Number(m[1]);
|
|
436
|
+
const b = m[2] ? Number(m[2]) : a;
|
|
437
|
+
for (let n = Math.min(a, b); n <= Math.max(a, b) && n - a < 1e4; n++) out.add(n);
|
|
438
|
+
}
|
|
439
|
+
return out;
|
|
440
|
+
}
|
|
441
|
+
function parseCodeMeta(meta) {
|
|
442
|
+
if (!meta) return {};
|
|
443
|
+
const out = {};
|
|
444
|
+
const title = meta.match(/(?:title|filename)=(?:"([^"]*)"|'([^']*)'|(\S+))/);
|
|
445
|
+
if (title) out.title = title[1] ?? title[2] ?? title[3];
|
|
446
|
+
const lines = meta.match(/\{([\d,\s-]+)\}/);
|
|
447
|
+
if (lines) out.highlight = lines[1].replace(/\s+/g, "");
|
|
448
|
+
const rest = meta.replace(/(?:title|filename)=(?:"[^"]*"|'[^']*'|\S+)/, "");
|
|
449
|
+
if (/\bdiff\b/.test(rest)) out.diff = true;
|
|
450
|
+
if (/\b(?:showLineNumbers|lineNumbers|numbers)\b/.test(rest)) out.lineNumbers = true;
|
|
451
|
+
return out;
|
|
452
|
+
}
|
|
453
|
+
var ESCAPE = { "&": "&", "<": "<", ">": ">", '"': """ };
|
|
454
|
+
function escapeHtml(s) {
|
|
455
|
+
return s.replace(/[&<>"]/g, (c) => ESCAPE[c]);
|
|
456
|
+
}
|
|
457
|
+
function linesToHtml(lines, marks = {}) {
|
|
458
|
+
return lines.map((line, i) => {
|
|
459
|
+
const n = i + 1;
|
|
460
|
+
const attrs = [
|
|
461
|
+
'data-line=""',
|
|
462
|
+
marks.highlight?.has(n) ? 'data-mark=""' : "",
|
|
463
|
+
marks.diff?.has(n) ? `data-diff="${marks.diff.get(n)}"` : ""
|
|
464
|
+
].filter(Boolean).join(" ");
|
|
465
|
+
const body = line.map((t) => t.kind ? `<span class="${TOKEN_CLASS[t.kind]}">${escapeHtml(t.text)}</span>` : escapeHtml(t.text)).join("");
|
|
466
|
+
return `<span ${attrs}>${body}</span>`;
|
|
467
|
+
}).join("\n");
|
|
468
|
+
}
|
|
469
|
+
function highlightToHtml(code, lang, opts = {}) {
|
|
470
|
+
const d = opts.diff ? readDiff(code) : null;
|
|
471
|
+
return linesToHtml(highlight(d ? d.code : code, lang), {
|
|
472
|
+
highlight: parseLineRanges(opts.highlight),
|
|
473
|
+
diff: d?.diff
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// src/code/rehype.ts
|
|
478
|
+
function textOf(node) {
|
|
479
|
+
if (node.type === "text") return node.value ?? "";
|
|
480
|
+
return (node.children ?? []).map(textOf).join("");
|
|
481
|
+
}
|
|
482
|
+
function langOf(code) {
|
|
483
|
+
const cls = code.properties?.className;
|
|
484
|
+
const list = Array.isArray(cls) ? cls : typeof cls === "string" ? cls.split(" ") : [];
|
|
485
|
+
for (const c of list) {
|
|
486
|
+
const m = String(c).match(/^language-(.+)$/);
|
|
487
|
+
if (m) return m[1];
|
|
488
|
+
}
|
|
489
|
+
return void 0;
|
|
490
|
+
}
|
|
491
|
+
function rehypeCode(options = {}) {
|
|
492
|
+
const skip = new Set(options.skip ?? ["mermaid"]);
|
|
493
|
+
const visit = (node) => {
|
|
494
|
+
for (const child of node.children ?? []) {
|
|
495
|
+
const code = child.type === "element" && child.tagName === "pre" ? child.children?.[0] : void 0;
|
|
496
|
+
if (code && code.type === "element" && code.tagName === "code" && child.children?.length === 1) {
|
|
497
|
+
const lang = langOf(code);
|
|
498
|
+
if (lang && skip.has(lang)) continue;
|
|
499
|
+
const meta = parseCodeMeta(code.data?.meta);
|
|
500
|
+
let source = textOf(code);
|
|
501
|
+
const diff = meta.diff || lang === "diff" ? readDiff(source) : null;
|
|
502
|
+
if (diff) source = diff.code;
|
|
503
|
+
const lines = options.tokenize?.(source, lang) ?? highlight(source, lang === "diff" ? void 0 : lang);
|
|
504
|
+
child.properties = {
|
|
505
|
+
...child.properties,
|
|
506
|
+
dataOcaCode: "",
|
|
507
|
+
dataHtml: linesToHtml(lines, { highlight: parseLineRanges(meta.highlight), diff: diff?.diff }),
|
|
508
|
+
...lang ? { dataLang: lang } : {},
|
|
509
|
+
...meta.title ? { dataTitle: meta.title } : {},
|
|
510
|
+
...diff ? { dataDiff: "" } : {},
|
|
511
|
+
...meta.lineNumbers ? { dataLineNumbers: "" } : {}
|
|
512
|
+
};
|
|
513
|
+
child.children = [];
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
visit(child);
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
return (tree) => visit(tree);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
exports.CODE_LANGS = CODE_LANGS;
|
|
523
|
+
exports.TOKEN_CLASS = TOKEN_CLASS;
|
|
524
|
+
exports.escapeHtml = escapeHtml;
|
|
525
|
+
exports.grammarOf = grammarOf;
|
|
526
|
+
exports.highlight = highlight;
|
|
527
|
+
exports.highlightToHtml = highlightToHtml;
|
|
528
|
+
exports.linesToHtml = linesToHtml;
|
|
529
|
+
exports.parseCodeMeta = parseCodeMeta;
|
|
530
|
+
exports.parseLineRanges = parseLineRanges;
|
|
531
|
+
exports.readDiff = readDiff;
|
|
532
|
+
exports.rehypeCode = rehypeCode;
|
|
533
|
+
//# sourceMappingURL=code.js.map
|
|
534
|
+
//# sourceMappingURL=code.js.map
|