atdoc-core 0.1.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/LICENSE +21 -0
- package/README.md +33 -0
- package/configs/atdoc-setting.json +30 -0
- package/dist/Adapters.d.ts +18 -0
- package/dist/Adapters.d.ts.map +1 -0
- package/dist/Adapters.js +484 -0
- package/dist/Adapters.js.map +1 -0
- package/dist/Lexer.d.ts +23 -0
- package/dist/Lexer.d.ts.map +1 -0
- package/dist/Lexer.js +292 -0
- package/dist/Lexer.js.map +1 -0
- package/dist/Parser.d.ts +136 -0
- package/dist/Parser.d.ts.map +1 -0
- package/dist/Parser.js +797 -0
- package/dist/Parser.js.map +1 -0
- package/dist/Serializer.d.ts +97 -0
- package/dist/Serializer.d.ts.map +1 -0
- package/dist/Serializer.js +753 -0
- package/dist/Serializer.js.map +1 -0
- package/dist/editor/monarch.d.ts +17 -0
- package/dist/editor/monarch.d.ts.map +1 -0
- package/dist/editor/monarch.js +163 -0
- package/dist/editor/monarch.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +104 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +265 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/docs/en/Block-Syntax-Specification.md +992 -0
- package/docs/en/Inline-Syntax-Specification.md +915 -0
- package/docs/en/README.md +235 -0
- package/package.json +36 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 WEDC Studio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# @Doc β AI-Native Semantic Document Notation
|
|
2
|
+
|
|
3
|
+
<img src="https://wedc.cc/atd.png" width="64"/>
|
|
4
|
+
|
|
5
|
+
@Doc is a notation designed for three readers: humans who write content, AI that generates content, and compilers that render content. It is not the next Markdown β it's the missing notation layer between LLM-generated content and render targets.
|
|
6
|
+
|
|
7
|
+
Start with the [English documentation](docs/en/README.md). Chinese translations and other language editions are also available:
|
|
8
|
+
|
|
9
|
+
| Language | README | Block Syntax Spec | Inline Syntax Spec |
|
|
10
|
+
|:---|:---|:---|:---|
|
|
11
|
+
| πΊπΈ English | [README](docs/en/README.md) | [Block-Syntax-Specification](docs/en/Block-Syntax-Specification.md) | [Inline-Syntax-Specification](docs/en/Inline-Syntax-Specification.md) |
|
|
12
|
+
| πΉπΌ Traditional Chinese | [README](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/zh-tw/README.md) | [Block-Syntax-Specification](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/zh-tw/Block-Syntax-Specification.md) | [Inline-Syntax-Specification](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/zh-tw/Inline-Syntax-Specification.md) |
|
|
13
|
+
| π¨π³ Simplified Chinese | [README](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/zh-cn/README.md) | [Block-Syntax-Specification](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/zh-cn/Block-Syntax-Specification.md) | [Inline-Syntax-Specification](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/zh-cn/Inline-Syntax-Specification.md) |
|
|
14
|
+
| π―π΅ Japanese <sub>(AI translation; may contain errors)</sub> | [README](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/ja/README.md) | [Block-Syntax-Specification](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/ja/Block-Syntax-Specification.md) | [Inline-Syntax-Specification](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/ja/Inline-Syntax-Specification.md) |
|
|
15
|
+
| π°π· Korean <sub>(AI translation; may contain errors)</sub> | [README](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/ko/README.md) | [Block-Syntax-Specification](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/ko/Block-Syntax-Specification.md) | [Inline-Syntax-Specification](https://github.com/WEDC-Studio-Official/AtDoc/blob/main/docs/ko/Inline-Syntax-Specification.md) |
|
|
16
|
+
|
|
17
|
+
English is the primary language for the package and its documentation; Chinese is secondary. The two `*-Specification.md` files in each language folder describe the grammar (EBNF + semantic rules) for that language edition.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## What's in here
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
src/ Lexer, Parser, registry (single source of truth for nodes), Adapters (two HTML render routes)
|
|
25
|
+
src/editor/ Monarch tokenizer for Monaco-style editors
|
|
26
|
+
tests/ Strict Mode test cases for the Lexer/Parser, plus render verification for each node
|
|
27
|
+
configs/ Node configuration for editor/tooling
|
|
28
|
+
docs/<lang>/ Per-language documentation (README + the two grammar specifications)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## License
|
|
32
|
+
|
|
33
|
+
MIT β see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "AtDoc",
|
|
3
|
+
"extensions": [".atd"],
|
|
4
|
+
"specialRules": {
|
|
5
|
+
"voidNodes": ["hr", "n"],
|
|
6
|
+
"contextNodes": ["tab", "cols", "data"],
|
|
7
|
+
"rawNodes": ["code", "mermaid", "svg", "raw", "kbd", "fn"],
|
|
8
|
+
"escapeSymbols": ["@@"],
|
|
9
|
+
"rawEscapeNodes": ["raw"],
|
|
10
|
+
"rawEscapeSymbols": ["@@]", "@@[", "@]", "@["],
|
|
11
|
+
"strongQuote": { "open": "{[", "close": "]}" }
|
|
12
|
+
},
|
|
13
|
+
"tokenGroups": {
|
|
14
|
+
"Metadata": {
|
|
15
|
+
"metaKeywords": ["meta"]
|
|
16
|
+
},
|
|
17
|
+
"Block": {
|
|
18
|
+
"structuralKeywords": ["heading", "h", "paragraph", "p", "quote", "list", "code", "img", "table", "cols", "data", "hr", "svg"],
|
|
19
|
+
"containerKeywords": ["details", "card"],
|
|
20
|
+
"calloutKeywords": ["note", "tip", "important", "warning", "caution"],
|
|
21
|
+
"widgetKeywords": ["tabs", "tab", "mermaid"]
|
|
22
|
+
},
|
|
23
|
+
"Inline": {
|
|
24
|
+
"formatKeywords": ["mark", "color", "bordered", "bold", "b", "italic", "i", "underline", "u", "del", "raw"],
|
|
25
|
+
"semanticKeywords": ["sup", "sub", "kbd", "link"],
|
|
26
|
+
"footnoteKeywords": ["fn", "defn"],
|
|
27
|
+
"specialKeywords": ["n"]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DocASTNode } from './types';
|
|
2
|
+
type Route = 'tailwind' | 'inline';
|
|
3
|
+
export declare class DocTranspiler {
|
|
4
|
+
/** Route A β class-driven (Tailwind-style) output. */
|
|
5
|
+
static toTailwindHTML(node: DocASTNode): string;
|
|
6
|
+
/** Route B β inline-style output, for universal/legacy targets. */
|
|
7
|
+
static toInlineStyleHTML(node: DocASTNode): string;
|
|
8
|
+
/**
|
|
9
|
+
* Collects every @defn in the document and renders them as one real
|
|
10
|
+
* <ol> at the call site's choosing (normally once, after the full
|
|
11
|
+
* document body) β see the 'defn' case in renderNode() for why in-place
|
|
12
|
+
* rendering isn't an option. Returns '' when the document has no
|
|
13
|
+
* footnotes, so callers can append unconditionally.
|
|
14
|
+
*/
|
|
15
|
+
static renderFootnotes(nodes: DocASTNode[], route: Route): string;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=Adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Adapters.d.ts","sourceRoot":"","sources":["../src/Adapters.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,KAAK,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;AAscnC,qBAAa,aAAa;IACxB,sDAAsD;IACtD,OAAc,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAErD;IAED,mEAAmE;IACnE,OAAc,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAExD;IAED;;;;;;OAMG;IACH,OAAc,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAKvE;CACF"}
|
package/dist/Adapters.js
ADDED
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
// Adapters β render a DocASTNode tree to HTML.
|
|
2
|
+
//
|
|
3
|
+
// Tag choices follow the "Renderer Independence" examples already committed
|
|
4
|
+
// to in the syntax/ reference docs (Structural-Blocks.md Β§6, Container-Blocks.md
|
|
5
|
+
// Β§7, Callout-Blocks.md Β§8, Widget-Blocks.md Β§6, Text-Formatting.md Β§7,
|
|
6
|
+
// Semantic-Inline.md Β§6, Footnotes.md Β§7, Special-Nodes.md Β§8) β this file
|
|
7
|
+
// exists to make those examples real, not to invent new ones.
|
|
8
|
+
//
|
|
9
|
+
// Two routes, differing only where the grammar actually has something to
|
|
10
|
+
// differ on β @mark's, @color's, and @bordered's color tokens (Inline Syntax
|
|
11
|
+
// Specification Β§7, Block Syntax Specification Β§4) and @card's Card Style v1
|
|
12
|
+
// tokens (Block Syntax Specification Β§6) are the only per-instance style
|
|
13
|
+
// slots this Adapter maps to output with a real Route A/B split (class-driven
|
|
14
|
+
// vs inline CSS). @img's Image Style v1 (Β§5, resolveImageStyles()) is also
|
|
15
|
+
// mapped, but always as inline style on both routes β same as the pre-existing
|
|
16
|
+
// "(radius=...,border=...)" image options it layers on top of, no Tailwind
|
|
17
|
+
// class equivalent attempted. @details and the Callout Blocks also carry a
|
|
18
|
+
// parsed `styles` slot (registry.ts `styles: true`) but this Adapter doesn't
|
|
19
|
+
// yet map it to visual output. Everything else renders identically on both routes.
|
|
20
|
+
function escapeHtml(s) {
|
|
21
|
+
return s
|
|
22
|
+
.replace(/&/g, '&')
|
|
23
|
+
.replace(/</g, '<')
|
|
24
|
+
.replace(/>/g, '>')
|
|
25
|
+
.replace(/"/g, '"');
|
|
26
|
+
}
|
|
27
|
+
// Word's actual Text Highlight Color swatches (Home > Text Highlight Color),
|
|
28
|
+
// not a muted/pastel reinterpretation β index.css's `.mark-<token>` classes
|
|
29
|
+
// (Route A) mirror these exact values, and `mark` there forces black ink on
|
|
30
|
+
// top of them the same way Word never recolors text to match the highlight
|
|
31
|
+
// it sits on. orange has no Word highlighter swatch (only 15 fixed colors,
|
|
32
|
+
// none named "orange") β borrowed from Word's Standard Colors row instead.
|
|
33
|
+
const MARK_COLORS = {
|
|
34
|
+
yellow: '#FFFF00',
|
|
35
|
+
red: '#FF0000',
|
|
36
|
+
green: '#00FF00',
|
|
37
|
+
blue: '#0000FF',
|
|
38
|
+
orange: '#FFC000',
|
|
39
|
+
purple: '#800080',
|
|
40
|
+
gray: '#808080',
|
|
41
|
+
};
|
|
42
|
+
// @color's own named-token palette β deliberately a separate table from
|
|
43
|
+
// MARK_COLORS: those are Word's highlight-background swatches, and would read
|
|
44
|
+
// as low-contrast, barely-visible text if reused here as a foreground color,
|
|
45
|
+
// so @color gets Word's Font Color "Standard Colors" row instead β the same
|
|
46
|
+
// per-key split, just Word's other palette rather than a softened one.
|
|
47
|
+
// index.css's `.color-<token>`/`.bordered-<token>` classes mirror these.
|
|
48
|
+
const COLOR_PRESETS = {
|
|
49
|
+
yellow: '#FFFF00',
|
|
50
|
+
red: '#FF0000',
|
|
51
|
+
green: '#00B050',
|
|
52
|
+
blue: '#0070C0',
|
|
53
|
+
orange: '#FFC000',
|
|
54
|
+
purple: '#7030A0',
|
|
55
|
+
gray: '#808080',
|
|
56
|
+
};
|
|
57
|
+
const HEX_COLOR = /^#[0-9a-fA-F]{6}$/;
|
|
58
|
+
const RADIUS_TOKEN = /^radius-(\d+)$/;
|
|
59
|
+
/**
|
|
60
|
+
* @mark's {styles} color-token resolver β accepts either a named token
|
|
61
|
+
* (Inline Syntax Specification Β§7) or a literal "#RRGGBB" hex token.
|
|
62
|
+
* Unknown/malformed tokens resolve to undefined so callers can fall back
|
|
63
|
+
* silently, per Β§6 Unknown Command Fallback's ignore-don't-throw spirit.
|
|
64
|
+
*/
|
|
65
|
+
function resolveColorToken(token) {
|
|
66
|
+
if (!token)
|
|
67
|
+
return undefined;
|
|
68
|
+
if (HEX_COLOR.test(token))
|
|
69
|
+
return token;
|
|
70
|
+
return MARK_COLORS[token];
|
|
71
|
+
}
|
|
72
|
+
/** Same idea as resolveColorToken(), but for @color's own {styles} slot and its separate, darker palette (COLOR_PRESETS). */
|
|
73
|
+
function resolveColorPreset(token) {
|
|
74
|
+
if (!token)
|
|
75
|
+
return undefined;
|
|
76
|
+
if (HEX_COLOR.test(token))
|
|
77
|
+
return token;
|
|
78
|
+
return COLOR_PRESETS[token];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* @card's {styles} resolver β Card Style v1 (Container-Blocks.md Β§4 Card).
|
|
82
|
+
* Deliberately a closed, cross-platform set of two token shapes, not a CSS
|
|
83
|
+
* escape hatch: a literal "#RRGGBB" hex token for background-color, and a
|
|
84
|
+
* "radius-N" token for a border-radius of N pixels. No named-token palette
|
|
85
|
+
* like @mark/@color have β either token may be present, absent, or both
|
|
86
|
+
* (comma-separated, order doesn't matter); anything else in the list is
|
|
87
|
+
* silently ignored, per Β§6 Unknown Command Fallback's ignore-don't-throw
|
|
88
|
+
* spirit.
|
|
89
|
+
*/
|
|
90
|
+
function resolveCardStyles(tokens) {
|
|
91
|
+
const background = tokens?.find(t => HEX_COLOR.test(t));
|
|
92
|
+
const radiusToken = tokens?.find(t => RADIUS_TOKEN.test(t));
|
|
93
|
+
const radius = radiusToken ? `${radiusToken.match(RADIUS_TOKEN)[1]}px` : undefined;
|
|
94
|
+
return { background, radiusToken, radius };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* @img's {styles} resolver β Image Style v1 (Block Syntax Specification Β§5
|
|
98
|
+
* Image). Same two token shapes as Card Style v1 (RADIUS_TOKEN/HEX_COLOR are
|
|
99
|
+
* shared), reused for a different, image-appropriate meaning: a "radius-N"
|
|
100
|
+
* token still means border-radius, but the hex token means *border color*
|
|
101
|
+
* here rather than background β an image already has its own pixel content,
|
|
102
|
+
* so "paint a background behind it" isn't the useful knob a border is. Both
|
|
103
|
+
* radius and border are opt-in (no styles at all β a bare, undecorated
|
|
104
|
+
* <img>). Explicit {styles} values control the image's border and radius.
|
|
105
|
+
*/
|
|
106
|
+
function resolveImageStyles(tokens) {
|
|
107
|
+
const borderColor = tokens?.find(t => HEX_COLOR.test(t));
|
|
108
|
+
const radiusToken = tokens?.find(t => RADIUS_TOKEN.test(t));
|
|
109
|
+
const radius = radiusToken ? `${radiusToken.match(RADIUS_TOKEN)[1]}px` : undefined;
|
|
110
|
+
return { borderColor, radiusToken, radius };
|
|
111
|
+
}
|
|
112
|
+
/** URI scheme inference β Inline Syntax Specification Β§8 @link URI Semantics. */
|
|
113
|
+
function resolveUri(raw) {
|
|
114
|
+
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(raw))
|
|
115
|
+
return raw; // explicit scheme: MUST be used as-is
|
|
116
|
+
if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(raw))
|
|
117
|
+
return `mailto:${raw}`;
|
|
118
|
+
if (/^\+?[0-9][0-9\- ]*$/.test(raw))
|
|
119
|
+
return `tel:${raw.replace(/[\s-]/g, '')}`;
|
|
120
|
+
return `https://${raw}`;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* True for a text child that's pure formatting whitespace β the author
|
|
124
|
+
* pretty-printed a nested node onto its own indented line, and the Parser
|
|
125
|
+
* (deliberately, per spec β no implicit trimming) kept that indentation as
|
|
126
|
+
* a literal text node. Rendered as-is, it becomes a real, visible space
|
|
127
|
+
* sitting right against the adjacent node's tag boundary (CSS only trims
|
|
128
|
+
* collapsible whitespace at a *line* edge, not at an inline element's inner
|
|
129
|
+
* edge), which is especially obvious once that node has a background or
|
|
130
|
+
* border (@mark, @bordered). A same-line run of spaces with no newline is
|
|
131
|
+
* left untouched β that's the author actually asking for a visible gap.
|
|
132
|
+
*/
|
|
133
|
+
function isIndentationWhitespace(s) {
|
|
134
|
+
return s.includes('\n') && /^\s*$/.test(s);
|
|
135
|
+
}
|
|
136
|
+
function renderChildren(content, route) {
|
|
137
|
+
return content
|
|
138
|
+
.map(c => {
|
|
139
|
+
if (typeof c !== 'string')
|
|
140
|
+
return renderNode(c, route);
|
|
141
|
+
return isIndentationWhitespace(c) ? '' : escapeHtml(c);
|
|
142
|
+
})
|
|
143
|
+
.join('');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Recursively collects the plain text of a content list, discarding any
|
|
147
|
+
* formatting nodes' tags β used where the output must be text-only (e.g.
|
|
148
|
+
* @img's alt attribute), unlike renderChildren() which renders real markup.
|
|
149
|
+
* A formatting node (e.g. @bold) contributes its own nested content's text;
|
|
150
|
+
* a raw-family node (e.g. @kbd, which has no `content`) contributes its
|
|
151
|
+
* `.raw` text instead.
|
|
152
|
+
*/
|
|
153
|
+
function extractPlainText(content) {
|
|
154
|
+
return content.map(c => {
|
|
155
|
+
if (typeof c === 'string')
|
|
156
|
+
return c;
|
|
157
|
+
if (c.content.length)
|
|
158
|
+
return extractPlainText(c.content);
|
|
159
|
+
return c.raw ?? '';
|
|
160
|
+
}).join('');
|
|
161
|
+
}
|
|
162
|
+
function renderMark(node, route) {
|
|
163
|
+
const tokens = node.styles ?? [];
|
|
164
|
+
const colorToken = tokens.find(t => resolveColorToken(t) !== undefined);
|
|
165
|
+
const resolvedColor = resolveColorToken(colorToken);
|
|
166
|
+
const inner = renderChildren(node.content, route);
|
|
167
|
+
if (route === 'inline') {
|
|
168
|
+
const styleAttr = resolvedColor ? ` style="background-color: ${resolvedColor};"` : '';
|
|
169
|
+
return `<mark${styleAttr}>${inner}</mark>`;
|
|
170
|
+
}
|
|
171
|
+
// A literal hex token has no Tailwind-style class equivalent β fall back to inline style for it.
|
|
172
|
+
const isNamedColor = colorToken !== undefined && !HEX_COLOR.test(colorToken);
|
|
173
|
+
const classes = ['mark', ...(isNamedColor ? [`mark-${colorToken}`] : [])];
|
|
174
|
+
const hexStyle = colorToken && !isNamedColor ? ` style="background-color: ${resolvedColor};"` : '';
|
|
175
|
+
return `<mark class="${classes.join(' ')}"${hexStyle}>${inner}</mark>`;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* @bordered β shares @color's exact {styles} slot and darker COLOR_PRESETS
|
|
179
|
+
* swatch (resolveColorPreset), just painted onto a border instead of a
|
|
180
|
+
* foreground color. Retires @mark's old 'bordered' modifier token in favor
|
|
181
|
+
* of being its own first-class node, the same way 'underline' already has
|
|
182
|
+
* its own @underline node and 'strikethrough' already has @del.
|
|
183
|
+
*/
|
|
184
|
+
function renderBordered(node, route) {
|
|
185
|
+
const resolvedColor = resolveColorPreset(node.color) ?? 'currentColor';
|
|
186
|
+
const inner = renderChildren(node.content, route);
|
|
187
|
+
if (route === 'inline') {
|
|
188
|
+
return `<span style="border: 1px solid ${resolvedColor};">${inner}</span>`;
|
|
189
|
+
}
|
|
190
|
+
const isNamedColor = node.color !== undefined && resolveColorPreset(node.color) !== undefined && !HEX_COLOR.test(node.color);
|
|
191
|
+
const classes = ['bordered', ...(isNamedColor ? [`bordered-${node.color}`] : [])];
|
|
192
|
+
const hexStyle = !isNamedColor ? ` style="border: 1px solid ${resolvedColor};"` : '';
|
|
193
|
+
return `<span class="${classes.join(' ')}"${hexStyle}>${inner}</span>`;
|
|
194
|
+
}
|
|
195
|
+
function renderColor(node, route) {
|
|
196
|
+
// @color is for a precise text color; unlike @mark it doesn't fall back to
|
|
197
|
+
// a default when the token is missing/unrecognized (this Adapter doesn't
|
|
198
|
+
// maintain a "default color" concept for either node) β an unresolved
|
|
199
|
+
// token just renders as a plain, uncolored <span>, per the Unknown Command
|
|
200
|
+
// Fallback ignore-don't-throw spirit (Inline Spec Β§6).
|
|
201
|
+
const colorToken = node.color;
|
|
202
|
+
const resolvedColor = resolveColorPreset(colorToken);
|
|
203
|
+
const inner = renderChildren(node.content, route);
|
|
204
|
+
if (route === 'inline') {
|
|
205
|
+
const styleAttr = resolvedColor ? ` style="color: ${resolvedColor};"` : '';
|
|
206
|
+
return `<span${styleAttr}>${inner}</span>`;
|
|
207
|
+
}
|
|
208
|
+
// A literal hex token has no Tailwind-style class equivalent β fall back to inline style for it.
|
|
209
|
+
const isNamedColor = resolvedColor !== undefined && !HEX_COLOR.test(colorToken);
|
|
210
|
+
const classes = ['color', ...(isNamedColor ? [`color-${colorToken}`] : [])];
|
|
211
|
+
const hexStyle = resolvedColor && !isNamedColor ? ` style="color: ${resolvedColor};"` : '';
|
|
212
|
+
return `<span class="${classes.join(' ')}"${hexStyle}>${inner}</span>`;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* @card β Card Style v1's two per-instance styles (see resolveCardStyles()).
|
|
216
|
+
* A hex background has no Tailwind-style class equivalent, so it always
|
|
217
|
+
* falls back to inline style on both routes; radius-N is already a valid
|
|
218
|
+
* class-name fragment, so the tailwind route gets a "card-radius-N" modifier
|
|
219
|
+
* class instead, the same way @mark gets "mark-<token>".
|
|
220
|
+
*/
|
|
221
|
+
function renderCard(node, route) {
|
|
222
|
+
const { background, radiusToken, radius } = resolveCardStyles(node.styles);
|
|
223
|
+
const header = node.title ? `<header>${escapeHtml(node.title)}</header>` : '';
|
|
224
|
+
const inner = renderChildren(node.content, route);
|
|
225
|
+
if (route === 'inline') {
|
|
226
|
+
const styleParts = [];
|
|
227
|
+
if (background)
|
|
228
|
+
styleParts.push(`background-color: ${background};`);
|
|
229
|
+
if (radius)
|
|
230
|
+
styleParts.push(`border-radius: ${radius};`);
|
|
231
|
+
const styleAttr = styleParts.length ? ` style="${styleParts.join(' ')}"` : '';
|
|
232
|
+
return `<article${styleAttr}>${header}${inner}</article>`;
|
|
233
|
+
}
|
|
234
|
+
const classes = ['card', ...(radiusToken ? [`card-${radiusToken}`] : [])];
|
|
235
|
+
const styleAttr = background ? ` style="background-color: ${background};"` : '';
|
|
236
|
+
return `<article class="${classes.join(' ')}"${styleAttr}>${header}${inner}</article>`;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* @svg is a raw pass-through node (Widget-Blocks-style raw content, like
|
|
240
|
+
* @mermaid) β its content is trusted markup the Renderer emits unescaped so
|
|
241
|
+
* the browser actually draws the vector graphic instead of printing source.
|
|
242
|
+
* Because that crosses a trust boundary, strip <script> and on*="" handlers
|
|
243
|
+
* before emitting rather than passing the source through untouched.
|
|
244
|
+
*/
|
|
245
|
+
function sanitizeSvg(raw) {
|
|
246
|
+
return raw
|
|
247
|
+
.replace(/<script[\s\S]*?<\/script\s*>/gi, '')
|
|
248
|
+
.replace(/\son[a-z]+\s*=\s*"[^"]*"/gi, '')
|
|
249
|
+
.replace(/\son[a-z]+\s*=\s*'[^']*'/gi, '');
|
|
250
|
+
}
|
|
251
|
+
function renderList(node, route) {
|
|
252
|
+
// @list items are structured 'list-item' nodes built by the Parser
|
|
253
|
+
// (Structural-Blocks.md Β§5 List) β every non-empty line is an item, so
|
|
254
|
+
// nested inline nodes (e.g. @bold) inside an item render correctly instead
|
|
255
|
+
// of being flattened to text first. A nested @list is just another content
|
|
256
|
+
// node inside an item, so renderChildren recurses back into renderList for it.
|
|
257
|
+
const items = node.content.filter((c) => typeof c !== 'string' && c.type === 'list-item');
|
|
258
|
+
const tag = node.ordered ? 'ol' : 'ul';
|
|
259
|
+
if (items.length === 0)
|
|
260
|
+
return `<${tag}></${tag}>`;
|
|
261
|
+
const li = items.map(i => {
|
|
262
|
+
const valueAttr = node.ordered && i.marker !== undefined ? ` value="${i.marker}"` : '';
|
|
263
|
+
return `<li${valueAttr}>${renderChildren(i.content, route)}</li>`;
|
|
264
|
+
}).join('');
|
|
265
|
+
return `<${tag}>${li}</${tag}>`;
|
|
266
|
+
}
|
|
267
|
+
function renderTabs(node, route) {
|
|
268
|
+
const tabs = node.tabs ?? [];
|
|
269
|
+
const tablist = tabs
|
|
270
|
+
.map((t, i) => `<button role="tab" aria-controls="tab-panel-${i}">${escapeHtml(t.title ?? '')}</button>`)
|
|
271
|
+
.join('');
|
|
272
|
+
const panels = tabs
|
|
273
|
+
.map((t, i) => `<div role="tabpanel" id="tab-panel-${i}">${renderChildren(t.content, route)}</div>`)
|
|
274
|
+
.join('');
|
|
275
|
+
return `<div class="tabs"><div role="tablist">${tablist}</div>${panels}</div>`;
|
|
276
|
+
}
|
|
277
|
+
function renderNode(node, route) {
|
|
278
|
+
switch (node.type) {
|
|
279
|
+
// Metadata β not rendered as visible HTML (Block Syntax Specification Β§9).
|
|
280
|
+
case 'meta':
|
|
281
|
+
return '';
|
|
282
|
+
// Structural Blocks
|
|
283
|
+
case 'heading':
|
|
284
|
+
return `<h${node.level ?? 1}>${renderChildren(node.content, route)}</h${node.level ?? 1}>`;
|
|
285
|
+
case 'paragraph':
|
|
286
|
+
return `<p>${renderChildren(node.content, route)}</p>`;
|
|
287
|
+
case 'quote':
|
|
288
|
+
return `<blockquote>${renderChildren(node.content, route)}</blockquote>`;
|
|
289
|
+
case 'list':
|
|
290
|
+
return renderList(node, route);
|
|
291
|
+
case 'code':
|
|
292
|
+
return `<pre><code class="language-${escapeHtml(node.language ?? 'text')}">${escapeHtml(node.raw ?? '')}</code></pre>`;
|
|
293
|
+
case 'img': {
|
|
294
|
+
const opts = node.imgOptions ?? {};
|
|
295
|
+
const alt = extractPlainText(node.content).trim();
|
|
296
|
+
const attrs = [`src="${escapeHtml(opts.src ?? '')}"`, `alt="${escapeHtml(alt)}"`];
|
|
297
|
+
if (opts.width)
|
|
298
|
+
attrs.push(`width="${escapeHtml(opts.width)}"`);
|
|
299
|
+
if (opts.height)
|
|
300
|
+
attrs.push(`height="${escapeHtml(opts.height)}"`);
|
|
301
|
+
const styleParts = [];
|
|
302
|
+
if (opts.align) {
|
|
303
|
+
const margin = opts.align === 'center' ? '0 auto' : opts.align === 'right' ? '0 0 0 auto' : '0';
|
|
304
|
+
styleParts.push(`display:block;margin:${margin};`);
|
|
305
|
+
}
|
|
306
|
+
// Image Style v1 ({radius-N,#hex} β see resolveImageStyles()) takes
|
|
307
|
+
// priority over the older, free-form "(radius=...,border=...)" image
|
|
308
|
+
// options when both are present, since the closed {styles} token set
|
|
309
|
+
// is the more deliberate, more recent input; either source alone still
|
|
310
|
+
// works on its own.
|
|
311
|
+
const { borderColor, radius: styleRadius } = resolveImageStyles(node.styles);
|
|
312
|
+
const radius = styleRadius ?? opts.radius;
|
|
313
|
+
const border = borderColor ? `1px solid ${borderColor}` : opts.border;
|
|
314
|
+
if (radius)
|
|
315
|
+
styleParts.push(`border-radius:${escapeHtml(radius)};`);
|
|
316
|
+
if (border)
|
|
317
|
+
styleParts.push(`border:${escapeHtml(border)};`);
|
|
318
|
+
if (styleParts.length)
|
|
319
|
+
attrs.push(`style="${styleParts.join('')}"`);
|
|
320
|
+
return `<img ${attrs.join(' ')}>`;
|
|
321
|
+
}
|
|
322
|
+
case 'table': {
|
|
323
|
+
// columns/rows hold inline content (text + a curated set of formatting
|
|
324
|
+
// nodes, see registry.ts's isCellAllowedNode), same shape as `content`
|
|
325
|
+
// elsewhere β render it the same way, then turn @n's "\n" marker into <br>.
|
|
326
|
+
const thead = `<thead><tr>${(node.columns ?? []).map(c => `<th>${renderChildren(c, route).replace(/\n/g, '<br>')}</th>`).join('')}</tr></thead>`;
|
|
327
|
+
const tbody = `<tbody>${(node.rows ?? [])
|
|
328
|
+
.map(r => `<tr>${r.map(cell => `<td>${renderChildren(cell, route).replace(/\n/g, '<br>')}</td>`).join('')}</tr>`)
|
|
329
|
+
.join('')}</tbody>`;
|
|
330
|
+
return `<table>${thead}${tbody}</table>`;
|
|
331
|
+
}
|
|
332
|
+
case 'hr':
|
|
333
|
+
return '<hr>';
|
|
334
|
+
case 'svg':
|
|
335
|
+
return sanitizeSvg(node.raw ?? '');
|
|
336
|
+
// Container Blocks
|
|
337
|
+
case 'details':
|
|
338
|
+
return `<details><summary>${escapeHtml(node.title ?? 'Details')}</summary>${renderChildren(node.content, route)}</details>`;
|
|
339
|
+
case 'card':
|
|
340
|
+
return renderCard(node, route);
|
|
341
|
+
// Callout Blocks
|
|
342
|
+
case 'note':
|
|
343
|
+
case 'tip':
|
|
344
|
+
case 'important':
|
|
345
|
+
case 'warning':
|
|
346
|
+
case 'caution':
|
|
347
|
+
return `<aside class="${node.type}">${node.title ? `<strong>${escapeHtml(node.title)}</strong> ` : ''}${renderChildren(node.content, route)}</aside>`;
|
|
348
|
+
// Widget Blocks
|
|
349
|
+
case 'tabs':
|
|
350
|
+
return renderTabs(node, route);
|
|
351
|
+
case 'tab':
|
|
352
|
+
// Standalone rendering fallback β normally only reached via @tabs.
|
|
353
|
+
return `<section><h4>${escapeHtml(node.title ?? '')}</h4>${renderChildren(node.content, route)}</section>`;
|
|
354
|
+
case 'mermaid':
|
|
355
|
+
return `<pre class="mermaid">${escapeHtml(node.raw ?? '')}</pre>`;
|
|
356
|
+
// Text Formatting
|
|
357
|
+
case 'bold':
|
|
358
|
+
return `<strong>${renderChildren(node.content, route)}</strong>`;
|
|
359
|
+
case 'italic':
|
|
360
|
+
return `<em>${renderChildren(node.content, route)}</em>`;
|
|
361
|
+
case 'underline':
|
|
362
|
+
return `<u>${renderChildren(node.content, route)}</u>`;
|
|
363
|
+
case 'del':
|
|
364
|
+
return `<del>${renderChildren(node.content, route)}</del>`;
|
|
365
|
+
case 'mark':
|
|
366
|
+
return renderMark(node, route);
|
|
367
|
+
case 'color':
|
|
368
|
+
return renderColor(node, route);
|
|
369
|
+
case 'bordered':
|
|
370
|
+
return renderBordered(node, route);
|
|
371
|
+
// Inline code. `@raw`'s opaque domain (Inline Syntax Specification Β§9) is
|
|
372
|
+
// the same thing Markdown's backticks are: content that must not be
|
|
373
|
+
// parsed, shown literally. `<code>` is the semantic tag for exactly that,
|
|
374
|
+
// and its browser default already supplies the monospace font β index.css
|
|
375
|
+
// only adds the tint on top. Distinct from `@code`, which is a block and
|
|
376
|
+
// renders as `<pre><code>`; `pre code` resets the inline decoration.
|
|
377
|
+
case 'raw':
|
|
378
|
+
return `<code>${escapeHtml(node.raw ?? '')}</code>`;
|
|
379
|
+
// Semantic Inline
|
|
380
|
+
case 'sup':
|
|
381
|
+
return `<sup>${renderChildren(node.content, route)}</sup>`;
|
|
382
|
+
case 'sub':
|
|
383
|
+
return `<sub>${renderChildren(node.content, route)}</sub>`;
|
|
384
|
+
case 'kbd':
|
|
385
|
+
return `<kbd>${escapeHtml(node.raw ?? '')}</kbd>`;
|
|
386
|
+
case 'link':
|
|
387
|
+
return `<a href="${escapeHtml(resolveUri(node.uri ?? ''))}">${renderChildren(node.content, route)}</a>`;
|
|
388
|
+
// Footnotes
|
|
389
|
+
// @defn is a plain inline-node (Footnotes.md Β§4) β an author writing it
|
|
390
|
+
// as its own line at the document's end (the documented convention) gets
|
|
391
|
+
// it wrapped in an implicit <p> by the Parser's paragraph aggregation.
|
|
392
|
+
// Rendering it here as `<li>` (as this case used to) put flow content
|
|
393
|
+
// inside phrasing-only content, which browsers "fix" by force-closing
|
|
394
|
+
// the <p> right before it, splitting it into two empty <p></p>. So
|
|
395
|
+
// @defn renders as nothing in place; DocTranspiler.renderFootnotes()
|
|
396
|
+
// collects every @defn in the document and renders them together as one
|
|
397
|
+
// real <ol> β the "collected footnotes list" registry.ts already assumed
|
|
398
|
+
// existed (see its CELL_ALLOWED_INLINE comment).
|
|
399
|
+
case 'defn':
|
|
400
|
+
return '';
|
|
401
|
+
case 'fn':
|
|
402
|
+
return `<sup id="fnref${node.number}"><a href="#fn${node.number}">${node.number}</a></sup>`;
|
|
403
|
+
// Special Nodes
|
|
404
|
+
case 'n':
|
|
405
|
+
return '<br>';
|
|
406
|
+
default:
|
|
407
|
+
// Should be unreachable β every registered node is handled above.
|
|
408
|
+
return `<div data-node="${escapeHtml(node.type)}">${renderChildren(node.content, route)}</div>`;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Renders a single @defn as a real footnotes-list item β unlike the 'defn'
|
|
413
|
+
* case in renderNode() (which renders nothing in-place, see there for why),
|
|
414
|
+
* this is only ever called on nodes already inside the <ol> built by
|
|
415
|
+
* DocTranspiler.renderFootnotes(), where a bare <li> is legal HTML.
|
|
416
|
+
*/
|
|
417
|
+
function renderFootnoteItem(node, route) {
|
|
418
|
+
return `<li id="fn${escapeHtml(node.id ?? '')}">${renderChildren(node.content, route)} <a href="#fnref${escapeHtml(node.id ?? '')}">β©</a></li>`;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Walks the whole document (recursively β @defn is a plain inline-node, so
|
|
422
|
+
* it can appear nested inside @quote/@list/@table cells/etc., not just at
|
|
423
|
+
* the top level) collecting every @defn in document order. A @defn's own
|
|
424
|
+
* content isn't walked any further once collected β nesting a @defn inside
|
|
425
|
+
* another @defn isn't a meaningful/supported pattern (Footnotes.md Β§4 only
|
|
426
|
+
* documents ordinary inline content there), so there's nothing useful to
|
|
427
|
+
* find by recursing past it.
|
|
428
|
+
*/
|
|
429
|
+
function collectFootnoteDefns(nodes) {
|
|
430
|
+
const found = [];
|
|
431
|
+
const visit = (n) => {
|
|
432
|
+
if (n.type === 'defn') {
|
|
433
|
+
found.push(n);
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
for (const c of n.content ?? []) {
|
|
437
|
+
if (typeof c !== 'string')
|
|
438
|
+
visit(c);
|
|
439
|
+
}
|
|
440
|
+
for (const col of n.columns ?? []) {
|
|
441
|
+
for (const c of col)
|
|
442
|
+
if (typeof c !== 'string')
|
|
443
|
+
visit(c);
|
|
444
|
+
}
|
|
445
|
+
for (const row of n.rows ?? []) {
|
|
446
|
+
for (const cell of row)
|
|
447
|
+
for (const c of cell)
|
|
448
|
+
if (typeof c !== 'string')
|
|
449
|
+
visit(c);
|
|
450
|
+
}
|
|
451
|
+
for (const t of n.tabs ?? [])
|
|
452
|
+
visit(t);
|
|
453
|
+
};
|
|
454
|
+
for (const n of nodes) {
|
|
455
|
+
if (typeof n !== 'string')
|
|
456
|
+
visit(n);
|
|
457
|
+
}
|
|
458
|
+
return found;
|
|
459
|
+
}
|
|
460
|
+
export class DocTranspiler {
|
|
461
|
+
/** Route A β class-driven (Tailwind-style) output. */
|
|
462
|
+
static toTailwindHTML(node) {
|
|
463
|
+
return renderNode(node, 'tailwind');
|
|
464
|
+
}
|
|
465
|
+
/** Route B β inline-style output, for universal/legacy targets. */
|
|
466
|
+
static toInlineStyleHTML(node) {
|
|
467
|
+
return renderNode(node, 'inline');
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Collects every @defn in the document and renders them as one real
|
|
471
|
+
* <ol> at the call site's choosing (normally once, after the full
|
|
472
|
+
* document body) β see the 'defn' case in renderNode() for why in-place
|
|
473
|
+
* rendering isn't an option. Returns '' when the document has no
|
|
474
|
+
* footnotes, so callers can append unconditionally.
|
|
475
|
+
*/
|
|
476
|
+
static renderFootnotes(nodes, route) {
|
|
477
|
+
const defns = collectFootnoteDefns(nodes);
|
|
478
|
+
if (defns.length === 0)
|
|
479
|
+
return '';
|
|
480
|
+
const items = defns.map(n => renderFootnoteItem(n, route)).join('');
|
|
481
|
+
return route === 'tailwind' ? `<ol class="footnotes">${items}</ol>` : `<ol>${items}</ol>`;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
//# sourceMappingURL=Adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Adapters.js","sourceRoot":"","sources":["../src/Adapters.ts"],"names":[],"mappings":"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"}
|