@refrakt-md/runes 0.14.4 → 0.15.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/dist/config.d.ts +40 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +154 -88
- package/dist/config.js.map +1 -1
- package/dist/drawer-pipeline.d.ts +33 -0
- package/dist/drawer-pipeline.d.ts.map +1 -0
- package/dist/drawer-pipeline.js +206 -0
- package/dist/drawer-pipeline.js.map +1 -0
- package/dist/expand-pipeline.d.ts +51 -0
- package/dist/expand-pipeline.d.ts.map +1 -0
- package/dist/expand-pipeline.js +305 -0
- package/dist/expand-pipeline.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -3
- package/dist/index.js.map +1 -1
- package/dist/lang-map.d.ts +32 -0
- package/dist/lang-map.d.ts.map +1 -0
- package/dist/lang-map.js +76 -0
- package/dist/lang-map.js.map +1 -0
- package/dist/lib/read-file.d.ts +78 -0
- package/dist/lib/read-file.d.ts.map +1 -0
- package/dist/lib/read-file.js +166 -0
- package/dist/lib/read-file.js.map +1 -0
- package/dist/nodes.d.ts.map +1 -1
- package/dist/nodes.js +12 -1
- package/dist/nodes.js.map +1 -1
- package/dist/outline-scope.d.ts +29 -0
- package/dist/outline-scope.d.ts.map +1 -0
- package/dist/outline-scope.js +149 -0
- package/dist/outline-scope.js.map +1 -0
- package/dist/plugins.d.ts +13 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +65 -1
- package/dist/plugins.js.map +1 -1
- package/dist/snippet-pipeline.d.ts +42 -0
- package/dist/snippet-pipeline.d.ts.map +1 -0
- package/dist/snippet-pipeline.js +219 -0
- package/dist/snippet-pipeline.js.map +1 -0
- package/dist/tags/drawer.d.ts +26 -0
- package/dist/tags/drawer.d.ts.map +1 -0
- package/dist/tags/drawer.js +134 -0
- package/dist/tags/drawer.js.map +1 -0
- package/dist/tags/expand.d.ts +22 -0
- package/dist/tags/expand.d.ts.map +1 -0
- package/dist/tags/expand.js +76 -0
- package/dist/tags/expand.js.map +1 -0
- package/dist/tags/snippet.d.ts +19 -0
- package/dist/tags/snippet.d.ts.map +1 -0
- package/dist/tags/snippet.js +49 -0
- package/dist/tags/snippet.js.map +1 -0
- package/dist/util.d.ts +11 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +35 -0
- package/dist/util.js.map +1 -1
- package/dist/xref-patterns.d.ts +57 -0
- package/dist/xref-patterns.d.ts.map +1 -0
- package/dist/xref-patterns.js +140 -0
- package/dist/xref-patterns.js.map +1 -0
- package/dist/xref-resolve.d.ts +22 -5
- package/dist/xref-resolve.d.ts.map +1 -1
- package/dist/xref-resolve.js +203 -79
- package/dist/xref-resolve.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet-pipeline.js","sourceRoot":"","sources":["../src/snippet-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawer rune (SPEC-060).
|
|
3
|
+
*
|
|
4
|
+
* Body-only modal panel: declares an addressable region by id and renders
|
|
5
|
+
* its body as a visible in-flow `<section>` at the authored position. With
|
|
6
|
+
* JS (WORK-258 behaviors), the section is enhanced into a `<dialog>` and
|
|
7
|
+
* xref clicks open it via `showModal()`. Without JS, the body is visible
|
|
8
|
+
* inline and xref clicks scroll to it via fragment navigation.
|
|
9
|
+
*
|
|
10
|
+
* Triggers are not part of this rune — any `{% ref "drawer-id" /%}` on
|
|
11
|
+
* the same page resolves to `<a href="#drawer-{id}" data-target-type="drawer">`
|
|
12
|
+
* (via SPEC-065's `data-target-type` propagation, WORK-253). The
|
|
13
|
+
* progressive-enhancement layer queries that marker.
|
|
14
|
+
*
|
|
15
|
+
* Title heading level: `headingLevel="3"` etc. sets the level explicitly.
|
|
16
|
+
* Without an explicit level, the schema emits a sentinel `data-drawer-title-auto`
|
|
17
|
+
* marker; the corePipelineHooks.postProcess walk replaces it with an
|
|
18
|
+
* `h{n}` element one level deeper than the nearest preceding heading on
|
|
19
|
+
* the page (clamped to 1-6, default h2 when no preceding heading exists).
|
|
20
|
+
*/
|
|
21
|
+
import Markdoc from '@markdoc/markdoc';
|
|
22
|
+
/** Marker attribute placed on the title heading when `headingLevel` is omitted.
|
|
23
|
+
* The core postProcess walk replaces the tag with `h{n}` based on outline depth. */
|
|
24
|
+
export declare const DRAWER_TITLE_AUTO_MARKER = "data-drawer-title-auto";
|
|
25
|
+
export declare const drawer: Markdoc.Schema;
|
|
26
|
+
//# sourceMappingURL=drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../src/tags/drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAMvC;qFACqF;AACrF,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAKjE,eAAO,MAAM,MAAM,gBAgHjB,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawer rune (SPEC-060).
|
|
3
|
+
*
|
|
4
|
+
* Body-only modal panel: declares an addressable region by id and renders
|
|
5
|
+
* its body as a visible in-flow `<section>` at the authored position. With
|
|
6
|
+
* JS (WORK-258 behaviors), the section is enhanced into a `<dialog>` and
|
|
7
|
+
* xref clicks open it via `showModal()`. Without JS, the body is visible
|
|
8
|
+
* inline and xref clicks scroll to it via fragment navigation.
|
|
9
|
+
*
|
|
10
|
+
* Triggers are not part of this rune — any `{% ref "drawer-id" /%}` on
|
|
11
|
+
* the same page resolves to `<a href="#drawer-{id}" data-target-type="drawer">`
|
|
12
|
+
* (via SPEC-065's `data-target-type` propagation, WORK-253). The
|
|
13
|
+
* progressive-enhancement layer queries that marker.
|
|
14
|
+
*
|
|
15
|
+
* Title heading level: `headingLevel="3"` etc. sets the level explicitly.
|
|
16
|
+
* Without an explicit level, the schema emits a sentinel `data-drawer-title-auto`
|
|
17
|
+
* marker; the corePipelineHooks.postProcess walk replaces it with an
|
|
18
|
+
* `h{n}` element one level deeper than the nearest preceding heading on
|
|
19
|
+
* the page (clamped to 1-6, default h2 when no preceding heading exists).
|
|
20
|
+
*/
|
|
21
|
+
import Markdoc from '@markdoc/markdoc';
|
|
22
|
+
const { Tag } = Markdoc;
|
|
23
|
+
import { createContentModelSchema, createComponentRenderable, asNodes } from '../lib/index.js';
|
|
24
|
+
import { RenderableNodeCursor } from '../lib/renderable.js';
|
|
25
|
+
/** Marker attribute placed on the title heading when `headingLevel` is omitted.
|
|
26
|
+
* The core postProcess walk replaces the tag with `h{n}` based on outline depth. */
|
|
27
|
+
export const DRAWER_TITLE_AUTO_MARKER = 'data-drawer-title-auto';
|
|
28
|
+
const drawerSides = ['right', 'left', 'top', 'bottom'];
|
|
29
|
+
const drawerSizes = ['sm', 'md', 'lg'];
|
|
30
|
+
export const drawer = createContentModelSchema({
|
|
31
|
+
attributes: {
|
|
32
|
+
id: {
|
|
33
|
+
type: String,
|
|
34
|
+
required: true,
|
|
35
|
+
description: 'Stable id for the drawer. Used in entity registration and as the `id="drawer-{value}"` on the rendered element so xref triggers can target it via fragment.',
|
|
36
|
+
},
|
|
37
|
+
title: {
|
|
38
|
+
type: String,
|
|
39
|
+
required: false,
|
|
40
|
+
description: 'Panel heading text. Rendered in the drawer header (or as a heading in the no-JS in-flow rendering).',
|
|
41
|
+
},
|
|
42
|
+
headingLevel: {
|
|
43
|
+
type: Number,
|
|
44
|
+
required: false,
|
|
45
|
+
description: 'Heading level (1-6) for the title. When omitted, the level is auto-detected from outline position (one deeper than the nearest preceding heading). Out-of-range values are clamped to the 1-6 range.',
|
|
46
|
+
},
|
|
47
|
+
shortcut: {
|
|
48
|
+
type: String,
|
|
49
|
+
required: false,
|
|
50
|
+
description: 'Keyboard shortcut that opens the drawer when behaviors are loaded (e.g. ".", "cmd+k"). Surfaces as `data-shortcut`; the progressive-enhancement layer wires the listener.',
|
|
51
|
+
},
|
|
52
|
+
side: {
|
|
53
|
+
type: String,
|
|
54
|
+
required: false,
|
|
55
|
+
matches: drawerSides.slice(),
|
|
56
|
+
description: 'Edge the panel slides from when enhanced. Defaults to "right".',
|
|
57
|
+
},
|
|
58
|
+
size: {
|
|
59
|
+
type: String,
|
|
60
|
+
required: false,
|
|
61
|
+
matches: drawerSizes.slice(),
|
|
62
|
+
description: 'Panel size. "sm" / "md" (default) / "lg" — width for left/right sides, height for top/bottom.',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
contentModel: {
|
|
66
|
+
type: 'sequence',
|
|
67
|
+
fields: [
|
|
68
|
+
{ name: 'body', match: 'any', optional: true, greedy: true },
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
transform(resolved, attrs, config) {
|
|
72
|
+
const drawerId = attrs.id;
|
|
73
|
+
const titleText = attrs.title;
|
|
74
|
+
const side = attrs.side ?? 'right';
|
|
75
|
+
const size = attrs.size ?? 'md';
|
|
76
|
+
// Title heading: explicit level → `h{n}`, otherwise emit a sentinel
|
|
77
|
+
// `h3` placeholder marked with `data-drawer-title-auto`. The core
|
|
78
|
+
// postProcess walk inspects outline depth and rewrites the tag name.
|
|
79
|
+
// We pick `h3` as the sentinel because it's the no-postProcess
|
|
80
|
+
// fallback (most drawers live under an h2 page section).
|
|
81
|
+
const clampedLevel = typeof attrs.headingLevel === 'number'
|
|
82
|
+
? Math.min(6, Math.max(1, Math.trunc(attrs.headingLevel)))
|
|
83
|
+
: undefined;
|
|
84
|
+
const titleTag = titleText
|
|
85
|
+
? (clampedLevel
|
|
86
|
+
? new Tag(`h${clampedLevel}`, {}, [titleText])
|
|
87
|
+
: new Tag('h3', { [DRAWER_TITLE_AUTO_MARKER]: 'true' }, [titleText]))
|
|
88
|
+
: undefined;
|
|
89
|
+
const closeButton = new Tag('button', {
|
|
90
|
+
type: 'button',
|
|
91
|
+
'aria-label': 'Close',
|
|
92
|
+
hidden: true,
|
|
93
|
+
}, ['×']);
|
|
94
|
+
const headerChildren = [];
|
|
95
|
+
if (titleTag)
|
|
96
|
+
headerChildren.push(titleTag);
|
|
97
|
+
headerChildren.push(closeButton);
|
|
98
|
+
const header = new Tag('header', {}, headerChildren);
|
|
99
|
+
const body = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.body), config)).wrap('div');
|
|
100
|
+
// Property meta tags drive engine modifier-from-meta + data-attribute
|
|
101
|
+
// derivation. We always emit `side` and `size` so the engine applies
|
|
102
|
+
// the BEM modifier even when the author didn't specify them (the
|
|
103
|
+
// default "right"/"md" still need their data-attribute on the wrapper).
|
|
104
|
+
// `shortcut` is only emitted when set — its absence shouldn't appear
|
|
105
|
+
// as `data-shortcut=""` on the wrapper.
|
|
106
|
+
const properties = {
|
|
107
|
+
side: new Tag('meta', { content: side }),
|
|
108
|
+
size: new Tag('meta', { content: size }),
|
|
109
|
+
};
|
|
110
|
+
if (attrs.shortcut) {
|
|
111
|
+
properties.shortcut = new Tag('meta', { content: attrs.shortcut });
|
|
112
|
+
}
|
|
113
|
+
const renderable = createComponentRenderable({
|
|
114
|
+
rune: 'drawer',
|
|
115
|
+
tag: 'section',
|
|
116
|
+
id: `drawer-${drawerId}`,
|
|
117
|
+
properties,
|
|
118
|
+
refs: {
|
|
119
|
+
header,
|
|
120
|
+
...(titleTag ? { title: titleTag } : {}),
|
|
121
|
+
close: closeButton,
|
|
122
|
+
body: body.tag('div'),
|
|
123
|
+
},
|
|
124
|
+
children: [...Object.values(properties), header, body.next()],
|
|
125
|
+
});
|
|
126
|
+
// `data-drawer-id` carries the author-supplied id (before the
|
|
127
|
+
// `drawer-` prefix) for register-hook consumption. The register
|
|
128
|
+
// scan reads this to know what id the entity should have without
|
|
129
|
+
// re-parsing the html id.
|
|
130
|
+
renderable.attributes['data-drawer-id'] = drawerId;
|
|
131
|
+
return renderable;
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer.js","sourceRoot":"","sources":["../../src/tags/drawer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand rune (SPEC-066, WORK-260).
|
|
3
|
+
*
|
|
4
|
+
* Inline-substitution counterpart to `{% ref %}`: same registry lookup
|
|
5
|
+
* chain, different output mode (inline content instead of an anchor).
|
|
6
|
+
* Schema is self-closing and emits a placeholder; the postProcess hook
|
|
7
|
+
* (`expand-pipeline.ts`) walks for placeholders, resolves the entity
|
|
8
|
+
* from the registry, reads its `sourceFile`, calls the plugin's
|
|
9
|
+
* `extract()` to get the embeddable subtree, processes headings, and
|
|
10
|
+
* substitutes the content inline. The wrapper is a `<section
|
|
11
|
+
* data-rune="expand">` with `data-outline-scope` set so the WORK-259
|
|
12
|
+
* walkers automatically TOC-isolate the embed and namespace its
|
|
13
|
+
* heading IDs.
|
|
14
|
+
*/
|
|
15
|
+
import type { Schema } from '@markdoc/markdoc';
|
|
16
|
+
/** Sentinel attribute value used to identify expand placeholders in the
|
|
17
|
+
* renderable tree. PostProcess queries for `data-rune="expand-pending"`
|
|
18
|
+
* to find tags awaiting resolution. After substitution the wrapper
|
|
19
|
+
* carries `data-rune="expand"`. */
|
|
20
|
+
export declare const EXPAND_PLACEHOLDER_MARKER = "expand-pending";
|
|
21
|
+
export declare const expand: Schema;
|
|
22
|
+
//# sourceMappingURL=expand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../src/tags/expand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAgB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG7D;;;oCAGoC;AACpC,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAE1D,eAAO,MAAM,MAAM,EAAE,MAmDpB,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand rune (SPEC-066, WORK-260).
|
|
3
|
+
*
|
|
4
|
+
* Inline-substitution counterpart to `{% ref %}`: same registry lookup
|
|
5
|
+
* chain, different output mode (inline content instead of an anchor).
|
|
6
|
+
* Schema is self-closing and emits a placeholder; the postProcess hook
|
|
7
|
+
* (`expand-pipeline.ts`) walks for placeholders, resolves the entity
|
|
8
|
+
* from the registry, reads its `sourceFile`, calls the plugin's
|
|
9
|
+
* `extract()` to get the embeddable subtree, processes headings, and
|
|
10
|
+
* substitutes the content inline. The wrapper is a `<section
|
|
11
|
+
* data-rune="expand">` with `data-outline-scope` set so the WORK-259
|
|
12
|
+
* walkers automatically TOC-isolate the embed and namespace its
|
|
13
|
+
* heading IDs.
|
|
14
|
+
*/
|
|
15
|
+
import Markdoc from '@markdoc/markdoc';
|
|
16
|
+
const { Tag } = Markdoc;
|
|
17
|
+
/** Sentinel attribute value used to identify expand placeholders in the
|
|
18
|
+
* renderable tree. PostProcess queries for `data-rune="expand-pending"`
|
|
19
|
+
* to find tags awaiting resolution. After substitution the wrapper
|
|
20
|
+
* carries `data-rune="expand"`. */
|
|
21
|
+
export const EXPAND_PLACEHOLDER_MARKER = 'expand-pending';
|
|
22
|
+
export const expand = {
|
|
23
|
+
selfClosing: true,
|
|
24
|
+
attributes: {
|
|
25
|
+
primary: {
|
|
26
|
+
type: String,
|
|
27
|
+
required: true,
|
|
28
|
+
description: 'Entity ID or name to substitute inline. Same lookup chain as xref.',
|
|
29
|
+
},
|
|
30
|
+
level: {
|
|
31
|
+
type: Number,
|
|
32
|
+
required: false,
|
|
33
|
+
description: 'Optional heading-demotion opt-in. When set, embedded headings shift by `N - 1` and the embed joins the host outline instead of staying TOC-isolated.',
|
|
34
|
+
},
|
|
35
|
+
type: {
|
|
36
|
+
type: String,
|
|
37
|
+
required: false,
|
|
38
|
+
description: 'Entity type hint for disambiguation when the same ID/name lives in multiple registries.',
|
|
39
|
+
},
|
|
40
|
+
canonical: {
|
|
41
|
+
type: Boolean,
|
|
42
|
+
required: false,
|
|
43
|
+
description: 'When true, append a visible "View canonical" link pointing at the entity\'s canonical URL.',
|
|
44
|
+
},
|
|
45
|
+
label: {
|
|
46
|
+
type: String,
|
|
47
|
+
required: false,
|
|
48
|
+
description: 'Custom label for the canonical link (only meaningful when `canonical=true`).',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
transform(node, _config) {
|
|
52
|
+
const id = node.attributes.primary;
|
|
53
|
+
const level = node.attributes.level;
|
|
54
|
+
const typeHint = node.attributes.type;
|
|
55
|
+
const canonical = node.attributes.canonical === true;
|
|
56
|
+
const label = node.attributes.label;
|
|
57
|
+
const attrs = {
|
|
58
|
+
'data-rune': EXPAND_PLACEHOLDER_MARKER,
|
|
59
|
+
'data-expand-id': id,
|
|
60
|
+
};
|
|
61
|
+
if (typeof level === 'number')
|
|
62
|
+
attrs['data-expand-level'] = String(level);
|
|
63
|
+
if (typeHint)
|
|
64
|
+
attrs['data-expand-type'] = typeHint;
|
|
65
|
+
if (canonical)
|
|
66
|
+
attrs['data-expand-canonical'] = 'true';
|
|
67
|
+
if (label)
|
|
68
|
+
attrs['data-expand-label'] = label;
|
|
69
|
+
// The placeholder is a `<div>` rather than a `<span>` because the
|
|
70
|
+
// substituted content is block-level (the embedded rune's `<section>`).
|
|
71
|
+
// A `<span>` parent would produce invalid block-in-inline HTML once
|
|
72
|
+
// the postProcess substitutes content.
|
|
73
|
+
return new Tag('div', attrs, []);
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=expand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../../src/tags/expand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AAExB;;;oCAGoC;AACpC,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAE1D,MAAM,CAAC,MAAM,MAAM,GAAW;IAC7B,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE;QACX,OAAO,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,oEAAoE;SACjF;QACD,KAAK,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,sJAAsJ;SACnK;QACD,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,yFAAyF;SACtG;QACD,SAAS,EAAE;YACV,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,4FAA4F;SACzG;QACD,KAAK,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,8EAA8E;SAC3F;KACD;IACD,SAAS,CAAC,IAAU,EAAE,OAAe;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAiB,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAA2B,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAA0B,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,KAAK,IAAI,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAA2B,CAAC;QAE1D,MAAM,KAAK,GAA4B;YACtC,WAAW,EAAE,yBAAyB;YACtC,gBAAgB,EAAE,EAAE;SACpB,CAAC;QACF,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,KAAK,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,QAAQ;YAAE,KAAK,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC;QACnD,IAAI,SAAS;YAAE,KAAK,CAAC,uBAAuB,CAAC,GAAG,MAAM,CAAC;QACvD,IAAI,KAAK;YAAE,KAAK,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC;QAE9C,kEAAkE;QAClE,wEAAwE;QACxE,oEAAoE;QACpE,uCAAuC;QACvC,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;CACD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `snippet` rune — embed a file's contents as a syntax-highlighted code
|
|
3
|
+
* block (SPEC-062).
|
|
4
|
+
*
|
|
5
|
+
* Implementation note: snippet is implemented as an **AST preprocessor**
|
|
6
|
+
* rather than a transform-time rune. Every `{% snippet %}` tag is replaced
|
|
7
|
+
* by a Markdoc `fence` node before the schema-driven transform runs (see
|
|
8
|
+
* `corePipelineHooks.preprocess` in `../config.ts`). By the time the transform
|
|
9
|
+
* reaches the AST, no snippet tags exist — only fences. So this schema's
|
|
10
|
+
* `transform` function is **unreachable in normal operation**.
|
|
11
|
+
*
|
|
12
|
+
* The schema still exists for tooling: `refrakt inspect snippet`, the
|
|
13
|
+
* contracts generator, attribute validation, and the rune-catalog docs all
|
|
14
|
+
* read from it. If the transform ever does execute (e.g., the core preprocess
|
|
15
|
+
* hook isn't registered for some reason), it throws a clear error pointing
|
|
16
|
+
* the user at the registration site.
|
|
17
|
+
*/
|
|
18
|
+
export declare const snippet: import("@markdoc/markdoc").Schema;
|
|
19
|
+
//# sourceMappingURL=snippet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet.d.ts","sourceRoot":"","sources":["../../src/tags/snippet.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,mCA+BlB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createContentModelSchema } from '../lib/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* The `snippet` rune — embed a file's contents as a syntax-highlighted code
|
|
4
|
+
* block (SPEC-062).
|
|
5
|
+
*
|
|
6
|
+
* Implementation note: snippet is implemented as an **AST preprocessor**
|
|
7
|
+
* rather than a transform-time rune. Every `{% snippet %}` tag is replaced
|
|
8
|
+
* by a Markdoc `fence` node before the schema-driven transform runs (see
|
|
9
|
+
* `corePipelineHooks.preprocess` in `../config.ts`). By the time the transform
|
|
10
|
+
* reaches the AST, no snippet tags exist — only fences. So this schema's
|
|
11
|
+
* `transform` function is **unreachable in normal operation**.
|
|
12
|
+
*
|
|
13
|
+
* The schema still exists for tooling: `refrakt inspect snippet`, the
|
|
14
|
+
* contracts generator, attribute validation, and the rune-catalog docs all
|
|
15
|
+
* read from it. If the transform ever does execute (e.g., the core preprocess
|
|
16
|
+
* hook isn't registered for some reason), it throws a clear error pointing
|
|
17
|
+
* the user at the registration site.
|
|
18
|
+
*/
|
|
19
|
+
export const snippet = createContentModelSchema({
|
|
20
|
+
attributes: {
|
|
21
|
+
path: {
|
|
22
|
+
type: String,
|
|
23
|
+
required: true,
|
|
24
|
+
description: 'Path to the source file, relative to the project root. Rejected if it escapes the root.',
|
|
25
|
+
},
|
|
26
|
+
lines: {
|
|
27
|
+
type: String,
|
|
28
|
+
required: false,
|
|
29
|
+
description: 'Line range. Formats: "10-25", "10-" (to EOF), "-20" (from start), "10" (single line). 1-indexed, inclusive.',
|
|
30
|
+
},
|
|
31
|
+
lang: {
|
|
32
|
+
type: String,
|
|
33
|
+
required: false,
|
|
34
|
+
description: 'Syntax-highlighting language hint. Overrides the extension-based inference.',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
contentModel: { type: 'sequence', fields: [] },
|
|
38
|
+
transform(_resolved, _attrs) {
|
|
39
|
+
// Unreachable in normal operation — corePipelineHooks.preprocess
|
|
40
|
+
// replaces snippet tags with fence nodes before the transform runs.
|
|
41
|
+
// If you see this error, ensure your content pipeline runs the
|
|
42
|
+
// preprocess phase (call sites: packages/content/src/site.ts and the
|
|
43
|
+
// hook set assembled via createCorePipelineHooks).
|
|
44
|
+
throw new Error('snippet rune reached the transform phase — its preprocess hook was not wired through. ' +
|
|
45
|
+
'Ensure the content pipeline runs registered `preprocess` hooks before `Markdoc.transform` ' +
|
|
46
|
+
'(snippet pre-resolves to a Markdoc `fence` node; see SPEC-062 § Composition).');
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=snippet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippet.js","sourceRoot":"","sources":["../../src/tags/snippet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,wBAAwB,CAAC;IAC/C,UAAU,EAAE;QACX,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,yFAAyF;SACtG;QACD,KAAK,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6GAA6G;SAC1H;QACD,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6EAA6E;SAC1F;KACD;IACD,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;IAC9C,SAAS,CAAC,SAAS,EAAE,MAAM;QAC1B,iEAAiE;QACjE,oEAAoE;QACpE,+DAA+D;QAC/D,qEAAqE;QACrE,mDAAmD;QACnD,MAAM,IAAI,KAAK,CACd,wFAAwF;YACxF,4FAA4F;YAC5F,+EAA+E,CAC/E,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
|
package/dist/util.d.ts
CHANGED
|
@@ -19,5 +19,16 @@ export interface HeadingInfo {
|
|
|
19
19
|
* IDs using the same algorithm as nodes.ts heading transform.
|
|
20
20
|
*/
|
|
21
21
|
export declare function extractHeadings(node: Node): HeadingInfo[];
|
|
22
|
+
/**
|
|
23
|
+
* Find the text content of the first H1 heading in an AST.
|
|
24
|
+
*
|
|
25
|
+
* Walks depth-first, descending into both regular nodes and tag (rune)
|
|
26
|
+
* children. The first `heading` node with `level: 1` wins. Used by the
|
|
27
|
+
* content pipeline to derive `$page.title` when frontmatter doesn't set
|
|
28
|
+
* one — matches the author mental model of "the page's title is the H1
|
|
29
|
+
* the reader sees," including the common case where an H1 is wrapped in
|
|
30
|
+
* a layout rune (hero etc.).
|
|
31
|
+
*/
|
|
32
|
+
export declare function firstH1(node: Node): string | undefined;
|
|
22
33
|
export declare function headingsToList(options?: HeadingsToListOptions): (nodes: Node[]) => Markdoc.Node[];
|
|
23
34
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAoB7D;AAED,wBAAiB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAShE;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,EAAE,CA+BzD;AAED,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,IAIpD,OAAO,IAAI,EAAE,oBAkCtB"}
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAoB7D;AAED,wBAAiB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAShE;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,EAAE,CA+BzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAyBtD;AAED,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,IAIpD,OAAO,IAAI,EAAE,oBAkCtB"}
|
package/dist/util.js
CHANGED
|
@@ -62,6 +62,41 @@ export function extractHeadings(node) {
|
|
|
62
62
|
walk(node);
|
|
63
63
|
return headings;
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Find the text content of the first H1 heading in an AST.
|
|
67
|
+
*
|
|
68
|
+
* Walks depth-first, descending into both regular nodes and tag (rune)
|
|
69
|
+
* children. The first `heading` node with `level: 1` wins. Used by the
|
|
70
|
+
* content pipeline to derive `$page.title` when frontmatter doesn't set
|
|
71
|
+
* one — matches the author mental model of "the page's title is the H1
|
|
72
|
+
* the reader sees," including the common case where an H1 is wrapped in
|
|
73
|
+
* a layout rune (hero etc.).
|
|
74
|
+
*/
|
|
75
|
+
export function firstH1(node) {
|
|
76
|
+
let found;
|
|
77
|
+
function walk(n) {
|
|
78
|
+
if (n.type === 'heading' && n.attributes.level === 1) {
|
|
79
|
+
const textParts = [];
|
|
80
|
+
for (const child of n.walk()) {
|
|
81
|
+
if (child.type === 'text' && child.attributes.content) {
|
|
82
|
+
textParts.push(child.attributes.content);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Text nodes already carry their own surrounding whitespace, so joining
|
|
86
|
+
// with `''` (rather than `' '`) avoids doubling spaces when a heading
|
|
87
|
+
// contains inline formatting like `# Hello **strong** world`.
|
|
88
|
+
found = textParts.join('');
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
for (const child of n.children) {
|
|
92
|
+
if (walk(child))
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
walk(node);
|
|
98
|
+
return found;
|
|
99
|
+
}
|
|
65
100
|
export function headingsToList(options) {
|
|
66
101
|
const explicitLevel = options?.level;
|
|
67
102
|
const include = options?.include;
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-reference pattern compilation.
|
|
3
|
+
*
|
|
4
|
+
* Compiles user-authored `XrefPattern` config entries from `refrakt.config.json`
|
|
5
|
+
* into validated, ready-to-use `CompiledXrefPattern` objects. The runtime
|
|
6
|
+
* resolver (in `xref-resolve.ts`) consumes the compiled forms to turn
|
|
7
|
+
* unresolved xref IDs into URLs.
|
|
8
|
+
*
|
|
9
|
+
* Validation rules (per SPEC-065):
|
|
10
|
+
* - `match` must compile as a JavaScript regex; anchored to whole-string match
|
|
11
|
+
* by default (`^` and `$` auto-applied unless explicit anchors are present
|
|
12
|
+
* at the start/end of the pattern).
|
|
13
|
+
* - `template` placeholders must each be `id` or a named group of the regex.
|
|
14
|
+
* - `type` defaults to `"external"`. The value `"unresolved"` is reserved.
|
|
15
|
+
* - `label` defaults to `"{id}"` and uses the same placeholder syntax as
|
|
16
|
+
* `template`.
|
|
17
|
+
* - Duplicate `match` strings across entries are flagged as a warning (not an
|
|
18
|
+
* error; first-wins ordering still produces deterministic behaviour).
|
|
19
|
+
*/
|
|
20
|
+
import type { XrefPattern } from '@refrakt-md/types';
|
|
21
|
+
/** A pattern entry compiled and ready to be matched against an xref ID at
|
|
22
|
+
* resolve time. Authored {@link XrefPattern}s in `refrakt.config.json` are
|
|
23
|
+
* turned into this shape once per build via {@link compileXrefPatterns}. */
|
|
24
|
+
export interface CompiledXrefPattern {
|
|
25
|
+
/** The compiled regex (already wrapped in whole-string anchors if needed). */
|
|
26
|
+
match: RegExp;
|
|
27
|
+
/** URL template — same string the author wrote, ready for placeholder
|
|
28
|
+
* substitution by the resolver. */
|
|
29
|
+
template: string;
|
|
30
|
+
/** CSS modifier class value. Defaulted to `"external"` if the author
|
|
31
|
+
* omitted it. */
|
|
32
|
+
type: string;
|
|
33
|
+
/** Link-text template. Defaulted to `"{id}"` if the author omitted it. */
|
|
34
|
+
label: string;
|
|
35
|
+
/** Named groups declared in the regex, in declaration order. The resolver
|
|
36
|
+
* uses these (plus the implicit `{id}`) to validate template placeholders
|
|
37
|
+
* at match time. */
|
|
38
|
+
groupNames: string[];
|
|
39
|
+
}
|
|
40
|
+
/** Diagnostics produced by {@link compileXrefPatterns}. Compilation never
|
|
41
|
+
* throws — fatal cases (invalid regex, unknown placeholder, reserved type)
|
|
42
|
+
* are surfaced via `errors`; soft diagnostics (duplicate `match`) via
|
|
43
|
+
* `warnings`. Adapters decide how to render them. */
|
|
44
|
+
export interface CompiledXrefPatternsResult {
|
|
45
|
+
patterns: CompiledXrefPattern[];
|
|
46
|
+
errors: string[];
|
|
47
|
+
warnings: string[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Compile a list of authored xref patterns into runtime-ready form.
|
|
51
|
+
*
|
|
52
|
+
* Returns the compiled patterns alongside errors and warnings — callers
|
|
53
|
+
* (typically the content-loader bootstrap) decide whether errors should
|
|
54
|
+
* throw, log, or be passed back to the user.
|
|
55
|
+
*/
|
|
56
|
+
export declare function compileXrefPatterns(patterns: XrefPattern[] | undefined): CompiledXrefPatternsResult;
|
|
57
|
+
//# sourceMappingURL=xref-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xref-patterns.d.ts","sourceRoot":"","sources":["../src/xref-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;6EAE6E;AAC7E,MAAM,WAAW,mBAAmB;IACnC,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd;wCACoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB;sBACkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd;;yBAEqB;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;sDAGsD;AACtD,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AA+CD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,WAAW,EAAE,GAAG,SAAS,GACjC,0BAA0B,CA8E5B"}
|