@forsakringskassan/docs-generator 2.25.1 → 2.26.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/dist/{create-markdown-renderer-Ch-EjWgQ.js → create-markdown-renderer-LaaGM3xi.js} +64 -55
- package/dist/create-markdown-renderer-LaaGM3xi.js.map +1 -0
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/markdown.d.ts +2 -0
- package/dist/markdown.js +1 -1
- package/dist/processors/selectable-version.js +23 -17
- package/dist/runtime.js +1 -1
- package/dist/style/core.css +2 -1
- package/dist/style/index.css +2 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/package.json +1 -1
- package/dist/create-markdown-renderer-Ch-EjWgQ.js.map +0 -1
|
@@ -122,20 +122,6 @@ function parseImport(raw) {
|
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
function getExampleImport(searchDirs, filename) {
|
|
126
|
-
const pattern = searchDirs.map((dir) => `${dir}/**/${filename}`);
|
|
127
|
-
const matches = vendor.globSync(pattern);
|
|
128
|
-
if (matches.length === 0) {
|
|
129
|
-
const message = `No files matched import "${filename}"`;
|
|
130
|
-
throw new Error(message);
|
|
131
|
-
} else if (matches.length > 1) {
|
|
132
|
-
const message = `Multiple files matched import "${filename}"`;
|
|
133
|
-
throw new Error(message);
|
|
134
|
-
} else {
|
|
135
|
-
return normalizePath(matches[0]);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
125
|
function getExampleName(filename) {
|
|
140
126
|
return path$1.parse(filename).name;
|
|
141
127
|
}
|
|
@@ -152,13 +138,10 @@ function vueGenerator() {
|
|
|
152
138
|
}
|
|
153
139
|
}
|
|
154
140
|
function generateExample(options) {
|
|
155
|
-
const { language } = options;
|
|
141
|
+
const { language, fileMatcher } = options;
|
|
156
142
|
if (language === "import") {
|
|
157
143
|
const parsed = parseImport(options.source);
|
|
158
|
-
const filename =
|
|
159
|
-
options.exampleFolders,
|
|
160
|
-
parsed.filename
|
|
161
|
-
);
|
|
144
|
+
const filename = fileMatcher(parsed.filename, "when importing example");
|
|
162
145
|
const language2 = parsed.extension;
|
|
163
146
|
const comments = parsed.comments;
|
|
164
147
|
const content = fs.readFileSync(filename, "utf-8");
|
|
@@ -554,45 +537,68 @@ function getStandalonePath(output) {
|
|
|
554
537
|
const { dir, name } = path$1.parse(output);
|
|
555
538
|
return path$1.join(dir, `${name}.html`);
|
|
556
539
|
}
|
|
557
|
-
function
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
throw new Error(
|
|
564
|
-
`Failed to find referenced example "${compare.value}"`
|
|
565
|
-
);
|
|
566
|
-
}
|
|
567
|
-
const a = transformCode(reference.content, reference.language);
|
|
568
|
-
const b = transformCode(content, language);
|
|
569
|
-
const diff = vendor.createTwoFilesPatch("a", "b", a, b, "", "", {
|
|
570
|
-
context: context ? parseInt(context, 10) : 3,
|
|
571
|
-
ignoreWhitespace: true
|
|
572
|
-
}).split("\n").slice(4).join("\n");
|
|
573
|
-
return {
|
|
574
|
-
source: diff,
|
|
575
|
-
language: "diff"
|
|
576
|
-
};
|
|
540
|
+
function ensureTrailingNewline(text) {
|
|
541
|
+
if (text.endsWith("\n")) {
|
|
542
|
+
return text;
|
|
543
|
+
} else {
|
|
544
|
+
return `${text}
|
|
545
|
+
`;
|
|
577
546
|
}
|
|
578
|
-
return { source: content, language };
|
|
579
547
|
}
|
|
580
548
|
function codePreview(options) {
|
|
581
|
-
const { generateExample } = options;
|
|
549
|
+
const { generateExample, getImportedSource } = options;
|
|
582
550
|
return (md) => {
|
|
583
551
|
md.renderer.rules.fence = fence.bind(void 0, md);
|
|
584
552
|
};
|
|
553
|
+
function getSource(content, language, tags, env) {
|
|
554
|
+
const { namedExamples } = env;
|
|
555
|
+
if (language === "import") {
|
|
556
|
+
const parsed = parseImport(content);
|
|
557
|
+
const importedContent = getImportedSource(parsed.filename);
|
|
558
|
+
return getSource(importedContent, parsed.extension, tags, env);
|
|
559
|
+
}
|
|
560
|
+
const compare = findTag(tags, "compare");
|
|
561
|
+
if (compare && compare.value !== null) {
|
|
562
|
+
const { value: context } = findTag(tags, "context") ?? {};
|
|
563
|
+
const reference = namedExamples.get(compare.value);
|
|
564
|
+
if (!reference) {
|
|
565
|
+
throw new Error(
|
|
566
|
+
`Failed to find referenced example "${compare.value}"`
|
|
567
|
+
);
|
|
568
|
+
}
|
|
569
|
+
const a = ensureTrailingNewline(
|
|
570
|
+
transformCode(reference.content, reference.language)
|
|
571
|
+
);
|
|
572
|
+
const b = ensureTrailingNewline(transformCode(content, language));
|
|
573
|
+
const diff = vendor.createTwoFilesPatch("a", "b", a, b, "", "", {
|
|
574
|
+
context: context ? parseInt(context, 10) : 3,
|
|
575
|
+
ignoreWhitespace: true
|
|
576
|
+
}).split("\n").slice(4).join("\n");
|
|
577
|
+
return {
|
|
578
|
+
source: diff,
|
|
579
|
+
language: "diff"
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
return { source: content, language };
|
|
583
|
+
}
|
|
585
584
|
function fence(_md, tokens, idx, _options, env) {
|
|
586
585
|
const { fileInfo } = env;
|
|
587
586
|
const { content: rawContent, info, map } = tokens[idx];
|
|
588
587
|
const { language: rawLanguage, tags: rawTags } = parseInfostring(info);
|
|
588
|
+
const { source, language } = getSource(
|
|
589
|
+
rawContent,
|
|
590
|
+
rawLanguage,
|
|
591
|
+
rawTags,
|
|
592
|
+
env
|
|
593
|
+
);
|
|
589
594
|
const name = findTag(rawTags, "name")?.value;
|
|
590
595
|
if (name) {
|
|
591
596
|
env.namedExamples.set(name, {
|
|
592
597
|
name,
|
|
593
598
|
tags: rawTags,
|
|
594
|
-
content
|
|
595
|
-
|
|
599
|
+
/* store original raw content unless it is an imported example */
|
|
600
|
+
content: rawLanguage === "import" ? source : rawContent,
|
|
601
|
+
language: rawLanguage === "import" ? language : rawLanguage
|
|
596
602
|
});
|
|
597
603
|
}
|
|
598
604
|
if (hasTag(rawTags, "hidden")) {
|
|
@@ -606,15 +612,10 @@ function codePreview(options) {
|
|
|
606
612
|
`
|
|
607
613
|
);
|
|
608
614
|
}
|
|
609
|
-
const
|
|
610
|
-
rawContent,
|
|
611
|
-
rawLanguage,
|
|
612
|
-
rawTags,
|
|
613
|
-
env
|
|
614
|
-
);
|
|
615
|
+
const needOriginalSource = language !== "diff" && rawLanguage === "import";
|
|
615
616
|
const example = generateExample({
|
|
616
|
-
source,
|
|
617
|
-
language,
|
|
617
|
+
source: needOriginalSource ? rawContent : source,
|
|
618
|
+
language: needOriginalSource ? rawLanguage : language,
|
|
618
619
|
filename: fileInfo.fullPath,
|
|
619
620
|
tags: rawTags
|
|
620
621
|
});
|
|
@@ -1045,9 +1046,16 @@ function containerRenderer(doc, docs, env, included, handleSoftError, options) {
|
|
|
1045
1046
|
}
|
|
1046
1047
|
|
|
1047
1048
|
function paragraph() {
|
|
1049
|
+
const renderToken = (...args) => {
|
|
1050
|
+
const [tokens, idx, options, , self] = args;
|
|
1051
|
+
return self.renderToken(tokens, idx, options);
|
|
1052
|
+
};
|
|
1048
1053
|
return function(md) {
|
|
1049
|
-
md.renderer.rules.paragraph_open
|
|
1050
|
-
md.renderer.rules.
|
|
1054
|
+
const renderRule = md.renderer.rules.paragraph_open ?? renderToken;
|
|
1055
|
+
md.renderer.rules.paragraph_open = (tokens, idx, index, env, self) => {
|
|
1056
|
+
tokens[idx].attrJoin("class", "docs-paragraph");
|
|
1057
|
+
return renderRule(tokens, idx, index, env, self);
|
|
1058
|
+
};
|
|
1051
1059
|
};
|
|
1052
1060
|
}
|
|
1053
1061
|
|
|
@@ -1101,7 +1109,8 @@ function createMarkdownRenderer(options) {
|
|
|
1101
1109
|
md.use(vendor.deflist_plugin);
|
|
1102
1110
|
md.use(
|
|
1103
1111
|
codePreview({
|
|
1104
|
-
generateExample: options.generateExample
|
|
1112
|
+
generateExample: options.generateExample,
|
|
1113
|
+
getImportedSource: options.getImportedSource
|
|
1105
1114
|
})
|
|
1106
1115
|
);
|
|
1107
1116
|
md.use(headingLevel({ initialLevel: 1 }));
|
|
@@ -1156,4 +1165,4 @@ exports.htmlencode = htmlencode;
|
|
|
1156
1165
|
exports.isDocumentPage = isDocumentPage;
|
|
1157
1166
|
exports.normalizePath = normalizePath;
|
|
1158
1167
|
exports.parseInfostring = parseInfostring;
|
|
1159
|
-
//# sourceMappingURL=create-markdown-renderer-
|
|
1168
|
+
//# sourceMappingURL=create-markdown-renderer-LaaGM3xi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-markdown-renderer-LaaGM3xi.js","sources":["../src/document/is-document-page.ts","../src/utils/find-document.ts","../src/utils/find-tag.ts","../src/utils/generate-id.ts","../src/utils/get-fingerprint.ts","../src/utils/normalize-path.ts","../src/utils/get-output-filepath.ts","../src/utils/has-tag.ts","../src/utils/htmlencode.ts","../src/utils/parse-import.ts","../src/examples/get-example-name.ts","../src/examples/generate-example.ts","../src/examples/normalize-language.ts","../src/examples/parse-infostring.ts","../src/examples/transform-code.ts","../src/render/soft-error.ts","../src/render/process-inline-tags.ts","../src/render/inline-tags/link.ts","../src/render/inline-tags/optional.ts","../src/render/inline-tags/index.ts","../src/render/markdown/utils/find-test-id.ts","../src/render/markdown/utils/highlight.ts","../src/render/markdown/utils/replace-at-link.ts","../src/render/markdown/code-preview.ts","../src/render/markdown/heading-level.ts","../src/render/markdown/image-resources.ts","../src/render/markdown/container/alt-container.ts","../src/render/markdown/container/api-container.ts","../src/render/markdown/container/details-container.ts","../src/render/markdown/container/messagebox-container.ts","../src/render/markdown/container-renderer.ts","../src/render/markdown/paragraph.ts","../src/render/markdown/table.ts","../src/render/markdown/code-inline.ts","../src/render/create-markdown-renderer.ts"],"sourcesContent":["import { type Document } from \"./document\";\nimport { type DocumentPage } from \"./document-page\";\n\n/**\n * @internal\n */\nexport function isDocumentPage(doc: Document): doc is DocumentPage {\n return doc.kind === \"page\";\n}\n","import { type Document } from \"../document\";\n\n/**\n * Find a document by id, name or alias.\n *\n * In case multiple document matches the \"first\" match is returned but the order\n * is in no way guaranteed so results may change over time.\n *\n * @internal\n * @param haystack - All available documents.\n * @param needle - What to search for.\n * @returns Matching document or `null` if no document matches.\n */\nexport function findDocument(\n haystack: Document[],\n needle: string,\n): Document | null {\n const match = haystack.find((it) => {\n if (it.id === needle) {\n return true;\n }\n if (it.name === needle) {\n return true;\n }\n if (it.alias.includes(needle)) {\n return true;\n }\n return false;\n });\n return match ?? null;\n}\n","/**\n * From a list of parsed tags in an infoline find a specific tag.\n *\n * @internal\n */\nexport function findTag(\n tags: string[],\n tag: string,\n): { tag: string; value: string | null } | null {\n const match = tags.find((it) => it === tag || it.startsWith(`${tag}=`));\n if (!match) {\n return null;\n }\n if (match === tag) {\n return { tag, value: null };\n } else {\n return { tag, value: match.slice(tag.length + 1) };\n }\n}\n","const replacements = {\n å: \"a\",\n ä: \"a\",\n ö: \"o\",\n};\n\nfunction findVersion(text: string): [number, number, number] | null {\n const match = text.match(/(\\d+)\\.(\\d+)\\.(\\d+) \\(\\d+-\\d+-\\d+\\)/);\n if (match) {\n return [\n parseInt(match[1], 10),\n parseInt(match[2], 10),\n parseInt(match[3], 10),\n ];\n } else {\n return null;\n }\n}\n\n/**\n * Generate a URL safe id from a text, suitable to use with headings etc.\n *\n * @internal\n */\nexport function generateId(text: string): string {\n const version = findVersion(text);\n if (version) {\n return `v${version.join(\"-\")}`;\n }\n return text\n .toLowerCase()\n .trim()\n .replace(/[åäö]/g, (m) => replacements[m as keyof typeof replacements]) // åäö to aao\n .replace(/[^a-z0-9]+/g, \"_\") // non-alphanum to dashes\n .replace(/^_+/, \"\") // remove leading dashes\n .replace(/_+$/, \"\"); // remove trailing dashes\n}\n","import crypto from \"node:crypto\";\n\nexport function getFingerprint(source: string): string {\n return crypto.createHash(\"md5\").update(source).digest(\"hex\").slice(0, 6);\n}\n","import path from \"node:path/posix\";\n\n/**\n * @internal\n */\nexport function normalizePath(...pathSegments: string[]): string {\n const filePath = path.join(...pathSegments);\n return path.normalize(filePath).replace(/\\\\/g, \"/\");\n}\n","import { normalizePath } from \"./normalize-path\";\n\nexport interface FileInfoLike {\n path: string;\n outputName: string | false;\n}\n\n/**\n * Get the final output filename.\n *\n * @internal\n */\nexport function getOutputFilePath(\n outputFolder: string,\n fileInfo: FileInfoLike & { outputName: string },\n): string;\nexport function getOutputFilePath(\n outputFolder: string,\n fileInfo: FileInfoLike & { outputName: false },\n): null;\nexport function getOutputFilePath(\n outputFolder: string,\n fileInfo: FileInfoLike,\n): string | null;\nexport function getOutputFilePath(\n outputFolder: string,\n fileInfo: FileInfoLike,\n): string | null {\n const { path, outputName } = fileInfo;\n if (outputName === false) {\n return null;\n }\n return normalizePath(outputFolder, path, outputName);\n}\n","/**\n * Tell if a specific tag is present in a list of parsed tags in an infoline.\n *\n * @internal\n */\nexport function hasTag(tags: string[], tag: string): boolean {\n const match = tags.find((it) => it === tag || it.startsWith(`${tag}=`));\n return Boolean(match);\n}\n","const replacement: Record<string, string> = {\n \"<\": `<`,\n \">\": `>`,\n \"&\": `&`,\n '\"': `"`,\n \"'\": `'`,\n};\n\n/**\n * Encodes symbols as HTML entities:\n *\n * - `<`\n * - `>`\n * - `&`\n * - `\"`\n * - `'`\n *\n * @internal\n */\nexport function htmlencode(text: string): string {\n return text.replace(/[<>&\"']/g, (m) => {\n return replacement[m];\n });\n}\n","import path from \"node:path\";\n\nexport interface ParsedImport {\n filename: string;\n extension: string;\n comments: string[];\n}\n\nexport function parseImport(raw: string): ParsedImport {\n const comments: string[] = [];\n let stripped = raw;\n let previous;\n do {\n previous = stripped;\n stripped = stripped.replace(/<!--.*?-->/gms, (match) => {\n comments.push(match);\n return \"\";\n });\n } while (stripped !== previous);\n const filename = stripped.trim();\n const extension = path.parse(filename).ext.slice(1);\n return {\n filename,\n extension,\n comments,\n };\n}\n","import path from \"node:path\";\n\n/**\n * Get name without path and extension.\n *\n * @internal\n */\nexport function getExampleName(filename: string): string {\n return path.parse(filename).name;\n}\n","import fs from \"node:fs\";\nimport { version } from \"vue\";\nimport { generateCode as vue3 } from \"plugin-vue3\";\nimport { getFingerprint, parseImport } from \"../utils\";\nimport { type ExampleOptions } from \"./example-options\";\nimport { type ExampleResult } from \"./example-result\";\nimport { getExampleName } from \"./get-example-name\";\n\nconst vueMajor = parseInt(version.split(\".\", 2)[0], 10) as 2 | 3;\n\nfunction vueGenerator(): typeof vue3 {\n switch (vueMajor) {\n case 2:\n throw new Error(\n \"Vue 2 is no longer supported, upgrade to Vue 3 or downgrade docs-generator\",\n );\n case 3:\n return vue3;\n }\n}\n\n/**\n * @internal\n */\nexport function generateExample(options: ExampleOptions): ExampleResult {\n const { language, fileMatcher } = options;\n\n if (language === \"import\") {\n const parsed = parseImport(options.source);\n const filename = fileMatcher(parsed.filename, \"when importing example\");\n const language = parsed.extension;\n const comments = parsed.comments;\n const content = fs.readFileSync(filename, \"utf-8\");\n const example = generateExample({\n ...options,\n source: content,\n language,\n filename,\n });\n return { ...example, comments };\n }\n\n switch (language) {\n case \"vue\":\n return generateVueExample(options);\n case \"html\":\n return generateStaticExample(options);\n default:\n return generateStaticExample(options);\n }\n}\n\nfunction generateVueExample(options: ExampleOptions): ExampleResult {\n const { filename, source, parent, setupPath, tags } = options;\n const fn = vueGenerator();\n const slug = getExampleName(filename);\n const fingerprint = getFingerprint(source);\n const { markup, sourcecode, output } = fn({\n filename,\n slug,\n fingerprint,\n code: source,\n setupPath,\n });\n if (output) {\n return {\n source,\n language: options.language,\n comments: [],\n tags,\n markup,\n output,\n runtime: true,\n task: {\n outputFile: output,\n sourcecode,\n sourceFile: filename,\n parent,\n },\n };\n } else {\n return {\n source: sourcecode,\n language: \"plaintext\",\n comments: [],\n tags,\n markup,\n output: null,\n runtime: true,\n task: null,\n };\n }\n}\n\nfunction generateStaticExample(options: ExampleOptions): ExampleResult {\n const { filename, source, language, tags } = options;\n const slug = getExampleName(filename);\n const fingerprint = getFingerprint(source);\n const asset = `${slug}-${fingerprint}.${language}`;\n const runtimeLanguages = [\"html\"];\n const runtime = runtimeLanguages.includes(language);\n return {\n source,\n language: options.language,\n comments: [],\n tags,\n markup: source,\n output: runtime ? asset : null,\n runtime,\n task: null,\n };\n}\n","/**\n * @internal\n */\nexport function normalizeLanguage(lang: string): string {\n switch (lang) {\n case \"ts\":\n return \"typescript\";\n case \"js\":\n return \"javascript\";\n default:\n return lang;\n }\n}\n","import { normalizeLanguage } from \"./normalize-language\";\n\n/**\n * Parse a markdown infostring from a code fence.\n *\n * @internal\n */\nexport function parseInfostring(infostring: string): {\n language: string;\n tags: string[];\n} {\n const [rawLanguage, ...rawTags] = infostring.trim().split(/\\s+/);\n return {\n language: normalizeLanguage(rawLanguage),\n tags: rawTags,\n };\n}\n","import dedent from \"dedent\";\nimport { normalizeLanguage } from \"./normalize-language\";\n\nfunction removeLinesInline(\n lines: string[],\n { begin, end }: { begin: number; end: number },\n): void {\n /* remove lines by blanking them (when the lines are later joined these\n * blank lines end up being nothing */\n for (let i = begin; i <= end; i++) {\n lines[i] = \"\";\n }\n\n /* if the previous line is just a blank line we remove that as well */\n if (lines[begin - 1] === \"\\n\") {\n lines[begin - 1] = \"\";\n begin--;\n }\n\n /* if the next line is just a blank line we remove that as well */\n if (lines[end + 1] === \"\\n\") {\n lines[end + 1] = \"\";\n }\n\n /* remove the trailing newline from the new last line or we end up with an\n * extra newline at the end of the string that wasn't there before */\n if (end === lines.length - 1 && begin > 0) {\n lines[begin - 1] = lines[begin - 1].slice(0, -1);\n }\n}\n\nfunction cutSnippets(code: string): string {\n const lines = code\n .split(/\\n/)\n .map((it, index, lines) => (index < lines.length - 1 ? `${it}\\n` : it));\n const directive =\n /(?:\\/\\* +--- +cut (?<js>above|below|begin|end) +--- +\\*\\/|<!---? +cut (?<html>above|below|begin|end) +---?>)/;\n\n let buffer = -1;\n lines.forEach((line, index) => {\n const match = line.match(directive);\n const { js, html } = match?.groups ?? { js: null, html: null };\n const instruction = js ?? html;\n if (!instruction) {\n return;\n }\n switch (instruction) {\n /* --- cut above --- */\n case \"above\":\n /* remove all lines above (including this one) */\n removeLinesInline(lines, {\n begin: 0,\n end: index,\n });\n break;\n /* --- cut below --- */\n case \"below\":\n /* remove all lines below (including this one) */\n removeLinesInline(lines, {\n begin: index,\n end: lines.length - 1,\n });\n break;\n /* --- cut begin --- */\n case \"begin\":\n /* here we only hold on to the line number until we\n * encounter the end instruction */\n if (buffer === -1) {\n buffer = index;\n }\n break;\n /* --- cut end --- */\n case \"end\":\n removeLinesInline(lines, {\n begin: Math.max(buffer, 0),\n end: index,\n });\n buffer = -1;\n break;\n default:\n break;\n }\n });\n\n /* if cut begin was used without end we still have the line number buffered\n * and should interpret it as cut below, i.e. we remove all lines from begin\n * and down */\n if (buffer >= 0) {\n removeLinesInline(lines, {\n begin: buffer,\n end: lines.length - 1,\n });\n }\n\n return lines.join(\"\");\n}\n\nfunction stripEslintComments(code: string): string {\n /* matches an eslint comment occupying the whole line (entire line including\n * newline is removed) */\n const matchLine =\n /^[ \\t]*(\\/\\* eslint-disable[^*]*\\*\\/|\\/\\/ eslint-disable.*)\\n/gm;\n\n /* matches an eslint comment embedded with other statements (only the\n * commend and whitespace before it is removed) */\n const matchEmbedded =\n /[ \\t]*(\\/\\* eslint-disable[^*]*\\*\\/|\\/\\/ eslint-disable.*)/g;\n\n return code.replace(matchLine, \"\").replace(matchEmbedded, \"\");\n}\n\nfunction maybeDedent(value: string): string {\n /* if the string is only whitespace we preserve it exactly as is */\n if (/^\\s*$/.test(value)) {\n return value;\n }\n\n /* Conditionally calling dedent due to\n * https://github.com/dmnd/dedent/issues/20\n *\n * - If the first line is indented we dedent the string as usual.\n *\n * - If the first line is not indented the dedention should be a no-op as\n * the indentation level is zero already but the referenced bug causes\n * `dedent` to pick up any other indented line as basis for the current\n * indentation level and thus removes to much.\n *\n * Consider the following input:\n *\n * ```\n * function foo() {\n * return \"...\";\n * }\n * ```\n *\n * The expected output is the same as the input.\n */\n if (/^\\s/.test(value)) {\n return dedent(value);\n } else {\n return value;\n }\n}\n\n/* transformations to apply based on language, transforms are run from left to right */\nconst transformations: Record<string, Array<(code: string) => string>> = {\n html: [cutSnippets, maybeDedent],\n vue: [cutSnippets, maybeDedent],\n javascript: [cutSnippets, stripEslintComments, maybeDedent],\n typescript: [cutSnippets, stripEslintComments, maybeDedent],\n};\n\nexport function transformCode(code: string, lang: string): string {\n const normalizedLanguage = normalizeLanguage(lang);\n const fns = transformations[normalizedLanguage] ?? [];\n for (const fn of fns) {\n code = fn(code);\n }\n return code;\n}\n","/**\n * @public\n */\nexport interface SoftErrorDetails {\n ELINKTARGET: { key: string; hash: string; title: string };\n ELINKFORMAT: undefined;\n ELINKPARTIAL: { key: string; hash: string; title: string };\n EINCLUDETARGET: { id: string };\n EINCLUDERECURSION: undefined;\n ETAGMISSING: undefined;\n}\n\n/**\n * @public\n */\nexport type SoftErrorCode = keyof SoftErrorDetails;\n\n/**\n * A soft error than can be recovered from.\n *\n * @public\n */\nexport class SoftError<T extends SoftErrorCode> extends Error {\n public readonly code: T;\n public readonly details: SoftErrorDetails[T];\n\n /**\n * @internal\n */\n public constructor(\n code: T,\n message: string,\n ...args: SoftErrorDetails[T] extends undefined\n ? []\n : [SoftErrorDetails[T]]\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n const [details] = args;\n this.details = details as typeof this.details;\n }\n}\n\n/**\n * @public\n */\nexport type SoftErrorType = {\n [T in SoftErrorCode]: SoftError<T>;\n}[SoftErrorCode];\n","import { type Document, type DocumentPage } from \"../document\";\nimport { type InlineTag } from \"./inline-tags\";\nimport { SoftError, type SoftErrorType } from \"./soft-error\";\n\n/**\n * @internal\n */\nexport function processInlineTags(\n tags: InlineTag[],\n doc: DocumentPage,\n docs: Document[],\n text: string,\n handleSoftError: (error: SoftErrorType) => string,\n): string {\n return text.replace(/{@(@?)([^{}]+)}/g, (_, escape, content) => {\n if (escape) {\n return `{@${content}}`;\n }\n const match = content.match(/^(\\S+)($|\\s[^]+)$/);\n\n /* istanbul ignore next: should never happen but just in case this is a\n * better fallback than crashing */\n if (!match) {\n return `{@${content}}`;\n }\n\n const [, name, text] = match;\n const tag = tags.find((it) => it.name === name);\n if (!tag) {\n return handleSoftError(\n new SoftError(\n \"ETAGMISSING\",\n `No inline tag registered with the name \"${name}\"`,\n ),\n );\n }\n try {\n return tag.handler(doc, docs, text.trim());\n } catch (err) {\n if (err instanceof SoftError) {\n return handleSoftError(err);\n } else {\n throw err;\n }\n }\n });\n}\n","import path from \"node:path/posix\";\nimport { type DocumentPage, isDocumentPage } from \"../../document\";\nimport { SoftError } from \"../soft-error\";\nimport { getOutputFilePath, findDocument } from \"../../utils\";\nimport { type InlineTag } from \"./inline-tag\";\n\nfunction getRelativeUrl(from: DocumentPage, to: DocumentPage): string {\n const fromResolved = getOutputFilePath(\".\", from.fileInfo);\n const toResolved = getOutputFilePath(\".\", to.fileInfo);\n if (!fromResolved || !toResolved) {\n throw new Error(\"Cannot create link to document with no output\");\n }\n\n const fromDir = path.dirname(fromResolved);\n const toDir = path.dirname(toResolved);\n const relative = path.relative(fromDir, toResolved);\n if (fromDir === toDir) {\n return relative === \"index.html\" ? \"./\" : `./${relative}`;\n } else if (relative.endsWith(\"/index.html\")) {\n return path.dirname(relative);\n } else {\n return relative;\n }\n}\n\nfunction getLinkTitle(\n doc: DocumentPage,\n key: string,\n explicitTitle?: string,\n): string {\n if (explicitTitle) {\n return explicitTitle;\n }\n const { title, component } = doc.attributes;\n if (component && component.some((it) => it.name === key)) {\n return `<code>${key}</code>`;\n } else {\n return title ?? doc.name;\n }\n}\n\nexport const linkTag: InlineTag = {\n name: \"link\",\n description: \"Create a link to another document\",\n handler(doc, docs, content) {\n const match = content.match(/^([^\\s#]+)(#\\S+)?\\s*(.+)?$/);\n if (!match) {\n throw new SoftError(\n \"ELINKFORMAT\",\n `Failed to parse link \"${content}\"`,\n );\n }\n const [, key, hash, explicitTitle] = match;\n\n if (key.startsWith(\"http://\") || key.startsWith(\"https://\")) {\n return `<a href=\"${key}${hash ?? \"\"}\">${explicitTitle ?? key}</a>`;\n }\n\n const linked = findDocument(docs, key);\n if (!linked) {\n throw new SoftError(\n \"ELINKTARGET\",\n `Failed to find linked document \"${key}\"`,\n {\n key,\n hash,\n title: explicitTitle,\n },\n );\n }\n\n /* if the document we are trying to linkt to is not a page document we\n * cannot link to it as we don't know the url (i.e. what page it exists\n * on or even if it is included on any page at all)\n */\n if (!isDocumentPage(linked)) {\n throw new SoftError(\n \"ELINKPARTIAL\",\n `Cannot link to partial document \"${key}\"`,\n {\n key,\n hash,\n title: explicitTitle,\n },\n );\n }\n\n const url = getRelativeUrl(doc, linked);\n const title = getLinkTitle(linked, key, explicitTitle);\n return `<a href=\"${url}${hash ?? \"\"}\">${title}</a>`;\n },\n};\n","import { type InlineTag } from \"./inline-tag\";\n\nexport const optionalTag: InlineTag = {\n name: \"optional\",\n description: \"Create a tag for symbolize optional content\",\n handler() {\n return `<span class=\"docs-tag docs-tag--default\">Optional</span>`;\n },\n};\n","import { type InlineTag } from \"./inline-tag\";\nimport { linkTag } from \"./link\";\nimport { optionalTag } from \"./optional\";\n\nexport { type InlineTag } from \"./inline-tag\";\n\nconst inlineTags: InlineTag[] = [linkTag, optionalTag];\n\nexport default inlineTags;\n","/**\n * Find test-id among a list of example tags.\n *\n * @internal\n */\nexport function findTestId(tags: string[]): string | null {\n const prefix = \"test-id=\";\n const tag = tags.find((it) => {\n return it.startsWith(prefix);\n });\n const match = tag?.match(/^test-id=(?:\"([^\"]+)\"|'([^']+)'|([^'\"]+))$/);\n if (!match) {\n return null;\n }\n /* the matched value will be in match[1], match[2] or match[3] depending on\n * which of the three that matches */\n return match.slice(1).find(Boolean) ?? null;\n}\n","import hljs from \"highlight.js/lib/common\";\n\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g;\nconst HTML_REPLACEMENTS: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n};\n\nfunction escapeHtml(str: string): string {\n return str.replace(HTML_ESCAPE_REPLACE_RE, (ch) => HTML_REPLACEMENTS[ch]);\n}\n\nfunction wrap(content: string, language: string): string {\n const markup = /* HTML */ `\n <code class=\"hljs lang-${language}\" tabindex=\"0\">${content}</code>\n `;\n return markup.trim();\n}\n\n/**\n * @internal\n */\nexport function highlight({\n source,\n language,\n}: {\n source: string;\n language: string;\n}): string {\n switch (language) {\n case \"\":\n case \"import\":\n case \"mermaid\":\n case \"plaintext\":\n return `<code>${escapeHtml(source)}</code>`;\n case \"vue\":\n return highlight({ source, language: \"html\" });\n case \"html\":\n }\n try {\n const { value } = hljs.highlight(source, { language });\n return wrap(value, language);\n } catch (err) {\n return wrap(String(err), language);\n }\n}\n","export function replaceAtLink(text: string): string {\n return text.replace(/{@link [^}]+[$}]/g, (match) =>\n match.replace(/^{/, \"{\").replace(/}$/, \"}\"),\n );\n}\n","import path from \"node:path\";\nimport { createTwoFilesPatch } from \"diff\";\nimport type MarkdownIt from \"markdown-it\";\nimport {\n type ExampleResult,\n parseInfostring,\n transformCode,\n} from \"../../examples\";\nimport { type MarkdownEnv } from \"../markdown-env\";\nimport {\n findTag,\n getFingerprint,\n hasTag,\n htmlencode,\n parseImport,\n} from \"../../utils\";\nimport { findTestId, highlight, replaceAtLink } from \"./utils\";\n\n/**\n * @internal\n */\nexport interface CodePreviewOptions {\n /** Callback when an example should be generated */\n generateExample(options: {\n source: string;\n language: string;\n filename: string;\n tags: string[];\n }): ExampleResult;\n\n /** Callback to get source for an imported filename */\n getImportedSource(filename: string): string;\n}\n\nfunction getClassModifier(tags: string[]): string {\n if (tags.includes(\"borderless\")) {\n return \"code-preview--borderless\";\n }\n return \"code-preview--default\";\n}\n\nfunction getStandalonePath(output: string | null): string | null {\n if (!output) {\n return null;\n }\n const { dir, name } = path.parse(output);\n return path.join(dir, `${name}.html`);\n}\n\nfunction ensureTrailingNewline(text: string): string {\n if (text.endsWith(\"\\n\")) {\n return text;\n } else {\n return `${text}\\n`;\n }\n}\n\nexport function codePreview(\n options: CodePreviewOptions,\n): (md: MarkdownIt) => void {\n const { generateExample, getImportedSource } = options;\n\n return (md: MarkdownIt): void => {\n md.renderer.rules.fence = fence.bind(undefined, md);\n };\n\n function getSource(\n content: string,\n language: string,\n tags: string[],\n env: Pick<MarkdownEnv, \"namedExamples\">,\n ): { source: string; language: string } {\n const { namedExamples } = env;\n\n if (language === \"import\") {\n const parsed = parseImport(content);\n const importedContent = getImportedSource(parsed.filename);\n return getSource(importedContent, parsed.extension, tags, env);\n }\n\n const compare = findTag(tags, \"compare\");\n if (compare && compare.value !== null) {\n const { value: context } = findTag(tags, \"context\") ?? {};\n const reference = namedExamples.get(compare.value);\n if (!reference) {\n throw new Error(\n `Failed to find referenced example \"${compare.value}\"`,\n );\n }\n const a = ensureTrailingNewline(\n transformCode(reference.content, reference.language),\n );\n const b = ensureTrailingNewline(transformCode(content, language));\n const diff = createTwoFilesPatch(\"a\", \"b\", a, b, \"\", \"\", {\n context: context ? parseInt(context, 10) : 3,\n ignoreWhitespace: true,\n })\n .split(\"\\n\")\n .slice(4) // remove header\n .join(\"\\n\");\n return {\n source: diff,\n language: \"diff\",\n };\n }\n\n return { source: content, language };\n }\n\n function fence(\n _md: MarkdownIt,\n tokens: MarkdownIt.Token[],\n idx: number,\n _options: MarkdownIt.Options,\n env: MarkdownEnv,\n ): string {\n const { fileInfo } = env;\n const { content: rawContent, info, map } = tokens[idx];\n const { language: rawLanguage, tags: rawTags } = parseInfostring(info);\n\n const { source, language } = getSource(\n rawContent,\n rawLanguage,\n rawTags,\n env,\n );\n\n /* store a named reference to this example */\n const name = findTag(rawTags, \"name\")?.value;\n if (name) {\n env.namedExamples.set(name, {\n name,\n tags: rawTags,\n /* store original raw content unless it is an imported example */\n content: rawLanguage === \"import\" ? source : rawContent,\n language: rawLanguage === \"import\" ? language : rawLanguage,\n });\n }\n\n if (hasTag(rawTags, \"hidden\")) {\n return \"\";\n }\n\n if (rawLanguage === \"mermaid\") {\n return /* HTML */ `\n <pre class=\"mermaid\">${htmlencode(rawContent)}</pre>\n `;\n }\n\n /* pass original raw content for imported examples as the original\n * context is needed to resolve paths */\n const needOriginalSource =\n language !== \"diff\" && rawLanguage === \"import\";\n\n const example = generateExample({\n source: needOriginalSource ? rawContent : source,\n language: needOriginalSource ? rawLanguage : language,\n filename: fileInfo.fullPath,\n tags: rawTags,\n });\n const { tags } = example;\n\n const hashContent = `${map?.[0]}:${map?.[1]}:${info}:${source}`;\n const fingerprint = getFingerprint(hashContent);\n const transformedCode = transformCode(example.source, example.language);\n const highlightedCode = replaceAtLink(\n highlight({ source: transformedCode, language: example.language }),\n );\n const testId = findTestId(tags) ?? findTag(tags, \"name\")?.value;\n const liveExample = tags.includes(\"live-example\");\n const staticCode = example.runtime === false || tags.includes(\"static\");\n const noMarkup = tags.includes(\"nomarkup\");\n const fullscreen = tags.includes(\"fullscreen\");\n const modifier = getClassModifier(tags);\n const standalonePath = getStandalonePath(example.output);\n const showFullscreen = Boolean(standalonePath) && fullscreen;\n const testIdAttr = testId ? `data-test=\"${testId}\"` : \"\";\n const filteredTags = tags.filter((it) => {\n if (\n it.startsWith(\"test-id=\") ||\n it.startsWith(\"name\") ||\n it.startsWith(\"compare\")\n ) {\n return false;\n }\n return true;\n });\n const dataTagsAttr =\n filteredTags.length > 0\n ? `data-tags=\"${htmlencode(filteredTags.join(\" \"))}\"`\n : \"\";\n\n if (liveExample) {\n return /* HTML */ `\n <div\n id=\"example-${fingerprint}\"\n class=\"code-preview code-preview--borderless\"\n ${testIdAttr}\n ${dataTagsAttr}\n data-language=\"${example.language}\"\n >\n ${example.markup}\n </div>\n `;\n }\n\n if (staticCode) {\n return /* HTML */ `\n <div\n id=\"example-${fingerprint}\"\n class=\"code-preview ${modifier}\"\n ${testIdAttr}\n ${dataTagsAttr}\n data-language=\"${example.language}\"\n >\n ${example.comments.join(\"\\n\")}\n <pre class=\"code-preview__markup\">${highlightedCode}</pre>\n </div>\n `;\n }\n\n if (noMarkup) {\n return /* HTML */ `\n <div\n id=\"example-${fingerprint}\"\n class=\"code-preview ${modifier}\"\n ${testIdAttr}\n ${dataTagsAttr}\n data-language=\"${example.language}\"\n >\n ${example.comments.join(\"\\n\")}\n <div class=\"code-preview__preview\">${example.markup}</div>\n </div>\n `;\n }\n\n const toggleMarkup = /* HTML */ `\n <button\n type=\"button\"\n class=\"button button--discrete code-preview__toggle-markup\"\n aria-expanded=\"false\"\n onclick=\"toggleMarkup(this)\"\n >\n <i class=\"icon icon--code\"></i>\n Visa kod\n </button>\n `;\n\n const toggleFullscreen = showFullscreen\n ? /* HTML */ `\n <a href=\"${standalonePath}\" class=\"code-preview__fullscreen\">\n <i class=\"icon icon--fullscreen\"></i>\n Helskärm\n </a>\n `\n : \"\";\n\n return /* HTML */ `\n <div\n id=\"example-${fingerprint}\"\n class=\"code-preview ${modifier}\"\n ${testIdAttr}\n ${dataTagsAttr}\n data-language=\"${example.language}\"\n >\n ${example.comments.join(\"\\n\")}\n <div class=\"code-preview__preview\">${example.markup}</div>\n <div>${toggleMarkup} ${toggleFullscreen}</div>\n <div\n class=\"code-preview__expand animate-expand\"\n style=\"height: 0px;\"\n hidden\n >\n <pre class=\"code-preview__markup\">${highlightedCode}</pre>\n </div>\n </div>\n `;\n }\n}\n","import type MarkdownIt from \"markdown-it\";\nimport { generateId } from \"../../utils/generate-id\";\nimport { type MarkdownEnv } from \"../markdown-env\";\n\nfunction getTokensText(tokens: MarkdownIt.Token[]): string {\n return tokens\n .filter((token) => [\"text\", \"code_inline\"].includes(token.type))\n .map((token) => token.content)\n .join(\"\");\n}\n\nexport function headingLevel(options: {\n initialLevel: number;\n}): (md: MarkdownIt) => void {\n const { initialLevel } = options;\n const offset = initialLevel - 1;\n let counter = 1;\n return function (md: MarkdownIt): void {\n /* eslint-disable-next-line camelcase -- upstream library uses snake_case */\n md.renderer.rules.heading_open = function (\n tokens,\n idx,\n _options,\n env: MarkdownEnv,\n ) {\n const { ids } = env;\n const { tag } = tokens[idx];\n const title = getTokensText(tokens[idx + 1]?.children ?? []);\n let id = generateId(title);\n\n /* handles duplicate id's */\n if (ids.has(id)) {\n id += `--${counter++}`;\n }\n\n ids.add(id);\n\n return tag.replace(/h(\\d)/, (_, n: string) => {\n const level = parseInt(n, 10) + offset;\n env.currentHeading = level;\n return `<h${level} id=\"${id}\"><a class=\"header-anchor\" href=\"#${id}\">`;\n });\n };\n /* eslint-disable-next-line camelcase -- upstream library uses snake_case */\n md.renderer.rules.heading_close = function (tokens, idx) {\n const { tag } = tokens[idx];\n return tag.replace(/h(\\d)/, (_, n: string) => {\n const level = parseInt(n, 10) + offset;\n return `</a></h${level}>`;\n });\n };\n };\n}\n","import path from \"node:path/posix\";\nimport crypto from \"node:crypto\";\nimport type MarkdownIt from \"markdown-it\";\nimport { type FileInfo } from \"../../document\";\nimport { type MarkdownEnv } from \"../markdown-env\";\n\nfunction computeHash(source: string): string {\n return crypto.createHash(\"md5\").update(source).digest(\"hex\");\n}\n\nfunction getFilename(fileInfo: FileInfo, src: string): string {\n const key = [fileInfo.fullPath, src].join(\"-\");\n const hash = computeHash(key);\n const { ext } = path.parse(src);\n return `images/${hash}${ext}`;\n}\n\nexport function imageResources(options: {\n addResource(dst: string, src: string): void;\n}): (md: MarkdownIt) => void {\n const { addResource } = options;\n function imageResource(\n tokens: MarkdownIt.Token[],\n index: number,\n options: MarkdownIt.Options,\n env: MarkdownEnv,\n self: MarkdownIt.Renderer,\n ): string {\n const { fileInfo } = env;\n const token = tokens[index];\n\n token.attrs ??= [];\n\n /* copy image asset into the `assets/images` directory and rewrite the url to match */\n const srcAttr = token.attrGet(\"src\");\n if (srcAttr) {\n const dst = getFilename(fileInfo, srcAttr);\n const src = path.join(path.dirname(fileInfo.fullPath), srcAttr);\n const url = path.relative(fileInfo.path, path.join(\"assets\", dst));\n\n addResource(dst, src);\n token.attrs[token.attrIndex(\"src\")][1] = url;\n }\n\n /* from upstream original image renderer, sets the alt attribute */\n token.attrs[token.attrIndex(\"alt\")][1] = self.renderInlineAsText(\n /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- from upstream code */\n token.children!,\n options,\n env,\n );\n\n return self.renderToken(tokens, index, options);\n }\n\n return function (md: MarkdownIt): void {\n md.renderer.rules.image = imageResource;\n };\n}\n","import { findDocument } from \"../../../utils/find-document\";\nimport { type ContainerCallback } from \"./container-callback\";\nimport { type ContainerContext } from \"./container-context\";\n\n/**\n * Create a container renderer \"alt\" to render alternative texts.\n *\n * @internal\n */\nexport function altContainer(context: ContainerContext): ContainerCallback {\n const { md, env, docs } = context;\n return (tokens, index) => {\n const token = tokens[index];\n const needle = token.info;\n const tags = token.info.trim().split(/\\s+/);\n const doc = findDocument(docs, needle);\n\n if (doc && doc.format === \"markdown\") {\n const body =\n typeof doc.body === \"string\" ? doc.body : doc.body(tags);\n return md.render(body, env);\n }\n\n return md.render(token.content, env);\n };\n}\n","import { findDocument } from \"../../../utils/find-document\";\nimport { SoftError } from \"../../soft-error\";\nimport { type ContainerCallback } from \"./container-callback\";\nimport { type ContainerContext } from \"./container-context\";\n\n/**\n * Create a container renderer \"api\" to render API documentation.\n *\n * @internal\n */\nexport function apiContainer(context: ContainerContext): ContainerCallback {\n const { md, env, docs, included, handleSoftError } = context;\n return (tokens, index) => {\n const token = tokens[index];\n const needle = token.content.trim();\n const tags = token.info.trim().split(/\\s+/);\n const doc = findDocument(docs, needle);\n if (!doc) {\n return handleSoftError(\n new SoftError(\n \"EINCLUDETARGET\",\n `No document matches \"${needle}\" when trying to include content`,\n { id: needle },\n ),\n );\n }\n\n /* @todo here we should instead detect the chain of includes to\n * provide a better explanation of *why* it happened, not just\n * *that* it happend */\n const key = [doc.id, ...tags].join(\"|\");\n const loop = included.get(doc.id);\n if (loop && loop !== context.doc.id) {\n return handleSoftError(\n new SoftError(\n \"EINCLUDERECURSION\",\n `Recursion detected when including document \"${doc.id}\"`,\n ),\n );\n }\n included.set(key, context.doc.id);\n\n const body = typeof doc.body === \"string\" ? doc.body : doc.body(tags);\n\n if (doc.format === \"html\") {\n return body.replace(\n /* replace `<next-heading-level>` and `</next-heading-level>` with actual h-tags */\n /(?<=<\\/?)next-heading-level/g,\n `h${String(env.currentHeading + 1)}`,\n );\n }\n\n const content = md.render(body, env);\n return /* HTML */ ` <div>${content}</div> `;\n };\n}\n","import { type ContainerCallback } from \"./container-callback\";\nimport { type ContainerContext } from \"./container-context\";\n\n/**\n * Create a container renderer \"details\" to render details (special variant of\n * messagebox).\n *\n * @internal\n */\nexport function detailsContainer(\n context: ContainerContext,\n options: { title: Record<string, string | undefined> },\n): ContainerCallback {\n const { md, env } = context;\n\n function parseInfo(info: string | undefined): string {\n const customTitle = info ? info.split(\" \") : [];\n if (customTitle.length > 0) {\n return customTitle.join(\" \");\n } else {\n return options.title[\"details\"] || \"Details\";\n }\n }\n\n return (tokens, index) => {\n const token = tokens[index];\n const title = parseInfo(token.info);\n const text = token.content.trim();\n return /* HTML */ `\n <details class=\"docs-messagebox docs-messagebox--details\">\n <summary class=\"docs-messagebox__title\">\n ${md.renderInline(title, env)}\n </summary>\n ${md.render(text, env)}\n </details>\n `;\n };\n}\n","import { type ContainerCallback } from \"./container-callback\";\nimport { type ContainerContext } from \"./container-context\";\n\nconst defaultTitle: Record<string, string | undefined> = {\n info: \"INFO\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n};\n\n/**\n * Create a container renderer \"messagebox\" to render messageboxes.\n *\n * @internal\n * @param alias - If specified it creates a messagebox renderer only for given variant.\n */\nexport function messageboxContainer(\n context: ContainerContext,\n options: { title: Record<string, string | undefined> },\n alias?: string,\n): ContainerCallback {\n const { md, env } = context;\n\n function getTitle(\n variant: string,\n customTitle: string[] | undefined,\n ): string {\n if (customTitle && customTitle.length > 0) {\n return customTitle.join(\" \");\n } else {\n return options.title[variant] ?? defaultTitle[variant] ?? \"\";\n }\n }\n\n function parseInfo(info: string | undefined): {\n variant: string;\n title: string;\n } {\n if (alias) {\n const variant = alias;\n const customTitle = info ? info.split(\" \") : [];\n const title = getTitle(variant, customTitle);\n return { variant, title };\n } else {\n const [variant = \"info\", ...customTitle] = info\n ? info.split(\" \")\n : [];\n const title = getTitle(variant, customTitle);\n return { variant, title };\n }\n }\n\n return (tokens, index) => {\n const token = tokens[index];\n const { variant, title } = parseInfo(token.info);\n const text = token.content.trim();\n return /* HTML */ `\n <div class=\"docs-messagebox docs-messagebox--${variant}\">\n ${title\n ? `<p class=\"docs-messagebox__title\">${md.renderInline(\n title,\n env,\n )}</p>`\n : \"\"}\n ${md.render(text, env)}\n </div>\n `;\n };\n}\n","import type MarkdownIt from \"markdown-it\";\nimport { type Document } from \"../../document\";\nimport { type MarkdownEnv } from \"../markdown-env\";\nimport { type SoftErrorType } from \"../soft-error\";\nimport {\n type ContainerCallback,\n type ContainerContext,\n altContainer,\n apiContainer,\n detailsContainer,\n messageboxContainer,\n} from \"./container\";\n\ntype Options = Record<string, ContainerCallback>;\n\nconst markerStr = \":\";\nconst markerChar = markerStr.charCodeAt(0);\n\n/**\n * @internal\n */\nexport function containerParser(md: MarkdownIt, options: Options): void {\n function container(\n state: MarkdownIt.StateBlock,\n startLine: number,\n endLine: number,\n silent: boolean,\n ): boolean {\n let pos = state.bMarks[startLine] + state.tShift[startLine];\n let max = state.eMarks[startLine];\n\n // if it's indented more than 3 spaces, it should be a code block\n if (state.sCount[startLine] - state.blkIndent >= 4) {\n return false;\n }\n\n if (pos + 3 > max) {\n return false;\n }\n\n const marker = state.src.charCodeAt(pos);\n\n if (marker !== markerChar) {\n return false;\n }\n\n // scan marker length\n let mem = pos;\n pos = state.skipChars(pos, marker);\n\n let len = pos - mem;\n\n if (len < 3) {\n return false;\n }\n\n const markup = state.src.slice(mem, pos);\n const params = state.src.slice(pos, max).trim().split(/\\s+/);\n const kind = params[0];\n const info = params.slice(1).join(\" \");\n\n // Since start is found, we can report success here in validation mode\n if (silent) {\n return true;\n }\n\n // search end of block\n let nextLine = startLine;\n let haveEndMarker = false;\n\n for (;;) {\n nextLine++;\n if (nextLine >= endLine) {\n // unclosed block should be autoclosed by end of document.\n // also block seems to be autoclosed by end of parent\n break;\n }\n\n pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];\n max = state.eMarks[nextLine];\n\n if (pos < max && state.sCount[nextLine] < state.blkIndent) {\n // non-empty line with negative indent should stop the list:\n // - ```\n // test\n break;\n }\n\n if (state.src.charCodeAt(pos) !== marker) {\n continue;\n }\n\n if (state.sCount[nextLine] - state.blkIndent >= 4) {\n // closing fence should be indented less than 4 spaces\n continue;\n }\n\n pos = state.skipChars(pos, marker);\n\n // closing code fence must be at least as long as the opening one\n if (pos - mem < len) {\n continue;\n }\n\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos < max) {\n continue;\n }\n\n haveEndMarker = true;\n // found!\n break;\n }\n\n // If a fence has heading spaces, they should be removed from its inner block\n len = state.sCount[startLine];\n\n state.line = nextLine + (haveEndMarker ? 1 : 0);\n\n const token = state.push(`doc_${kind}`, \"div\", 0);\n token.info = info?.trim();\n token.content = state.getLines(startLine + 1, nextLine, len, true);\n token.markup = markup;\n token.map = [startLine, state.line];\n\n return true;\n }\n\n md.block.ruler.before(\"fence\", \"container_include\", container, {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n for (const [kind, fn] of Object.entries(options)) {\n md.renderer.rules[`doc_${kind}`] = fn;\n }\n}\n\n/* eslint-disable-next-line @typescript-eslint/max-params -- technical debt: should create and interface or similar */\nexport function containerRenderer(\n doc: () => Document,\n docs: Document[],\n env: MarkdownEnv,\n included: Map<string, string>,\n handleSoftError: (error: SoftErrorType) => string,\n options: {\n messagebox: {\n title: Record<string, string>;\n };\n },\n): (md: MarkdownIt) => void {\n return function (md: MarkdownIt): void {\n const context: ContainerContext = {\n md,\n env,\n get doc() {\n return doc();\n },\n docs,\n included,\n handleSoftError,\n };\n md.use(containerParser, {\n alt: altContainer(context),\n api: apiContainer(context),\n details: detailsContainer(context, options.messagebox),\n messagebox: messageboxContainer(context, options.messagebox),\n\n /* aliases for messagebox containers */\n info: messageboxContainer(context, options.messagebox, \"info\"),\n tip: messageboxContainer(context, options.messagebox, \"tip\"),\n warning: messageboxContainer(\n context,\n options.messagebox,\n \"warning\",\n ),\n danger: messageboxContainer(context, options.messagebox, \"danger\"),\n });\n };\n}\n","import type MarkdownIt from \"markdown-it\";\n\nexport function paragraph(): (md: MarkdownIt) => void {\n const renderToken: MarkdownIt.Renderer.RenderRule = (...args) => {\n const [tokens, idx, options, , self] = args;\n return self.renderToken(tokens, idx, options);\n };\n\n return function (md: MarkdownIt): void {\n /* eslint-disable camelcase -- property is defined in upstream library */\n const renderRule = md.renderer.rules.paragraph_open ?? renderToken;\n md.renderer.rules.paragraph_open = (tokens, idx, index, env, self) => {\n tokens[idx].attrJoin(\"class\", \"docs-paragraph\");\n return renderRule(tokens, idx, index, env, self);\n };\n /* eslint-enable camelcase */\n };\n}\n","/* eslint-disable camelcase -- upstream library uses snake_case */\n\nimport type markdownIt from \"markdown-it\";\n\nexport function table(): (md: markdownIt) => void {\n return function (md: markdownIt): void {\n md.renderer.rules.table_open = () => `<table class=\"table\">\\n`;\n md.renderer.rules.tr_open = () => `<tr class=\"table__row\">\\n`;\n md.renderer.rules.th_open = () =>\n `<th class=\"table__column table__column--text\" scope=\"col\">`;\n md.renderer.rules.td_open = () =>\n `<td class=\"table__column table__column--text\">`;\n };\n}\n","/* eslint-disable camelcase -- upstream library uses snake_case */\nimport type markdownIt from \"markdown-it\";\nimport { replaceAtLink } from \"./utils\";\n\ntype RenderRule = markdownIt.Renderer.RenderRule;\n\nexport function codeInline(): (md: markdownIt) => void {\n return function (md: markdownIt): void {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- will never be undefined\n const original = md.renderer.rules.code_inline!;\n md.renderer.rules.code_inline = (...args: Parameters<RenderRule>) => {\n const tmp = original(...args);\n return replaceAtLink(tmp);\n };\n };\n}\n","import markdownIt from \"markdown-it\";\nimport markdownItDeflist from \"markdown-it-deflist\";\nimport { type Document, type DocumentPage } from \"../document\";\nimport { type ExampleResult } from \"../examples/example-result\";\nimport { processInlineTags } from \"./process-inline-tags\";\nimport inlineTags from \"./inline-tags\";\nimport {\n codeInline,\n codePreview,\n headingLevel,\n imageResources,\n containerRenderer,\n table,\n paragraph,\n} from \"./markdown\";\nimport { MarkdownEnv } from \"./markdown-env\";\nimport { SoftErrorType } from \"./soft-error\";\n\n/**\n * Options for [[createMarkdownRenderer]].\n *\n * @public\n */\nexport interface MarkdownOptions {\n /** List of all available documents */\n readonly docs: Document[];\n\n /** Callback for adding a static resource */\n addResource(dst: string, src: string): void;\n\n /** Callback when an example should be generated */\n generateExample(options: {\n source: string;\n language: string;\n filename: string;\n tags: string[];\n }): ExampleResult;\n\n /** Callback to get source for an imported filename */\n getImportedSource(filename: string): string;\n\n /**\n * Handle error which can be recovered from.\n *\n * If a string is returned it replaces the intended content but otherwise\n * continues rendering.\n *\n * If the exception is rethrown it will cause the renderer to bail out.\n *\n * @param error - The error to be handled.\n * @returns A replacement string or rethrows error.\n */\n handleSoftError(error: SoftErrorType): string;\n\n /**\n * Options for messagebox container.\n */\n messagebox?: {\n /** Default titles for messageboxes */\n title?: Record<string, string>;\n };\n}\n\n/**\n * Markdown renderer.\n *\n * @public\n */\nexport interface MarkdownRenderer {\n /**\n * Render given markdown content to HTML\n *\n * @param doc - Document metadata.\n * @param content - Markdown content to render.\n * @returns HTML rendered from markdown content.\n */\n render(doc: DocumentPage, content: string): string;\n}\n\n/**\n * @public\n */\nexport function createMarkdownRenderer(\n options: MarkdownOptions,\n): MarkdownRenderer {\n const { docs } = options;\n const env: MarkdownEnv = {\n fileInfo: {\n fullPath: \"\",\n name: \"\",\n path: \"\",\n outputName: false,\n },\n ids: new Set(),\n currentHeading: 1,\n namedExamples: new Map(),\n };\n\n let currentDoc: Document | null = null;\n const getCurrentDocument = (): Document => {\n if (!currentDoc) {\n throw new Error(\n \"Internal error: getting current document before rendering has started\",\n );\n }\n return currentDoc;\n };\n\n const included = new Map<string, string>();\n const md = markdownIt({\n html: true,\n });\n md.use(markdownItDeflist);\n md.use(\n codePreview({\n generateExample: options.generateExample,\n getImportedSource: options.getImportedSource,\n }),\n );\n md.use(headingLevel({ initialLevel: 1 }));\n md.use(\n imageResources({\n addResource: options.addResource,\n }),\n );\n md.use(\n containerRenderer(\n getCurrentDocument,\n docs,\n env,\n included,\n options.handleSoftError,\n {\n messagebox: { title: {}, ...options.messagebox },\n },\n ),\n );\n md.use(paragraph());\n md.use(table());\n md.use(codeInline());\n\n return {\n render(doc: DocumentPage, content: string): string {\n currentDoc = doc;\n included.clear();\n included.set(doc.id, doc.id);\n env.fileInfo = doc.fileInfo;\n env.ids = new Set();\n const html = md.render(content, env);\n return processInlineTags(\n inlineTags,\n doc,\n docs,\n html,\n options.handleSoftError,\n );\n },\n };\n}\n"],"names":["path","version","vue3","language","lines","dedent","text","hljs","createTwoFilesPatch","options","markdownIt","markdownItDeflist"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var fs = require('node:fs/promises');
|
|
4
4
|
var path = require('node:path/posix');
|
|
5
5
|
var vendor = require('./vendor-CIZoJHXd.js');
|
|
6
|
-
var createMarkdownRenderer = require('./create-markdown-renderer-
|
|
6
|
+
var createMarkdownRenderer = require('./create-markdown-renderer-LaaGM3xi.js');
|
|
7
7
|
var path$1 = require('node:path');
|
|
8
8
|
var require$$1 = require('crypto');
|
|
9
9
|
require('node:crypto');
|
|
@@ -2478,7 +2478,7 @@ function stripPrettierComments(content) {
|
|
|
2478
2478
|
}
|
|
2479
2479
|
async function render(doc, docs, nav, vendors, options) {
|
|
2480
2480
|
const { fileInfo } = doc;
|
|
2481
|
-
const { i18n, outputFolder, cacheFolder, templateFolders } = options;
|
|
2481
|
+
const { i18n, outputFolder, cacheFolder, templateFolders, fileMatcher } = options;
|
|
2482
2482
|
if (!haveOutputFile(fileInfo)) {
|
|
2483
2483
|
return null;
|
|
2484
2484
|
}
|
|
@@ -2545,7 +2545,8 @@ async function render(doc, docs, nav, vendors, options) {
|
|
|
2545
2545
|
parent: fileInfo.fullPath,
|
|
2546
2546
|
setupPath: options.setupPath,
|
|
2547
2547
|
exampleFolders: options.exampleFolders,
|
|
2548
|
-
tags
|
|
2548
|
+
tags,
|
|
2549
|
+
fileMatcher
|
|
2549
2550
|
});
|
|
2550
2551
|
if (example.output) {
|
|
2551
2552
|
const { dir, name } = path$1.parse(example.output);
|
|
@@ -2559,6 +2560,11 @@ async function render(doc, docs, nav, vendors, options) {
|
|
|
2559
2560
|
}
|
|
2560
2561
|
return example;
|
|
2561
2562
|
},
|
|
2563
|
+
getImportedSource(filename) {
|
|
2564
|
+
const context = `when importing example from "${fileInfo.fullPath}"`;
|
|
2565
|
+
const match = fileMatcher(filename, context);
|
|
2566
|
+
return fs$1.readFileSync(match, "utf-8");
|
|
2567
|
+
},
|
|
2562
2568
|
addResource(dst2, src) {
|
|
2563
2569
|
if (!fs$1.existsSync(src)) {
|
|
2564
2570
|
throw new Error(`Failed to find image "${src}"`);
|
|
@@ -3204,6 +3210,7 @@ class Generator {
|
|
|
3204
3210
|
setupPath,
|
|
3205
3211
|
markdownOptions
|
|
3206
3212
|
} = this;
|
|
3213
|
+
const examplePatterns = this.exampleFolders.map((it) => `${it}/**/*`);
|
|
3207
3214
|
const i18n = vendor.createInstance({
|
|
3208
3215
|
lng: site.lang,
|
|
3209
3216
|
fallbackLng: "en",
|
|
@@ -3233,7 +3240,8 @@ class Generator {
|
|
|
3233
3240
|
exampleFolders,
|
|
3234
3241
|
templateFolders,
|
|
3235
3242
|
setupPath,
|
|
3236
|
-
markdown: markdownOptions ?? {}
|
|
3243
|
+
markdown: markdownOptions ?? {},
|
|
3244
|
+
fileMatcher: fileMatcher(examplePatterns)
|
|
3237
3245
|
}),
|
|
3238
3246
|
...this.processors
|
|
3239
3247
|
];
|