@hpcc-js/markdown-it-plugins 1.5.13 → 1.5.15

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/index.js CHANGED
@@ -1,2 +1,246 @@
1
- var e=Object.defineProperty,n=(n,t)=>e(n,"name",{value:t,configurable:!0});import{Runtime as t,Library as r,Inspector as o}from"@observablehq/runtime";import{ojs2notebook as c,compile as s}from"@hpcc-js/observablehq-compiler";const l={type:"js",exec:!1,echo:void 0,hide:void 0};function i(e){return!0===e.exec?!0===e.echo:!1!==e.echo}function d(e){return!0===e.exec}function a(e){return 1==e.exec&&!0!==e.hide}n(i,"showSrc"),n(d,"executeSrc"),n(a,"renderExecutedSrc");let p=0;function f(e){return`fence-${++p}${e?`-${e}`:""}`}function u(e,n){const t=[];try{const r=c(e);for(let e=0;e<r.nodes.length;++e){const o=f(e+1),c=r.nodes[e].value;t.push({...n,id:o,content:c,innerHTML:`<span id="${o}" >\n ${a(n)?"...":""}\n</span>`})}}catch(r){const e=`fence-${p}-error`;t.push({...n,id:e,content:JSON.stringify(r),innerHTML:`<span id="${e}" class="red">\n ${JSON.stringify(r)}\n</span>`})}return t}n(f,"createId"),n(u,"calcPlaceholders");const h="ENV_OBSERVABLE";function y(e,n,t){return t[h]||(t[h]=[]),u(e,n).reduce((e,n)=>(t[h].push({...n,innerHTML:void 0}),e+n.innerHTML),"")}n(y,"generatePlaceholders");const m=class _Inspector extends o{constructor(e){super(e),this.placeholder=e}placeholder;pending(){super.pending()}fulfilled(e,n){if("string"==typeof e)this.placeholder.innerText=e;else super.fulfilled(e)}rejected(e){super.rejected(e)}};n(m,"Inspector");let b=m;async function g(e){const n={},o={nodes:[],files:[]};for(const t of e)o.nodes.push({id:t.id,name:t.id,mode:"js",value:t.content}),n[t.id]=a(t);const c=await s(o),l=new t(new r);l.module(c,()=>{c(l,(e,t)=>{const r=globalThis?.document?.getElementById(""+t);return r&&n[t]?new b(r):{pending(){},fulfilled(e,n){},rejected(e,n){}}})})}function k(e,n,t,r,o){return y(e[n].content,{type:"js",exec:!0},r)}n(g,"render"),n(k,"renderObservable");const x=123;function*v(e,n=0,t=e.length){if(36===e.charCodeAt(n)&&e.charCodeAt(n+1)===x){const r=n+=2;let o=0,c=!1;for(;!c&&n<t;){switch(e.charCodeAt(n)){case x:o++;break;case 125:0===o?(c=!0,--n):o--}n++}const s=n;if(n>=t||r==s)return;if(125!==e.charCodeAt(n))return;n++;const l=e.slice(r,s).trim();yield{type:"placeholder",content:l,pos:n}}}function*j(e){let n=0,t=0;const r=e.length;for(;n<r;)if(36===e.charCodeAt(n)&&e.charCodeAt(n+1)===x){yield{type:"html_block",content:e.slice(t,n)};for(const o of v(e,n,r))yield o,n=o.pos,t=n}else n++;n>t&&(yield{type:"html_block",content:e.slice(t,n)})}n(v,"parsePlaceholderInline"),n(j,"parsePlaceholderBlock");const C=/* @__PURE__ */n((e,n)=>{if(n||e.pos+2>e.posMax)return!1;const t=e.src.charCodeAt(e.pos),r=e.src.charCodeAt(e.pos+1);if(36!==t||r!==x)return!1;for(const{type:o,content:c,pos:s}of v(e.src,e.pos,e.posMax)){if("placeholder"!==o)break;return e.push(o,"",0).content=c,e.pos=s,!0}return!1},"transformPlaceholderInline"),T=/* @__PURE__ */n(e=>{const{tokens:n}=e;for(let t=0,r=n.length;t<r;++t){const r=n[t];if("html_block"===r.type){const o=[];for(const{type:n,content:t}of j(r.content)){const r=new e.Token(n,"",0);r.content=t,o.push(r)}if(1===o.length&&"html_block"===o[0].type)n[t].content=o[0].content;else{const r=new e.Token("inline","",0);r.children=o,n[t]=r}}}},"transformPlaceholderCore");function w(e){e.inline.ruler.push("placeholder",C),e.core.ruler.after("inline","placeholder",T),e.renderer.rules.placeholder=(e,n,t,r,o)=>k(e,n,0,r)}n(w,"hookTemplateLiterals");const A=/* @__PURE__ */n(e=>e.split(/\s+/).reduce((e,n,t)=>{if(0===t)return e.type=n,e;const[r,o]=n.split("=");switch(r){case"exec":case"echo":case"hide":e[r]="false"!==o}return e},{...l}),"deserializeFenceInfo"),I=/* @__PURE__ */n((e,n,t,r,o)=>o.renderToken(e,n,t),"proxy");function $(e){const t=e.renderer.rules.fence||I,r=/* @__PURE__ */n((e,n,r,o,c)=>{const s=e[n],l=A(s.info);"javascript"===l.type&&(l.type="js"),s.content+="\n";let a="";return"js"!==l.type?a+t(e,n,r,o,c):(d(l)&&(o[h]||(o[h]=[]),a+=y(s.content,l,o)),i(l)?a+t(e,n,r,o,c):a)},"fenceRenderer");e.renderer.rules.fence=r}function P(e){const n=e.render;e.render=(t,r)=>{const o={...r},c=n.call(e,t,o);return g(o[h]??[]),c}}function S(e){const n=e.render;e.render=(t,r)=>{const o=r??{};let c=n.call(e,t,o);if(r[h]?.length){c+=`<RenderComponent content="${encodeURI(JSON.stringify(r[h]))}" />`}return c}}function L(e,n={}){w(e),$(e),n.vitePress?S(e):P(e)}n($,"hookFence"),n(P,"hookRender"),n(S,"hookVitepressRender"),n(L,"observable");export{L as observable,g as render};
2
- //# sourceMappingURL=index.js.map
1
+ import { Runtime as e } from "@observablehq/runtime";
2
+ import { Library as t } from "@observablehq/stdlib";
3
+ import { Inspector as n } from "@observablehq/inspector";
4
+ import { compile as r, ojs2notebook as i } from "@hpcc-js/observablehq-compiler";
5
+ //#region \0rolldown/runtime.js
6
+ var a = Object.defineProperty, __name = (e, t) => a(e, "name", {
7
+ value: t,
8
+ configurable: !0
9
+ }), o = {
10
+ type: "js",
11
+ exec: !1,
12
+ echo: void 0,
13
+ hide: void 0
14
+ };
15
+ function showSrc(e) {
16
+ return e.exec === !0 ? e.echo === !0 : e.echo !== !1;
17
+ }
18
+ function executeSrc(e) {
19
+ return e.exec === !0;
20
+ }
21
+ function renderExecutedSrc(e) {
22
+ return e.exec == 1 && e.hide !== !0;
23
+ }
24
+ var s = 0;
25
+ function createId(e) {
26
+ return `fence-${++s}${e ? `-${e}` : ""}`;
27
+ }
28
+ function calcPlaceholders(e, t) {
29
+ let n = [];
30
+ try {
31
+ let r = i(e);
32
+ for (let e = 0; e < r.nodes.length; ++e) {
33
+ let i = createId(e + 1), a = r.nodes[e].value;
34
+ n.push({
35
+ ...t,
36
+ id: i,
37
+ content: a,
38
+ innerHTML: `\
39
+ <span id="${i}" >
40
+ ${renderExecutedSrc(t) ? "..." : ""}
41
+ </span>`
42
+ });
43
+ }
44
+ } catch (e) {
45
+ let r = `fence-${s}-error`;
46
+ n.push({
47
+ ...t,
48
+ id: r,
49
+ content: JSON.stringify(e),
50
+ innerHTML: `\
51
+ <span id="${r}" class="red">
52
+ ${JSON.stringify(e)}
53
+ </span>`
54
+ });
55
+ }
56
+ return n;
57
+ }
58
+ var c = "ENV_OBSERVABLE";
59
+ function generatePlaceholders(e, t, n) {
60
+ return n.ENV_OBSERVABLE || (n[c] = []), calcPlaceholders(e, t).reduce((e, t) => (n[c].push({
61
+ ...t,
62
+ innerHTML: void 0
63
+ }), e + t.innerHTML), "");
64
+ }
65
+ //#endregion
66
+ //#region src/render.ts
67
+ var Inspector$1 = class extends n {
68
+ static {
69
+ __name(this, "Inspector");
70
+ }
71
+ placeholder;
72
+ constructor(e) {
73
+ super(e), this.placeholder = e;
74
+ }
75
+ pending() {
76
+ super.pending();
77
+ }
78
+ fulfilled(e, t) {
79
+ switch (typeof e) {
80
+ case "string":
81
+ this.placeholder.innerText = e;
82
+ break;
83
+ default: super.fulfilled(e);
84
+ }
85
+ }
86
+ rejected(e) {
87
+ super.rejected(e);
88
+ }
89
+ };
90
+ async function render(n) {
91
+ let i = {}, a = {
92
+ nodes: [],
93
+ files: []
94
+ };
95
+ for (let e of n) a.nodes.push({
96
+ id: e.id,
97
+ name: e.id,
98
+ mode: "js",
99
+ value: e.content
100
+ }), i[e.id] = renderExecutedSrc(e);
101
+ let o = await r(a), s = new e(new t());
102
+ s.module(o, () => {
103
+ o(s, (e, t) => {
104
+ let n = globalThis?.document?.getElementById("" + t);
105
+ return n && i[t] ? new Inspector$1(n) : {
106
+ pending() {},
107
+ fulfilled(e, t) {},
108
+ rejected(e, t) {}
109
+ };
110
+ });
111
+ });
112
+ }
113
+ //#endregion
114
+ //#region src/template-literal.ts
115
+ function renderObservable(e, t, n, r, i) {
116
+ return generatePlaceholders(e[t].content, {
117
+ type: "js",
118
+ exec: !0
119
+ }, r);
120
+ }
121
+ var l = 36, u = 123, d = 125;
122
+ function* parsePlaceholderInline(e, t = 0, n = e.length) {
123
+ if (e.charCodeAt(t) === l && e.charCodeAt(t + 1) === u) {
124
+ t += 2;
125
+ let r = t, i = 0, a = !1;
126
+ for (; !a && t < n;) {
127
+ switch (e.charCodeAt(t)) {
128
+ case u:
129
+ i++;
130
+ break;
131
+ case d:
132
+ i === 0 ? (a = !0, --t) : i--;
133
+ break;
134
+ }
135
+ t++;
136
+ }
137
+ let o = t;
138
+ if (t >= n || r == o || e.charCodeAt(t) !== d) return;
139
+ t++, yield {
140
+ type: "placeholder",
141
+ content: e.slice(r, o).trim(),
142
+ pos: t
143
+ };
144
+ }
145
+ }
146
+ function* parsePlaceholderBlock(e) {
147
+ let t = 0, n = 0, r = e.length;
148
+ for (; t < r;) if (e.charCodeAt(t) === l && e.charCodeAt(t + 1) === u) {
149
+ yield {
150
+ type: "html_block",
151
+ content: e.slice(n, t)
152
+ };
153
+ for (let i of parsePlaceholderInline(e, t, r)) yield i, t = i.pos, n = t;
154
+ } else t++;
155
+ t > n && (yield {
156
+ type: "html_block",
157
+ content: e.slice(n, t)
158
+ });
159
+ }
160
+ var transformPlaceholderInline = (e, t) => {
161
+ if (t || e.pos + 2 > e.posMax) return !1;
162
+ let n = e.src.charCodeAt(e.pos), r = e.src.charCodeAt(e.pos + 1);
163
+ if (n !== l || r !== u) return !1;
164
+ for (let { type: t, content: n, pos: r } of parsePlaceholderInline(e.src, e.pos, e.posMax)) {
165
+ if (t !== "placeholder") break;
166
+ let i = e.push(t, "", 0);
167
+ return i.content = n, e.pos = r, !0;
168
+ }
169
+ return !1;
170
+ }, transformPlaceholderCore = (e) => {
171
+ let { tokens: t } = e;
172
+ for (let n = 0, r = t.length; n < r; ++n) {
173
+ let r = t[n];
174
+ if (r.type === "html_block") {
175
+ let i = [];
176
+ for (let { type: t, content: n } of parsePlaceholderBlock(r.content)) {
177
+ let r = new e.Token(t, "", 0);
178
+ r.content = n, i.push(r);
179
+ }
180
+ if (i.length === 1 && i[0].type === "html_block") t[n].content = i[0].content;
181
+ else {
182
+ let r = new e.Token("inline", "", 0);
183
+ r.children = i, t[n] = r;
184
+ }
185
+ }
186
+ }
187
+ };
188
+ function hookTemplateLiterals(e) {
189
+ e.inline.ruler.push("placeholder", transformPlaceholderInline), e.core.ruler.after("inline", "placeholder", transformPlaceholderCore), e.renderer.rules.placeholder = (e, t, n, r, i) => renderObservable(e, t, n, r, i);
190
+ }
191
+ //#endregion
192
+ //#region src/fence.ts
193
+ var deserializeFenceInfo = (e) => e.split(/\s+/).reduce((e, t, n) => {
194
+ if (n === 0) return e.type = t, e;
195
+ let [r, i] = t.split("=");
196
+ switch (r) {
197
+ case "exec":
198
+ case "echo":
199
+ case "hide":
200
+ e[r] = i !== "false";
201
+ break;
202
+ }
203
+ return e;
204
+ }, { ...o }), proxy = (e, t, n, r, i) => i.renderToken(e, t, n);
205
+ function hookFence(e) {
206
+ let t = e.renderer.rules.fence || proxy, fenceRenderer = (e, n, r, i, a) => {
207
+ let o = e[n], s = deserializeFenceInfo(o.info);
208
+ s.type === "javascript" && (s.type = "js"), o.content += "\n";
209
+ let l = "";
210
+ switch (s.type) {
211
+ case "js":
212
+ if (executeSrc(s) && (i.ENV_OBSERVABLE || (i[c] = []), l += generatePlaceholders(o.content, s, i)), showSrc(s)) return l + t(e, n, r, i, a);
213
+ break;
214
+ default: return l + t(e, n, r, i, a);
215
+ }
216
+ return l;
217
+ };
218
+ e.renderer.rules.fence = fenceRenderer;
219
+ }
220
+ //#endregion
221
+ //#region src/index.ts
222
+ function hookRender(e) {
223
+ let t = e.render;
224
+ e.render = (n, r) => {
225
+ let i = { ...r }, a = t.call(e, n, i);
226
+ return render(i.ENV_OBSERVABLE ?? []), a;
227
+ };
228
+ }
229
+ function hookVitepressRender(e) {
230
+ let t = e.render;
231
+ e.render = (n, r) => {
232
+ let i = r ?? {}, a = t.call(e, n, i);
233
+ if (r.ENV_OBSERVABLE?.length) {
234
+ let e = encodeURI(JSON.stringify(r[c]));
235
+ a += `<RenderComponent content="${e}" />`;
236
+ }
237
+ return a;
238
+ };
239
+ }
240
+ function observable(e, t = {}) {
241
+ hookTemplateLiterals(e), hookFence(e), t.vitePress ? hookVitepressRender(e) : hookRender(e);
242
+ }
243
+ //#endregion
244
+ export { observable, render };
245
+
246
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/util.ts","../src/render.ts","../src/template-literal.ts","../src/fence.ts","../src/index.ts"],"sourcesContent":["import { ojs2notebook } from \"@hpcc-js/observablehq-compiler\";\nimport { RenderNode } from \"./render.ts\";\n\nexport interface FenceInfo {\n type: \"js\" | \"javascript\" | string;\n exec?: boolean;\n echo?: boolean;\n hide?: boolean;\n}\n\nexport const fenceInfoDefaults: Readonly<FenceInfo> = {\n type: \"js\",\n exec: false,\n echo: undefined,\n hide: undefined\n};\n\nexport function showSrc(fetchInfo: FenceInfo): boolean {\n if (fetchInfo.exec === true) {\n return fetchInfo.echo === true;\n }\n return fetchInfo.echo !== false;\n}\n\nexport function executeSrc(fenceInfo: FenceInfo): boolean {\n return fenceInfo.exec === true;\n}\n\nexport function renderExecutedSrc(fetchInfo: FenceInfo): boolean {\n return fetchInfo.exec == true && fetchInfo.hide !== true;\n}\n\nlet idx = 0;\nexport function createId(suffix?: string | number): string {\n return `fence-${++idx}${suffix ? `-${suffix}` : \"\"}`;\n}\n\nfunction calcPlaceholders(content: string, fenceInfo: FenceInfo): RenderNode[] {\n const retVal: RenderNode[] = [];\n try {\n const cellNb = ojs2notebook(content);\n for (let i = 0; i < cellNb.nodes.length; ++i) {\n const id = createId(i + 1);\n const content = cellNb.nodes[i].value;\n retVal.push({\n ...fenceInfo,\n id,\n content,\n innerHTML: `\\\n<span id=\"${id}\" >\n ${renderExecutedSrc(fenceInfo) ? \"...\" : \"\"}\n</span>`\n });\n }\n } catch (e: any) {\n const id = `fence-${idx}-error`;\n retVal.push({\n ...fenceInfo,\n id,\n content: JSON.stringify(e),\n innerHTML: `\\\n<span id=\"${id}\" class=\"red\">\n ${JSON.stringify(e)}\n</span>`\n });\n }\n return retVal;\n}\n\nexport const ENV_KEY = \"ENV_OBSERVABLE\";\n\nexport function generatePlaceholders(content: string, fenceInfo: FenceInfo, env: any): string {\n if (!env[ENV_KEY]) {\n env[ENV_KEY] = [];\n }\n return calcPlaceholders(content, fenceInfo).reduce((acc, cur) => {\n env[ENV_KEY]!.push({ ...cur, innerHTML: undefined });\n return acc + cur.innerHTML;\n }, \"\");\n}\n\n","import { Runtime, Library, Inspector as BaseInspector } from \"@observablehq/runtime\";\nimport { compile, type ohq } from \"@hpcc-js/observablehq-compiler\";\nimport { FenceInfo, renderExecutedSrc } from \"./util.ts\";\n\nclass Inspector extends BaseInspector {\n\n constructor(protected placeholder: HTMLElement) {\n super(placeholder);\n }\n\n pending() {\n super.pending();\n }\n\n fulfilled(value: any, _name?: string) {\n switch (typeof value) {\n case \"string\":\n this.placeholder.innerText = value;\n break;\n default:\n super.fulfilled(value);\n }\n }\n\n rejected(error: Error) {\n super.rejected(error);\n }\n}\n\nexport interface RenderNode extends FenceInfo {\n id: string;\n content: string;\n innerHTML?: string;\n}\n\nexport async function render(nodes: RenderNode[]) {\n const displayIndex: { [key: string]: boolean } = {};\n const nb: ohq.Notebook = { nodes: [], files: [] };\n for (const node of nodes) {\n nb.nodes.push({\n id: node.id,\n name: node.id,\n mode: \"js\",\n value: node.content\n });\n displayIndex[node.id] = renderExecutedSrc(node);\n }\n const define = await compile(nb);\n const runtime = new Runtime(new Library());\n runtime.module(define, () => {\n define(runtime, (_name: string | undefined, id: string | number) => {\n const placeholder = globalThis?.document?.getElementById(\"\" + id);\n if (placeholder && displayIndex[id]) {\n return new Inspector(placeholder);\n }\n return {\n pending() { },\n fulfilled(_value: any, _name?: string) { },\n rejected(_error: any, _name?: string) { }\n };\n });\n });\n}\n","import type MarkdownIt from \"markdown-it\";\nimport type { Options } from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport type { RuleCore } from \"markdown-it/lib/parser_core.mjs\";\nimport type { RuleInline } from \"markdown-it/lib/parser_inline.mjs\";\nimport { generatePlaceholders } from \"./util.ts\";\n\nfunction renderObservable(tokens: Token[], idx: number, _options: Options, env: any, _self: Renderer) {\n return generatePlaceholders(tokens[idx].content, { type: \"js\", exec: true }, env);\n}\n\nconst DOLLAR = 0x24;\nconst CURLEY_OPEN = 0x7B;\nconst CURLEY_CLOSE = 0x7D;\n\nfunction* parsePlaceholderInline(src: string, pos: number = 0, posMax: number = src.length) {\n if (src.charCodeAt(pos) === DOLLAR && src.charCodeAt(pos + 1) === CURLEY_OPEN) {\n pos += 2;\n\n const observableStart = pos;\n let nestedCurly = 0;\n let done = false;\n while (!done && pos < posMax) {\n switch (src.charCodeAt(pos)) {\n case CURLEY_OPEN:\n nestedCurly++;\n break;\n case CURLEY_CLOSE:\n if (nestedCurly === 0) {\n done = true;\n --pos;\n } else {\n nestedCurly--;\n }\n break;\n }\n pos++;\n }\n const observableEnd = pos;\n if (pos >= posMax || observableStart == observableEnd) return;\n if (src.charCodeAt(pos) !== CURLEY_CLOSE) return;\n pos++;\n\n const observableJs = src.slice(observableStart, observableEnd).trim();\n yield { type: \"placeholder\", content: observableJs, pos };\n }\n}\n\nfunction* parsePlaceholderBlock(src: string) {\n let pos = 0;\n let prevPos = 0;\n const posMax = src.length;\n while (pos < posMax) {\n if (src.charCodeAt(pos) === DOLLAR && src.charCodeAt(pos + 1) === CURLEY_OPEN) {\n yield ({ type: \"html_block\", content: src.slice(prevPos, pos) });\n for (const placeholder of parsePlaceholderInline(src, pos, posMax)) {\n yield placeholder;\n pos = placeholder.pos;\n prevPos = pos;\n }\n } else {\n pos++;\n }\n }\n if (pos > prevPos) {\n yield ({ type: \"html_block\", content: src.slice(prevPos, pos) });\n }\n}\n\nconst transformPlaceholderInline: RuleInline = (state, silent) => {\n if (silent || state.pos + 2 > state.posMax) return false;\n const marker1 = state.src.charCodeAt(state.pos);\n const marker2 = state.src.charCodeAt(state.pos + 1);\n if (marker1 !== DOLLAR || marker2 !== CURLEY_OPEN) return false;\n for (const { type, content, pos } of parsePlaceholderInline(state.src, state.pos, state.posMax)) {\n if (type !== \"placeholder\") break;\n const token = state.push(type, \"\", 0);\n token.content = content;\n state.pos = pos;\n return true;\n }\n return false;\n};\n\nconst transformPlaceholderCore: RuleCore = (state) => {\n const { tokens } = state;\n for (let i = 0, n = tokens.length; i < n; ++i) {\n const token = tokens[i];\n if (token.type === \"html_block\") {\n const children: Token[] = [];\n for (const { type, content } of parsePlaceholderBlock(token.content)) {\n const child = new state.Token(type, \"\", 0);\n child.content = content;\n children.push(child);\n }\n if (children.length === 1 && children[0].type === \"html_block\") {\n tokens[i].content = children[0].content;\n } else {\n const inline = new state.Token(\"inline\", \"\", 0);\n inline.children = children;\n tokens[i] = inline;\n }\n }\n }\n};\n\nexport function hookTemplateLiterals(md: MarkdownIt) {\n md.inline.ruler.push(\"placeholder\", transformPlaceholderInline);\n md.core.ruler.after(\"inline\", \"placeholder\", transformPlaceholderCore);\n md.renderer.rules.placeholder = (tokens: Token[], idx: number, options: any, env: any, self: Renderer) => renderObservable(tokens, idx, options, env, self);\n}\n\n","import type MarkdownIt from \"markdown-it\";\nimport type { Options } from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport { RenderNode } from \"./render.ts\";\nimport { ENV_KEY, executeSrc, FenceInfo, fenceInfoDefaults, generatePlaceholders, showSrc } from \"./util.ts\";\n\nconst deserializeFenceInfo = (attrs: string): FenceInfo =>\n attrs\n .split(/\\s+/)\n .reduce((acc: FenceInfo, pair, idx: number) => {\n if (idx === 0) {\n acc.type = pair as \"js\" | \"javascript\" | string;\n return acc;\n }\n\n const [key, value] = pair.split(\"=\") as [keyof FenceInfo, string];\n switch (key) {\n case \"exec\":\n case \"echo\":\n case \"hide\":\n acc[key] = value !== \"false\";\n break;\n }\n return acc;\n }, { ...fenceInfoDefaults })\n ;\n\nconst proxy = (tokens: Token[], idx: number, options: Options, _env: any, self: Renderer) => self.renderToken(tokens, idx, options);\n\nexport function hookFence(md: MarkdownIt) {\n const defaultFenceRenderer = md.renderer.rules.fence || proxy;\n const fenceRenderer = (tokens: Token[], idx: number, options: Options, env: { [ENV_KEY]?: RenderNode[] }, self: Renderer) => {\n const token = tokens[idx];\n const fenceInfo = deserializeFenceInfo(token.info);\n if (fenceInfo.type === \"javascript\") {\n fenceInfo.type = \"js\";\n }\n token.content += \"\\n\";\n let preHtml = \"\";\n switch (fenceInfo.type) {\n case \"js\":\n if (executeSrc(fenceInfo)) {\n if (!env[ENV_KEY]) {\n env[ENV_KEY] = [];\n }\n preHtml += generatePlaceholders(token.content, fenceInfo, env);\n }\n if (showSrc(fenceInfo)) {\n return preHtml + defaultFenceRenderer(tokens, idx, options, env, self);\n }\n break;\n default:\n return preHtml + defaultFenceRenderer(tokens, idx, options, env, self);\n }\n return preHtml;\n };\n md.renderer.rules.fence = fenceRenderer;\n}\n","import type MarkdownIt from \"markdown-it\";\nimport { render } from \"./render.ts\";\nimport { ENV_KEY } from \"./util.ts\";\nimport { hookTemplateLiterals } from \"./template-literal.ts\";\nimport { hookFence } from \"./fence.ts\";\n\nfunction hookRender(md: MarkdownIt) {\n const originalRender = md.render;\n md.render = (src: string, _env?: any): string => {\n const env = { ..._env };\n const retVal = originalRender.call(md, src, env);\n render(env[ENV_KEY] ?? []);\n return retVal;\n };\n}\n\nfunction hookVitepressRender(md: MarkdownIt) {\n\n const originalRender = md.render;\n md.render = (src: string, env?: any): string => {\n const myEnv = env ?? {};\n let retVal = originalRender.call(md, src, myEnv);\n if (env[ENV_KEY]?.length) {\n const content = encodeURI(JSON.stringify(env[ENV_KEY]));\n retVal += `<RenderComponent content=\"${content}\" />`;\n }\n return retVal;\n };\n}\n\nexport interface ObservableOptions {\n vitePress?: boolean;\n}\n\nexport function observable(md: MarkdownIt, opts: ObservableOptions = {}) {\n hookTemplateLiterals(md);\n hookFence(md);\n if (opts.vitePress) {\n hookVitepressRender(md);\n } else {\n hookRender(md);\n }\n}\n\nexport {\n render\n};\n"],"names":["fenceInfoDefaults","type","exec","echo","hide","showSrc","fetchInfo","executeSrc","fenceInfo","renderExecutedSrc","__name","idx","createId","suffix","calcPlaceholders","content","retVal","cellNb","ojs2notebook","i","nodes","length","id","value","push","innerHTML","e","JSON","stringify","ENV_KEY","generatePlaceholders","env","reduce","acc","cur","_Inspector","BaseInspector","constructor","placeholder","super","this","pending","fulfilled","_name","innerText","rejected","error","Inspector","async","render","displayIndex","nb","files","node","name","mode","define","compile","runtime","Runtime","Library","module","globalThis","document","getElementById","_value","_error","renderObservable","tokens","_options","_self","CURLEY_OPEN","parsePlaceholderInline","src","pos","posMax","charCodeAt","observableStart","nestedCurly","done","observableEnd","observableJs","slice","trim","parsePlaceholderBlock","prevPos","transformPlaceholderInline","state","silent","marker1","marker2","transformPlaceholderCore","n","token","children","child","Token","inline","hookTemplateLiterals","md","ruler","core","after","renderer","rules","options","self","deserializeFenceInfo","attrs","split","pair","key","proxy","_env","renderToken","hookFence","defaultFenceRenderer","fence","fenceRenderer","info","preHtml","hookRender","originalRender","call","hookVitepressRender","myEnv","encodeURI","observable","opts","vitePress"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/util.ts","../src/render.ts","../src/template-literal.ts","../src/fence.ts","../src/index.ts"],"sourcesContent":["import { ojs2notebook } from \"@hpcc-js/observablehq-compiler\";\nimport { RenderNode } from \"./render.ts\";\n\nexport interface FenceInfo {\n type: \"js\" | \"javascript\" | string;\n exec?: boolean;\n echo?: boolean;\n hide?: boolean;\n}\n\nexport const fenceInfoDefaults: Readonly<FenceInfo> = {\n type: \"js\",\n exec: false,\n echo: undefined,\n hide: undefined\n};\n\nexport function showSrc(fetchInfo: FenceInfo): boolean {\n if (fetchInfo.exec === true) {\n return fetchInfo.echo === true;\n }\n return fetchInfo.echo !== false;\n}\n\nexport function executeSrc(fenceInfo: FenceInfo): boolean {\n return fenceInfo.exec === true;\n}\n\nexport function renderExecutedSrc(fetchInfo: FenceInfo): boolean {\n return fetchInfo.exec == true && fetchInfo.hide !== true;\n}\n\nlet idx = 0;\nexport function createId(suffix?: string | number): string {\n return `fence-${++idx}${suffix ? `-${suffix}` : \"\"}`;\n}\n\nfunction calcPlaceholders(content: string, fenceInfo: FenceInfo): RenderNode[] {\n const retVal: RenderNode[] = [];\n try {\n const cellNb = ojs2notebook(content);\n for (let i = 0; i < cellNb.nodes.length; ++i) {\n const id = createId(i + 1);\n const content = cellNb.nodes[i].value;\n retVal.push({\n ...fenceInfo,\n id,\n content,\n innerHTML: `\\\n<span id=\"${id}\" >\n ${renderExecutedSrc(fenceInfo) ? \"...\" : \"\"}\n</span>`\n });\n }\n } catch (e: any) {\n const id = `fence-${idx}-error`;\n retVal.push({\n ...fenceInfo,\n id,\n content: JSON.stringify(e),\n innerHTML: `\\\n<span id=\"${id}\" class=\"red\">\n ${JSON.stringify(e)}\n</span>`\n });\n }\n return retVal;\n}\n\nexport const ENV_KEY = \"ENV_OBSERVABLE\";\n\nexport function generatePlaceholders(content: string, fenceInfo: FenceInfo, env: any): string {\n if (!env[ENV_KEY]) {\n env[ENV_KEY] = [];\n }\n return calcPlaceholders(content, fenceInfo).reduce((acc, cur) => {\n env[ENV_KEY]!.push({ ...cur, innerHTML: undefined });\n return acc + cur.innerHTML;\n }, \"\");\n}\n\n","import { Runtime } from \"@observablehq/runtime\";\nimport { Library } from \"@observablehq/stdlib\";\nimport { Inspector as BaseInspector } from \"@observablehq/inspector\";\nimport { compile, type ohq } from \"@hpcc-js/observablehq-compiler\";\nimport { FenceInfo, renderExecutedSrc } from \"./util.ts\";\n\nclass Inspector extends BaseInspector {\n\n constructor(protected placeholder: HTMLElement) {\n super(placeholder);\n }\n\n pending() {\n super.pending();\n }\n\n fulfilled(value: any, _name?: string) {\n switch (typeof value) {\n case \"string\":\n this.placeholder.innerText = value;\n break;\n default:\n super.fulfilled(value);\n }\n }\n\n rejected(error: Error) {\n super.rejected(error);\n }\n}\n\nexport interface RenderNode extends FenceInfo {\n id: string;\n content: string;\n innerHTML?: string;\n}\n\nexport async function render(nodes: RenderNode[]) {\n const displayIndex: { [key: string]: boolean } = {};\n const nb: ohq.Notebook = { nodes: [], files: [] };\n for (const node of nodes) {\n nb.nodes.push({\n id: node.id,\n name: node.id,\n mode: \"js\",\n value: node.content\n });\n displayIndex[node.id] = renderExecutedSrc(node);\n }\n const define = await compile(nb);\n const runtime = new Runtime(new Library());\n runtime.module(define, () => {\n define(runtime, (_name: string | undefined, id: string | number) => {\n const placeholder = globalThis?.document?.getElementById(\"\" + id);\n if (placeholder && displayIndex[id]) {\n return new Inspector(placeholder);\n }\n return {\n pending() { },\n fulfilled(_value: any, _name?: string) { },\n rejected(_error: any, _name?: string) { }\n };\n });\n });\n}\n","import type MarkdownIt from \"markdown-it\";\nimport type { Options } from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport type { RuleCore } from \"markdown-it/lib/parser_core.mjs\";\nimport type { RuleInline } from \"markdown-it/lib/parser_inline.mjs\";\nimport { generatePlaceholders } from \"./util.ts\";\n\nfunction renderObservable(tokens: Token[], idx: number, _options: Options, env: any, _self: Renderer) {\n return generatePlaceholders(tokens[idx].content, { type: \"js\", exec: true }, env);\n}\n\nconst DOLLAR = 0x24;\nconst CURLEY_OPEN = 0x7B;\nconst CURLEY_CLOSE = 0x7D;\n\nfunction* parsePlaceholderInline(src: string, pos: number = 0, posMax: number = src.length) {\n if (src.charCodeAt(pos) === DOLLAR && src.charCodeAt(pos + 1) === CURLEY_OPEN) {\n pos += 2;\n\n const observableStart = pos;\n let nestedCurly = 0;\n let done = false;\n while (!done && pos < posMax) {\n switch (src.charCodeAt(pos)) {\n case CURLEY_OPEN:\n nestedCurly++;\n break;\n case CURLEY_CLOSE:\n if (nestedCurly === 0) {\n done = true;\n --pos;\n } else {\n nestedCurly--;\n }\n break;\n }\n pos++;\n }\n const observableEnd = pos;\n if (pos >= posMax || observableStart == observableEnd) return;\n if (src.charCodeAt(pos) !== CURLEY_CLOSE) return;\n pos++;\n\n const observableJs = src.slice(observableStart, observableEnd).trim();\n yield { type: \"placeholder\", content: observableJs, pos };\n }\n}\n\nfunction* parsePlaceholderBlock(src: string) {\n let pos = 0;\n let prevPos = 0;\n const posMax = src.length;\n while (pos < posMax) {\n if (src.charCodeAt(pos) === DOLLAR && src.charCodeAt(pos + 1) === CURLEY_OPEN) {\n yield ({ type: \"html_block\", content: src.slice(prevPos, pos) });\n for (const placeholder of parsePlaceholderInline(src, pos, posMax)) {\n yield placeholder;\n pos = placeholder.pos;\n prevPos = pos;\n }\n } else {\n pos++;\n }\n }\n if (pos > prevPos) {\n yield ({ type: \"html_block\", content: src.slice(prevPos, pos) });\n }\n}\n\nconst transformPlaceholderInline: RuleInline = (state, silent) => {\n if (silent || state.pos + 2 > state.posMax) return false;\n const marker1 = state.src.charCodeAt(state.pos);\n const marker2 = state.src.charCodeAt(state.pos + 1);\n if (marker1 !== DOLLAR || marker2 !== CURLEY_OPEN) return false;\n for (const { type, content, pos } of parsePlaceholderInline(state.src, state.pos, state.posMax)) {\n if (type !== \"placeholder\") break;\n const token = state.push(type, \"\", 0);\n token.content = content;\n state.pos = pos;\n return true;\n }\n return false;\n};\n\nconst transformPlaceholderCore: RuleCore = (state) => {\n const { tokens } = state;\n for (let i = 0, n = tokens.length; i < n; ++i) {\n const token = tokens[i];\n if (token.type === \"html_block\") {\n const children: Token[] = [];\n for (const { type, content } of parsePlaceholderBlock(token.content)) {\n const child = new state.Token(type, \"\", 0);\n child.content = content;\n children.push(child);\n }\n if (children.length === 1 && children[0].type === \"html_block\") {\n tokens[i].content = children[0].content;\n } else {\n const inline = new state.Token(\"inline\", \"\", 0);\n inline.children = children;\n tokens[i] = inline;\n }\n }\n }\n};\n\nexport function hookTemplateLiterals(md: MarkdownIt) {\n md.inline.ruler.push(\"placeholder\", transformPlaceholderInline);\n md.core.ruler.after(\"inline\", \"placeholder\", transformPlaceholderCore);\n md.renderer.rules.placeholder = (tokens: Token[], idx: number, options: any, env: any, self: Renderer) => renderObservable(tokens, idx, options, env, self);\n}\n\n","import type MarkdownIt from \"markdown-it\";\nimport type { Options } from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport { RenderNode } from \"./render.ts\";\nimport { ENV_KEY, executeSrc, FenceInfo, fenceInfoDefaults, generatePlaceholders, showSrc } from \"./util.ts\";\n\nconst deserializeFenceInfo = (attrs: string): FenceInfo =>\n attrs\n .split(/\\s+/)\n .reduce((acc: FenceInfo, pair, idx: number) => {\n if (idx === 0) {\n acc.type = pair as \"js\" | \"javascript\" | string;\n return acc;\n }\n\n const [key, value] = pair.split(\"=\") as [keyof FenceInfo, string];\n switch (key) {\n case \"exec\":\n case \"echo\":\n case \"hide\":\n acc[key] = value !== \"false\";\n break;\n }\n return acc;\n }, { ...fenceInfoDefaults })\n ;\n\nconst proxy = (tokens: Token[], idx: number, options: Options, _env: any, self: Renderer) => self.renderToken(tokens, idx, options);\n\nexport function hookFence(md: MarkdownIt) {\n const defaultFenceRenderer = md.renderer.rules.fence || proxy;\n const fenceRenderer = (tokens: Token[], idx: number, options: Options, env: { [ENV_KEY]?: RenderNode[] }, self: Renderer) => {\n const token = tokens[idx];\n const fenceInfo = deserializeFenceInfo(token.info);\n if (fenceInfo.type === \"javascript\") {\n fenceInfo.type = \"js\";\n }\n token.content += \"\\n\";\n let preHtml = \"\";\n switch (fenceInfo.type) {\n case \"js\":\n if (executeSrc(fenceInfo)) {\n if (!env[ENV_KEY]) {\n env[ENV_KEY] = [];\n }\n preHtml += generatePlaceholders(token.content, fenceInfo, env);\n }\n if (showSrc(fenceInfo)) {\n return preHtml + defaultFenceRenderer(tokens, idx, options, env, self);\n }\n break;\n default:\n return preHtml + defaultFenceRenderer(tokens, idx, options, env, self);\n }\n return preHtml;\n };\n md.renderer.rules.fence = fenceRenderer;\n}\n","import type MarkdownIt from \"markdown-it\";\nimport { render } from \"./render.ts\";\nimport { ENV_KEY } from \"./util.ts\";\nimport { hookTemplateLiterals } from \"./template-literal.ts\";\nimport { hookFence } from \"./fence.ts\";\n\nfunction hookRender(md: MarkdownIt) {\n const originalRender = md.render;\n md.render = (src: string, _env?: any): string => {\n const env = { ..._env };\n const retVal = originalRender.call(md, src, env);\n render(env[ENV_KEY] ?? []);\n return retVal;\n };\n}\n\nfunction hookVitepressRender(md: MarkdownIt) {\n\n const originalRender = md.render;\n md.render = (src: string, env?: any): string => {\n const myEnv = env ?? {};\n let retVal = originalRender.call(md, src, myEnv);\n if (env[ENV_KEY]?.length) {\n const content = encodeURI(JSON.stringify(env[ENV_KEY]));\n retVal += `<RenderComponent content=\"${content}\" />`;\n }\n return retVal;\n };\n}\n\nexport interface ObservableOptions {\n vitePress?: boolean;\n}\n\nexport function observable(md: MarkdownIt, opts: ObservableOptions = {}) {\n hookTemplateLiterals(md);\n hookFence(md);\n if (opts.vitePress) {\n hookVitepressRender(md);\n } else {\n hookRender(md);\n }\n}\n\nexport {\n render\n};\n"],"mappings":"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"}
@@ -1,2 +1,9 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("@observablehq/runtime"),require("@hpcc-js/observablehq-compiler")):"function"==typeof define&&define.amd?define(["exports","@observablehq/runtime","@hpcc-js/observablehq-compiler"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["@hpcc-js/markdown-it-plugins"]={},e["@observablehq/runtime"],e["@hpcc-js/observablehq-compiler"])}(this,function(e,n,t){"use strict";var o=Object.defineProperty,r=(e,n)=>o(e,"name",{value:n,configurable:!0});const c={type:"js",exec:!1,echo:void 0,hide:void 0};function s(e){return!0===e.exec?!0===e.echo:!1!==e.echo}function l(e){return!0===e.exec}function i(e){return 1==e.exec&&!0!==e.hide}r(s,"showSrc"),r(l,"executeSrc"),r(i,"renderExecutedSrc");let d=0;function a(e){return`fence-${++d}${e?`-${e}`:""}`}function p(e,n){const o=[];try{const r=t.ojs2notebook(e);for(let e=0;e<r.nodes.length;++e){const t=a(e+1),c=r.nodes[e].value;o.push({...n,id:t,content:c,innerHTML:`<span id="${t}" >\n ${i(n)?"...":""}\n</span>`})}}catch(r){const e=`fence-${d}-error`;o.push({...n,id:e,content:JSON.stringify(r),innerHTML:`<span id="${e}" class="red">\n ${JSON.stringify(r)}\n</span>`})}return o}r(a,"createId"),r(p,"calcPlaceholders");const u="ENV_OBSERVABLE";function f(e,n,t){return t[u]||(t[u]=[]),p(e,n).reduce((e,n)=>(t[u].push({...n,innerHTML:void 0}),e+n.innerHTML),"")}r(f,"generatePlaceholders");const h=class _Inspector extends n.Inspector{constructor(e){super(e),this.placeholder=e}placeholder;pending(){super.pending()}fulfilled(e,n){if("string"==typeof e)this.placeholder.innerText=e;else super.fulfilled(e)}rejected(e){super.rejected(e)}};r(h,"Inspector");let b=h;async function y(e){const o={},r={nodes:[],files:[]};for(const n of e)r.nodes.push({id:n.id,name:n.id,mode:"js",value:n.content}),o[n.id]=i(n);const c=await t.compile(r),s=new n.Runtime(new n.Library);s.module(c,()=>{c(s,(e,n)=>{const t=globalThis?.document?.getElementById(""+n);return t&&o[n]?new b(t):{pending(){},fulfilled(e,n){},rejected(e,n){}}})})}function m(e,n,t,o,r){return f(e[n].content,{type:"js",exec:!0},o)}r(y,"render"),r(m,"renderObservable");const g=123;function*v(e,n=0,t=e.length){if(36===e.charCodeAt(n)&&e.charCodeAt(n+1)===g){const o=n+=2;let r=0,c=!1;for(;!c&&n<t;){switch(e.charCodeAt(n)){case g:r++;break;case 125:0===r?(c=!0,--n):r--}n++}const s=n;if(n>=t||o==s)return;if(125!==e.charCodeAt(n))return;n++;const l=e.slice(o,s).trim();yield{type:"placeholder",content:l,pos:n}}}function*j(e){let n=0,t=0;const o=e.length;for(;n<o;)if(36===e.charCodeAt(n)&&e.charCodeAt(n+1)===g){yield{type:"html_block",content:e.slice(t,n)};for(const r of v(e,n,o))yield r,n=r.pos,t=n}else n++;n>t&&(yield{type:"html_block",content:e.slice(t,n)})}r(v,"parsePlaceholderInline"),r(j,"parsePlaceholderBlock");const k=r((e,n)=>{if(n||e.pos+2>e.posMax)return!1;const t=e.src.charCodeAt(e.pos),o=e.src.charCodeAt(e.pos+1);if(36!==t||o!==g)return!1;for(const{type:r,content:c,pos:s}of v(e.src,e.pos,e.posMax)){if("placeholder"!==r)break;return e.push(r,"",0).content=c,e.pos=s,!0}return!1},"transformPlaceholderInline"),x=r(e=>{const{tokens:n}=e;for(let t=0,o=n.length;t<o;++t){const o=n[t];if("html_block"===o.type){const r=[];for(const{type:n,content:t}of j(o.content)){const o=new e.Token(n,"",0);o.content=t,r.push(o)}if(1===r.length&&"html_block"===r[0].type)n[t].content=r[0].content;else{const o=new e.Token("inline","",0);o.children=r,n[t]=o}}}},"transformPlaceholderCore");function T(e){e.inline.ruler.push("placeholder",k),e.core.ruler.after("inline","placeholder",x),e.renderer.rules.placeholder=(e,n,t,o,r)=>m(e,n,0,o)}r(T,"hookTemplateLiterals");const w=r(e=>e.split(/\s+/).reduce((e,n,t)=>{if(0===t)return e.type=n,e;const[o,r]=n.split("=");switch(o){case"exec":case"echo":case"hide":e[o]="false"!==r}return e},{...c}),"deserializeFenceInfo"),C=r((e,n,t,o,r)=>r.renderToken(e,n,t),"proxy");function A(e){const n=e.renderer.rules.fence||C,t=r((e,t,o,r,c)=>{const i=e[t],d=w(i.info);"javascript"===d.type&&(d.type="js"),i.content+="\n";let a="";return"js"!==d.type?a+n(e,t,o,r,c):(l(d)&&(r[u]||(r[u]=[]),a+=f(i.content,d,r)),s(d)?a+n(e,t,o,r,c):a)},"fenceRenderer");e.renderer.rules.fence=t}function I(e){const n=e.render;e.render=(t,o)=>{const r={...o},c=n.call(e,t,r);return y(r[u]??[]),c}}function P(e){const n=e.render;e.render=(t,o)=>{const r=o??{};let c=n.call(e,t,r);if(o[u]?.length){c+=`<RenderComponent content="${encodeURI(JSON.stringify(o[u]))}" />`}return c}}function S(e,n={}){T(e),A(e),n.vitePress?P(e):I(e)}r(A,"hookFence"),r(I,"hookRender"),r(P,"hookVitepressRender"),r(S,"observable"),e.observable=S,e.render=y,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
2
- //# sourceMappingURL=index.umd.cjs.map
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@observablehq/runtime"),require("@observablehq/stdlib"),require("@observablehq/inspector"),require("@hpcc-js/observablehq-compiler")):typeof define==`function`&&define.amd?define([`exports`,`@observablehq/runtime`,`@observablehq/stdlib`,`@observablehq/inspector`,`@hpcc-js/observablehq-compiler`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e[`@hpcc-js/markdown-it-plugins`]={},e[`@observablehq/runtime`],e[`@observablehq/stdlib`],e[`@observablehq/inspector`],e[`@hpcc-js/observablehq-compiler`]))})(this,function(e,t,n,r,i){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var a={type:`js`,exec:!1,echo:void 0,hide:void 0};function showSrc(e){return e.exec===!0?e.echo===!0:e.echo!==!1}function executeSrc(e){return e.exec===!0}function renderExecutedSrc(e){return e.exec==1&&e.hide!==!0}var o=0;function createId(e){return`fence-${++o}${e?`-${e}`:``}`}function calcPlaceholders(e,t){let n=[];try{let r=(0,i.ojs2notebook)(e);for(let e=0;e<r.nodes.length;++e){let i=createId(e+1),a=r.nodes[e].value;n.push({...t,id:i,content:a,innerHTML:`\
2
+ <span id="${i}" >
3
+ ${renderExecutedSrc(t)?`...`:``}
4
+ </span>`})}}catch(e){let r=`fence-${o}-error`;n.push({...t,id:r,content:JSON.stringify(e),innerHTML:`\
5
+ <span id="${r}" class="red">
6
+ ${JSON.stringify(e)}
7
+ </span>`})}return n}var s=`ENV_OBSERVABLE`;function generatePlaceholders(e,t,n){return n.ENV_OBSERVABLE||(n[s]=[]),calcPlaceholders(e,t).reduce((e,t)=>(n[s].push({...t,innerHTML:void 0}),e+t.innerHTML),``)}var Inspector=class extends r.Inspector{placeholder;constructor(e){super(e),this.placeholder=e}pending(){super.pending()}fulfilled(e,t){switch(typeof e){case`string`:this.placeholder.innerText=e;break;default:super.fulfilled(e)}}rejected(e){super.rejected(e)}};async function render(e){let r={},a={nodes:[],files:[]};for(let t of e)a.nodes.push({id:t.id,name:t.id,mode:`js`,value:t.content}),r[t.id]=renderExecutedSrc(t);let o=await(0,i.compile)(a),s=new t.Runtime(new n.Library);s.module(o,()=>{o(s,(e,t)=>{let n=globalThis?.document?.getElementById(``+t);return n&&r[t]?new Inspector(n):{pending(){},fulfilled(e,t){},rejected(e,t){}}})})}function renderObservable(e,t,n,r,i){return generatePlaceholders(e[t].content,{type:`js`,exec:!0},r)}var c=36,l=123,u=125;function*parsePlaceholderInline(e,t=0,n=e.length){if(e.charCodeAt(t)===c&&e.charCodeAt(t+1)===l){t+=2;let r=t,i=0,a=!1;for(;!a&&t<n;){switch(e.charCodeAt(t)){case l:i++;break;case u:i===0?(a=!0,--t):i--;break}t++}let o=t;if(t>=n||r==o||e.charCodeAt(t)!==u)return;t++,yield{type:`placeholder`,content:e.slice(r,o).trim(),pos:t}}}function*parsePlaceholderBlock(e){let t=0,n=0,r=e.length;for(;t<r;)if(e.charCodeAt(t)===c&&e.charCodeAt(t+1)===l){yield{type:`html_block`,content:e.slice(n,t)};for(let i of parsePlaceholderInline(e,t,r))yield i,t=i.pos,n=t}else t++;t>n&&(yield{type:`html_block`,content:e.slice(n,t)})}var transformPlaceholderInline=(e,t)=>{if(t||e.pos+2>e.posMax)return!1;let n=e.src.charCodeAt(e.pos),r=e.src.charCodeAt(e.pos+1);if(n!==c||r!==l)return!1;for(let{type:t,content:n,pos:r}of parsePlaceholderInline(e.src,e.pos,e.posMax)){if(t!==`placeholder`)break;let i=e.push(t,``,0);return i.content=n,e.pos=r,!0}return!1},transformPlaceholderCore=e=>{let{tokens:t}=e;for(let n=0,r=t.length;n<r;++n){let r=t[n];if(r.type===`html_block`){let i=[];for(let{type:t,content:n}of parsePlaceholderBlock(r.content)){let r=new e.Token(t,``,0);r.content=n,i.push(r)}if(i.length===1&&i[0].type===`html_block`)t[n].content=i[0].content;else{let r=new e.Token(`inline`,``,0);r.children=i,t[n]=r}}}};function hookTemplateLiterals(e){e.inline.ruler.push(`placeholder`,transformPlaceholderInline),e.core.ruler.after(`inline`,`placeholder`,transformPlaceholderCore),e.renderer.rules.placeholder=(e,t,n,r,i)=>renderObservable(e,t,n,r,i)}var deserializeFenceInfo=e=>e.split(/\s+/).reduce((e,t,n)=>{if(n===0)return e.type=t,e;let[r,i]=t.split(`=`);switch(r){case`exec`:case`echo`:case`hide`:e[r]=i!==`false`;break}return e},{...a}),proxy=(e,t,n,r,i)=>i.renderToken(e,t,n);function hookFence(e){let t=e.renderer.rules.fence||proxy,fenceRenderer=(e,n,r,i,a)=>{let o=e[n],c=deserializeFenceInfo(o.info);c.type===`javascript`&&(c.type=`js`),o.content+=`
8
+ `;let l=``;switch(c.type){case`js`:if(executeSrc(c)&&(i.ENV_OBSERVABLE||(i[s]=[]),l+=generatePlaceholders(o.content,c,i)),showSrc(c))return l+t(e,n,r,i,a);break;default:return l+t(e,n,r,i,a)}return l};e.renderer.rules.fence=fenceRenderer}function hookRender(e){let t=e.render;e.render=(n,r)=>{let i={...r},a=t.call(e,n,i);return render(i.ENV_OBSERVABLE??[]),a}}function hookVitepressRender(e){let t=e.render;e.render=(n,r)=>{let i=r??{},a=t.call(e,n,i);if(r.ENV_OBSERVABLE?.length){let e=encodeURI(JSON.stringify(r[s]));a+=`<RenderComponent content="${e}" />`}return a}}function observable(e,t={}){hookTemplateLiterals(e),hookFence(e),t.vitePress?hookVitepressRender(e):hookRender(e)}e.observable=observable,e.render=render});
9
+ //# sourceMappingURL=index.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/util.ts","../src/render.ts","../src/template-literal.ts","../src/fence.ts","../src/index.ts"],"sourcesContent":["import { ojs2notebook } from \"@hpcc-js/observablehq-compiler\";\nimport { RenderNode } from \"./render.ts\";\n\nexport interface FenceInfo {\n type: \"js\" | \"javascript\" | string;\n exec?: boolean;\n echo?: boolean;\n hide?: boolean;\n}\n\nexport const fenceInfoDefaults: Readonly<FenceInfo> = {\n type: \"js\",\n exec: false,\n echo: undefined,\n hide: undefined\n};\n\nexport function showSrc(fetchInfo: FenceInfo): boolean {\n if (fetchInfo.exec === true) {\n return fetchInfo.echo === true;\n }\n return fetchInfo.echo !== false;\n}\n\nexport function executeSrc(fenceInfo: FenceInfo): boolean {\n return fenceInfo.exec === true;\n}\n\nexport function renderExecutedSrc(fetchInfo: FenceInfo): boolean {\n return fetchInfo.exec == true && fetchInfo.hide !== true;\n}\n\nlet idx = 0;\nexport function createId(suffix?: string | number): string {\n return `fence-${++idx}${suffix ? `-${suffix}` : \"\"}`;\n}\n\nfunction calcPlaceholders(content: string, fenceInfo: FenceInfo): RenderNode[] {\n const retVal: RenderNode[] = [];\n try {\n const cellNb = ojs2notebook(content);\n for (let i = 0; i < cellNb.nodes.length; ++i) {\n const id = createId(i + 1);\n const content = cellNb.nodes[i].value;\n retVal.push({\n ...fenceInfo,\n id,\n content,\n innerHTML: `\\\n<span id=\"${id}\" >\n ${renderExecutedSrc(fenceInfo) ? \"...\" : \"\"}\n</span>`\n });\n }\n } catch (e: any) {\n const id = `fence-${idx}-error`;\n retVal.push({\n ...fenceInfo,\n id,\n content: JSON.stringify(e),\n innerHTML: `\\\n<span id=\"${id}\" class=\"red\">\n ${JSON.stringify(e)}\n</span>`\n });\n }\n return retVal;\n}\n\nexport const ENV_KEY = \"ENV_OBSERVABLE\";\n\nexport function generatePlaceholders(content: string, fenceInfo: FenceInfo, env: any): string {\n if (!env[ENV_KEY]) {\n env[ENV_KEY] = [];\n }\n return calcPlaceholders(content, fenceInfo).reduce((acc, cur) => {\n env[ENV_KEY]!.push({ ...cur, innerHTML: undefined });\n return acc + cur.innerHTML;\n }, \"\");\n}\n\n","import { Runtime, Library, Inspector as BaseInspector } from \"@observablehq/runtime\";\nimport { compile, type ohq } from \"@hpcc-js/observablehq-compiler\";\nimport { FenceInfo, renderExecutedSrc } from \"./util.ts\";\n\nclass Inspector extends BaseInspector {\n\n constructor(protected placeholder: HTMLElement) {\n super(placeholder);\n }\n\n pending() {\n super.pending();\n }\n\n fulfilled(value: any, _name?: string) {\n switch (typeof value) {\n case \"string\":\n this.placeholder.innerText = value;\n break;\n default:\n super.fulfilled(value);\n }\n }\n\n rejected(error: Error) {\n super.rejected(error);\n }\n}\n\nexport interface RenderNode extends FenceInfo {\n id: string;\n content: string;\n innerHTML?: string;\n}\n\nexport async function render(nodes: RenderNode[]) {\n const displayIndex: { [key: string]: boolean } = {};\n const nb: ohq.Notebook = { nodes: [], files: [] };\n for (const node of nodes) {\n nb.nodes.push({\n id: node.id,\n name: node.id,\n mode: \"js\",\n value: node.content\n });\n displayIndex[node.id] = renderExecutedSrc(node);\n }\n const define = await compile(nb);\n const runtime = new Runtime(new Library());\n runtime.module(define, () => {\n define(runtime, (_name: string | undefined, id: string | number) => {\n const placeholder = globalThis?.document?.getElementById(\"\" + id);\n if (placeholder && displayIndex[id]) {\n return new Inspector(placeholder);\n }\n return {\n pending() { },\n fulfilled(_value: any, _name?: string) { },\n rejected(_error: any, _name?: string) { }\n };\n });\n });\n}\n","import type MarkdownIt from \"markdown-it\";\nimport type { Options } from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport type { RuleCore } from \"markdown-it/lib/parser_core.mjs\";\nimport type { RuleInline } from \"markdown-it/lib/parser_inline.mjs\";\nimport { generatePlaceholders } from \"./util.ts\";\n\nfunction renderObservable(tokens: Token[], idx: number, _options: Options, env: any, _self: Renderer) {\n return generatePlaceholders(tokens[idx].content, { type: \"js\", exec: true }, env);\n}\n\nconst DOLLAR = 0x24;\nconst CURLEY_OPEN = 0x7B;\nconst CURLEY_CLOSE = 0x7D;\n\nfunction* parsePlaceholderInline(src: string, pos: number = 0, posMax: number = src.length) {\n if (src.charCodeAt(pos) === DOLLAR && src.charCodeAt(pos + 1) === CURLEY_OPEN) {\n pos += 2;\n\n const observableStart = pos;\n let nestedCurly = 0;\n let done = false;\n while (!done && pos < posMax) {\n switch (src.charCodeAt(pos)) {\n case CURLEY_OPEN:\n nestedCurly++;\n break;\n case CURLEY_CLOSE:\n if (nestedCurly === 0) {\n done = true;\n --pos;\n } else {\n nestedCurly--;\n }\n break;\n }\n pos++;\n }\n const observableEnd = pos;\n if (pos >= posMax || observableStart == observableEnd) return;\n if (src.charCodeAt(pos) !== CURLEY_CLOSE) return;\n pos++;\n\n const observableJs = src.slice(observableStart, observableEnd).trim();\n yield { type: \"placeholder\", content: observableJs, pos };\n }\n}\n\nfunction* parsePlaceholderBlock(src: string) {\n let pos = 0;\n let prevPos = 0;\n const posMax = src.length;\n while (pos < posMax) {\n if (src.charCodeAt(pos) === DOLLAR && src.charCodeAt(pos + 1) === CURLEY_OPEN) {\n yield ({ type: \"html_block\", content: src.slice(prevPos, pos) });\n for (const placeholder of parsePlaceholderInline(src, pos, posMax)) {\n yield placeholder;\n pos = placeholder.pos;\n prevPos = pos;\n }\n } else {\n pos++;\n }\n }\n if (pos > prevPos) {\n yield ({ type: \"html_block\", content: src.slice(prevPos, pos) });\n }\n}\n\nconst transformPlaceholderInline: RuleInline = (state, silent) => {\n if (silent || state.pos + 2 > state.posMax) return false;\n const marker1 = state.src.charCodeAt(state.pos);\n const marker2 = state.src.charCodeAt(state.pos + 1);\n if (marker1 !== DOLLAR || marker2 !== CURLEY_OPEN) return false;\n for (const { type, content, pos } of parsePlaceholderInline(state.src, state.pos, state.posMax)) {\n if (type !== \"placeholder\") break;\n const token = state.push(type, \"\", 0);\n token.content = content;\n state.pos = pos;\n return true;\n }\n return false;\n};\n\nconst transformPlaceholderCore: RuleCore = (state) => {\n const { tokens } = state;\n for (let i = 0, n = tokens.length; i < n; ++i) {\n const token = tokens[i];\n if (token.type === \"html_block\") {\n const children: Token[] = [];\n for (const { type, content } of parsePlaceholderBlock(token.content)) {\n const child = new state.Token(type, \"\", 0);\n child.content = content;\n children.push(child);\n }\n if (children.length === 1 && children[0].type === \"html_block\") {\n tokens[i].content = children[0].content;\n } else {\n const inline = new state.Token(\"inline\", \"\", 0);\n inline.children = children;\n tokens[i] = inline;\n }\n }\n }\n};\n\nexport function hookTemplateLiterals(md: MarkdownIt) {\n md.inline.ruler.push(\"placeholder\", transformPlaceholderInline);\n md.core.ruler.after(\"inline\", \"placeholder\", transformPlaceholderCore);\n md.renderer.rules.placeholder = (tokens: Token[], idx: number, options: any, env: any, self: Renderer) => renderObservable(tokens, idx, options, env, self);\n}\n\n","import type MarkdownIt from \"markdown-it\";\nimport type { Options } from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport { RenderNode } from \"./render.ts\";\nimport { ENV_KEY, executeSrc, FenceInfo, fenceInfoDefaults, generatePlaceholders, showSrc } from \"./util.ts\";\n\nconst deserializeFenceInfo = (attrs: string): FenceInfo =>\n attrs\n .split(/\\s+/)\n .reduce((acc: FenceInfo, pair, idx: number) => {\n if (idx === 0) {\n acc.type = pair as \"js\" | \"javascript\" | string;\n return acc;\n }\n\n const [key, value] = pair.split(\"=\") as [keyof FenceInfo, string];\n switch (key) {\n case \"exec\":\n case \"echo\":\n case \"hide\":\n acc[key] = value !== \"false\";\n break;\n }\n return acc;\n }, { ...fenceInfoDefaults })\n ;\n\nconst proxy = (tokens: Token[], idx: number, options: Options, _env: any, self: Renderer) => self.renderToken(tokens, idx, options);\n\nexport function hookFence(md: MarkdownIt) {\n const defaultFenceRenderer = md.renderer.rules.fence || proxy;\n const fenceRenderer = (tokens: Token[], idx: number, options: Options, env: { [ENV_KEY]?: RenderNode[] }, self: Renderer) => {\n const token = tokens[idx];\n const fenceInfo = deserializeFenceInfo(token.info);\n if (fenceInfo.type === \"javascript\") {\n fenceInfo.type = \"js\";\n }\n token.content += \"\\n\";\n let preHtml = \"\";\n switch (fenceInfo.type) {\n case \"js\":\n if (executeSrc(fenceInfo)) {\n if (!env[ENV_KEY]) {\n env[ENV_KEY] = [];\n }\n preHtml += generatePlaceholders(token.content, fenceInfo, env);\n }\n if (showSrc(fenceInfo)) {\n return preHtml + defaultFenceRenderer(tokens, idx, options, env, self);\n }\n break;\n default:\n return preHtml + defaultFenceRenderer(tokens, idx, options, env, self);\n }\n return preHtml;\n };\n md.renderer.rules.fence = fenceRenderer;\n}\n","import type MarkdownIt from \"markdown-it\";\nimport { render } from \"./render.ts\";\nimport { ENV_KEY } from \"./util.ts\";\nimport { hookTemplateLiterals } from \"./template-literal.ts\";\nimport { hookFence } from \"./fence.ts\";\n\nfunction hookRender(md: MarkdownIt) {\n const originalRender = md.render;\n md.render = (src: string, _env?: any): string => {\n const env = { ..._env };\n const retVal = originalRender.call(md, src, env);\n render(env[ENV_KEY] ?? []);\n return retVal;\n };\n}\n\nfunction hookVitepressRender(md: MarkdownIt) {\n\n const originalRender = md.render;\n md.render = (src: string, env?: any): string => {\n const myEnv = env ?? {};\n let retVal = originalRender.call(md, src, myEnv);\n if (env[ENV_KEY]?.length) {\n const content = encodeURI(JSON.stringify(env[ENV_KEY]));\n retVal += `<RenderComponent content=\"${content}\" />`;\n }\n return retVal;\n };\n}\n\nexport interface ObservableOptions {\n vitePress?: boolean;\n}\n\nexport function observable(md: MarkdownIt, opts: ObservableOptions = {}) {\n hookTemplateLiterals(md);\n hookFence(md);\n if (opts.vitePress) {\n hookVitepressRender(md);\n } else {\n hookRender(md);\n }\n}\n\nexport {\n render\n};\n"],"names":["fenceInfoDefaults","type","exec","echo","hide","showSrc","fetchInfo","executeSrc","fenceInfo","renderExecutedSrc","__name","idx","createId","suffix","calcPlaceholders","content","retVal","cellNb","ojs2notebook","i","nodes","length","id","value","push","innerHTML","e","JSON","stringify","ENV_KEY","generatePlaceholders","env","reduce","acc","cur","_Inspector","BaseInspector","constructor","placeholder","super","this","pending","fulfilled","_name","innerText","rejected","error","Inspector","async","render","displayIndex","nb","files","node","name","mode","define","compile","runtime","Runtime","Library","module","globalThis","document","getElementById","_value","_error","renderObservable","tokens","_options","_self","CURLEY_OPEN","parsePlaceholderInline","src","pos","posMax","charCodeAt","observableStart","nestedCurly","done","observableEnd","observableJs","slice","trim","parsePlaceholderBlock","prevPos","transformPlaceholderInline","state","silent","marker1","marker2","transformPlaceholderCore","n","token","children","child","Token","inline","hookTemplateLiterals","md","ruler","core","after","renderer","rules","options","self","deserializeFenceInfo","attrs","split","pair","key","proxy","_env","renderToken","hookFence","defaultFenceRenderer","fence","fenceRenderer","info","preHtml","hookRender","originalRender","call","hookVitepressRender","myEnv","encodeURI","observable","opts","vitePress"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","names":[],"sources":["../src/util.ts","../src/render.ts","../src/template-literal.ts","../src/fence.ts","../src/index.ts"],"sourcesContent":["import { ojs2notebook } from \"@hpcc-js/observablehq-compiler\";\nimport { RenderNode } from \"./render.ts\";\n\nexport interface FenceInfo {\n type: \"js\" | \"javascript\" | string;\n exec?: boolean;\n echo?: boolean;\n hide?: boolean;\n}\n\nexport const fenceInfoDefaults: Readonly<FenceInfo> = {\n type: \"js\",\n exec: false,\n echo: undefined,\n hide: undefined\n};\n\nexport function showSrc(fetchInfo: FenceInfo): boolean {\n if (fetchInfo.exec === true) {\n return fetchInfo.echo === true;\n }\n return fetchInfo.echo !== false;\n}\n\nexport function executeSrc(fenceInfo: FenceInfo): boolean {\n return fenceInfo.exec === true;\n}\n\nexport function renderExecutedSrc(fetchInfo: FenceInfo): boolean {\n return fetchInfo.exec == true && fetchInfo.hide !== true;\n}\n\nlet idx = 0;\nexport function createId(suffix?: string | number): string {\n return `fence-${++idx}${suffix ? `-${suffix}` : \"\"}`;\n}\n\nfunction calcPlaceholders(content: string, fenceInfo: FenceInfo): RenderNode[] {\n const retVal: RenderNode[] = [];\n try {\n const cellNb = ojs2notebook(content);\n for (let i = 0; i < cellNb.nodes.length; ++i) {\n const id = createId(i + 1);\n const content = cellNb.nodes[i].value;\n retVal.push({\n ...fenceInfo,\n id,\n content,\n innerHTML: `\\\n<span id=\"${id}\" >\n ${renderExecutedSrc(fenceInfo) ? \"...\" : \"\"}\n</span>`\n });\n }\n } catch (e: any) {\n const id = `fence-${idx}-error`;\n retVal.push({\n ...fenceInfo,\n id,\n content: JSON.stringify(e),\n innerHTML: `\\\n<span id=\"${id}\" class=\"red\">\n ${JSON.stringify(e)}\n</span>`\n });\n }\n return retVal;\n}\n\nexport const ENV_KEY = \"ENV_OBSERVABLE\";\n\nexport function generatePlaceholders(content: string, fenceInfo: FenceInfo, env: any): string {\n if (!env[ENV_KEY]) {\n env[ENV_KEY] = [];\n }\n return calcPlaceholders(content, fenceInfo).reduce((acc, cur) => {\n env[ENV_KEY]!.push({ ...cur, innerHTML: undefined });\n return acc + cur.innerHTML;\n }, \"\");\n}\n\n","import { Runtime } from \"@observablehq/runtime\";\nimport { Library } from \"@observablehq/stdlib\";\nimport { Inspector as BaseInspector } from \"@observablehq/inspector\";\nimport { compile, type ohq } from \"@hpcc-js/observablehq-compiler\";\nimport { FenceInfo, renderExecutedSrc } from \"./util.ts\";\n\nclass Inspector extends BaseInspector {\n\n constructor(protected placeholder: HTMLElement) {\n super(placeholder);\n }\n\n pending() {\n super.pending();\n }\n\n fulfilled(value: any, _name?: string) {\n switch (typeof value) {\n case \"string\":\n this.placeholder.innerText = value;\n break;\n default:\n super.fulfilled(value);\n }\n }\n\n rejected(error: Error) {\n super.rejected(error);\n }\n}\n\nexport interface RenderNode extends FenceInfo {\n id: string;\n content: string;\n innerHTML?: string;\n}\n\nexport async function render(nodes: RenderNode[]) {\n const displayIndex: { [key: string]: boolean } = {};\n const nb: ohq.Notebook = { nodes: [], files: [] };\n for (const node of nodes) {\n nb.nodes.push({\n id: node.id,\n name: node.id,\n mode: \"js\",\n value: node.content\n });\n displayIndex[node.id] = renderExecutedSrc(node);\n }\n const define = await compile(nb);\n const runtime = new Runtime(new Library());\n runtime.module(define, () => {\n define(runtime, (_name: string | undefined, id: string | number) => {\n const placeholder = globalThis?.document?.getElementById(\"\" + id);\n if (placeholder && displayIndex[id]) {\n return new Inspector(placeholder);\n }\n return {\n pending() { },\n fulfilled(_value: any, _name?: string) { },\n rejected(_error: any, _name?: string) { }\n };\n });\n });\n}\n","import type MarkdownIt from \"markdown-it\";\nimport type { Options } from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport type { RuleCore } from \"markdown-it/lib/parser_core.mjs\";\nimport type { RuleInline } from \"markdown-it/lib/parser_inline.mjs\";\nimport { generatePlaceholders } from \"./util.ts\";\n\nfunction renderObservable(tokens: Token[], idx: number, _options: Options, env: any, _self: Renderer) {\n return generatePlaceholders(tokens[idx].content, { type: \"js\", exec: true }, env);\n}\n\nconst DOLLAR = 0x24;\nconst CURLEY_OPEN = 0x7B;\nconst CURLEY_CLOSE = 0x7D;\n\nfunction* parsePlaceholderInline(src: string, pos: number = 0, posMax: number = src.length) {\n if (src.charCodeAt(pos) === DOLLAR && src.charCodeAt(pos + 1) === CURLEY_OPEN) {\n pos += 2;\n\n const observableStart = pos;\n let nestedCurly = 0;\n let done = false;\n while (!done && pos < posMax) {\n switch (src.charCodeAt(pos)) {\n case CURLEY_OPEN:\n nestedCurly++;\n break;\n case CURLEY_CLOSE:\n if (nestedCurly === 0) {\n done = true;\n --pos;\n } else {\n nestedCurly--;\n }\n break;\n }\n pos++;\n }\n const observableEnd = pos;\n if (pos >= posMax || observableStart == observableEnd) return;\n if (src.charCodeAt(pos) !== CURLEY_CLOSE) return;\n pos++;\n\n const observableJs = src.slice(observableStart, observableEnd).trim();\n yield { type: \"placeholder\", content: observableJs, pos };\n }\n}\n\nfunction* parsePlaceholderBlock(src: string) {\n let pos = 0;\n let prevPos = 0;\n const posMax = src.length;\n while (pos < posMax) {\n if (src.charCodeAt(pos) === DOLLAR && src.charCodeAt(pos + 1) === CURLEY_OPEN) {\n yield ({ type: \"html_block\", content: src.slice(prevPos, pos) });\n for (const placeholder of parsePlaceholderInline(src, pos, posMax)) {\n yield placeholder;\n pos = placeholder.pos;\n prevPos = pos;\n }\n } else {\n pos++;\n }\n }\n if (pos > prevPos) {\n yield ({ type: \"html_block\", content: src.slice(prevPos, pos) });\n }\n}\n\nconst transformPlaceholderInline: RuleInline = (state, silent) => {\n if (silent || state.pos + 2 > state.posMax) return false;\n const marker1 = state.src.charCodeAt(state.pos);\n const marker2 = state.src.charCodeAt(state.pos + 1);\n if (marker1 !== DOLLAR || marker2 !== CURLEY_OPEN) return false;\n for (const { type, content, pos } of parsePlaceholderInline(state.src, state.pos, state.posMax)) {\n if (type !== \"placeholder\") break;\n const token = state.push(type, \"\", 0);\n token.content = content;\n state.pos = pos;\n return true;\n }\n return false;\n};\n\nconst transformPlaceholderCore: RuleCore = (state) => {\n const { tokens } = state;\n for (let i = 0, n = tokens.length; i < n; ++i) {\n const token = tokens[i];\n if (token.type === \"html_block\") {\n const children: Token[] = [];\n for (const { type, content } of parsePlaceholderBlock(token.content)) {\n const child = new state.Token(type, \"\", 0);\n child.content = content;\n children.push(child);\n }\n if (children.length === 1 && children[0].type === \"html_block\") {\n tokens[i].content = children[0].content;\n } else {\n const inline = new state.Token(\"inline\", \"\", 0);\n inline.children = children;\n tokens[i] = inline;\n }\n }\n }\n};\n\nexport function hookTemplateLiterals(md: MarkdownIt) {\n md.inline.ruler.push(\"placeholder\", transformPlaceholderInline);\n md.core.ruler.after(\"inline\", \"placeholder\", transformPlaceholderCore);\n md.renderer.rules.placeholder = (tokens: Token[], idx: number, options: any, env: any, self: Renderer) => renderObservable(tokens, idx, options, env, self);\n}\n\n","import type MarkdownIt from \"markdown-it\";\nimport type { Options } from \"markdown-it\";\nimport type Token from \"markdown-it/lib/token.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport { RenderNode } from \"./render.ts\";\nimport { ENV_KEY, executeSrc, FenceInfo, fenceInfoDefaults, generatePlaceholders, showSrc } from \"./util.ts\";\n\nconst deserializeFenceInfo = (attrs: string): FenceInfo =>\n attrs\n .split(/\\s+/)\n .reduce((acc: FenceInfo, pair, idx: number) => {\n if (idx === 0) {\n acc.type = pair as \"js\" | \"javascript\" | string;\n return acc;\n }\n\n const [key, value] = pair.split(\"=\") as [keyof FenceInfo, string];\n switch (key) {\n case \"exec\":\n case \"echo\":\n case \"hide\":\n acc[key] = value !== \"false\";\n break;\n }\n return acc;\n }, { ...fenceInfoDefaults })\n ;\n\nconst proxy = (tokens: Token[], idx: number, options: Options, _env: any, self: Renderer) => self.renderToken(tokens, idx, options);\n\nexport function hookFence(md: MarkdownIt) {\n const defaultFenceRenderer = md.renderer.rules.fence || proxy;\n const fenceRenderer = (tokens: Token[], idx: number, options: Options, env: { [ENV_KEY]?: RenderNode[] }, self: Renderer) => {\n const token = tokens[idx];\n const fenceInfo = deserializeFenceInfo(token.info);\n if (fenceInfo.type === \"javascript\") {\n fenceInfo.type = \"js\";\n }\n token.content += \"\\n\";\n let preHtml = \"\";\n switch (fenceInfo.type) {\n case \"js\":\n if (executeSrc(fenceInfo)) {\n if (!env[ENV_KEY]) {\n env[ENV_KEY] = [];\n }\n preHtml += generatePlaceholders(token.content, fenceInfo, env);\n }\n if (showSrc(fenceInfo)) {\n return preHtml + defaultFenceRenderer(tokens, idx, options, env, self);\n }\n break;\n default:\n return preHtml + defaultFenceRenderer(tokens, idx, options, env, self);\n }\n return preHtml;\n };\n md.renderer.rules.fence = fenceRenderer;\n}\n","import type MarkdownIt from \"markdown-it\";\nimport { render } from \"./render.ts\";\nimport { ENV_KEY } from \"./util.ts\";\nimport { hookTemplateLiterals } from \"./template-literal.ts\";\nimport { hookFence } from \"./fence.ts\";\n\nfunction hookRender(md: MarkdownIt) {\n const originalRender = md.render;\n md.render = (src: string, _env?: any): string => {\n const env = { ..._env };\n const retVal = originalRender.call(md, src, env);\n render(env[ENV_KEY] ?? []);\n return retVal;\n };\n}\n\nfunction hookVitepressRender(md: MarkdownIt) {\n\n const originalRender = md.render;\n md.render = (src: string, env?: any): string => {\n const myEnv = env ?? {};\n let retVal = originalRender.call(md, src, myEnv);\n if (env[ENV_KEY]?.length) {\n const content = encodeURI(JSON.stringify(env[ENV_KEY]));\n retVal += `<RenderComponent content=\"${content}\" />`;\n }\n return retVal;\n };\n}\n\nexport interface ObservableOptions {\n vitePress?: boolean;\n}\n\nexport function observable(md: MarkdownIt, opts: ObservableOptions = {}) {\n hookTemplateLiterals(md);\n hookFence(md);\n if (opts.vitePress) {\n hookVitepressRender(md);\n } else {\n hookRender(md);\n }\n}\n\nexport {\n render\n};\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import{existsSync as Z}from"node:fs";import{readdir as H,readFile as S}from"node:fs/promises";import l from"node:path";import{pathToFileURL as z}from"node:url";var D={},b={},B=34,F=10,E=13;function q(e){return new Function("d","return {"+e.map(function(t,r){return JSON.stringify(t)+": d["+r+'] || ""'}).join(",")+"}")}function L(e,t){var r=q(e);return function(o,s){return t(r(o),s,e)}}function O(e){var t=Object.create(null),r=[];return e.forEach(function(o){for(var s in o)s in t||r.push(t[s]=s)}),r}function c(e,t){var r=e+"",o=r.length;return o<t?new Array(t-o+1).join(0)+r:r}function M(e){return e<0?"-"+c(-e,6):e>9999?"+"+c(e,6):c(e,4)}function $(e){var t=e.getUTCHours(),r=e.getUTCMinutes(),o=e.getUTCSeconds(),s=e.getUTCMilliseconds();return isNaN(e)?"Invalid Date":M(e.getUTCFullYear(),4)+"-"+c(e.getUTCMonth()+1,2)+"-"+c(e.getUTCDate(),2)+(s?"T"+c(t,2)+":"+c(r,2)+":"+c(o,2)+"."+c(s,3)+"Z":o?"T"+c(t,2)+":"+c(r,2)+":"+c(o,2)+"Z":r||t?"T"+c(t,2)+":"+c(r,2)+"Z":"")}function P(e){var t=new RegExp('["'+e+`
2
- \r]`),r=e.charCodeAt(0);function o(n,i){var p,f,a=s(n,function(v,d){if(p)return p(v,d-1);f=v,p=i?L(v,i):q(v)});return a.columns=f||[],a}function s(n,i){var p=[],f=n.length,a=0,v=0,d,A=f<=0,w=!1;n.charCodeAt(f-1)===F&&--f,n.charCodeAt(f-1)===E&&--f;function U(){if(A)return b;if(w)return w=!1,D;var T,I=a,y;if(n.charCodeAt(I)===B){for(;a++<f&&n.charCodeAt(a)!==B||n.charCodeAt(++a)===B;);return(T=a)>=f?A=!0:(y=n.charCodeAt(a++))===F?w=!0:y===E&&(w=!0,n.charCodeAt(a)===F&&++a),n.slice(I+1,T-1).replace(/""/g,'"')}for(;a<f;){if((y=n.charCodeAt(T=a++))===F)w=!0;else if(y===E)w=!0,n.charCodeAt(a)===F&&++a;else if(y!==r)continue;return n.slice(I,T)}return A=!0,n.slice(I,f)}for(;(d=U())!==b;){for(var R=[];d!==D&&d!==b;)R.push(d),d=U();i&&(R=i(R,v++))==null||p.push(R)}return p}function u(n,i){return n.map(function(p){return i.map(function(f){return C(p[f])}).join(e)})}function m(n,i){return i==null&&(i=O(n)),[i.map(C).join(e)].concat(u(n,i)).join(`
3
- `)}function h(n,i){return i==null&&(i=O(n)),u(n,i).join(`
4
- `)}function x(n){return n.map(g).join(`
5
- `)}function g(n){return n.map(C).join(e)}function C(n){return n==null?"":n instanceof Date?$(n):t.test(n+="")?'"'+n.replace(/"/g,'""')+'"':n}return{parse:o,parseRows:s,format:m,formatBody:h,formatRows:x,formatRow:g,formatValue:C}}function j(e){for(var t in e){var r=e[t].trim(),o,s;if(!r)r=null;else if(r==="true")r=!0;else if(r==="false")r=!1;else if(r==="NaN")r=NaN;else if(!isNaN(o=+r))r=o;else if(s=r.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/))V&&s[4]&&!s[7]&&(r=r.replace(/-/g,"/").replace(/T/," ")),r=new Date(r);else continue;e[t]=r}return e}var V=new Date("2019-01-01T00:00").getHours()||new Date("2019-07-01T00:00").getHours();import{LoaderResolver as J}from"@observablehq/framework/dist/loader.js";import{getResolvers as Y}from"@observablehq/framework/dist/resolvers.js";import{normalizeConfig as k}from"@observablehq/framework/dist/config.js";import{parseMarkdown as Q}from"@observablehq/framework/dist/markdown.js";function W({path:e,...t}){return{...k(t),path:e}}var N=class e{filePath;options;resolvers;ext;constructor(t,r,o){this.filePath=t,this.options=r,this.resolvers=o,this.ext=l.extname(t).substring(1)}static async attach(t,r=l.resolve(".")){let o=Z(l.resolve(r,t)),u=new J({root:r,interpreters:{}}).find(t);if(u){await u.load();let m=l.extname(t),h=W({root:r,path:"dummy.md"}),x=Q(`\${FileAttachment('${t}')${m}()}`,h),g=await Y(x,h);return g.resolveFile(t),new e(o?l.resolve(r,t):l.resolve(l.join(r,".observablehq","cache",t)),h,g)}}async myResolve(t){let r=await this.resolvers.resolveImport(t);return l.resolve(l.join(this.options.root,".observablehq","cache",r))}async myImport(t){if(t==="npm:apache-arrow")return import("apache-arrow");let r=await this.myResolve(t);return import(z(r).href).catch(s=>{console.error(s)})}buffer(){return S(this.filePath)}arrayBuffer(){return this.buffer().then(t=>t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength))}text(t="utf8"){return S(this.filePath,t)}json(){return this.text().then(t=>JSON.parse(t))}dsv({delimiter:t=",",array:r=!1,typed:o=!1}={}){return this.text().then(s=>{let u=P(t);return(r?u.parseRows:u.parse)(s,o&&j)})}csv(t){return this.dsv({...t,delimiter:","})}tsv(t){return this.dsv({...t,delimiter:" "})}arrow(){return Promise.all([this.myImport("npm:apache-arrow"),this.arrayBuffer()]).then(([t,r])=>t.tableFromIPC(r))}parquet(){return this.myResolve("npm:parquet-wasm/esm/parquet_wasm_bg.wasm").then(t=>{let r=new e(t,this.options,this.resolvers);return Promise.all([this.myImport("npm:apache-arrow"),this.myImport("npm:parquet-wasm"),r.arrayBuffer(),this.arrayBuffer()]).then(([o,s,u,m])=>(s.initSync(u),o.tableFromIPC(s.readParquet(new Uint8Array(m)).intoIPCStream())))})}fetch(){if(this[this.ext])return this[this.ext]()}},_=/^(.+\.(csv|tsv|txt|json|arrow|parquet))(?:\..*)?$/;async function G(e,t=!1){let r=await H(e,{withFileTypes:!0}),o=[];for(let s of r){let u=l.join(e,s.name);if(s.isDirectory()&&t){let m=await G(u,t);o=o.concat(m)}else if(s.isFile()){let m=s.name.match(_);if(m){let h=l.join(e,m[1]);o.push({path:h,data:await N.attach(h)})}}}return o}async function lt(e){return(await N.attach(e))?.fetch()}export{N as DataFile,lt as fetchData,G as findDataFiles};
1
+ import{existsSync as B}from"node:fs";import{readdir as Z,readFile as S,mkdir as k}from"node:fs/promises";import{createWriteStream as W}from"node:fs";import h from"node:path";import{spawn as J}from"node:child_process";var O={},A={},I=34,C=10,D=13;function $(r){return new Function("d","return {"+r.map(function(t,e){return JSON.stringify(t)+": d["+e+'] || ""'}).join(",")+"}")}function q(r,t){var e=$(r);return function(o,s){return t(e(o),s,r)}}function L(r){var t=Object.create(null),e=[];return r.forEach(function(o){for(var s in o)s in t||e.push(t[s]=s)}),e}function c(r,t){var e=r+"",o=e.length;return o<t?new Array(t-o+1).join(0)+e:e}function H(r){return r<0?"-"+c(-r,6):r>9999?"+"+c(r,6):c(r,4)}function M(r){var t=r.getUTCHours(),e=r.getUTCMinutes(),o=r.getUTCSeconds(),s=r.getUTCMilliseconds();return isNaN(r)?"Invalid Date":H(r.getUTCFullYear(),4)+"-"+c(r.getUTCMonth()+1,2)+"-"+c(r.getUTCDate(),2)+(s?"T"+c(t,2)+":"+c(e,2)+":"+c(o,2)+"."+c(s,3)+"Z":o?"T"+c(t,2)+":"+c(e,2)+":"+c(o,2)+"Z":e||t?"T"+c(t,2)+":"+c(e,2)+"Z":"")}function b(r){var t=new RegExp('["'+r+`
2
+ \r]`),e=r.charCodeAt(0);function o(n,i){var d,f,a=s(n,function(g,m){if(d)return d(g,m-1);f=g,d=i?q(g,i):$(g)});return a.columns=f||[],a}function s(n,i){var d=[],f=n.length,a=0,g=0,m,j=f<=0,w=!1;n.charCodeAt(f-1)===C&&--f,n.charCodeAt(f-1)===D&&--f;function U(){if(j)return A;if(w)return w=!1,O;var x,E=a,F;if(n.charCodeAt(E)===I){for(;a++<f&&n.charCodeAt(a)!==I||n.charCodeAt(++a)===I;);return(x=a)>=f?j=!0:(F=n.charCodeAt(a++))===C?w=!0:F===D&&(w=!0,n.charCodeAt(a)===C&&++a),n.slice(E+1,x-1).replace(/""/g,'"')}for(;a<f;){if((F=n.charCodeAt(x=a++))===C)w=!0;else if(F===D)w=!0,n.charCodeAt(a)===C&&++a;else if(F!==e)continue;return n.slice(E,x)}return j=!0,n.slice(E,f)}for(;(m=U())!==A;){for(var T=[];m!==O&&m!==A;)T.push(m),m=U();i&&(T=i(T,g++))==null||d.push(T)}return d}function u(n,i){return n.map(function(d){return i.map(function(f){return R(d[f])}).join(r)})}function l(n,i){return i==null&&(i=L(n)),[i.map(R).join(r)].concat(u(n,i)).join(`
3
+ `)}function p(n,i){return i==null&&(i=L(n)),u(n,i).join(`
4
+ `)}function y(n){return n.map(v).join(`
5
+ `)}function v(n){return n.map(R).join(r)}function R(n){return n==null?"":n instanceof Date?M(n):t.test(n+="")?'"'+n.replace(/"/g,'""')+'"':n}return{parse:o,parseRows:s,format:l,formatBody:p,formatRows:y,formatRow:v,formatValue:R}}function N(r){for(var t in r){var e=r[t].trim(),o,s;if(!e)e=null;else if(e==="true")e=!0;else if(e==="false")e=!1;else if(e==="NaN")e=NaN;else if(!isNaN(o=+e))e=o;else if(s=e.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/))V&&s[4]&&!s[7]&&(e=e.replace(/-/g,"/").replace(/T/," ")),e=new Date(e);else continue;r[t]=e}return r}var V=new Date("2019-01-01T00:00").getHours()||new Date("2019-07-01T00:00").getHours();var Y=".observablehq/cache";function z(r){switch(r){case".js":return["node",["--no-warnings=ExperimentalWarning"]];case".ts":return["tsx",[]];case".py":return["python3",[]];case".r":case".R":return["Rscript",[]];default:return null}}function Q(r,t){for(let e of[".js",".ts",".py",".r",".R"]){let o=h.resolve(t,`${r}${e}`);if(B(o))return{loaderPath:o,loaderExt:e}}return null}async function G(r,t,e){let o=z(t);if(!o)throw new Error(`No interpreter for loader extension: ${t}`);await k(h.dirname(e),{recursive:!0});let[s,u]=o,l=J(s,[...u,r],{windowsHide:!0,stdio:["ignore","pipe","inherit"]});l.stdout.pipe(W(e)),await new Promise((p,y)=>{l.on("error",y),l.on("exit",v=>v===0?p():y(new Error(`Loader "${r}" exited with code ${v}`)))})}var P=class r{filePath;ext;constructor(t){this.filePath=t,this.ext=h.extname(t).substring(1)}static async attach(t,e=h.resolve(".")){let o=h.resolve(e,t);if(B(o))return new r(o);let s=Q(t,e);if(s){let u=h.resolve(e,Y,t);return B(u)||await G(s.loaderPath,s.loaderExt,u),new r(u)}}buffer(){return S(this.filePath)}arrayBuffer(){return this.buffer().then(t=>t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength))}text(t="utf8"){return S(this.filePath,t)}json(){return this.text().then(t=>JSON.parse(t))}dsv({delimiter:t=",",array:e=!1,typed:o=!1}={}){return this.text().then(s=>{let u=b(t);return(e?u.parseRows:u.parse)(s,o&&N)})}csv(t){return this.dsv({...t,delimiter:","})}tsv(t){return this.dsv({...t,delimiter:" "})}arrow(){return Promise.all([import("apache-arrow"),this.arrayBuffer()]).then(([t,e])=>t.tableFromIPC(e))}parquet(){throw new Error("parquet() is not supported; install @observablehq/framework for npm: package resolution.")}fetch(){if(this[this.ext])return this[this.ext]()}},K=/^(.+\.(csv|tsv|txt|json|arrow|parquet))(?:\..*)?$/;async function X(r,t=!1){let e=await Z(r,{withFileTypes:!0}),o=[];for(let s of e){let u=h.join(r,s.name);if(s.isDirectory()&&t){let l=await X(u,t);o=o.concat(l)}else if(s.isFile()){let l=s.name.match(K);if(l){let p=h.join(r,l[1]);o.push({path:p,data:await P.attach(p)})}}}return o}async function ut(r){return(await P.attach(r))?.fetch()}export{P as DataFile,ut as fetchData,X as findDataFiles};
6
6
  //# sourceMappingURL=loader.node.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/loader.ts", "../../../node_modules/d3-dsv/src/dsv.js", "../../../node_modules/d3-dsv/src/autoType.js"],
4
- "sourcesContent": ["import { existsSync } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { dsvFormat, autoType } from \"d3-dsv\";\nimport { LoaderResolver, } from \"@observablehq/framework/dist/loader.js\";\nimport { getResolvers } from \"@observablehq/framework/dist/resolvers.js\";\nimport { normalizeConfig } from \"@observablehq/framework/dist/config.js\";\nimport { parseMarkdown } from \"@observablehq/framework/dist/markdown.js\";\n\nfunction getOptions({ path, ...config }) {\n return { ...normalizeConfig(config), path };\n}\n\nexport class DataFile {\n\n private filePath: string;\n private options: any;\n private resolvers: any;\n readonly ext: string;\n\n protected constructor(filePath, options, resolvers) {\n this.filePath = filePath;\n this.options = options;\n this.resolvers = resolvers;\n this.ext = path.extname(filePath).substring(1);\n }\n\n static async attach(partialPath: string, root: string = path.resolve(\".\")) {\n const exists = existsSync(path.resolve(root, partialPath));\n const loaders = new LoaderResolver({ root, interpreters: {} });\n const loader = loaders.find(partialPath);\n if (loader) {\n await loader.load();\n const ext = path.extname(partialPath);\n const options = getOptions({ root, path: \"dummy.md\" });\n const page = parseMarkdown(`\\${FileAttachment('${partialPath}')${ext}()}`, options);\n const resolvers = await getResolvers(page, options);\n resolvers.resolveFile(partialPath);\n return new DataFile(exists ? path.resolve(root, partialPath) : path.resolve(path.join(root, \".observablehq\", \"cache\", partialPath)), options, resolvers);\n }\n }\n\n async myResolve(module: string) {\n const partialPath = await this.resolvers.resolveImport(module);\n return path.resolve(path.join(this.options.root, \".observablehq\", \"cache\", partialPath));\n }\n\n async myImport(module: string) {\n if (module === \"npm:apache-arrow\") {\n return import(\"apache-arrow\");\n }\n const fullPath = await this.myResolve(module);\n const href = pathToFileURL(fullPath).href;\n return import(href).catch((error) => {\n console.error(error);\n });\n }\n\n buffer(): Promise<Buffer> {\n return readFile(this.filePath);\n }\n\n arrayBuffer() {\n return this.buffer().then(buffer => buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength));\n }\n\n text(encoding: BufferEncoding = \"utf8\") {\n return readFile(this.filePath, encoding);\n }\n\n json() {\n return this.text().then(txt => {\n return JSON.parse(txt);\n });\n }\n\n dsv({ delimiter = \",\", array = false, typed = false } = {}) {\n return this.text().then(text => {\n const format = dsvFormat(delimiter);\n const parse: any = array ? format.parseRows : format.parse;\n return parse(text, typed && autoType);\n });\n }\n\n csv(options?) {\n return this.dsv({ ...options, delimiter: \",\" });\n }\n\n tsv(options?) {\n return this.dsv({ ...options, delimiter: \"\\t\" });\n }\n\n arrow() {\n return Promise.all([this.myImport(\"npm:apache-arrow\"), this.arrayBuffer()]).then(([Arrow, response]) => {\n return Arrow.tableFromIPC(response);\n });\n }\n\n parquet() {\n return this.myResolve(\"npm:parquet-wasm/esm/parquet_wasm_bg.wasm\").then(wasmBytes => {\n const wasmFile = new DataFile(wasmBytes, this.options, this.resolvers);\n return Promise.all([\n this.myImport(\"npm:apache-arrow\"),\n this.myImport(\"npm:parquet-wasm\"),\n wasmFile.arrayBuffer(),\n this.arrayBuffer()\n ]).then(([Arrow, Parquet, wasm, buffer]) => {\n Parquet.initSync(wasm);\n return Arrow.tableFromIPC(Parquet.readParquet(new Uint8Array(buffer)).intoIPCStream());\n });\n });\n }\n\n fetch() {\n if (this[this.ext]) {\n return this[this.ext]();\n }\n }\n}\n\nconst regex = /^(.+\\.(csv|tsv|txt|json|arrow|parquet))(?:\\..*)?$/;\ninterface FileInfo {\n path: string;\n data: any;\n}\nexport async function findDataFiles(directory: string, recursive: boolean = false): Promise<FileInfo[]> {\n const files = await readdir(directory, { withFileTypes: true });\n let dataFiles: FileInfo[] = [];\n\n for (const file of files) {\n const fullPath = path.join(directory, file.name);\n if (file.isDirectory() && recursive) {\n const nestedFiles = await findDataFiles(fullPath, recursive);\n dataFiles = dataFiles.concat(nestedFiles);\n } else if (file.isFile()) {\n const match = file.name.match(regex);\n if (match) {\n const _path = path.join(directory, match[1]);\n dataFiles.push({\n path: _path,\n data: await DataFile.attach(_path)\n });\n }\n }\n }\n return dataFiles;\n}\n\nexport async function fetchData(partialPath: string) {\n const dataFile = await DataFile.attach(partialPath);\n return dataFile?.fetch();\n}\n\n", "var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nfunction pad(value, width) {\n var s = value + \"\", length = s.length;\n return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n return year < 0 ? \"-\" + pad(-year, 6)\n : year > 9999 ? \"+\" + pad(year, 6)\n : pad(year, 4);\n}\n\nfunction formatDate(date) {\n var hours = date.getUTCHours(),\n minutes = date.getUTCMinutes(),\n seconds = date.getUTCSeconds(),\n milliseconds = date.getUTCMilliseconds();\n return isNaN(date) ? \"Invalid Date\"\n : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n : \"\");\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function preformatBody(rows, columns) {\n return rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n });\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n }\n\n function formatBody(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return preformatBody(rows, columns).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(value) {\n return value == null ? \"\"\n : value instanceof Date ? formatDate(value)\n : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : value;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatBody: formatBody,\n formatRows: formatRows,\n formatRow: formatRow,\n formatValue: formatValue\n };\n}\n", "export default function autoType(object) {\n for (var key in object) {\n var value = object[key].trim(), number, m;\n if (!value) value = null;\n else if (value === \"true\") value = true;\n else if (value === \"false\") value = false;\n else if (value === \"NaN\") value = NaN;\n else if (!isNaN(number = +value)) value = number;\n else if (m = value.match(/^([-+]\\d{2})?\\d{4}(-\\d{2}(-\\d{2})?)?(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?(Z|[-+]\\d{2}:\\d{2})?)?$/)) {\n if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, \"/\").replace(/T/, \" \");\n value = new Date(value);\n }\n else continue;\n object[key] = value;\n }\n return object;\n}\n\n// https://github.com/d3/d3-dsv/issues/45\nconst fixtz = new Date(\"2019-01-01T00:00\").getHours() || new Date(\"2019-07-01T00:00\").getHours();"],
5
- "mappings": "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",
6
- "names": ["existsSync", "readdir", "readFile", "path", "pathToFileURL", "EOL", "EOF", "QUOTE", "NEWLINE", "RETURN", "objectConverter", "columns", "name", "i", "customConverter", "f", "object", "row", "inferColumns", "rows", "columnSet", "column", "pad", "value", "width", "s", "length", "formatYear", "year", "formatDate", "date", "hours", "minutes", "seconds", "milliseconds", "dsv_default", "delimiter", "reFormat", "DELIMITER", "parse", "text", "convert", "parseRows", "N", "I", "n", "t", "eof", "eol", "token", "j", "c", "preformatBody", "formatValue", "format", "formatBody", "formatRows", "formatRow", "autoType", "object", "key", "value", "number", "m", "fixtz", "LoaderResolver", "getResolvers", "normalizeConfig", "parseMarkdown", "getOptions", "path", "config", "DataFile", "_DataFile", "filePath", "options", "resolvers", "partialPath", "root", "exists", "existsSync", "loader", "ext", "page", "module", "fullPath", "pathToFileURL", "error", "readFile", "buffer", "encoding", "txt", "delimiter", "array", "typed", "text", "format", "dsv_default", "autoType", "Arrow", "response", "wasmBytes", "wasmFile", "Parquet", "wasm", "regex", "findDataFiles", "directory", "recursive", "files", "readdir", "dataFiles", "file", "nestedFiles", "match", "_path", "fetchData"]
4
+ "sourcesContent": ["import { existsSync } from \"node:fs\";\nimport { readdir, readFile, mkdir } from \"node:fs/promises\";\nimport { createWriteStream } from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { dsvFormat, autoType } from \"d3-dsv\";\n\nconst CACHE_DIR = \".observablehq/cache\";\n\n// Interpreter commands for data loader scripts (mirrors @observablehq/framework defaults)\nfunction getInterpreterCommand(ext: string): [string, string[]] | null {\n switch (ext) {\n case \".js\": return [\"node\", [\"--no-warnings=ExperimentalWarning\"]];\n case \".ts\": return [\"tsx\", []];\n case \".py\": return [\"python3\", []];\n case \".r\":\n case \".R\": return [\"Rscript\", []];\n default: return null;\n }\n}\n\nfunction findLoader(partialPath: string, root: string): { loaderPath: string; loaderExt: string } | null {\n for (const ext of [\".js\", \".ts\", \".py\", \".r\", \".R\"]) {\n const loaderPath = path.resolve(root, `${partialPath}${ext}`);\n if (existsSync(loaderPath)) {\n return { loaderPath, loaderExt: ext };\n }\n }\n return null;\n}\n\nasync function runLoader(loaderPath: string, loaderExt: string, cachePath: string): Promise<void> {\n const cmd = getInterpreterCommand(loaderExt);\n if (!cmd) throw new Error(`No interpreter for loader extension: ${loaderExt}`);\n await mkdir(path.dirname(cachePath), { recursive: true });\n const [command, args] = cmd;\n const child = spawn(command, [...args, loaderPath], {\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"inherit\"]\n });\n child.stdout!.pipe(createWriteStream(cachePath));\n await new Promise<void>((resolve, reject) => {\n child.on(\"error\", reject);\n child.on(\"exit\", (code) =>\n code === 0 ? resolve() : reject(new Error(`Loader \"${loaderPath}\" exited with code ${code}`))\n );\n });\n}\n\nexport class DataFile {\n\n private filePath: string;\n readonly ext: string;\n\n protected constructor(filePath: string) {\n this.filePath = filePath;\n this.ext = path.extname(filePath).substring(1);\n }\n\n static async attach(partialPath: string, root: string = path.resolve(\".\")) {\n const absolutePath = path.resolve(root, partialPath);\n if (existsSync(absolutePath)) {\n return new DataFile(absolutePath);\n }\n const loaderInfo = findLoader(partialPath, root);\n if (loaderInfo) {\n const cachePath = path.resolve(root, CACHE_DIR, partialPath);\n if (!existsSync(cachePath)) {\n await runLoader(loaderInfo.loaderPath, loaderInfo.loaderExt, cachePath);\n }\n return new DataFile(cachePath);\n }\n return undefined;\n }\n\n buffer(): Promise<Buffer> {\n return readFile(this.filePath);\n }\n\n arrayBuffer() {\n return this.buffer().then(buffer => buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength));\n }\n\n text(encoding: BufferEncoding = \"utf8\") {\n return readFile(this.filePath, encoding);\n }\n\n json() {\n return this.text().then(txt => {\n return JSON.parse(txt);\n });\n }\n\n dsv({ delimiter = \",\", array = false, typed = false } = {}) {\n return this.text().then(text => {\n const format = dsvFormat(delimiter);\n const parse: any = array ? format.parseRows : format.parse;\n return parse(text, typed && autoType);\n });\n }\n\n csv(options?) {\n return this.dsv({ ...options, delimiter: \",\" });\n }\n\n tsv(options?) {\n return this.dsv({ ...options, delimiter: \"\\t\" });\n }\n\n arrow() {\n return Promise.all([import(\"apache-arrow\"), this.arrayBuffer()]).then(([Arrow, response]) => {\n return Arrow.tableFromIPC(response);\n });\n }\n\n parquet() {\n throw new Error(\"parquet() is not supported; install @observablehq/framework for npm: package resolution.\");\n }\n\n fetch() {\n if (this[this.ext]) {\n return this[this.ext]();\n }\n }\n}\n\nconst regex = /^(.+\\.(csv|tsv|txt|json|arrow|parquet))(?:\\..*)?$/;\ninterface FileInfo {\n path: string;\n data: any;\n}\nexport async function findDataFiles(directory: string, recursive: boolean = false): Promise<FileInfo[]> {\n const files = await readdir(directory, { withFileTypes: true });\n let dataFiles: FileInfo[] = [];\n\n for (const file of files) {\n const fullPath = path.join(directory, file.name);\n if (file.isDirectory() && recursive) {\n const nestedFiles = await findDataFiles(fullPath, recursive);\n dataFiles = dataFiles.concat(nestedFiles);\n } else if (file.isFile()) {\n const match = file.name.match(regex);\n if (match) {\n const _path = path.join(directory, match[1]);\n dataFiles.push({\n path: _path,\n data: await DataFile.attach(_path)\n });\n }\n }\n }\n return dataFiles;\n}\n\nexport async function fetchData(partialPath: string) {\n const dataFile = await DataFile.attach(partialPath);\n return dataFile?.fetch();\n}\n\n", "var EOL = {},\n EOF = {},\n QUOTE = 34,\n NEWLINE = 10,\n RETURN = 13;\n\nfunction objectConverter(columns) {\n return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n var object = objectConverter(columns);\n return function(row, i) {\n return f(object(row), i, columns);\n };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n var columnSet = Object.create(null),\n columns = [];\n\n rows.forEach(function(row) {\n for (var column in row) {\n if (!(column in columnSet)) {\n columns.push(columnSet[column] = column);\n }\n }\n });\n\n return columns;\n}\n\nfunction pad(value, width) {\n var s = value + \"\", length = s.length;\n return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n return year < 0 ? \"-\" + pad(-year, 6)\n : year > 9999 ? \"+\" + pad(year, 6)\n : pad(year, 4);\n}\n\nfunction formatDate(date) {\n var hours = date.getUTCHours(),\n minutes = date.getUTCMinutes(),\n seconds = date.getUTCSeconds(),\n milliseconds = date.getUTCMilliseconds();\n return isNaN(date) ? \"Invalid Date\"\n : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n : \"\");\n}\n\nexport default function(delimiter) {\n var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n DELIMITER = delimiter.charCodeAt(0);\n\n function parse(text, f) {\n var convert, columns, rows = parseRows(text, function(row, i) {\n if (convert) return convert(row, i - 1);\n columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n });\n rows.columns = columns || [];\n return rows;\n }\n\n function parseRows(text, f) {\n var rows = [], // output rows\n N = text.length,\n I = 0, // current character index\n n = 0, // current line number\n t, // current token\n eof = N <= 0, // current token followed by EOF?\n eol = false; // current token followed by EOL?\n\n // Strip the trailing newline.\n if (text.charCodeAt(N - 1) === NEWLINE) --N;\n if (text.charCodeAt(N - 1) === RETURN) --N;\n\n function token() {\n if (eof) return EOF;\n if (eol) return eol = false, EOL;\n\n // Unescape quotes.\n var i, j = I, c;\n if (text.charCodeAt(j) === QUOTE) {\n while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n if ((i = I) >= N) eof = true;\n else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n }\n\n // Find next delimiter or newline.\n while (I < N) {\n if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n else if (c !== DELIMITER) continue;\n return text.slice(j, i);\n }\n\n // Return last token before EOF.\n return eof = true, text.slice(j, N);\n }\n\n while ((t = token()) !== EOF) {\n var row = [];\n while (t !== EOL && t !== EOF) row.push(t), t = token();\n if (f && (row = f(row, n++)) == null) continue;\n rows.push(row);\n }\n\n return rows;\n }\n\n function preformatBody(rows, columns) {\n return rows.map(function(row) {\n return columns.map(function(column) {\n return formatValue(row[column]);\n }).join(delimiter);\n });\n }\n\n function format(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n }\n\n function formatBody(rows, columns) {\n if (columns == null) columns = inferColumns(rows);\n return preformatBody(rows, columns).join(\"\\n\");\n }\n\n function formatRows(rows) {\n return rows.map(formatRow).join(\"\\n\");\n }\n\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n\n function formatValue(value) {\n return value == null ? \"\"\n : value instanceof Date ? formatDate(value)\n : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n : value;\n }\n\n return {\n parse: parse,\n parseRows: parseRows,\n format: format,\n formatBody: formatBody,\n formatRows: formatRows,\n formatRow: formatRow,\n formatValue: formatValue\n };\n}\n", "export default function autoType(object) {\n for (var key in object) {\n var value = object[key].trim(), number, m;\n if (!value) value = null;\n else if (value === \"true\") value = true;\n else if (value === \"false\") value = false;\n else if (value === \"NaN\") value = NaN;\n else if (!isNaN(number = +value)) value = number;\n else if (m = value.match(/^([-+]\\d{2})?\\d{4}(-\\d{2}(-\\d{2})?)?(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?(Z|[-+]\\d{2}:\\d{2})?)?$/)) {\n if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, \"/\").replace(/T/, \" \");\n value = new Date(value);\n }\n else continue;\n object[key] = value;\n }\n return object;\n}\n\n// https://github.com/d3/d3-dsv/issues/45\nconst fixtz = new Date(\"2019-01-01T00:00\").getHours() || new Date(\"2019-07-01T00:00\").getHours();"],
5
+ "mappings": "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",
6
+ "names": ["existsSync", "readdir", "readFile", "mkdir", "createWriteStream", "path", "spawn", "EOL", "EOF", "QUOTE", "NEWLINE", "RETURN", "objectConverter", "columns", "name", "i", "customConverter", "f", "object", "row", "inferColumns", "rows", "columnSet", "column", "pad", "value", "width", "s", "length", "formatYear", "year", "formatDate", "date", "hours", "minutes", "seconds", "milliseconds", "dsv_default", "delimiter", "reFormat", "DELIMITER", "parse", "text", "convert", "parseRows", "N", "I", "n", "t", "eof", "eol", "token", "j", "c", "preformatBody", "formatValue", "format", "formatBody", "formatRows", "formatRow", "autoType", "object", "key", "value", "number", "m", "fixtz", "CACHE_DIR", "getInterpreterCommand", "ext", "findLoader", "partialPath", "root", "loaderPath", "path", "existsSync", "runLoader", "loaderExt", "cachePath", "cmd", "mkdir", "command", "args", "child", "spawn", "createWriteStream", "resolve", "reject", "code", "DataFile", "_DataFile", "filePath", "absolutePath", "loaderInfo", "readFile", "buffer", "encoding", "txt", "delimiter", "array", "typed", "text", "format", "dsv_default", "autoType", "options", "Arrow", "response", "regex", "findDataFiles", "directory", "recursive", "files", "readdir", "dataFiles", "file", "fullPath", "nestedFiles", "match", "_path", "fetchData"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hpcc-js/markdown-it-plugins",
3
- "version": "1.5.13",
3
+ "version": "1.5.15",
4
4
  "description": "markdown-it plugins",
5
5
  "type": "module",
6
6
  "main": "./dist/index.umd.cjs",
@@ -54,9 +54,10 @@
54
54
  "update-major": "npx --yes npm-check-updates -u"
55
55
  },
56
56
  "dependencies": {
57
- "@hpcc-js/observablehq-compiler": "^3.7.11",
58
- "@observablehq/framework": "1.13.4",
59
- "@observablehq/runtime": "5.9.9",
57
+ "@hpcc-js/observablehq-compiler": "^3.7.13",
58
+ "@observablehq/inspector": "5.0.1",
59
+ "@observablehq/runtime": "6.0.0",
60
+ "@observablehq/stdlib": "5.8.8",
60
61
  "@types/markdown-it": "14.1.2"
61
62
  },
62
63
  "peerDependencies": {
@@ -65,11 +66,11 @@
65
66
  "shiki": "2.5.0"
66
67
  },
67
68
  "devDependencies": {
68
- "@hpcc-js/esbuild-plugins": "^1.8.9",
69
+ "@hpcc-js/esbuild-plugins": "^1.8.11",
69
70
  "d3-dsv": "3.0.1",
70
71
  "d3-fetch": "3.0.1",
71
- "dotenv": "16.6.1",
72
- "tsx": "4.21.0"
72
+ "dotenv": "17.4.2",
73
+ "tsx": "4.22.3"
73
74
  },
74
75
  "repository": {
75
76
  "type": "git",
@@ -82,5 +83,5 @@
82
83
  "url": "https://github.com/hpcc-systems/Visualization/issues"
83
84
  },
84
85
  "homepage": "https://github.com/hpcc-systems/Visualization/tree/main/packages/markdown-it-plugins",
85
- "gitHead": "6695c9be7e44c9a4dd50e36fad2044b287685e2e"
86
+ "gitHead": "1c0e8862859769465f70f384183f1399191d76e6"
86
87
  }
