@refrakt-md/runes 0.15.0 → 0.16.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/aggregate-resolve.d.ts +4 -0
- package/dist/aggregate-resolve.d.ts.map +1 -0
- package/dist/aggregate-resolve.js +209 -0
- package/dist/aggregate-resolve.js.map +1 -0
- package/dist/collection-helpers.d.ts +101 -0
- package/dist/collection-helpers.d.ts.map +1 -0
- package/dist/collection-helpers.js +206 -0
- package/dist/collection-helpers.js.map +1 -0
- package/dist/collection-resolve.d.ts +5 -0
- package/dist/collection-resolve.d.ts.map +1 -0
- package/dist/collection-resolve.js +209 -0
- package/dist/collection-resolve.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +87 -5
- package/dist/config.js.map +1 -1
- package/dist/deferred-body.d.ts +19 -0
- package/dist/deferred-body.d.ts.map +1 -0
- package/dist/deferred-body.js +70 -0
- package/dist/deferred-body.js.map +1 -0
- package/dist/drawer-pipeline.d.ts +72 -1
- package/dist/drawer-pipeline.d.ts.map +1 -1
- package/dist/drawer-pipeline.js +242 -1
- package/dist/drawer-pipeline.js.map +1 -1
- package/dist/expand-pipeline.js +25 -16
- package/dist/expand-pipeline.js.map +1 -1
- package/dist/field-match.d.ts +43 -0
- package/dist/field-match.d.ts.map +1 -0
- package/dist/field-match.js +121 -0
- package/dist/field-match.js.map +1 -0
- package/dist/file-ref-resolve.d.ts +22 -0
- package/dist/file-ref-resolve.d.ts.map +1 -0
- package/dist/file-ref-resolve.js +233 -0
- package/dist/file-ref-resolve.js.map +1 -0
- package/dist/functions.d.ts +36 -0
- package/dist/functions.d.ts.map +1 -0
- package/dist/functions.js +74 -0
- package/dist/functions.js.map +1 -0
- package/dist/index.d.ts +33 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +80 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/nodes.d.ts.map +1 -1
- package/dist/nodes.js +68 -9
- package/dist/nodes.js.map +1 -1
- package/dist/outline-scope.d.ts +17 -0
- package/dist/outline-scope.d.ts.map +1 -1
- package/dist/outline-scope.js +59 -0
- package/dist/outline-scope.js.map +1 -1
- package/dist/relationships-resolve.d.ts +4 -0
- package/dist/relationships-resolve.d.ts.map +1 -0
- package/dist/relationships-resolve.js +180 -0
- package/dist/relationships-resolve.js.map +1 -0
- package/dist/snippet-pipeline.d.ts +7 -5
- package/dist/snippet-pipeline.d.ts.map +1 -1
- package/dist/snippet-pipeline.js +32 -13
- package/dist/snippet-pipeline.js.map +1 -1
- package/dist/tags/aggregate.d.ts +19 -0
- package/dist/tags/aggregate.d.ts.map +1 -0
- package/dist/tags/aggregate.js +59 -0
- package/dist/tags/aggregate.js.map +1 -0
- package/dist/tags/card.d.ts +25 -0
- package/dist/tags/card.d.ts.map +1 -0
- package/dist/tags/card.js +138 -0
- package/dist/tags/card.js.map +1 -0
- package/dist/tags/codegroup.d.ts.map +1 -1
- package/dist/tags/codegroup.js +37 -1
- package/dist/tags/codegroup.js.map +1 -1
- package/dist/tags/collection.d.ts +10 -0
- package/dist/tags/collection.d.ts.map +1 -0
- package/dist/tags/collection.js +54 -0
- package/dist/tags/collection.js.map +1 -0
- package/dist/tags/conversation.d.ts.map +1 -1
- package/dist/tags/conversation.js +26 -6
- package/dist/tags/conversation.js.map +1 -1
- package/dist/tags/diff.d.ts.map +1 -1
- package/dist/tags/diff.js +85 -18
- package/dist/tags/diff.js.map +1 -1
- package/dist/tags/drawer.d.ts.map +1 -1
- package/dist/tags/drawer.js +32 -2
- package/dist/tags/drawer.js.map +1 -1
- package/dist/tags/file-ref.d.ts +21 -0
- package/dist/tags/file-ref.d.ts.map +1 -0
- package/dist/tags/file-ref.js +88 -0
- package/dist/tags/file-ref.js.map +1 -0
- package/dist/tags/progress.d.ts +9 -0
- package/dist/tags/progress.d.ts.map +1 -0
- package/dist/tags/progress.js +96 -0
- package/dist/tags/progress.js.map +1 -0
- package/dist/tags/relationships.d.ts +12 -0
- package/dist/tags/relationships.d.ts.map +1 -0
- package/dist/tags/relationships.js +62 -0
- package/dist/tags/relationships.js.map +1 -0
- package/dist/tags/snippet.d.ts.map +1 -1
- package/dist/tags/snippet.js +10 -0
- package/dist/tags/snippet.js.map +1 -1
- package/dist/tags/xref.d.ts.map +1 -1
- package/dist/tags/xref.js +9 -0
- package/dist/tags/xref.js.map +1 -1
- package/dist/xref-preview-resolve.d.ts +35 -0
- package/dist/xref-preview-resolve.d.ts.map +1 -0
- package/dist/xref-preview-resolve.js +188 -0
- package/dist/xref-preview-resolve.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* relationships postProcess resolver (SPEC-072).
|
|
3
|
+
*
|
|
4
|
+
* Walks the serialized renderable, finds `relationships` sentinels, queries the
|
|
5
|
+
* registry's relationship graph (`getRelated`), and renders either a per-edge
|
|
6
|
+
* body template (deferBody, with `$item` + `$kind` bound) or a built-in
|
|
7
|
+
* grouped-by-kind list. Shares render helpers with `collection`.
|
|
8
|
+
*/
|
|
9
|
+
import Markdoc from '@markdoc/markdoc';
|
|
10
|
+
import { humanize } from './functions.js';
|
|
11
|
+
import { fieldValue, titleLink as titleLinkFor, groupBy, projectItem, renderItemTemplate, buildOrdering, splitBodyZones, renderGroupAccordion, } from './collection-helpers.js';
|
|
12
|
+
import { RELATIONSHIPS_SENTINEL } from './tags/relationships.js';
|
|
13
|
+
const { Tag } = Markdoc;
|
|
14
|
+
function isTag(node) {
|
|
15
|
+
return Tag.isTag(node);
|
|
16
|
+
}
|
|
17
|
+
function metaContent(tag, field) {
|
|
18
|
+
for (const child of tag.children ?? []) {
|
|
19
|
+
if (isTag(child) && child.name === 'meta' && child.attributes['data-field'] === field) {
|
|
20
|
+
return String(child.attributes.content ?? '');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
function hasSentinel(tag) {
|
|
26
|
+
return (tag.children ?? []).some((c) => isTag(c) && c.name === 'meta' && c.attributes['data-field'] === RELATIONSHIPS_SENTINEL);
|
|
27
|
+
}
|
|
28
|
+
function csv(s) {
|
|
29
|
+
return s.split(',').map((x) => x.trim()).filter(Boolean);
|
|
30
|
+
}
|
|
31
|
+
function readQuery(tag) {
|
|
32
|
+
const limitRaw = metaContent(tag, 'relationships-limit');
|
|
33
|
+
const limitNum = Number(limitRaw);
|
|
34
|
+
return {
|
|
35
|
+
of: metaContent(tag, 'relationships-of'),
|
|
36
|
+
kinds: csv(metaContent(tag, 'relationships-kind')),
|
|
37
|
+
types: csv(metaContent(tag, 'relationships-type')),
|
|
38
|
+
group: metaContent(tag, 'relationships-group') || 'kind',
|
|
39
|
+
groupDisplay: metaContent(tag, 'relationships-group-display') || 'headings',
|
|
40
|
+
sort: metaContent(tag, 'relationships-sort'),
|
|
41
|
+
limit: limitRaw && Number.isFinite(limitNum) && limitNum > 0 ? Math.floor(limitNum) : undefined,
|
|
42
|
+
fields: csv(metaContent(tag, 'relationships-fields')),
|
|
43
|
+
layout: metaContent(tag, 'relationships-layout') || 'list',
|
|
44
|
+
bodySource: metaContent(tag, 'relationships-body'),
|
|
45
|
+
empty: metaContent(tag, 'relationships-empty'),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Sort edges by a related-entity field, honoring domain ordering. */
|
|
49
|
+
function sortEdges(edges, sortExpr, ordering) {
|
|
50
|
+
if (!sortExpr)
|
|
51
|
+
return edges;
|
|
52
|
+
let field = sortExpr.trim();
|
|
53
|
+
let dir = 1;
|
|
54
|
+
if (field.startsWith('-')) {
|
|
55
|
+
dir = -1;
|
|
56
|
+
field = field.slice(1);
|
|
57
|
+
}
|
|
58
|
+
else if (field.endsWith('-desc')) {
|
|
59
|
+
dir = -1;
|
|
60
|
+
field = field.slice(0, -5);
|
|
61
|
+
}
|
|
62
|
+
else if (field.endsWith('-asc')) {
|
|
63
|
+
field = field.slice(0, -4);
|
|
64
|
+
}
|
|
65
|
+
const ranked = edges.some((e) => ordering.order(e.target.type, field));
|
|
66
|
+
return [...edges].sort((a, b) => {
|
|
67
|
+
if (ranked) {
|
|
68
|
+
const ra = ordering.rank(a.target.type, field, fieldValue(a.target, field));
|
|
69
|
+
const rb = ordering.rank(b.target.type, field, fieldValue(b.target, field));
|
|
70
|
+
const aR = ra >= 0, bR = rb >= 0;
|
|
71
|
+
if (aR && bR) {
|
|
72
|
+
if (ra !== rb)
|
|
73
|
+
return (ra - rb) * dir;
|
|
74
|
+
}
|
|
75
|
+
else if (aR !== bR)
|
|
76
|
+
return aR ? -1 : 1;
|
|
77
|
+
}
|
|
78
|
+
const av = fieldValue(a.target, field);
|
|
79
|
+
const bv = fieldValue(b.target, field);
|
|
80
|
+
return av.localeCompare(bv) * dir;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function titleLink(e) {
|
|
84
|
+
return titleLinkFor(e, 'rf-relationships');
|
|
85
|
+
}
|
|
86
|
+
function builtInItem(edge, q) {
|
|
87
|
+
const spans = q.fields.map((f) => new Tag('span', { class: 'rf-relationships__field', 'data-field': f }, [fieldValue(edge.target, f)]));
|
|
88
|
+
const attrs = { 'data-entity-id': edge.target.id, 'data-kind': edge.kind };
|
|
89
|
+
// grid gets card chrome (mirroring collection); list stays an inline row.
|
|
90
|
+
if (q.layout === 'grid') {
|
|
91
|
+
return new Tag('article', { class: 'rf-relationships__card', ...attrs }, [titleLink(edge.target), ...spans]);
|
|
92
|
+
}
|
|
93
|
+
return new Tag('div', { class: 'rf-relationships__item', ...attrs }, [titleLink(edge.target), ...spans]);
|
|
94
|
+
}
|
|
95
|
+
function renderEdges(edges, q, tmpl, embedConfig) {
|
|
96
|
+
return edges.map((edge) => {
|
|
97
|
+
if (tmpl && embedConfig) {
|
|
98
|
+
const kids = renderItemTemplate(tmpl, embedConfig, { item: projectItem(edge.target), kind: edge.kind });
|
|
99
|
+
return new Tag('div', { class: 'rf-relationships__item', 'data-entity-id': edge.target.id, 'data-kind': edge.kind, 'data-block': '' }, kids);
|
|
100
|
+
}
|
|
101
|
+
return builtInItem(edge, q);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function resolveOne(tag, registry, embedConfig, ordering, ctx, pageUrl) {
|
|
105
|
+
const q = readQuery(tag);
|
|
106
|
+
if (!q.of) {
|
|
107
|
+
ctx.warn('relationships — no `of` entity given (pass of=$item.id on an entity page)', pageUrl);
|
|
108
|
+
}
|
|
109
|
+
let edges = q.of && registry.getRelated
|
|
110
|
+
? registry.getRelated(q.of, {
|
|
111
|
+
kind: q.kinds.length ? q.kinds : undefined,
|
|
112
|
+
type: q.types.length ? q.types : undefined,
|
|
113
|
+
})
|
|
114
|
+
: [];
|
|
115
|
+
edges = sortEdges(edges, q.sort, ordering);
|
|
116
|
+
// `$count` = total matched (pre-limit); `$shown` = rendered (post-limit).
|
|
117
|
+
const matched = edges.length;
|
|
118
|
+
if (q.limit !== undefined && edges.length > q.limit)
|
|
119
|
+
edges = edges.slice(0, q.limit);
|
|
120
|
+
const counts = { count: matched, shown: edges.length };
|
|
121
|
+
const zones = splitBodyZones(q.bodySource);
|
|
122
|
+
const tmpl = zones.template;
|
|
123
|
+
const attrs = { ...tag.attributes, 'data-of': q.of, 'data-layout': q.layout };
|
|
124
|
+
// Empty state (SPEC-072 Cap 5): fallback zone, else `empty` attribute, else nothing.
|
|
125
|
+
if (edges.length === 0) {
|
|
126
|
+
const out = [];
|
|
127
|
+
if (zones.fallback && embedConfig) {
|
|
128
|
+
out.push(new Tag('div', { 'data-name': 'empty', class: 'rf-relationships__empty' }, renderItemTemplate(zones.fallback, embedConfig, counts)));
|
|
129
|
+
}
|
|
130
|
+
else if (q.empty) {
|
|
131
|
+
out.push(new Tag('div', { 'data-name': 'empty', class: 'rf-relationships__empty' }, [q.empty]));
|
|
132
|
+
}
|
|
133
|
+
return new Tag(tag.name, attrs, out);
|
|
134
|
+
}
|
|
135
|
+
let children;
|
|
136
|
+
if (q.group === 'none' || !q.group) {
|
|
137
|
+
children = renderEdges(edges, q, tmpl, embedConfig);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// group by kind (default) or by target type
|
|
141
|
+
const keyOf = q.group === 'type' ? (e) => e.target.type : (e) => e.kind;
|
|
142
|
+
const groups = groupBy(edges, keyOf);
|
|
143
|
+
if (q.groupDisplay === 'accordion') {
|
|
144
|
+
children = renderGroupAccordion([...groups].map(([key, es]) => ({ key, label: humanize(key), count: es.length, nodes: renderEdges(es, q, tmpl, embedConfig) })));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
children = [];
|
|
148
|
+
for (const [key, es] of groups) {
|
|
149
|
+
children.push(new Tag('div', { class: 'rf-relationships__group', 'data-group': key }, [
|
|
150
|
+
new Tag('h3', { class: 'rf-relationships__group-title' }, [humanize(key)]),
|
|
151
|
+
...renderEdges(es, q, tmpl, embedConfig),
|
|
152
|
+
]));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const itemsDiv = new Tag('div', { 'data-name': 'items', class: 'rf-relationships__items' }, children);
|
|
157
|
+
const head = [];
|
|
158
|
+
if (zones.preamble && embedConfig) {
|
|
159
|
+
head.push(new Tag('div', { 'data-name': 'preamble', class: 'rf-relationships__preamble' }, renderItemTemplate(zones.preamble, embedConfig, counts)));
|
|
160
|
+
}
|
|
161
|
+
return new Tag(tag.name, attrs, [...head, itemsDiv]);
|
|
162
|
+
}
|
|
163
|
+
export function resolveRelationships(renderable, pageUrl, registry, embedConfig, ctx) {
|
|
164
|
+
const ordering = buildOrdering(embedConfig);
|
|
165
|
+
const walk = (node) => {
|
|
166
|
+
if (Array.isArray(node))
|
|
167
|
+
return node.map(walk);
|
|
168
|
+
if (!isTag(node))
|
|
169
|
+
return node;
|
|
170
|
+
const tag = node;
|
|
171
|
+
if (tag.attributes?.['data-rune'] === 'relationships' && hasSentinel(tag)) {
|
|
172
|
+
return resolveOne(tag, registry, embedConfig, ordering, ctx, pageUrl);
|
|
173
|
+
}
|
|
174
|
+
if (!tag.children || tag.children.length === 0)
|
|
175
|
+
return tag;
|
|
176
|
+
return new Tag(tag.name, tag.attributes, tag.children.map(walk));
|
|
177
|
+
};
|
|
178
|
+
return walk(renderable);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=relationships-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships-resolve.js","sourceRoot":"","sources":["../src/relationships-resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Snippet pipeline hooks (SPEC-062).
|
|
2
|
+
* Snippet pipeline hooks (SPEC-062, WORK-304).
|
|
3
3
|
*
|
|
4
4
|
* - **Preprocess** walks the parsed Markdoc AST, finds every `{% snippet %}`
|
|
5
5
|
* tag, resolves + slices its source file, and replaces the tag with a
|
|
6
|
-
* Markdoc `fence` node. The fence carries `content`
|
|
6
|
+
* Markdoc `fence` node. The fence carries `content` + `language` (so
|
|
7
7
|
* the existing code-block transform syntax-highlights it identically to
|
|
8
|
-
* a triple-backtick fence) plus `
|
|
9
|
-
*
|
|
8
|
+
* a triple-backtick fence) plus `source` / `lines` + author-set
|
|
9
|
+
* `linenumbers` / `highlight` annotations (WORK-304). The fence schema
|
|
10
|
+
* renders them as `data-source` / `data-lines` / `data-linenumbers` /
|
|
11
|
+
* `data-highlight-lines` on the output `<pre>` + `<code>`.
|
|
10
12
|
*
|
|
11
13
|
* - **PostProcess** walks the rendered renderable tree, finds every `<pre>`
|
|
12
|
-
* element carrying `data-
|
|
14
|
+
* element carrying `data-source`, and — when not nested under a
|
|
13
15
|
* fence-consuming container (`data-rune="code-group"`, `data-rune="diff"`)
|
|
14
16
|
* — wraps it in `<figure class="rf-snippet">` so themes can style snippet
|
|
15
17
|
* blocks distinctly from regular code blocks (and tooling can find
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snippet-pipeline.d.ts","sourceRoot":"","sources":["../src/snippet-pipeline.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"snippet-pipeline.d.ts","sourceRoot":"","sources":["../src/snippet-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAiC7H;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,iBAAiB,GACpB,IAAI,GAAG,IAAI,CAYb;AAqHD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,cAAc,EAC3B,IAAI,EAAE,eAAe,GACnB,eAAe,CAIjB"}
|
package/dist/snippet-pipeline.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Snippet pipeline hooks (SPEC-062).
|
|
2
|
+
* Snippet pipeline hooks (SPEC-062, WORK-304).
|
|
3
3
|
*
|
|
4
4
|
* - **Preprocess** walks the parsed Markdoc AST, finds every `{% snippet %}`
|
|
5
5
|
* tag, resolves + slices its source file, and replaces the tag with a
|
|
6
|
-
* Markdoc `fence` node. The fence carries `content`
|
|
6
|
+
* Markdoc `fence` node. The fence carries `content` + `language` (so
|
|
7
7
|
* the existing code-block transform syntax-highlights it identically to
|
|
8
|
-
* a triple-backtick fence) plus `
|
|
9
|
-
*
|
|
8
|
+
* a triple-backtick fence) plus `source` / `lines` + author-set
|
|
9
|
+
* `linenumbers` / `highlight` annotations (WORK-304). The fence schema
|
|
10
|
+
* renders them as `data-source` / `data-lines` / `data-linenumbers` /
|
|
11
|
+
* `data-highlight-lines` on the output `<pre>` + `<code>`.
|
|
10
12
|
*
|
|
11
13
|
* - **PostProcess** walks the rendered renderable tree, finds every `<pre>`
|
|
12
|
-
* element carrying `data-
|
|
14
|
+
* element carrying `data-source`, and — when not nested under a
|
|
13
15
|
* fence-consuming container (`data-rune="code-group"`, `data-rune="diff"`)
|
|
14
16
|
* — wraps it in `<figure class="rf-snippet">` so themes can style snippet
|
|
15
17
|
* blocks distinctly from regular code blocks (and tooling can find
|
|
@@ -95,13 +97,14 @@ function walkAndReplaceSnippets(node, page, ctx, projectRoot, onReplaced) {
|
|
|
95
97
|
/** Build a `fence` AST node that renders a clear error message in place of
|
|
96
98
|
* the snippet. Used when resolution fails (sandbox, missing file, malformed
|
|
97
99
|
* lines, unresolvable variable reference). The fence carries the original
|
|
98
|
-
* attempted path in `
|
|
99
|
-
* snippet
|
|
100
|
+
* attempted path in `source` so tooling can still detect snippet
|
|
101
|
+
* provenance, plus a `data-snippet-error` raw data-attr that's
|
|
102
|
+
* forwarded through the fence transform for the error styling hook. */
|
|
100
103
|
function makeErrorFence(pathAttr, message) {
|
|
101
104
|
return new Ast.Node('fence', {
|
|
102
105
|
content: `snippet error: ${message}\n`,
|
|
103
106
|
language: 'text',
|
|
104
|
-
|
|
107
|
+
source: pathAttr || '(unresolved)',
|
|
105
108
|
'data-snippet-error': message,
|
|
106
109
|
});
|
|
107
110
|
}
|
|
@@ -113,6 +116,14 @@ function resolveSnippetToFence(tag, page, ctx, projectRoot) {
|
|
|
113
116
|
const langAttr = tag.attributes.lang !== undefined
|
|
114
117
|
? resolveAttributeValue(tag.attributes.lang, ctx.variables)
|
|
115
118
|
: undefined;
|
|
119
|
+
// WORK-304 — propagate author-set fence-level annotations from the
|
|
120
|
+
// snippet rune through to the fence node. The fence schema renders
|
|
121
|
+
// them as `data-linenumbers` / `data-highlight-lines`. `linenumbers`
|
|
122
|
+
// arrives as a Boolean from the rune schema; `highlight` as a String.
|
|
123
|
+
const linenumbers = tag.attributes.linenumbers === true;
|
|
124
|
+
const highlight = tag.attributes.highlight !== undefined
|
|
125
|
+
? resolveAttributeValue(tag.attributes.highlight, ctx.variables)
|
|
126
|
+
: undefined;
|
|
116
127
|
if (!pathAttr) {
|
|
117
128
|
const msg = 'snippet `path` attribute is required (and an unresolvable variable reference resolves to empty)';
|
|
118
129
|
ctx.error(msg, page.url);
|
|
@@ -142,13 +153,21 @@ function resolveSnippetToFence(tag, page, ctx, projectRoot) {
|
|
|
142
153
|
ctx.warn(warning, page.url);
|
|
143
154
|
}
|
|
144
155
|
const language = (langAttr && langAttr.length > 0) ? langAttr : inferLanguage(result.relativePath);
|
|
156
|
+
// WORK-304 — write unprefixed `source` / `lines` directly. The fence
|
|
157
|
+
// schema renders them as `data-source` / `data-lines`. `linenumbers` /
|
|
158
|
+
// `highlight` are propagated from the rune attributes (file-coordinate
|
|
159
|
+
// semantics — see WORK-304 acceptance criteria).
|
|
145
160
|
const fenceAttrs = {
|
|
146
161
|
content: result.content,
|
|
147
162
|
language,
|
|
148
|
-
|
|
163
|
+
source: result.relativePath,
|
|
149
164
|
};
|
|
150
165
|
if (lines)
|
|
151
|
-
fenceAttrs
|
|
166
|
+
fenceAttrs.lines = lines;
|
|
167
|
+
if (linenumbers)
|
|
168
|
+
fenceAttrs.linenumbers = true;
|
|
169
|
+
if (highlight && highlight.length > 0)
|
|
170
|
+
fenceAttrs.highlight = highlight;
|
|
152
171
|
// Construct a fence Ast.Node. Markdoc parses ``` blocks as
|
|
153
172
|
// new Ast.Node('fence', { content, language }) — same shape here.
|
|
154
173
|
return new Ast.Node('fence', fenceAttrs);
|
|
@@ -186,7 +205,7 @@ function walkAndWrap(node, insideFenceContainer) {
|
|
|
186
205
|
const childAncestor = insideFenceContainer || enteredFenceContainer;
|
|
187
206
|
// Wrap matching <pre> elements that aren't inside a fence-consuming container.
|
|
188
207
|
if (tag.name === 'pre' &&
|
|
189
|
-
tag.attributes?.['data-
|
|
208
|
+
tag.attributes?.['data-source'] !== undefined &&
|
|
190
209
|
!insideFenceContainer) {
|
|
191
210
|
return wrapPreInFigure(tag);
|
|
192
211
|
}
|
|
@@ -205,8 +224,8 @@ function walkAndWrap(node, insideFenceContainer) {
|
|
|
205
224
|
}
|
|
206
225
|
function wrapPreInFigure(preTag) {
|
|
207
226
|
const attrs = preTag.attributes;
|
|
208
|
-
const source = String(attrs['data-
|
|
209
|
-
const linesAttr = attrs['data-
|
|
227
|
+
const source = String(attrs['data-source'] ?? '');
|
|
228
|
+
const linesAttr = attrs['data-lines'] !== undefined ? String(attrs['data-lines']) : undefined;
|
|
210
229
|
const figureAttrs = {
|
|
211
230
|
class: 'rf-snippet',
|
|
212
231
|
'data-rune': 'snippet',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snippet-pipeline.js","sourceRoot":"","sources":["../src/snippet-pipeline.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"snippet-pipeline.js","sourceRoot":"","sources":["../src/snippet-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Markdoc from '@markdoc/markdoc';
|
|
2
|
+
export declare const AGGREGATE_SENTINEL = "__aggregate-sentinel";
|
|
3
|
+
/**
|
|
4
|
+
* `aggregate` (SPEC-076) — the third post-process-resolved query rune, beside
|
|
5
|
+
* `collection` and `relationships`. Where they project entities and edges, this
|
|
6
|
+
* one projects **numbers** — counts over the same field-match query, optionally
|
|
7
|
+
* broken down by group. Two modes from the same rune:
|
|
8
|
+
*
|
|
9
|
+
* - **No-body**: emits a single inline integer (the count). Replaces the
|
|
10
|
+
* standalone `count` rune proposal.
|
|
11
|
+
* - **Body-zoned**: source splits on top-level `hr` into preamble / template /
|
|
12
|
+
* fallback. `$item` is bound differently per zone — preamble gets totals,
|
|
13
|
+
* template gets the per-group projection, fallback gets zeros.
|
|
14
|
+
*
|
|
15
|
+
* The body is captured via `deferBody` and reparsed per group in the resolver
|
|
16
|
+
* (the same path collection's per-item template uses).
|
|
17
|
+
*/
|
|
18
|
+
export declare const aggregate: Markdoc.Schema;
|
|
19
|
+
//# sourceMappingURL=aggregate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../src/tags/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAKvC,eAAO,MAAM,kBAAkB,yBAAyB,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,gBAsCpB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import Markdoc from '@markdoc/markdoc';
|
|
2
|
+
const { Tag } = Markdoc;
|
|
3
|
+
import { createContentModelSchema, createComponentRenderable } from '../lib/index.js';
|
|
4
|
+
import { readDeferredBody } from '../deferred-body.js';
|
|
5
|
+
export const AGGREGATE_SENTINEL = '__aggregate-sentinel';
|
|
6
|
+
/**
|
|
7
|
+
* `aggregate` (SPEC-076) — the third post-process-resolved query rune, beside
|
|
8
|
+
* `collection` and `relationships`. Where they project entities and edges, this
|
|
9
|
+
* one projects **numbers** — counts over the same field-match query, optionally
|
|
10
|
+
* broken down by group. Two modes from the same rune:
|
|
11
|
+
*
|
|
12
|
+
* - **No-body**: emits a single inline integer (the count). Replaces the
|
|
13
|
+
* standalone `count` rune proposal.
|
|
14
|
+
* - **Body-zoned**: source splits on top-level `hr` into preamble / template /
|
|
15
|
+
* fallback. `$item` is bound differently per zone — preamble gets totals,
|
|
16
|
+
* template gets the per-group projection, fallback gets zeros.
|
|
17
|
+
*
|
|
18
|
+
* The body is captured via `deferBody` and reparsed per group in the resolver
|
|
19
|
+
* (the same path collection's per-item template uses).
|
|
20
|
+
*/
|
|
21
|
+
export const aggregate = createContentModelSchema({
|
|
22
|
+
attributes: {
|
|
23
|
+
type: { type: String, required: false, default: '', description: 'Entity type(s), comma-separated.' },
|
|
24
|
+
filter: { type: String, required: false, default: '', description: 'field:value clauses defining the primary set being measured (SPEC-070 grammar).' },
|
|
25
|
+
value: { type: String, required: false, default: '', description: 'Optional secondary field:value clause defining the achieved subset within `filter` (e.g. value="status:done"). When set, $item.value is the count matching both; $item.percent is the ratio. Without it, the rune is a pure count + breakdown — no progress-bar semantics.' },
|
|
26
|
+
group: { type: String, required: false, default: '', description: 'Group-by field; omit to render the body once with totals.' },
|
|
27
|
+
sort: { type: String, required: false, default: '', description: 'Sort groups by `key`, `count`, `value`, or `percent` (prefix `-` for descending). Honors SPEC-072 domain-aware ordering when the group field has one.' },
|
|
28
|
+
limit: { type: String, required: false, default: '', description: 'Cap the number of groups (after sort).' },
|
|
29
|
+
empty: { type: String, required: false, default: '', description: 'Fallback text shown when the query matches no entities (self-closing form; body form uses a fallback zone). Absent → render nothing.' },
|
|
30
|
+
},
|
|
31
|
+
deferBody: true,
|
|
32
|
+
contentModel: { type: 'sequence', fields: [] },
|
|
33
|
+
transform(_resolved, attrs) {
|
|
34
|
+
const meta = (field, content) => new Tag('meta', { 'data-field': field, content });
|
|
35
|
+
const bodySource = readDeferredBody(attrs) ?? '';
|
|
36
|
+
const hasBody = bodySource.length > 0;
|
|
37
|
+
const metas = [
|
|
38
|
+
meta('aggregate-type', String(attrs.type ?? '')),
|
|
39
|
+
meta('aggregate-filter', String(attrs.filter ?? '')),
|
|
40
|
+
meta('aggregate-value', String(attrs.value ?? '')),
|
|
41
|
+
meta('aggregate-group', String(attrs.group ?? '')),
|
|
42
|
+
meta('aggregate-sort', String(attrs.sort ?? '')),
|
|
43
|
+
meta('aggregate-limit', String(attrs.limit ?? '')),
|
|
44
|
+
meta('aggregate-empty', String(attrs.empty ?? '')),
|
|
45
|
+
meta(AGGREGATE_SENTINEL, 'true'),
|
|
46
|
+
];
|
|
47
|
+
if (bodySource)
|
|
48
|
+
metas.push(meta('aggregate-body', bodySource));
|
|
49
|
+
// Self-closing form must be inline-safe (no <section> mid-prose), so the
|
|
50
|
+
// outer tag is a span when there's no body. Body form is a <section>.
|
|
51
|
+
return createComponentRenderable({
|
|
52
|
+
rune: 'aggregate',
|
|
53
|
+
tag: hasBody ? 'section' : 'span',
|
|
54
|
+
properties: {},
|
|
55
|
+
children: metas,
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../src/tags/aggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import Markdoc from '@markdoc/markdoc';
|
|
2
|
+
/**
|
|
3
|
+
* `card` (SPEC-070) — a generic, self-contained content card.
|
|
4
|
+
*
|
|
5
|
+
* The body is divided by `---` (hr) into up to three zones:
|
|
6
|
+
*
|
|
7
|
+
* [media] --- body [--- footer]
|
|
8
|
+
*
|
|
9
|
+
* - **media** (optional leading zone): any content — an image, a `{% codegroup %}`,
|
|
10
|
+
* a `{% sandbox %}`, etc. Reuses the shared split layout (`SplitLayoutModel`):
|
|
11
|
+
* side-by-side with the body on wide screens, a full-bleed header on mobile
|
|
12
|
+
* (`data-media-position="top"`).
|
|
13
|
+
* - **body**: the main content.
|
|
14
|
+
* - **footer** (optional trailing zone): a muted meta row (date · tags · …).
|
|
15
|
+
*
|
|
16
|
+
* Zone roles are positional by count: 1 → body; 2 → media + body; 3 → media +
|
|
17
|
+
* body + footer. A leading empty zone (`--- body --- footer`) means "no media".
|
|
18
|
+
*
|
|
19
|
+
* `href` makes the whole card a link (a stretched link overlay, so real links
|
|
20
|
+
* inside body/footer stay clickable). The card carries no `$item`/registry
|
|
21
|
+
* knowledge — it's plain and composable, standalone or fed by a collection
|
|
22
|
+
* body template.
|
|
23
|
+
*/
|
|
24
|
+
export declare const card: Markdoc.Schema;
|
|
25
|
+
//# sourceMappingURL=card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/tags/card.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAOvC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,IAAI,gBAwHf,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import Markdoc from '@markdoc/markdoc';
|
|
2
|
+
const { Tag } = Markdoc;
|
|
3
|
+
import { createContentModelSchema, createComponentRenderable, asNodes } from '../lib/index.js';
|
|
4
|
+
import { RenderableNodeCursor } from '../lib/renderable.js';
|
|
5
|
+
import { SplitLayoutModel, buildLayoutMetas, extractMediaImage } from './common.js';
|
|
6
|
+
/**
|
|
7
|
+
* `card` (SPEC-070) — a generic, self-contained content card.
|
|
8
|
+
*
|
|
9
|
+
* The body is divided by `---` (hr) into up to three zones:
|
|
10
|
+
*
|
|
11
|
+
* [media] --- body [--- footer]
|
|
12
|
+
*
|
|
13
|
+
* - **media** (optional leading zone): any content — an image, a `{% codegroup %}`,
|
|
14
|
+
* a `{% sandbox %}`, etc. Reuses the shared split layout (`SplitLayoutModel`):
|
|
15
|
+
* side-by-side with the body on wide screens, a full-bleed header on mobile
|
|
16
|
+
* (`data-media-position="top"`).
|
|
17
|
+
* - **body**: the main content.
|
|
18
|
+
* - **footer** (optional trailing zone): a muted meta row (date · tags · …).
|
|
19
|
+
*
|
|
20
|
+
* Zone roles are positional by count: 1 → body; 2 → media + body; 3 → media +
|
|
21
|
+
* body + footer. A leading empty zone (`--- body --- footer`) means "no media".
|
|
22
|
+
*
|
|
23
|
+
* `href` makes the whole card a link (a stretched link overlay, so real links
|
|
24
|
+
* inside body/footer stay clickable). The card carries no `$item`/registry
|
|
25
|
+
* knowledge — it's plain and composable, standalone or fed by a collection
|
|
26
|
+
* body template.
|
|
27
|
+
*/
|
|
28
|
+
export const card = createContentModelSchema({
|
|
29
|
+
base: SplitLayoutModel,
|
|
30
|
+
attributes: {
|
|
31
|
+
href: { type: String, required: false, default: '', description: 'Optional link target; makes the whole card clickable.' },
|
|
32
|
+
},
|
|
33
|
+
contentModel: {
|
|
34
|
+
type: 'sequence',
|
|
35
|
+
fields: [{ name: 'body', match: 'any', optional: true, greedy: true }],
|
|
36
|
+
},
|
|
37
|
+
transform(resolved, attrs, config) {
|
|
38
|
+
// Split the body nodes on `hr` (`---`) into zones.
|
|
39
|
+
const nodes = asNodes(resolved.body);
|
|
40
|
+
const zones = [[]];
|
|
41
|
+
for (const n of nodes) {
|
|
42
|
+
if (n.type === 'hr')
|
|
43
|
+
zones.push([]);
|
|
44
|
+
else
|
|
45
|
+
zones[zones.length - 1].push(n);
|
|
46
|
+
}
|
|
47
|
+
let mediaNodes = [];
|
|
48
|
+
let bodyNodes = [];
|
|
49
|
+
let footerNodes = [];
|
|
50
|
+
if (zones.length === 1) {
|
|
51
|
+
bodyNodes = zones[0];
|
|
52
|
+
}
|
|
53
|
+
else if (zones.length === 2) {
|
|
54
|
+
mediaNodes = zones[0];
|
|
55
|
+
bodyNodes = zones[1];
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
mediaNodes = zones[0];
|
|
59
|
+
footerNodes = zones[zones.length - 1];
|
|
60
|
+
bodyNodes = zones.slice(1, -1).flat();
|
|
61
|
+
}
|
|
62
|
+
const { metas: layoutMetas, children: layoutChildren } = buildLayoutMetas(attrs);
|
|
63
|
+
const children = [...layoutChildren];
|
|
64
|
+
// Media zone — unwrap a bare image; otherwise render arbitrary content.
|
|
65
|
+
if (mediaNodes.length > 0) {
|
|
66
|
+
const mediaCursor = new RenderableNodeCursor(Markdoc.transform(mediaNodes, config));
|
|
67
|
+
const img = extractMediaImage(mediaCursor);
|
|
68
|
+
const inner = img ? [img] : mediaCursor.toArray();
|
|
69
|
+
children.push(new Tag('div', { 'data-section': 'media', 'data-name': 'media' }, inner));
|
|
70
|
+
}
|
|
71
|
+
// Eyebrow: a leading paragraph immediately followed by a heading becomes a
|
|
72
|
+
// kicker (the page-section / recipe pattern). The rest stays freeform body.
|
|
73
|
+
let eyebrowNode;
|
|
74
|
+
let mainBodyNodes = bodyNodes;
|
|
75
|
+
if (bodyNodes.length >= 2 &&
|
|
76
|
+
bodyNodes[0].type === 'paragraph' &&
|
|
77
|
+
bodyNodes[1].type === 'heading') {
|
|
78
|
+
eyebrowNode = bodyNodes[0];
|
|
79
|
+
mainBodyNodes = bodyNodes.slice(1);
|
|
80
|
+
}
|
|
81
|
+
// Content zone (body + optional footer) — one grid child so the split
|
|
82
|
+
// layout puts media | content; footer sits at the bottom of content.
|
|
83
|
+
const bodyInner = [];
|
|
84
|
+
let eyebrowTag;
|
|
85
|
+
if (eyebrowNode) {
|
|
86
|
+
const eyebrowCursor = new RenderableNodeCursor(Markdoc.transform([eyebrowNode], config));
|
|
87
|
+
const first = eyebrowCursor.toArray()[0];
|
|
88
|
+
if (Markdoc.Tag.isTag(first)) {
|
|
89
|
+
eyebrowTag = first;
|
|
90
|
+
bodyInner.push(eyebrowTag);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const bodyCursor = new RenderableNodeCursor(Markdoc.transform(mainBodyNodes, config));
|
|
94
|
+
const bodyRendered = bodyCursor.toArray();
|
|
95
|
+
// The body's leading heading is the card title — give it a hook so it can
|
|
96
|
+
// sit tight under an eyebrow instead of carrying default prose top margin.
|
|
97
|
+
let titleTag;
|
|
98
|
+
const firstBody = bodyRendered[0];
|
|
99
|
+
if (Markdoc.Tag.isTag(firstBody) && /^h[1-6]$/.test(firstBody.name)) {
|
|
100
|
+
titleTag = firstBody;
|
|
101
|
+
}
|
|
102
|
+
bodyInner.push(...bodyRendered);
|
|
103
|
+
const bodyDiv = new Tag('div', { 'data-name': 'body' }, bodyInner);
|
|
104
|
+
const contentChildren = [bodyDiv];
|
|
105
|
+
let footerTag;
|
|
106
|
+
if (footerNodes.length > 0) {
|
|
107
|
+
const footerCursor = new RenderableNodeCursor(Markdoc.transform(footerNodes, config));
|
|
108
|
+
footerTag = new Tag('footer', { 'data-name': 'footer' }, footerCursor.toArray());
|
|
109
|
+
contentChildren.push(footerTag);
|
|
110
|
+
}
|
|
111
|
+
const contentDiv = new Tag('div', { 'data-name': 'content' }, contentChildren);
|
|
112
|
+
children.push(contentDiv);
|
|
113
|
+
// Whole-card link as a stretched overlay (keeps nested links valid).
|
|
114
|
+
let linkTag;
|
|
115
|
+
const href = String(attrs.href ?? '');
|
|
116
|
+
if (href) {
|
|
117
|
+
linkTag = new Tag('a', { 'data-name': 'link', href, 'aria-hidden': 'true', tabindex: '-1' }, []);
|
|
118
|
+
children.push(linkTag);
|
|
119
|
+
}
|
|
120
|
+
const refs = { content: contentDiv, body: bodyDiv };
|
|
121
|
+
if (titleTag)
|
|
122
|
+
refs.title = titleTag;
|
|
123
|
+
if (eyebrowTag)
|
|
124
|
+
refs.eyebrow = eyebrowTag;
|
|
125
|
+
if (footerTag)
|
|
126
|
+
refs.footer = footerTag;
|
|
127
|
+
if (linkTag)
|
|
128
|
+
refs.link = linkTag;
|
|
129
|
+
return createComponentRenderable({
|
|
130
|
+
rune: 'card',
|
|
131
|
+
tag: 'div',
|
|
132
|
+
properties: { layout: layoutMetas.layout },
|
|
133
|
+
refs,
|
|
134
|
+
children,
|
|
135
|
+
});
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/tags/card.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegroup.d.ts","sourceRoot":"","sources":["../../src/tags/codegroup.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"codegroup.d.ts","sourceRoot":"","sources":["../../src/tags/codegroup.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAyCvC,eAAO,MAAM,SAAS,gBA4FpB,CAAC"}
|