markupress 0.0.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +292 -22
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/content.d.ts +69 -3
- package/dist/content.d.ts.map +1 -1
- package/dist/content.js +191 -62
- package/dist/content.js.map +1 -1
- package/dist/controllers/code.d.ts +7 -0
- package/dist/controllers/code.d.ts.map +1 -0
- package/dist/controllers/code.js +31 -0
- package/dist/controllers/code.js.map +1 -0
- package/dist/controllers/outline.d.ts +8 -0
- package/dist/controllers/outline.d.ts.map +1 -0
- package/dist/controllers/outline.js +45 -0
- package/dist/controllers/outline.js.map +1 -0
- package/dist/controllers/shell.d.ts +5 -1
- package/dist/controllers/shell.d.ts.map +1 -1
- package/dist/controllers/shell.js +12 -25
- package/dist/controllers/shell.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/markdown.d.ts +24 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +46 -0
- package/dist/markdown.js.map +1 -0
- package/dist/navigation.d.ts +37 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +52 -0
- package/dist/navigation.js.map +1 -0
- package/dist/site.d.ts +31 -10
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +174 -262
- package/dist/site.js.map +1 -1
- package/dist/theme.d.ts +2 -1
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +4 -34
- package/dist/theme.js.map +1 -1
- package/dist/versions.d.ts +4 -1
- package/dist/versions.d.ts.map +1 -1
- package/dist/versions.js +30 -45
- package/dist/versions.js.map +1 -1
- package/package.json +22 -12
- package/styles/base.css +1 -21
- package/styles/prose.css +38 -0
- package/theme/outline.html +11 -0
- package/theme/shell.html +66 -0
- package/theme/theme.css +52 -0
package/dist/content.js
CHANGED
|
@@ -1,85 +1,198 @@
|
|
|
1
1
|
import { basename, resolve } from 'node:path';
|
|
2
2
|
import { pathToFileURL } from 'node:url';
|
|
3
|
-
import {
|
|
3
|
+
import { applyLoomaCodeNotation, parseLoomaFenceInfo, splitLoomaFrontmatter } from '@threadlabs/looma/markdown';
|
|
4
|
+
import { createLoomaMarkdownIt } from '@threadlabs/looma/markdown/markdown-it';
|
|
4
5
|
import { parseFragment, serialize, serializeOuter } from 'parse5';
|
|
6
|
+
import { bundledLanguages, createHighlighter } from 'shiki';
|
|
5
7
|
import { parseDocument } from 'yaml';
|
|
6
8
|
import { stylesheet } from './styles.js';
|
|
9
|
+
const index = /^(?:\d+\.)?index\.md$/;
|
|
10
|
+
/** Whether a Markdown file is its folder's index page, which HTMLKit reads as the folder's own entry. */
|
|
11
|
+
export const isIndex = (file) => index.test(basename(file));
|
|
7
12
|
export function escapeHTML(value) {
|
|
8
13
|
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
9
14
|
}
|
|
10
15
|
// Markdown text is literal author content. Raw HTML tokens retain component expressions.
|
|
11
16
|
export function literal(value) { return value.replace(/\\/g, '\\\\').replace(/{/g, '\\{'); }
|
|
17
|
+
// Token colors are light-dark(light, dark), so they follow the page's color-scheme; --shiki-light and
|
|
18
|
+
// --shiki-dark carry the same colors for sites that switch another way. These themes keep common
|
|
19
|
+
// tokens at 4.5:1 or better on Looma's light and dark page surfaces.
|
|
20
|
+
const themes = { light: 'github-light-default', dark: 'github-dark-default' };
|
|
21
|
+
let highlighter;
|
|
22
|
+
const shikiOutput = {
|
|
23
|
+
// The site's stylesheet owns the code block's surface; Shiki's colors stay on the tokens.
|
|
24
|
+
pre(node) { delete node.properties.style; },
|
|
25
|
+
code(node) { this.addClassToHast(node, `language-${this.options.lang}`); },
|
|
26
|
+
// Code is literal author content: escape it like Markdown text so HTML Next never interpolates it.
|
|
27
|
+
span(node) { for (const child of node.children)
|
|
28
|
+
if (child.type === 'text')
|
|
29
|
+
child.value = literal(child.value); },
|
|
30
|
+
};
|
|
31
|
+
// Plain text needs no grammar, yet takes line highlighting and numbers like any highlighted language.
|
|
32
|
+
const plain = new Set(['text', 'plaintext', 'txt', 'plain']);
|
|
33
|
+
async function highlight(code, lang, lines) {
|
|
34
|
+
// One highlighter serves every page; a grammar loads the first time a fence uses its language.
|
|
35
|
+
const shiki = await (highlighter ??= createHighlighter({ themes: Object.values(themes), langs: [] }));
|
|
36
|
+
if (!plain.has(lang))
|
|
37
|
+
await shiki.loadLanguage(lang);
|
|
38
|
+
return shiki.codeToHtml(code, { lang, themes, defaultColor: 'light-dark()', transformers: [shikiOutput, lines] });
|
|
39
|
+
}
|
|
40
|
+
// Line highlighting and numbers are classes written at build time; the theme's stylesheet draws them. The fence
|
|
41
|
+
// meta stays on <code> as Looma Markdown's canonical HTML writes it.
|
|
42
|
+
const lineClasses = (marked, numbers, meta) => ({
|
|
43
|
+
pre(node) { if (numbers)
|
|
44
|
+
this.addClassToHast(node, 'line-numbers'); },
|
|
45
|
+
code(node) { if (meta)
|
|
46
|
+
node.properties['data-meta'] = meta; },
|
|
47
|
+
line(node, line) { if (marked.has(line))
|
|
48
|
+
this.addClassToHast(node, 'highlighted'); },
|
|
49
|
+
});
|
|
50
|
+
// Hidden until the page's code controller connects, so without JavaScript a code block is only its code.
|
|
51
|
+
const codeActions = '<div class="code-actions" hidden aria-live="polite"><button type="button" data-code-action="wrap" aria-pressed="false">Wrap</button>' +
|
|
52
|
+
'<button type="button" data-code-action="copy">Copy</button></div>';
|
|
12
53
|
function textContent(node) {
|
|
13
54
|
if ('value' in node)
|
|
14
55
|
return node.value;
|
|
15
56
|
return 'childNodes' in node ? node.childNodes.map(textContent).join('') : '';
|
|
16
57
|
}
|
|
58
|
+
// Looma Markdown: Looma's markdown-it plugin parses every form and renders the standard's canonical HTML. Markupress adds its presentation on top: Shiki code figures, heading self-links, literal text,
|
|
59
|
+
// and native component carriers.
|
|
60
|
+
const md = createLoomaMarkdownIt();
|
|
61
|
+
const { escapeHtml } = md.utils;
|
|
62
|
+
const rules = md.renderer.rules;
|
|
63
|
+
// Markdown text is literal: braces are escaped so HTML Next never interpolates them. Attributes are always literal
|
|
64
|
+
// in HTML Next, and raw HTML keeps its expressions. Plugin rules escape their text and attributes alike, so their
|
|
65
|
+
// text segments (between tags, where escaped HTML holds no `>`) gain the same escape.
|
|
66
|
+
const literalText = (html) => html.replace(/>([^<]+)</g, (_, text) => `>${literal(text)}<`);
|
|
67
|
+
for (const name of ['looma_container_open', 'looma_chip', 'looma_mention', 'looma_toc']) {
|
|
68
|
+
const rule = rules[name];
|
|
69
|
+
rules[name] = (...args) => literalText(rule(...args));
|
|
70
|
+
}
|
|
71
|
+
rules.text = (tokens, index) => literal(escapeHtml(tokens[index].content));
|
|
72
|
+
rules.code_inline = (tokens, index, _options, _env, self) => `<code${self.renderAttrs(tokens[index])}>${literal(escapeHtml(tokens[index].content))}</code>`;
|
|
73
|
+
// Each heading links to its own anchor, which the plugin assigned.
|
|
74
|
+
rules.heading_open = (tokens, index, options, _env, self) => `${self.renderToken(tokens, index, options)}<a href="#${escapeHtml(tokens[index].attrGet('id') ?? '')}">`;
|
|
75
|
+
rules.heading_close = (tokens, index, options, _env, self) => `</a>${self.renderToken(tokens, index, options)}`;
|
|
76
|
+
// Code reads as Looma's code notation leaves it: `[!code highlight]` comments are removed from every fence.
|
|
77
|
+
const plainCode = (code, { language, meta }) => `<pre><code${language ? ` class="language-${escapeHtml(language)}"` : ''}${meta ? ` data-meta="${escapeHtml(meta)}"` : ''}>${literal(escapeHtml(applyLoomaCodeNotation(code.replace(/\n$/, '')).code))}</code></pre>`;
|
|
78
|
+
const codeFigure = (pre, title) => `<figure class="code">${title ? `<figcaption>${literal(escapeHtml(title))}</figcaption>` : ''}${codeActions}${pre}</figure>\n`;
|
|
79
|
+
rules.fence = (tokens, index, _options, env) => {
|
|
80
|
+
const token = tokens[index], info = parseLoomaFenceInfo(token.info), tab = tokens[index - 1];
|
|
81
|
+
// A code group's tab already shows the fence title that labels it.
|
|
82
|
+
const title = tab?.type === 'looma_tab_open' && tab.meta.label === info.title ? undefined : info.title;
|
|
83
|
+
return codeFigure(env.highlighted.get(token) ?? plainCode(token.content, info), title);
|
|
84
|
+
};
|
|
85
|
+
rules.code_block = (tokens, index) => codeFigure(plainCode(tokens[index].content, { meta: '' }));
|
|
86
|
+
// A native component carrier, `<template component>` at the start of a block, is raw HTML through its closing tag,
|
|
87
|
+
// blank lines included. Native fragment parsing finds the boundary, nested templates too, so Markdown never
|
|
88
|
+
// interprets a component's CSS, expressions or internal markup.
|
|
89
|
+
md.block.ruler.before('html_block', 'native_component', (state, startLine, endLine, silent) => {
|
|
90
|
+
const start = state.bMarks[startLine] + state.tShift[startLine];
|
|
91
|
+
if (state.sCount[startLine] - state.blkIndent >= 4 || !/^<template(?:\s|>)/i.test(state.src.slice(start, start + 10)))
|
|
92
|
+
return false;
|
|
93
|
+
const carrier = parseFragment(state.src.slice(start), { sourceCodeLocationInfo: true }).childNodes.find(node => 'tagName' in node);
|
|
94
|
+
if (!carrier || !('tagName' in carrier) || carrier.tagName !== 'template' || !carrier.attrs.some(attr => attr.name === 'component'))
|
|
95
|
+
return false;
|
|
96
|
+
const end = carrier.sourceCodeLocation?.endTag?.endOffset;
|
|
97
|
+
if (end === undefined)
|
|
98
|
+
throw new Error(`${state.env.file}: unclosed native component template.`);
|
|
99
|
+
let line = startLine;
|
|
100
|
+
while (line < endLine && state.eMarks[line] < start + end)
|
|
101
|
+
line++;
|
|
102
|
+
if (line >= endLine)
|
|
103
|
+
return false;
|
|
104
|
+
if (silent)
|
|
105
|
+
return true;
|
|
106
|
+
const token = state.push('html_block', '', 0);
|
|
107
|
+
token.content = state.src.slice(start, state.eMarks[line]) + '\n';
|
|
108
|
+
token.map = [startLine, line + 1];
|
|
109
|
+
state.line = line + 1;
|
|
110
|
+
return true;
|
|
111
|
+
}, { alt: ['paragraph', 'reference', 'blockquote'] });
|
|
17
112
|
function frontmatter(source, file) {
|
|
18
|
-
const
|
|
19
|
-
if (
|
|
113
|
+
const split = splitLoomaFrontmatter(source);
|
|
114
|
+
if (split === null)
|
|
20
115
|
return { body: source, fields: {} };
|
|
21
|
-
const document = parseDocument(
|
|
116
|
+
const document = parseDocument(split.yaml);
|
|
22
117
|
if (document.errors.length > 0)
|
|
23
118
|
throw new Error(`${file}: ${document.errors.map(error => error.message).join('; ')}`);
|
|
24
119
|
const fields = document.toJS();
|
|
25
120
|
if (fields === null || typeof fields !== 'object' || Array.isArray(fields))
|
|
26
121
|
throw new Error(`${file}: frontmatter must be a mapping.`);
|
|
27
|
-
return { body:
|
|
122
|
+
return { body: split.body, fields: fields };
|
|
123
|
+
}
|
|
124
|
+
const text = (value) => typeof value === 'string' && value !== '';
|
|
125
|
+
const strings = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) &&
|
|
126
|
+
Object.values(value).every(item => typeof item === 'string' || typeof item === 'number');
|
|
127
|
+
const level = (value) => Number.isInteger(value) && value >= 1 && value <= 6;
|
|
128
|
+
const fieldTypes = {
|
|
129
|
+
title: [text, 'a nonempty string'], description: [text, 'a nonempty string'],
|
|
130
|
+
order: [value => Number.isSafeInteger(value) && value >= 0, 'a whole number'],
|
|
131
|
+
navigation: [value => value === 'hidden' || value === 'collapsed', 'hidden, or collapsed on a folder\'s index page'],
|
|
132
|
+
id: [text, 'a nonempty string'],
|
|
133
|
+
aliases: [value => Array.isArray(value) && value.every(item => typeof item === 'string'), 'a list of route paths'],
|
|
134
|
+
layout: [value => value === false || text(value), 'an HTMLKit layout name or false'],
|
|
135
|
+
outline: [value => value === false || (Array.isArray(value) && value.length === 2 && value.every(level) && value[0] <= value[1]), 'false or a heading range such as [2, 3]'],
|
|
136
|
+
head: [value => (value !== null && typeof value === 'object' && !Array.isArray(value) && Object.entries(value).every(([key, item]) => key === 'canonical' ? text(item) : (key === 'meta' || key === 'og') && strings(item))), 'a mapping of meta, og and canonical'],
|
|
137
|
+
editLink: [value => value === false || text(value), 'a URL or false'],
|
|
138
|
+
};
|
|
139
|
+
function validFrontMatter(fields, file) {
|
|
140
|
+
for (const [name, value] of Object.entries(fields)) {
|
|
141
|
+
const type = fieldTypes[name];
|
|
142
|
+
if (type === undefined)
|
|
143
|
+
throw new Error(`${file}: unknown front matter field ${name}. Fields are ${Object.keys(fieldTypes).join(', ')}.`);
|
|
144
|
+
if (!type[0](value))
|
|
145
|
+
throw new Error(`${file}: front matter ${name} must be ${type[1]}.`);
|
|
146
|
+
}
|
|
147
|
+
// HTMLKit reads a folder from its index page, so only an index page can start its folder collapsed.
|
|
148
|
+
if (fields.navigation === 'collapsed' && !isIndex(file))
|
|
149
|
+
throw new Error(`${file}: front matter navigation collapsed applies to a folder's index page.`);
|
|
150
|
+
return fields;
|
|
28
151
|
}
|
|
29
|
-
|
|
152
|
+
// Blocks rendered as Looma components, which the page links by package specifier, as the theme's shell links
|
|
153
|
+
// ui-button, so the site resolves Looma.
|
|
154
|
+
const blockComponent = (token) => token.type === 'looma_container_open'
|
|
155
|
+
? (token.info === 'tabs' || token.info === 'code-group' ? 'ui-tabs' : token.info === 'details' || token.info === 'figure' ? undefined : 'ui-callout')
|
|
156
|
+
: token.type === 'blockquote_open' && token.tag === 'ui-callout' ? 'ui-callout' : undefined;
|
|
157
|
+
/**
|
|
158
|
+
* The Looma Markdown layer: splits the front matter, parses with Looma's plugin and renders with Markupress's
|
|
159
|
+
* presentation. Front matter fields are left to the host; compileMarkdown validates Markupress's.
|
|
160
|
+
*/
|
|
161
|
+
export async function renderMarkdown(source, options) {
|
|
30
162
|
const { body, fields } = frontmatter(source, options.file);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
163
|
+
const tokens = md.parse(source, { file: options.file });
|
|
164
|
+
const highlighted = new Map(), components = new Set(), headings = [];
|
|
165
|
+
let hasCode = false;
|
|
166
|
+
for (const [index, token] of tokens.entries()) {
|
|
167
|
+
const component = blockComponent(token);
|
|
168
|
+
if (component)
|
|
169
|
+
components.add(component);
|
|
170
|
+
if (token.type === 'heading_open') {
|
|
171
|
+
const id = token.attrGet('id');
|
|
172
|
+
const label = textContent(parseFragment(md.renderer.renderInline(tokens[index + 1].children ?? [], md.options, { highlighted }))).replace(/\\([\\{])/g, '$1');
|
|
173
|
+
headings.push({ id, href: `#${id}`, label, depth: Number(token.tag.slice(1)) });
|
|
174
|
+
}
|
|
175
|
+
if (token.type === 'code_block')
|
|
176
|
+
hasCode = true;
|
|
177
|
+
if (token.type !== 'fence')
|
|
178
|
+
continue;
|
|
179
|
+
hasCode = true;
|
|
180
|
+
const { language, meta, lines, lineNumbers = options.lineNumbers ?? false } = parseLoomaFenceInfo(token.info);
|
|
181
|
+
// Languages Shiki does not bundle stay escaped plain text.
|
|
182
|
+
if (!language || !(Object.hasOwn(bundledLanguages, language) || plain.has(language)))
|
|
183
|
+
continue;
|
|
184
|
+
// Highlighted lines are the fence's `{1,3-5}` and the lines its `[!code highlight]` comments mark.
|
|
185
|
+
const { code, lines: noted } = applyLoomaCodeNotation(token.content.replace(/\n$/, ''));
|
|
186
|
+
const marked = new Set([...lines, ...noted]);
|
|
187
|
+
highlighted.set(token, await highlight(code, language, lineClasses(marked, lineNumbers, meta)));
|
|
34
188
|
}
|
|
189
|
+
return { html: md.renderer.render(tokens, md.options, { highlighted }), frontmatter: fields, body, headings, hasCode, components };
|
|
190
|
+
}
|
|
191
|
+
export async function compileMarkdown(source, options) {
|
|
192
|
+
const { html, frontmatter: raw, body, headings, hasCode, components } = await renderMarkdown(source, options);
|
|
193
|
+
const fields = { ...options.frontmatter, ...validFrontMatter(raw, options.file) };
|
|
35
194
|
const aliases = fields.aliases ?? [];
|
|
36
|
-
|
|
37
|
-
throw new Error(`${options.file}: sidebarHidden must be a boolean.`);
|
|
38
|
-
if (!Array.isArray(aliases) || aliases.some(value => typeof value !== 'string'))
|
|
39
|
-
throw new Error(`${options.file}: aliases must be a list of route paths.`);
|
|
40
|
-
const headings = new Map();
|
|
41
|
-
let firstHeading;
|
|
42
|
-
const markdown = new Marked({ async: false, renderer: {
|
|
43
|
-
text(token) { return 'tokens' in token && token.tokens ? this.parser.parseInline(token.tokens) : literal(token.text); },
|
|
44
|
-
codespan({ text }) { return `<code>${literal(escapeHTML(text))}</code>`; },
|
|
45
|
-
code({ text, lang }) { return `<pre><code${lang ? ` class="language-${escapeHTML(lang.split(/\s/)[0])}"` : ''}>${literal(escapeHTML(text))}</code></pre>\n`; },
|
|
46
|
-
heading({ tokens, depth }) {
|
|
47
|
-
const html = this.parser.parseInline(tokens);
|
|
48
|
-
const label = textContent(parseFragment(html)).replace(/\\([\\{])/g, '$1');
|
|
49
|
-
firstHeading ??= label;
|
|
50
|
-
const stem = label.normalize('NFKD').toLowerCase().replace(/[^\p{L}\p{N}]+/gu, '-').replace(/^-|-$/g, '') || 'heading';
|
|
51
|
-
const count = headings.get(stem) ?? 0;
|
|
52
|
-
headings.set(stem, count + 1);
|
|
53
|
-
const id = count === 0 ? stem : `${stem}-${count}`;
|
|
54
|
-
return `<h${depth} id="${escapeHTML(id)}"><a href="#${escapeHTML(id)}">${html}</a></h${depth}>\n`;
|
|
55
|
-
},
|
|
56
|
-
link({ href, title, tokens }) {
|
|
57
|
-
const target = options.resolveLink?.(href, 'link') ?? href;
|
|
58
|
-
return `<a href="${escapeHTML(target)}"${title ? ` title="${escapeHTML(title)}"` : ''}>${this.parser.parseInline(tokens)}</a>`;
|
|
59
|
-
},
|
|
60
|
-
image({ href, title, text }) {
|
|
61
|
-
const target = options.resolveLink?.(href, 'asset') ?? href;
|
|
62
|
-
return `<img src="${escapeHTML(target)}" alt="${escapeHTML(text)}"${title ? ` title="${escapeHTML(title)}"` : ''}>`;
|
|
63
|
-
},
|
|
64
|
-
} });
|
|
65
|
-
markdown.use({ extensions: [{ name: 'native-component', level: 'block',
|
|
66
|
-
start(text) { return text.indexOf('<template'); },
|
|
67
|
-
tokenizer(text) {
|
|
68
|
-
if (!/^ {0,3}<template(?:\s|>)/i.test(text))
|
|
69
|
-
return undefined;
|
|
70
|
-
// Native fragment parsing identifies the carrier boundary, including nested templates.
|
|
71
|
-
// Markdown must never interpret a component's CSS, expressions or internal markup.
|
|
72
|
-
const carrier = parseFragment(text, { sourceCodeLocationInfo: true }).childNodes.find(node => 'tagName' in node);
|
|
73
|
-
if (!carrier || !('tagName' in carrier) || carrier.tagName !== 'template' || !carrier.attrs.some(attr => attr.name === 'component'))
|
|
74
|
-
return undefined;
|
|
75
|
-
const end = carrier.sourceCodeLocation?.endTag?.endOffset;
|
|
76
|
-
if (end === undefined)
|
|
77
|
-
throw new Error(`${options.file}: unclosed native component template.`);
|
|
78
|
-
const raw = text.slice(0, end);
|
|
79
|
-
return { type: 'native-component', raw };
|
|
80
|
-
}, renderer(token) { return token.raw; },
|
|
81
|
-
}] });
|
|
82
|
-
const fragment = parseFragment(markdown.parse(body));
|
|
195
|
+
const fragment = parseFragment(html);
|
|
83
196
|
const declarations = [];
|
|
84
197
|
const metadata = [];
|
|
85
198
|
const original = pathToFileURL(resolve(options.file)).href;
|
|
@@ -96,7 +209,7 @@ export function compileMarkdown(source, options) {
|
|
|
96
209
|
if (node.tagName === 'link' && attribute.name === 'href' && node.attrs.some(attr => attr.name === 'rel' && attr.value.split(/\s+/).includes('component')))
|
|
97
210
|
attribute.value = rebase(attribute.value);
|
|
98
211
|
else if (options.resolveLink && ((attribute.name === 'href' && node.tagName === 'a') || (attribute.name === 'src' && node.tagName === 'img'))) {
|
|
99
|
-
//
|
|
212
|
+
// Every authored link and image, from Markdown or raw HTML, resolves here once.
|
|
100
213
|
attribute.value = options.resolveLink(attribute.value, attribute.name === 'src' ? 'asset' : 'link');
|
|
101
214
|
}
|
|
102
215
|
}
|
|
@@ -120,10 +233,26 @@ export function compileMarkdown(source, options) {
|
|
|
120
233
|
}
|
|
121
234
|
};
|
|
122
235
|
visit(fragment, false);
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
236
|
+
for (const name of components)
|
|
237
|
+
declarations.push(`<link rel="component" href="@threadlabs/looma/components/${name}/${name}.html">`);
|
|
238
|
+
const title = fields.title ?? headings[0]?.label ?? basename(options.file, '.md').replace(/^\d+\./, '');
|
|
239
|
+
// A folder's index page with front matter only generates the folder's listing, which the layout's loader supplies.
|
|
240
|
+
const generated = isIndex(options.file) && body.trim() === '';
|
|
241
|
+
// Front matter becomes HTMLKit page metadata: HTMLKit owns navigation labels, order, visibility, alias routes, the
|
|
242
|
+
// layout choice, and the document head, which merges meta and canonical links by identity.
|
|
243
|
+
const { meta = {}, og = {}, canonical } = fields.head ?? {};
|
|
244
|
+
const head = `<title>${literal(escapeHTML(title))}</title>` + (fields.description === undefined ? '' : `<meta name="description" content="${escapeHTML(fields.description)}">`) +
|
|
245
|
+
`<meta name="hk:label" content="${escapeHTML(title)}">` + (fields.navigation === 'hidden' ? '<meta name="hk:navigation" content="hidden">' : '') +
|
|
246
|
+
(fields.order === undefined ? '' : `<meta name="hk:order" content="${fields.order}">`) +
|
|
247
|
+
aliases.map(alias => `<meta name="hk:alias" content="${escapeHTML(alias)}">`).join('') +
|
|
248
|
+
(fields.layout === undefined ? '' : `<meta name="hk:layout" content="${fields.layout === false ? 'none' : escapeHTML(fields.layout)}">`) +
|
|
249
|
+
Object.entries(meta).map(([name, content]) => `<meta name="${escapeHTML(name)}" content="${escapeHTML(String(content))}">`).join('') +
|
|
250
|
+
Object.entries(og).map(([name, content]) => `<meta property="og:${escapeHTML(name)}" content="${escapeHTML(String(content))}">`).join('') +
|
|
251
|
+
(canonical === undefined ? '' : `<link rel="canonical" href="${escapeHTML(canonical)}">`);
|
|
252
|
+
const [from, to] = fields.outline === false ? [0, -1] : fields.outline ?? [2, 3];
|
|
253
|
+
const styles = options.styles?.length ? `<style>${options.styles.map(file => `@import "${pathToFileURL(file).href}";`).join('')}</style>` : '';
|
|
254
|
+
return { title, aliases, generated, ...(fields.id === undefined ? {} : { id: fields.id }),
|
|
255
|
+
frontmatter: fields, outline: headings.filter(heading => heading.depth >= from && heading.depth <= to),
|
|
256
|
+
resource: `<meta name="hk:page" content="${escapeHTML(options.pageName)}">\n${declarations.join('\n')}\n<template component="${escapeHTML(options.pageName)}"${hasCode ? ' controller="markupress/controllers/code.js"' : ''}>${head}${metadata.join('')}<article class="markupress-prose">${generated ? `<h1>${literal(escapeHTML(title))}</h1>` : ''}${serialize(fragment)}</article>${styles}</template>\n` };
|
|
128
257
|
}
|
|
129
258
|
//# sourceMappingURL=content.js.map
|
package/dist/content.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ComponentHost } from '@nextwebwg/html-next/runtime';
|
|
2
|
+
/**
|
|
3
|
+
* A Markdown page's code block buttons. One delegated listener serves every block; native buttons give
|
|
4
|
+
* keyboard access, and the clipboard API copies the code's text, which excludes CSS line numbers.
|
|
5
|
+
*/
|
|
6
|
+
export default function code(host: ComponentHost): void;
|
|
7
|
+
//# sourceMappingURL=code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/controllers/code.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAuBtD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Markdown page's code block buttons. One delegated listener serves every block; native buttons give
|
|
3
|
+
* keyboard access, and the clipboard API copies the code's text, which excludes CSS line numbers.
|
|
4
|
+
*/
|
|
5
|
+
export default function code(host) {
|
|
6
|
+
host.on('connect', () => {
|
|
7
|
+
const root = host.root;
|
|
8
|
+
const window = root.ownerDocument.defaultView;
|
|
9
|
+
for (const actions of root.querySelectorAll('.code-actions'))
|
|
10
|
+
actions.hidden = false;
|
|
11
|
+
const click = (event) => {
|
|
12
|
+
const button = event.target instanceof window.Element ? event.target.closest('button[data-code-action]') : null;
|
|
13
|
+
const pre = button?.closest('figure.code')?.querySelector('pre');
|
|
14
|
+
if (!button || !pre || !root.contains(button))
|
|
15
|
+
return;
|
|
16
|
+
if (button.dataset.codeAction === 'wrap') {
|
|
17
|
+
const wrap = button.getAttribute('aria-pressed') !== 'true';
|
|
18
|
+
button.setAttribute('aria-pressed', String(wrap));
|
|
19
|
+
pre.classList.toggle('wrap', wrap);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
void window.navigator.clipboard.writeText(pre.textContent ?? '').then(() => 'Copied', () => 'Copy failed').then(label => {
|
|
23
|
+
button.textContent = label;
|
|
24
|
+
window.setTimeout(() => { button.textContent = 'Copy'; }, 2000);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
root.addEventListener('click', click);
|
|
28
|
+
return () => root.removeEventListener('click', click);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/controllers/code.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,IAAmB;IAC9C,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,WAAY,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAc,eAAe,CAAC;YAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;QAClG,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,YAAY,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAoB,0BAA0B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnI,MAAM,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO;YACtD,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC;gBAC5D,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClD,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,KAAK,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACtH,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC3B,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ComponentHost } from '@nextwebwg/html-next/runtime';
|
|
2
|
+
/**
|
|
3
|
+
* Marks the outline link of the heading being read with aria-current="location". An IntersectionObserver
|
|
4
|
+
* watches the page's headings: the current one is the last heading that has reached the top fifth of the
|
|
5
|
+
* viewport, and none is current above the first. The outline is plain fragment links, so without JavaScript only this marking is missing.
|
|
6
|
+
*/
|
|
7
|
+
export default function outline(host: ComponentHost): void;
|
|
8
|
+
//# sourceMappingURL=outline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outline.d.ts","sourceRoot":"","sources":["../../src/controllers/outline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAiCzD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marks the outline link of the heading being read with aria-current="location". An IntersectionObserver
|
|
3
|
+
* watches the page's headings: the current one is the last heading that has reached the top fifth of the
|
|
4
|
+
* viewport, and none is current above the first. The outline is plain fragment links, so without JavaScript only this marking is missing.
|
|
5
|
+
*/
|
|
6
|
+
export default function outline(host) {
|
|
7
|
+
host.on('connect', () => {
|
|
8
|
+
const document = host.root.ownerDocument;
|
|
9
|
+
const window = document.defaultView;
|
|
10
|
+
let observer;
|
|
11
|
+
const observe = () => {
|
|
12
|
+
observer?.disconnect();
|
|
13
|
+
const links = [...host.root.querySelectorAll('a[href^="#"]')];
|
|
14
|
+
const headings = links.map(link => document.getElementById(decodeURIComponent(link.hash.slice(1)))).filter(heading => heading !== null);
|
|
15
|
+
const reached = new Set();
|
|
16
|
+
const mark = () => {
|
|
17
|
+
const current = headings.filter(heading => reached.has(heading)).at(-1);
|
|
18
|
+
for (const link of links) {
|
|
19
|
+
if (link.hash.slice(1) === current?.id)
|
|
20
|
+
link.setAttribute('aria-current', 'location');
|
|
21
|
+
else
|
|
22
|
+
link.removeAttribute('aria-current');
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
observer = new window.IntersectionObserver(entries => {
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
// In the band, or gone out through its top edge; a heading below the band is not reached yet.
|
|
28
|
+
if (entry.isIntersecting || entry.boundingClientRect.top < (entry.rootBounds?.top ?? 0))
|
|
29
|
+
reached.add(entry.target);
|
|
30
|
+
else
|
|
31
|
+
reached.delete(entry.target);
|
|
32
|
+
}
|
|
33
|
+
mark();
|
|
34
|
+
}, { rootMargin: '0px 0px -80% 0px' });
|
|
35
|
+
for (const heading of headings)
|
|
36
|
+
observer.observe(heading);
|
|
37
|
+
};
|
|
38
|
+
observe();
|
|
39
|
+
// HTMLKit swaps pages in place through the Navigation API; the outline then lists the new page's headings.
|
|
40
|
+
const navigation = window.navigation;
|
|
41
|
+
navigation?.addEventListener('navigatesuccess', observe);
|
|
42
|
+
return () => { observer?.disconnect(); navigation?.removeEventListener('navigatesuccess', observe); };
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=outline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outline.js","sourceRoot":"","sources":["../../src/controllers/outline.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,IAAmB;IACjD,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAY,CAAC;QACrC,IAAI,QAA0C,CAAC;QAC/C,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,QAAQ,EAAE,UAAU,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAoB,cAAc,CAAC,CAAC,CAAC;YACjF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;YACxI,MAAM,OAAO,GAAG,IAAI,GAAG,EAAW,CAAC;YACnC,MAAM,IAAI,GAAG,GAAG,EAAE;gBAChB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,EAAE;wBAAE,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;;wBACjF,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC,CAAC;YACF,QAAQ,GAAG,IAAI,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE;gBACnD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,8FAA8F;oBAC9F,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,kBAAkB,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;wBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;wBAC9G,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpC,CAAC;gBACD,IAAI,EAAE,CAAC;YACT,CAAC,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACvC,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC,CAAC;QACF,OAAO,EAAE,CAAC;QACV,2GAA2G;QAC3G,MAAM,UAAU,GAAI,MAAgD,CAAC,UAAU,CAAC;QAChF,UAAU,EAAE,gBAAgB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { ComponentHost } from '@nextwebwg/html-next/runtime';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Native controls and storage own interaction; HTML Next owns reactive state and cleanup. The drawer is a
|
|
4
|
+
* native popover, which opens without this controller. HTMLKit keeps the shell across client navigation, so a
|
|
5
|
+
* followed link here closes the drawer, as a document load would.
|
|
6
|
+
*/
|
|
3
7
|
export default function shell(host: ComponentHost): void;
|
|
4
8
|
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/controllers/shell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/controllers/shell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAqBvD"}
|
|
@@ -1,44 +1,31 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Native controls and storage own interaction; HTML Next owns reactive state and cleanup. The drawer is a
|
|
3
|
+
* native popover, which opens without this controller. HTMLKit keeps the shell across client navigation, so a
|
|
4
|
+
* followed link here closes the drawer, as a document load would.
|
|
5
|
+
*/
|
|
2
6
|
export default function shell(host) {
|
|
3
7
|
host.on('connect', () => {
|
|
4
8
|
const document = host.root.ownerDocument;
|
|
5
9
|
const window = document.defaultView;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
saved = window.localStorage.getItem('markupress:theme');
|
|
9
|
-
}
|
|
10
|
-
catch { /* Storage can be disabled while native controls remain usable. */ }
|
|
11
|
-
host.state.dark = saved === 'dark' || (saved === null && window.matchMedia('(prefers-color-scheme: dark)').matches);
|
|
12
|
-
const actions = host.root.querySelector(':scope > header > .actions');
|
|
13
|
-
const applyTheme = () => {
|
|
14
|
-
document.documentElement.dataset.theme = host.state.dark ? 'dark' : 'light';
|
|
15
|
-
};
|
|
16
|
-
applyTheme();
|
|
17
|
-
// HTMLKit head metadata admits no script, so a saved theme lands after first paint. Settle it
|
|
18
|
-
// at once instead of animating controls out of the default theme; user toggles still animate.
|
|
19
|
-
for (const transition of document.getAnimations())
|
|
20
|
-
if (transition instanceof window.CSSTransition)
|
|
21
|
-
transition.finish();
|
|
10
|
+
// The plugin's head script chose the theme before first paint.
|
|
11
|
+
host.state.dark = document.documentElement.dataset.theme === 'dark';
|
|
22
12
|
const click = (event) => {
|
|
23
13
|
const target = event.target;
|
|
24
14
|
if (!(target instanceof window.Element))
|
|
25
15
|
return;
|
|
26
|
-
if (
|
|
27
|
-
return;
|
|
28
|
-
const action = target.closest('[data-action]')?.getAttribute('data-action');
|
|
29
|
-
if (action === 'theme') {
|
|
16
|
+
if (target.closest('[data-action="theme"]')) {
|
|
30
17
|
host.state.dark = !host.state.dark;
|
|
31
|
-
applyTheme();
|
|
32
18
|
const theme = host.state.dark ? 'dark' : 'light';
|
|
19
|
+
document.documentElement.dataset.theme = theme;
|
|
33
20
|
try {
|
|
34
21
|
window.localStorage.setItem('markupress:theme', theme);
|
|
35
22
|
}
|
|
36
23
|
catch { /* Theme still applies for this page. */ }
|
|
37
24
|
}
|
|
38
|
-
if (
|
|
39
|
-
host.
|
|
40
|
-
}
|
|
25
|
+
if (target.closest('a[href]'))
|
|
26
|
+
host.root.querySelector('#documentation-navigation:popover-open')?.hidePopover();
|
|
41
27
|
};
|
|
28
|
+
// The page sits inside the shell, so this sees every click.
|
|
42
29
|
host.root.addEventListener('click', click);
|
|
43
30
|
return () => host.root.removeEventListener('click', click);
|
|
44
31
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/controllers/shell.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/controllers/shell.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAmB;IAC/C,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAY,CAAC;QACrC,+DAA+D;QAC/D,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC;QACpE,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,CAAC,MAAM,YAAY,MAAM,CAAC,OAAO,CAAC;gBAAE,OAAO;YAChD,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBACjD,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC/C,IAAI,CAAC;oBAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,wCAAwC,CAAC,CAAC;YACpH,CAAC;YACD,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAc,wCAAwC,CAAC,EAAE,WAAW,EAAE,CAAC;QAC/H,CAAC,CAAC;QACF,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
export { compileMarkdown } from './content.js';
|
|
2
|
-
export type { CompiledMarkdown, MarkdownOptions } from './content.js';
|
|
3
|
-
export {
|
|
4
|
-
export type {
|
|
2
|
+
export type { CompiledMarkdown, FrontMatter, MarkdownOptions, OutlineItem } from './content.js';
|
|
3
|
+
export { markdown } from './markdown.js';
|
|
4
|
+
export type { MarkdownPluginOptions } from './markdown.js';
|
|
5
|
+
export type { Link, NavItem, SidebarNode } from './navigation.js';
|
|
6
|
+
export { buildSite, devSite, markupress, previewSite, siteOptions } from './site.js';
|
|
7
|
+
export type { DocumentationPage, DocumentationVersion, MarkupressOptions } from './site.js';
|
|
5
8
|
export { snapshotVersion, versionLinks } from './versions.js';
|
|
6
9
|
export type { VersionLink } from './versions.js';
|
|
7
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrF,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Public exports are introduced with implemented, verified product behavior.
|
|
2
2
|
export { compileMarkdown } from './content.js';
|
|
3
|
-
export {
|
|
3
|
+
export { markdown } from './markdown.js';
|
|
4
|
+
export { buildSite, devSite, markupress, previewSite, siteOptions } from './site.js';
|
|
4
5
|
export { snapshotVersion, versionLinks } from './versions.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|