package/src/loader.ts CHANGED
@@ -1,60 +1,76 @@
1
1
  import { existsSync } from "node:fs";
2
- import { readdir, readFile } from "node:fs/promises";
2
+ import { readdir, readFile, mkdir } from "node:fs/promises";
3
+ import { createWriteStream } from "node:fs";
3
4
  import path from "node:path";
4
- import { pathToFileURL } from "node:url";
5
+ import { spawn } from "node:child_process";
5
6
  import { dsvFormat, autoType } from "d3-dsv";
6
- import { LoaderResolver, } from "@observablehq/framework/dist/loader.js";
7
- import { getResolvers } from "@observablehq/framework/dist/resolvers.js";
8
- import { normalizeConfig } from "@observablehq/framework/dist/config.js";
9
- import { parseMarkdown } from "@observablehq/framework/dist/markdown.js";
10
7
 
11
- function getOptions({ path, ...config }) {
12
- return { ...normalizeConfig(config), path };
8
+ const CACHE_DIR = ".observablehq/cache";
9
+
10
+ // Interpreter commands for data loader scripts (mirrors @observablehq/framework defaults)
11
+ function getInterpreterCommand(ext: string): [string, string[]] | null {
12
+ switch (ext) {
13
+ case ".js": return ["node", ["--no-warnings=ExperimentalWarning"]];
14
+ case ".ts": return ["tsx", []];
15
+ case ".py": return ["python3", []];
16
+ case ".r":
17
+ case ".R": return ["Rscript", []];
18
+ default: return null;
19
+ }
20
+ }
21
+
22
+ function findLoader(partialPath: string, root: string): { loaderPath: string; loaderExt: string } | null {
23
+ for (const ext of [".js", ".ts", ".py", ".r", ".R"]) {
24
+ const loaderPath = path.resolve(root, `${partialPath}${ext}`);
25
+ if (existsSync(loaderPath)) {
26
+ return { loaderPath, loaderExt: ext };
27
+ }
28
+ }
29
+ return null;
30
+ }
31
+
32
+ async function runLoader(loaderPath: string, loaderExt: string, cachePath: string): Promise<void> {
33
+ const cmd = getInterpreterCommand(loaderExt);
34
+ if (!cmd) throw new Error(`No interpreter for loader extension: ${loaderExt}`);
35
+ await mkdir(path.dirname(cachePath), { recursive: true });
36
+ const [command, args] = cmd;
37
+ const child = spawn(command, [...args, loaderPath], {
38
+ windowsHide: true,
39
+ stdio: ["ignore", "pipe", "inherit"]
40
+ });
41
+ child.stdout!.pipe(createWriteStream(cachePath));
42
+ await new Promise<void>((resolve, reject) => {
43
+ child.on("error", reject);
44
+ child.on("exit", (code) =>
45
+ code === 0 ? resolve() : reject(new Error(`Loader "${loaderPath}" exited with code ${code}`))
46
+ );
47
+ });
13
48
  }
14
49
 
15
50
  export class DataFile {
16
51
 
17
52
  private filePath: string;
18
- private options: any;
19
- private resolvers: any;
20
53
  readonly ext: string;
21
54
 
22
- protected constructor(filePath, options, resolvers) {
55
+ protected constructor(filePath: string) {
23
56
  this.filePath = filePath;
24
- this.options = options;
25
- this.resolvers = resolvers;
26
57
  this.ext = path.extname(filePath).substring(1);
27
58
  }
28
59
 
29
60
  static async attach(partialPath: string, root: string = path.resolve(".")) {
30
- const exists = existsSync(path.resolve(root, partialPath));
31
- const loaders = new LoaderResolver({ root, interpreters: {} });
32
- const loader = loaders.find(partialPath);
33
- if (loader) {
34
- await loader.load();
35
- const ext = path.extname(partialPath);
36
- const options = getOptions({ root, path: "dummy.md" });
37
- const page = parseMarkdown(`\${FileAttachment('${partialPath}')${ext}()}`, options);
38
- const resolvers = await getResolvers(page, options);
39
- resolvers.resolveFile(partialPath);
40
- return new DataFile(exists ? path.resolve(root, partialPath) : path.resolve(path.join(root, ".observablehq", "cache", partialPath)), options, resolvers);
61
+ const absolutePath = path.resolve(root, partialPath);
62
+ if (existsSync(absolutePath)) {
63
+ return new DataFile(absolutePath);
41
64
  }
42
- }
43
-
44
- async myResolve(module: string) {
45
- const partialPath = await this.resolvers.resolveImport(module);
46
- return path.resolve(path.join(this.options.root, ".observablehq", "cache", partialPath));
47
- }
48
-
49
- async myImport(module: string) {
50
- if (module === "npm:apache-arrow") {
51
- return import("apache-arrow");
65
+ const loaderInfo = findLoader(partialPath, root);
66
+ if (loaderInfo) {
67
+ const cachePath = path.resolve(root, CACHE_DIR, partialPath);
68
+ if (!existsSync(cachePath)) {
69
+ await runLoader(loaderInfo.loaderPath, loaderInfo.loaderExt, cachePath);
70
+ }
71
+ return new DataFile(cachePath);
52
72
  }
53
- const fullPath = await this.myResolve(module);
54
- const href = pathToFileURL(fullPath).href;
55
- return import(href).catch((error) => {
56
- console.error(error);
57
- });
73
+ return undefined;
58
74
  }
59
75
 
60
76
  buffer(): Promise<Buffer> {
@@ -92,24 +108,13 @@ export class DataFile {
92
108
  }
93
109
 
94
110
  arrow() {
95
- return Promise.all([this.myImport("npm:apache-arrow"), this.arrayBuffer()]).then(([Arrow, response]) => {
111
+ return Promise.all([import("apache-arrow"), this.arrayBuffer()]).then(([Arrow, response]) => {
96
112
  return Arrow.tableFromIPC(response);
97
113
  });
98
114
  }
99
115
 
100
116
  parquet() {
101
- return this.myResolve("npm:parquet-wasm/esm/parquet_wasm_bg.wasm").then(wasmBytes => {
102
- const wasmFile = new DataFile(wasmBytes, this.options, this.resolvers);
103
- return Promise.all([
104
- this.myImport("npm:apache-arrow"),
105
- this.myImport("npm:parquet-wasm"),
106
- wasmFile.arrayBuffer(),
107
- this.arrayBuffer()
108
- ]).then(([Arrow, Parquet, wasm, buffer]) => {
109
- Parquet.initSync(wasm);
110
- return Arrow.tableFromIPC(Parquet.readParquet(new Uint8Array(buffer)).intoIPCStream());
111
- });
112
- });
117
+ throw new Error("parquet() is not supported; install @observablehq/framework for npm: package resolution.");
113
118
  }
114
119
 
115
120
  fetch() {
package/src/render.ts CHANGED
@@ -1,4 +1,6 @@
1
- import { Runtime, Library, Inspector as BaseInspector } from "@observablehq/runtime";
1
+ import { Runtime } from "@observablehq/runtime";
2
+ import { Library } from "@observablehq/stdlib";
3
+ import { Inspector as BaseInspector } from "@observablehq/inspector";
2
4
  import { compile, type ohq } from "@hpcc-js/observablehq-compiler";
3
5
  import { FenceInfo, renderExecutedSrc } from "./util.ts";
4
6
 
package/types/loader.d.ts CHANGED
@@ -1,12 +1,8 @@
1
1
  export declare class DataFile {
2
2
  private filePath;
3
- private options;
4
- private resolvers;
5
3
  readonly ext: string;
6
- protected constructor(filePath: any, options: any, resolvers: any);
4
+ protected constructor(filePath: string);
7
5
  static attach(partialPath: string, root?: string): Promise<DataFile | undefined>;
8
- myResolve(module: string): Promise<string>;
9
- myImport(module: string): Promise<any>;
10
6
  buffer(): Promise<Buffer>;
11
7
  arrayBuffer(): Promise<ArrayBuffer | SharedArrayBuffer>;
12
8
  text(encoding?: BufferEncoding): Promise<string>;
@@ -18,8 +14,8 @@ export declare class DataFile {
18
14
  }): Promise<any>;
19
15
  csv(options?: any): Promise<any>;
20
16
  tsv(options?: any): Promise<any>;
21
- arrow(): Promise<any>;
22
- parquet(): Promise<any>;
17
+ arrow(): Promise<import("apache-arrow").Table<any>>;
18
+ parquet(): void;
23
19
  fetch(): any;
24
20
  }
25
21
  interface FileInfo {