@dogsbay/format-dogsbay-md 0.2.0-beta.92 → 0.2.0-beta.98
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/dist/browser.d.ts +22 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +21 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +57 -36
- package/dist/cli.js.map +1 -1
- package/dist/code-regions.d.ts +89 -0
- package/dist/code-regions.d.ts.map +1 -0
- package/dist/code-regions.js +215 -0
- package/dist/code-regions.js.map +1 -0
- package/dist/directive-guard.d.ts +11 -0
- package/dist/directive-guard.d.ts.map +1 -0
- package/dist/directive-guard.js +16 -0
- package/dist/directive-guard.js.map +1 -0
- package/dist/directive-preserve.d.ts +66 -0
- package/dist/directive-preserve.d.ts.map +1 -0
- package/dist/directive-preserve.js +410 -0
- package/dist/directive-preserve.js.map +1 -0
- package/dist/escape.d.ts +17 -3
- package/dist/escape.d.ts.map +1 -1
- package/dist/escape.js +17 -25
- package/dist/escape.js.map +1 -1
- package/dist/frontmatter.d.ts +12 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +67 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/headings.d.ts +50 -0
- package/dist/headings.d.ts.map +1 -0
- package/dist/headings.js +116 -0
- package/dist/headings.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/inline.d.ts +0 -20
- package/dist/inline.d.ts.map +1 -1
- package/dist/inline.js +107 -10
- package/dist/inline.js.map +1 -1
- package/dist/minja-mask.d.ts +64 -0
- package/dist/minja-mask.d.ts.map +1 -0
- package/dist/minja-mask.js +128 -0
- package/dist/minja-mask.js.map +1 -0
- package/dist/nav-file.d.ts +2 -0
- package/dist/nav-file.d.ts.map +1 -1
- package/dist/nav-file.js +53 -1
- package/dist/nav-file.js.map +1 -1
- package/dist/parse.d.ts +12 -1
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +129 -12
- package/dist/parse.js.map +1 -1
- package/dist/plugin-containers.d.ts +1 -1
- package/dist/plugin-containers.d.ts.map +1 -1
- package/dist/plugin-containers.js +9 -1
- package/dist/plugin-containers.js.map +1 -1
- package/dist/plugin-math.d.ts +23 -0
- package/dist/plugin-math.d.ts.map +1 -0
- package/dist/plugin-math.js +91 -0
- package/dist/plugin-math.js.map +1 -0
- package/dist/serialize.d.ts +1 -1
- package/dist/serialize.d.ts.map +1 -1
- package/dist/serialize.js +182 -48
- package/dist/serialize.js.map +1 -1
- package/dist/yaml.d.ts.map +1 -1
- package/dist/yaml.js +6 -0
- package/dist/yaml.js.map +1 -1
- package/package.json +18 -12
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe entry point — the pure TreeNode round-trip and text
|
|
3
|
+
* helpers, with NO `node:fs` in the module graph.
|
|
4
|
+
*
|
|
5
|
+
* The main barrel (`.`) re-exports nav / nav-file / mermaid, which
|
|
6
|
+
* import `node:fs` at module load and so break browser/extension
|
|
7
|
+
* bundling. Consumers that only need parse/serialize (the editing
|
|
8
|
+
* engine, extension contexts) import from `@dogsbay/format-dogsbay-md/browser`
|
|
9
|
+
* instead. `parse.ts` and `serialize.ts` transit only browser-safe deps
|
|
10
|
+
* (markdown-it, js-yaml). Frontmatter is split by the local `frontmatter.ts`
|
|
11
|
+
* (js-yaml only) rather than gray-matter, whose entry `require('fs')`s at
|
|
12
|
+
* module load and would drag `node:fs` back into this graph.
|
|
13
|
+
*/
|
|
14
|
+
export { dogsbayMdToTree, parseInline, type ParseResult, type ParseOptions } from "./parse.js";
|
|
15
|
+
export { treeToDogsbayMd, nodeToDogsbayMd } from "./serialize.js";
|
|
16
|
+
export type { SerializeOptions } from "./types.js";
|
|
17
|
+
export { inlineToDogsbayMd } from "./inline.js";
|
|
18
|
+
export { transformCodeRegions, transformProseLines, transformProseSegments, fenceOpenBefore, createFenceTracker, } from "./code-regions.js";
|
|
19
|
+
export { maskMinjaInCode, unmaskMinjaInCode, maskAllMinjaOpeners, isMinjaProcessedFence, stripInlineMinjaMarkers, stripFenceMinjaMarkers } from "./minja-mask.js";
|
|
20
|
+
export { extractHeadings, slugifyHeadingText, type HeadingInfo } from "./headings.js";
|
|
21
|
+
export { splitFrontmatter, type Frontmatter } from "./frontmatter.js";
|
|
22
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClK,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe entry point — the pure TreeNode round-trip and text
|
|
3
|
+
* helpers, with NO `node:fs` in the module graph.
|
|
4
|
+
*
|
|
5
|
+
* The main barrel (`.`) re-exports nav / nav-file / mermaid, which
|
|
6
|
+
* import `node:fs` at module load and so break browser/extension
|
|
7
|
+
* bundling. Consumers that only need parse/serialize (the editing
|
|
8
|
+
* engine, extension contexts) import from `@dogsbay/format-dogsbay-md/browser`
|
|
9
|
+
* instead. `parse.ts` and `serialize.ts` transit only browser-safe deps
|
|
10
|
+
* (markdown-it, js-yaml). Frontmatter is split by the local `frontmatter.ts`
|
|
11
|
+
* (js-yaml only) rather than gray-matter, whose entry `require('fs')`s at
|
|
12
|
+
* module load and would drag `node:fs` back into this graph.
|
|
13
|
+
*/
|
|
14
|
+
export { dogsbayMdToTree, parseInline } from "./parse.js";
|
|
15
|
+
export { treeToDogsbayMd, nodeToDogsbayMd } from "./serialize.js";
|
|
16
|
+
export { inlineToDogsbayMd } from "./inline.js";
|
|
17
|
+
export { transformCodeRegions, transformProseLines, transformProseSegments, fenceOpenBefore, createFenceTracker, } from "./code-regions.js";
|
|
18
|
+
export { maskMinjaInCode, unmaskMinjaInCode, maskAllMinjaOpeners, isMinjaProcessedFence, stripInlineMinjaMarkers, stripFenceMinjaMarkers } from "./minja-mask.js";
|
|
19
|
+
export { extractHeadings, slugifyHeadingText } from "./headings.js";
|
|
20
|
+
export { splitFrontmatter } from "./frontmatter.js";
|
|
21
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAuC,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClK,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAoB,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAoB,MAAM,kBAAkB,CAAC"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAA8C,MAAM,gBAAgB,CAAC;AA0Q/F,eAAO,MAAM,MAAM,EAAE,YAiBpB,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
8
8
|
import { join, relative, basename, dirname } from "node:path";
|
|
9
|
+
import { extractHeadings } from "./headings.js";
|
|
9
10
|
import { parseMeta } from "@dogsbay/types";
|
|
10
11
|
import { dogsbayMdToTree } from "./parse.js";
|
|
11
12
|
import { treeToDogsbayMd } from "./serialize.js";
|
|
@@ -102,31 +103,7 @@ async function importDogsbayMd(source, opts) {
|
|
|
102
103
|
// Duplicate slugs get `-1`, `-2` suffixes so two `## Foo`
|
|
103
104
|
// headings on the same page produce distinct anchors. Same
|
|
104
105
|
// collision-handling shape as MkDocs.
|
|
105
|
-
const headings =
|
|
106
|
-
const seen = new Map();
|
|
107
|
-
for (const node of tree) {
|
|
108
|
-
if (node.type === "heading" && node.inline) {
|
|
109
|
-
const text = node.inline
|
|
110
|
-
.map((n) => (n.type === "text" ? n.text : ""))
|
|
111
|
-
.join("")
|
|
112
|
-
.trim();
|
|
113
|
-
let slug = node.props?.slug;
|
|
114
|
-
if (!slug) {
|
|
115
|
-
const baseSlug = slugify(text);
|
|
116
|
-
const count = seen.get(baseSlug) ?? 0;
|
|
117
|
-
slug = count === 0 ? baseSlug : `${baseSlug}-${count}`;
|
|
118
|
-
seen.set(baseSlug, count + 1);
|
|
119
|
-
if (!node.props)
|
|
120
|
-
node.props = { level: 1 };
|
|
121
|
-
node.props.slug = slug;
|
|
122
|
-
}
|
|
123
|
-
headings.push({
|
|
124
|
-
depth: node.props?.level ?? 1,
|
|
125
|
-
slug,
|
|
126
|
-
text,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
106
|
+
const headings = extractHeadings(tree);
|
|
130
107
|
const redirect = frontmatter.redirect;
|
|
131
108
|
const meta = parseMeta(frontmatter, { slug, taxonomyNames });
|
|
132
109
|
pages.push({
|
|
@@ -153,7 +130,19 @@ async function importDogsbayMd(source, opts) {
|
|
|
153
130
|
hrefPrefix,
|
|
154
131
|
missingFile: missingNavTargets,
|
|
155
132
|
});
|
|
156
|
-
|
|
133
|
+
// Declare where this corpus's media lives, so an exporter copies the FILES
|
|
134
|
+
// that the `_assets/…` references in the pages point at.
|
|
135
|
+
//
|
|
136
|
+
// Without this the reference survives the conversion and the file does not,
|
|
137
|
+
// which looks exactly like success: the page count, the retention score and
|
|
138
|
+
// a clean exit are all unaffected while every image 404s. `dogsbay site
|
|
139
|
+
// build` has its own asset pass, so this was invisible there and only bit
|
|
140
|
+
// `convert` — an OpenShift vault shipped with 294 dead image references.
|
|
141
|
+
const assetMounts = [];
|
|
142
|
+
const assetsDir = join(source, "_assets");
|
|
143
|
+
if (existsSync(assetsDir))
|
|
144
|
+
assetMounts.push({ dir: assetsDir });
|
|
145
|
+
return assetMounts.length ? { pages, nav, assetMounts } : { pages, nav };
|
|
157
146
|
}
|
|
158
147
|
function prettifyName(slug) {
|
|
159
148
|
return slug
|
|
@@ -161,13 +150,6 @@ function prettifyName(slug) {
|
|
|
161
150
|
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
162
151
|
.join(" ");
|
|
163
152
|
}
|
|
164
|
-
function slugify(text) {
|
|
165
|
-
return text
|
|
166
|
-
.toLowerCase()
|
|
167
|
-
.replace(/[^\w\s-]/g, "")
|
|
168
|
-
.trim()
|
|
169
|
-
.replace(/\s+/g, "-");
|
|
170
|
-
}
|
|
171
153
|
/**
|
|
172
154
|
* Export ExportPage[] + nav to a directory of Dogsbay-MD files.
|
|
173
155
|
*
|
|
@@ -179,18 +161,57 @@ function slugify(text) {
|
|
|
179
161
|
* is the include path. Mirrors migrate-asciidoc's fragment convention so the
|
|
180
162
|
* build-time Minja preprocessor can `{% include %}` them.
|
|
181
163
|
*/
|
|
164
|
+
/** Media files worth carrying into `_assets` from a media-only mount. */
|
|
165
|
+
const MEDIA_EXTS = new Set([
|
|
166
|
+
".png", ".jpg", ".jpeg", ".gif", ".webp", ".avif",
|
|
167
|
+
".svg", ".ico", ".pdf", ".mp4", ".webm",
|
|
168
|
+
]);
|
|
169
|
+
/** Recursively copy only media files, preserving relative structure. */
|
|
170
|
+
function copyMediaTree(srcDir, destDir) {
|
|
171
|
+
for (const entry of readdirSync(srcDir, { withFileTypes: true })) {
|
|
172
|
+
const full = join(srcDir, entry.name);
|
|
173
|
+
if (entry.isDirectory()) {
|
|
174
|
+
copyMediaTree(full, join(destDir, entry.name));
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const dot = entry.name.lastIndexOf(".");
|
|
178
|
+
if (dot === -1 || !MEDIA_EXTS.has(entry.name.slice(dot).toLowerCase()))
|
|
179
|
+
continue;
|
|
180
|
+
mkdirSync(destDir, { recursive: true });
|
|
181
|
+
cpSync(full, join(destDir, entry.name));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
182
184
|
async function exportDogsbayMd(pages, nav, output, opts) {
|
|
183
185
|
mkdirSync(output, { recursive: true });
|
|
184
186
|
// Copy mounted asset dirs (e.g. Docusaurus `static/`) into `content/_assets/`,
|
|
185
187
|
// the Dogsbay standard (docs/images.md). Preserves internal structure
|
|
186
188
|
// (static/img/x → <output>/_assets/img/x) so the parser's rewritten
|
|
187
189
|
// `/_assets/img/x` refs resolve, and a later `site build`'s asset pass copies
|
|
188
|
-
// `content/_assets/**` through to `/_assets/**`.
|
|
190
|
+
// `content/_assets/**` through to `/_assets/**`. A mount may target an
|
|
191
|
+
// `_assets` subdir (`into`) and restrict itself to media files (`mediaOnly`) —
|
|
192
|
+
// used for docs-co-located images where the mount dir IS the docs tree.
|
|
189
193
|
if (Array.isArray(opts.assetMounts)) {
|
|
190
194
|
const assetsRoot = join(output, "_assets");
|
|
191
195
|
for (const mount of opts.assetMounts) {
|
|
192
|
-
if (existsSync(mount.dir))
|
|
193
|
-
|
|
196
|
+
if (!existsSync(mount.dir))
|
|
197
|
+
continue;
|
|
198
|
+
const dest = mount.into ? join(assetsRoot, mount.into) : assetsRoot;
|
|
199
|
+
if (mount.mediaOnly) {
|
|
200
|
+
copyMediaTree(mount.dir, dest);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const skip = new Set(mount.exclude ?? []);
|
|
204
|
+
cpSync(mount.dir, dest, {
|
|
205
|
+
recursive: true,
|
|
206
|
+
...(skip.size === 0 ? {} : {
|
|
207
|
+
// Relative to the mount, so an exclusion cannot be accidentally
|
|
208
|
+
// satisfied by a directory name somewhere above it on disk.
|
|
209
|
+
filter: (src) => {
|
|
210
|
+
const rel = relative(mount.dir, src);
|
|
211
|
+
return rel === "" || !rel.split(/[\\/]/).some((seg) => skip.has(seg));
|
|
212
|
+
},
|
|
213
|
+
}),
|
|
214
|
+
});
|
|
194
215
|
}
|
|
195
216
|
}
|
|
196
217
|
for (const page of pages) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5G,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,IAAY;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAa,CAAC;QACnE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,IAAY,EAAE,MAA4C,EAAE;IAC5F,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,wEAAwE;QACxE,0EAA0E;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrD,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACpC,oEAAoE;YACpE,mEAAmE;YACnE,kEAAkE;YAClE,oEAAoE;YACpE,oEAAoE;YACpE,sEAAsE;YACtE,qEAAqE;YACrE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpE,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAc,EACd,IAA6B;IAE7B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,uEAAuE;IACvE,sEAAsE;IACtE,gEAAgE;IAChE,0DAA0D;IAC1D,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;QACrD,CAAC,CAAE,IAAI,CAAC,aAAmC;QAC3C,CAAC,CAAC,SAAS,CAAC;IAEd,+DAA+D;IAC/D,gEAAgE;IAChE,+DAA+D;IAC/D,iEAAiE;IACjE,kEAAkE;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC;IAE3C,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CACjB,WAAW,CAAC,KAA4B;eACtC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAChC,CAAC;QAEF,kEAAkE;QAClE,gEAAgE;QAChE,oDAAoD;QACpD,2DAA2D;QAC3D,4DAA4D;QAC5D,2DAA2D;QAC3D,EAAE;QACF,0DAA0D;QAC1D,2DAA2D;QAC3D,sCAAsC;QACtC,MAAM,QAAQ,GAAc,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code-region walker — THE fence grammar shared by every tool that must
|
|
3
|
+
* treat code specially: the build preprocessor masks Minja openers
|
|
4
|
+
* inside code so template examples never evaluate, the workspace
|
|
5
|
+
* indexer blanks code so `{% include %}` examples never count as real
|
|
6
|
+
* includes, and the refactor commands edit only prose so code samples
|
|
7
|
+
* are never rewritten. One implementation, so none of them can drift.
|
|
8
|
+
*
|
|
9
|
+
* Fence rules (CommonMark): a fence opens with ``` or ~~~ (3+ chars,
|
|
10
|
+
* info string allowed) and closes only on a line of the SAME character
|
|
11
|
+
* with AT LEAST the opener's length and nothing but whitespace after —
|
|
12
|
+
* the serializer emits escalated fences (```` around content containing
|
|
13
|
+
* ```), so honoring the length rule is load-bearing. Fence-looking
|
|
14
|
+
* lines inside an open fence that don't close it are code content.
|
|
15
|
+
*/
|
|
16
|
+
type LineKind = "prose" | "fence" | "code";
|
|
17
|
+
/** Context passed to a code transform: which fence the line belongs to. */
|
|
18
|
+
export interface CodeRegionContext {
|
|
19
|
+
/**
|
|
20
|
+
* Fence info string (e.g. `yaml {minja}`). For inline code spans:
|
|
21
|
+
* the markdown-it-attrs group immediately following the closing
|
|
22
|
+
* backticks when present (e.g. `{minja}` for `` `x`{minja} ``),
|
|
23
|
+
* empty otherwise — so `isMinjaProcessedFence` grades fences and
|
|
24
|
+
* marked inline spans with the same predicate.
|
|
25
|
+
*/
|
|
26
|
+
fenceInfo: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Transform CODE content: every line inside a fence, and the inner
|
|
30
|
+
* content of inline code spans on prose lines (backticks kept). Fence
|
|
31
|
+
* marker lines themselves are untouched.
|
|
32
|
+
*
|
|
33
|
+
* `transformInlineAttrs` (optional) rewrites the attr group of an
|
|
34
|
+
* inline span at re-emission — return `""` to drop it. Only inline
|
|
35
|
+
* spans see it; fence info strings are never routed through it.
|
|
36
|
+
*/
|
|
37
|
+
/**
|
|
38
|
+
* Line-by-line fence tracker on THE shared grammar — for tools that must
|
|
39
|
+
* walk a document themselves (the remote-include inliner) instead of
|
|
40
|
+
* transforming regions. A locally re-implemented open/close regex pair
|
|
41
|
+
* drifted immediately: it missed the deflist-hosted `: ```` opener the
|
|
42
|
+
* shared grammar just gained, took the indented closer for an opener,
|
|
43
|
+
* and re-created the exact phantom-fence inversion it was fixing
|
|
44
|
+
* (issue #039 review).
|
|
45
|
+
*
|
|
46
|
+
* step(line) returns what the line IS: "fence" (an opener or closer),
|
|
47
|
+
* "code" (content of an open fence), or "prose". open() reports the
|
|
48
|
+
* state AFTER the last step, so an opener steps "fence" with
|
|
49
|
+
* open()===true and its closer steps "fence" with open()===false.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createFenceTracker(): {
|
|
52
|
+
step(line: string): LineKind;
|
|
53
|
+
open(): boolean;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Transform only fence OPENING lines' info strings, on the same shared
|
|
57
|
+
* grammar — a fence-looking line inside an open fence is code content
|
|
58
|
+
* and is never touched. Used to strip the spent `{minja}` marker after
|
|
59
|
+
* the terminal Minja render (a fence marker that survives into the
|
|
60
|
+
* mirror leaks into serializers that round-trip fence info verbatim —
|
|
61
|
+
* the Obsidian vault showed literal ```` ```yaml {minja} ````).
|
|
62
|
+
*/
|
|
63
|
+
export declare function transformFenceInfo(source: string, transform: (info: string) => string): string;
|
|
64
|
+
export declare function transformCodeRegions(source: string, transform: (codeText: string, ctx: CodeRegionContext) => string, transformInlineAttrs?: (attrs: string) => string): string;
|
|
65
|
+
/**
|
|
66
|
+
* The inverse walk: transform PROSE lines (outside fences), leaving
|
|
67
|
+
* fenced content and the fence lines untouched. Used by refactor
|
|
68
|
+
* commands that rewrite markdown structure line-wise (heading shifts,
|
|
69
|
+
* section splits) — a `# heading` inside a code example must never be
|
|
70
|
+
* treated as structure.
|
|
71
|
+
*/
|
|
72
|
+
export declare function transformProseLines(source: string, transform: (line: string, lineIndex: number) => string): string;
|
|
73
|
+
/**
|
|
74
|
+
* Transform PROSE TEXT SEGMENTS: prose lines with their inline code
|
|
75
|
+
* spans protected (the transform sees only the non-code stretches of
|
|
76
|
+
* each prose line). This is the write-side counterpart of
|
|
77
|
+
* transformCodeRegions — refactor commands rewrite references through
|
|
78
|
+
* it so `[x](old.md)` or `{{ key }}` inside examples survive verbatim.
|
|
79
|
+
*/
|
|
80
|
+
export declare function transformProseSegments(source: string, transform: (proseText: string) => string): string;
|
|
81
|
+
/**
|
|
82
|
+
* Fence state BEFORE each line: `openBefore[i]` is true when line i
|
|
83
|
+
* starts inside an unclosed fence. One extra trailing entry gives the
|
|
84
|
+
* state after the last line. Lets line-range refactors check "does
|
|
85
|
+
* this range start or end mid-fence" with the same grammar.
|
|
86
|
+
*/
|
|
87
|
+
export declare function fenceOpenBefore(source: string): boolean[];
|
|
88
|
+
export {};
|
|
89
|
+
//# sourceMappingURL=code-regions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-regions.d.ts","sourceRoot":"","sources":["../src/code-regions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgBH,KAAK,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AA6D3C,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,IAAI,IAAI,OAAO,CAAC;CACjB,CAMA;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAClC,MAAM,CAuBR;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,KAAK,MAAM,EAC/D,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAC/C,MAAM,CAyBR;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,GACrD,MAAM,CAMR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GACvC,MAAM,CAmBR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CASzD"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code-region walker — THE fence grammar shared by every tool that must
|
|
3
|
+
* treat code specially: the build preprocessor masks Minja openers
|
|
4
|
+
* inside code so template examples never evaluate, the workspace
|
|
5
|
+
* indexer blanks code so `{% include %}` examples never count as real
|
|
6
|
+
* includes, and the refactor commands edit only prose so code samples
|
|
7
|
+
* are never rewritten. One implementation, so none of them can drift.
|
|
8
|
+
*
|
|
9
|
+
* Fence rules (CommonMark): a fence opens with ``` or ~~~ (3+ chars,
|
|
10
|
+
* info string allowed) and closes only on a line of the SAME character
|
|
11
|
+
* with AT LEAST the opener's length and nothing but whitespace after —
|
|
12
|
+
* the serializer emits escalated fences (```` around content containing
|
|
13
|
+
* ```), so honoring the length rule is load-bearing. Fence-looking
|
|
14
|
+
* lines inside an open fence that don't close it are code content.
|
|
15
|
+
*/
|
|
16
|
+
// A fence may open as DEFLIST DEFINITION content with the definition
|
|
17
|
+
// marker glued to the opener (`: ```` — the adoc engine emits this when
|
|
18
|
+
// a dlist definition's first block is a listing; markdown-it-deflist also
|
|
19
|
+
// accepts `~` as the marker). markdown-it opens a fence there, so this
|
|
20
|
+
// grammar must too: without the prefix the walker took the CLOSER for an
|
|
21
|
+
// opener and inverted — prose after the dlist was masked as code and its
|
|
22
|
+
// `{{ attr }}` refs never resolved (virt-cluster-resource-requirements,
|
|
23
|
+
// the #030 residual class). The marker takes 1–3 spaces: at 4+ markdown-it
|
|
24
|
+
// reads an indented code block, not a fence. The info capture excludes a
|
|
25
|
+
// trailing `\r` so CRLF text grades identically (`.` can't match `\r`,
|
|
26
|
+
// which silently disabled the whole grammar on CRLF files).
|
|
27
|
+
//
|
|
28
|
+
// KNOWN bounded divergence: markdown-it only forms a deflist when a term
|
|
29
|
+
// paragraph precedes; at document start or right after a heading/list a
|
|
30
|
+
// `: ```` line is plain text. The walker opens (and, via the dedent
|
|
31
|
+
// rule, promptly closes) a fence there — a line-local grammar cannot see
|
|
32
|
+
// the term context. The divergence is bounded to the pseudo-fence's own
|
|
33
|
+
// region; the tail re-aligns at the first dedent.
|
|
34
|
+
const OPEN_RE = /^\s*(?:[:~][ \t]{1,3})?(`{3,}|~{3,})(.*?)\r?$/;
|
|
35
|
+
const CLOSE_RE = /^\s*(`{3,}|~{3,})\s*$/;
|
|
36
|
+
const stepFence = (state, line) => {
|
|
37
|
+
if (state.open) {
|
|
38
|
+
// A deflist-hosted fence ends when a non-blank line dedents out of
|
|
39
|
+
// the definition (indent < 4) — markdown-it terminates the fence
|
|
40
|
+
// BEFORE reading that line, so reprocess it in closed state: it may
|
|
41
|
+
// itself open a REAL fence (the col-0 ``` after a dedented deflist
|
|
42
|
+
// fence swallowed the document tail when taken as a closer — review
|
|
43
|
+
// finding).
|
|
44
|
+
if (state.hosted && /^ {0,3}\S/.test(line)) {
|
|
45
|
+
state.open = false;
|
|
46
|
+
state.info = "";
|
|
47
|
+
state.hosted = false;
|
|
48
|
+
// fall through to closed-state handling for this same line
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const close = line.match(CLOSE_RE);
|
|
52
|
+
if (close && close[1][0] === state.marker && close[1].length >= state.length) {
|
|
53
|
+
state.open = false;
|
|
54
|
+
state.info = "";
|
|
55
|
+
state.hosted = false;
|
|
56
|
+
return "fence";
|
|
57
|
+
}
|
|
58
|
+
return "code";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const open = line.match(OPEN_RE);
|
|
62
|
+
if (open) {
|
|
63
|
+
state.open = true;
|
|
64
|
+
state.marker = open[1][0];
|
|
65
|
+
state.length = open[1].length;
|
|
66
|
+
state.info = open[2].trim();
|
|
67
|
+
state.hosted = /^\s*[:~][ \t]/.test(line);
|
|
68
|
+
return "fence";
|
|
69
|
+
}
|
|
70
|
+
return "prose";
|
|
71
|
+
};
|
|
72
|
+
const newState = () => ({ open: false, marker: "", length: 0, info: "", hosted: false });
|
|
73
|
+
/**
|
|
74
|
+
* Transform CODE content: every line inside a fence, and the inner
|
|
75
|
+
* content of inline code spans on prose lines (backticks kept). Fence
|
|
76
|
+
* marker lines themselves are untouched.
|
|
77
|
+
*
|
|
78
|
+
* `transformInlineAttrs` (optional) rewrites the attr group of an
|
|
79
|
+
* inline span at re-emission — return `""` to drop it. Only inline
|
|
80
|
+
* spans see it; fence info strings are never routed through it.
|
|
81
|
+
*/
|
|
82
|
+
/**
|
|
83
|
+
* Line-by-line fence tracker on THE shared grammar — for tools that must
|
|
84
|
+
* walk a document themselves (the remote-include inliner) instead of
|
|
85
|
+
* transforming regions. A locally re-implemented open/close regex pair
|
|
86
|
+
* drifted immediately: it missed the deflist-hosted `: ```` opener the
|
|
87
|
+
* shared grammar just gained, took the indented closer for an opener,
|
|
88
|
+
* and re-created the exact phantom-fence inversion it was fixing
|
|
89
|
+
* (issue #039 review).
|
|
90
|
+
*
|
|
91
|
+
* step(line) returns what the line IS: "fence" (an opener or closer),
|
|
92
|
+
* "code" (content of an open fence), or "prose". open() reports the
|
|
93
|
+
* state AFTER the last step, so an opener steps "fence" with
|
|
94
|
+
* open()===true and its closer steps "fence" with open()===false.
|
|
95
|
+
*/
|
|
96
|
+
export function createFenceTracker() {
|
|
97
|
+
const state = newState();
|
|
98
|
+
return {
|
|
99
|
+
step: (line) => stepFence(state, line),
|
|
100
|
+
open: () => state.open,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Transform only fence OPENING lines' info strings, on the same shared
|
|
105
|
+
* grammar — a fence-looking line inside an open fence is code content
|
|
106
|
+
* and is never touched. Used to strip the spent `{minja}` marker after
|
|
107
|
+
* the terminal Minja render (a fence marker that survives into the
|
|
108
|
+
* mirror leaks into serializers that round-trip fence info verbatim —
|
|
109
|
+
* the Obsidian vault showed literal ```` ```yaml {minja} ````).
|
|
110
|
+
*/
|
|
111
|
+
export function transformFenceInfo(source, transform) {
|
|
112
|
+
const state = newState();
|
|
113
|
+
return source
|
|
114
|
+
.split("\n")
|
|
115
|
+
.map((line) => {
|
|
116
|
+
const wasOpen = state.open;
|
|
117
|
+
if (stepFence(state, line) === "fence" && !wasOpen) {
|
|
118
|
+
// Opening fence: rewrite the info string in place. Untouched info
|
|
119
|
+
// returns the line BYTE-IDENTICAL (incl. any trailing \r) — this
|
|
120
|
+
// is a write path on the shared grammar, and rewriting lines the
|
|
121
|
+
// transform didn't change broke mirror byte-stability (review).
|
|
122
|
+
const m = line.match(OPEN_RE);
|
|
123
|
+
if (m) {
|
|
124
|
+
const runEnd = line.indexOf(m[1]) + m[1].length;
|
|
125
|
+
const hadCR = line.endsWith("\r");
|
|
126
|
+
const info = line.substring(runEnd, hadCR ? line.length - 1 : line.length);
|
|
127
|
+
const newInfo = transform(info);
|
|
128
|
+
return newInfo === info ? line : line.substring(0, runEnd) + newInfo + (hadCR ? "\r" : "");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return line;
|
|
132
|
+
})
|
|
133
|
+
.join("\n");
|
|
134
|
+
}
|
|
135
|
+
export function transformCodeRegions(source, transform, transformInlineAttrs) {
|
|
136
|
+
const state = newState();
|
|
137
|
+
return source
|
|
138
|
+
.split("\n")
|
|
139
|
+
.map((line) => {
|
|
140
|
+
switch (stepFence(state, line)) {
|
|
141
|
+
case "fence":
|
|
142
|
+
return line;
|
|
143
|
+
case "code":
|
|
144
|
+
return transform(line, { fenceInfo: state.info });
|
|
145
|
+
default:
|
|
146
|
+
// An attr group directly after the closing ticks travels as
|
|
147
|
+
// the region's info string: `` `x`{minja} `` opts the span
|
|
148
|
+
// into Minja processing exactly like a `{minja}` fence.
|
|
149
|
+
// Backticks are excluded from the group so a brace group can
|
|
150
|
+
// never swallow a span opener and shift pairing vs markdown-it.
|
|
151
|
+
return line.replace(/(`+)([^`]*?)\1(\{[^{}`\n]*\})?/g, (_m, ticks, inner, attrs) => ticks + transform(inner, { fenceInfo: attrs ?? "" }) + ticks +
|
|
152
|
+
(attrs === undefined ? "" : transformInlineAttrs ? transformInlineAttrs(attrs) : attrs));
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
.join("\n");
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* The inverse walk: transform PROSE lines (outside fences), leaving
|
|
159
|
+
* fenced content and the fence lines untouched. Used by refactor
|
|
160
|
+
* commands that rewrite markdown structure line-wise (heading shifts,
|
|
161
|
+
* section splits) — a `# heading` inside a code example must never be
|
|
162
|
+
* treated as structure.
|
|
163
|
+
*/
|
|
164
|
+
export function transformProseLines(source, transform) {
|
|
165
|
+
const state = newState();
|
|
166
|
+
return source
|
|
167
|
+
.split("\n")
|
|
168
|
+
.map((line, index) => (stepFence(state, line) === "prose" ? transform(line, index) : line))
|
|
169
|
+
.join("\n");
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Transform PROSE TEXT SEGMENTS: prose lines with their inline code
|
|
173
|
+
* spans protected (the transform sees only the non-code stretches of
|
|
174
|
+
* each prose line). This is the write-side counterpart of
|
|
175
|
+
* transformCodeRegions — refactor commands rewrite references through
|
|
176
|
+
* it so `[x](old.md)` or `{{ key }}` inside examples survive verbatim.
|
|
177
|
+
*/
|
|
178
|
+
export function transformProseSegments(source, transform) {
|
|
179
|
+
const state = newState();
|
|
180
|
+
return source
|
|
181
|
+
.split("\n")
|
|
182
|
+
.map((line) => {
|
|
183
|
+
if (stepFence(state, line) !== "prose")
|
|
184
|
+
return line;
|
|
185
|
+
// Split the line into code spans and prose stretches; transform
|
|
186
|
+
// only the prose stretches
|
|
187
|
+
const parts = [];
|
|
188
|
+
let last = 0;
|
|
189
|
+
for (const match of line.matchAll(/(`+)[^`]*?\1/g)) {
|
|
190
|
+
parts.push(transform(line.slice(last, match.index)));
|
|
191
|
+
parts.push(match[0]);
|
|
192
|
+
last = match.index + match[0].length;
|
|
193
|
+
}
|
|
194
|
+
parts.push(transform(line.slice(last)));
|
|
195
|
+
return parts.join("");
|
|
196
|
+
})
|
|
197
|
+
.join("\n");
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Fence state BEFORE each line: `openBefore[i]` is true when line i
|
|
201
|
+
* starts inside an unclosed fence. One extra trailing entry gives the
|
|
202
|
+
* state after the last line. Lets line-range refactors check "does
|
|
203
|
+
* this range start or end mid-fence" with the same grammar.
|
|
204
|
+
*/
|
|
205
|
+
export function fenceOpenBefore(source) {
|
|
206
|
+
const state = newState();
|
|
207
|
+
const states = [];
|
|
208
|
+
for (const line of source.split("\n")) {
|
|
209
|
+
states.push(state.open);
|
|
210
|
+
stepFence(state, line);
|
|
211
|
+
}
|
|
212
|
+
states.push(state.open);
|
|
213
|
+
return states;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=code-regions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-regions.js","sourceRoot":"","sources":["../src/code-regions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A directive attribute is interpolated VERBATIM into its tag (minja has no
|
|
3
|
+
* escape syntax), so a value containing a tag delimiter would emit a tag
|
|
4
|
+
* that closes early — `{% if a %} b %}` leaves the body unguarded and a
|
|
5
|
+
* `{% raw %}` swallows the page on reparse. The parser can never produce
|
|
6
|
+
* such a value; only a programmatic edit (an editor) can. Refuse loudly
|
|
7
|
+
* rather than write broken bytes. Mirrored by @dogsbay/editor's field
|
|
8
|
+
* validation, which is the first line.
|
|
9
|
+
*/
|
|
10
|
+
export declare function assertDirectiveField(what: string, value: string): string;
|
|
11
|
+
//# sourceMappingURL=directive-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directive-guard.d.ts","sourceRoot":"","sources":["../src/directive-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIxE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A directive attribute is interpolated VERBATIM into its tag (minja has no
|
|
3
|
+
* escape syntax), so a value containing a tag delimiter would emit a tag
|
|
4
|
+
* that closes early — `{% if a %} b %}` leaves the body unguarded and a
|
|
5
|
+
* `{% raw %}` swallows the page on reparse. The parser can never produce
|
|
6
|
+
* such a value; only a programmatic edit (an editor) can. Refuse loudly
|
|
7
|
+
* rather than write broken bytes. Mirrored by @dogsbay/editor's field
|
|
8
|
+
* validation, which is the first line.
|
|
9
|
+
*/
|
|
10
|
+
export function assertDirectiveField(what, value) {
|
|
11
|
+
const marker = ["{%", "%}", "{{", "}}", "{#", "#}"].find((m) => value.includes(m));
|
|
12
|
+
if (marker)
|
|
13
|
+
throw new Error(`cannot serialize ${what} containing "${marker}": ${JSON.stringify(value)}`);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=directive-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directive-guard.js","sourceRoot":"","sources":["../src/directive-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,KAAa;IAC9D,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,IAAI,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,gBAAgB,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzG,OAAO,KAAK,CAAC;AACf,CAAC"}
|