markstream-vue2 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./exports.js");require("stream-markdown-parser"),require("vue"),exports.default=e.MathInlineNode;
package/dist/index2.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./exports.js");require("stream-markdown-parser"),require("vue"),exports.default=e.MathBlockNode;
package/dist/index3.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./exports.js");require("stream-markdown-parser"),require("vue"),exports.default=e.CodeBlockNode;
package/dist/index4.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./exports.js");require("stream-markdown-parser"),require("vue"),exports.default=e.MermaidBlockNode;
package/dist/index5.js ADDED
@@ -0,0 +1,6 @@
1
+ import { M as MermaidBlockNode } from "./exports.js";
2
+ import "stream-markdown-parser";
3
+ import "vue";
4
+ export {
5
+ MermaidBlockNode as default
6
+ };
@@ -0,0 +1 @@
1
+ "use strict";var e=Object.defineProperty,t=(t,r,i)=>(((t,r,i)=>{r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[r]=i})(t,"symbol"!=typeof r?r+"":r,i),i);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=new class{constructor(){t(this,"metrics",[]),t(this,"enabled",!1),t(this,"maxMetrics",1e3)}enable(){this.enabled=!0}disable(){this.enabled=!1}recordRender(e){this.enabled&&(this.metrics.push(e),this.metrics.length>this.maxMetrics&&this.metrics.shift())}getStats(){if(0===this.metrics.length)return{totalRenders:0,cacheHitRate:0,averageWorkerTime:0,averageDirectTime:0,averageCacheHitTime:0,workerSavings:0,recommendation:"Insufficient data"};const e=this.metrics.filter(e=>"worker"===e.type&&e.success),t=this.metrics.filter(e=>"direct"===e.type&&e.success),r=this.metrics.filter(e=>"cache-hit"===e.type),i=this.metrics.length,o=r.length,a=o/i*100,n=e.length>0?e.reduce((e,t)=>e+t.duration,0)/e.length:0,s=t.length>0?t.reduce((e,t)=>e+t.duration,0)/t.length:0,c=r.length>0?r.reduce((e,t)=>e+t.duration,0)/r.length:0,l=i*s-(e.reduce((e,t)=>e+t.duration,0)+t.reduce((e,t)=>e+t.duration,0)+r.reduce((e,t)=>e+t.duration,0));let h="";return h=a>70&&n<2*s?"✅ Worker + Cache is highly beneficial":a>50?"✅ Worker + Cache is beneficial":n>3*s?"⚠️ Worker overhead too high, consider direct rendering":s<5?"⚠️ Formulas too simple, Worker overhead may not be worth it":"✅ Worker prevents main thread blocking",{totalRenders:i,cacheHits:o,cacheHitRate:a.toFixed(1),workerCalls:e.length,directCalls:t.length,averageWorkerTime:n.toFixed(2),averageDirectTime:s.toFixed(2),averageCacheHitTime:c.toFixed(3),workerSavings:l.toFixed(2),recommendation:h}}printReport(){const e=this.getStats();return console.group("📊 KaTeX Rendering Performance Report"),e.totalRenders,e.cacheHits,e.cacheHitRate,e.workerCalls,e.directCalls,e.averageWorkerTime,e.averageDirectTime,e.averageCacheHitTime,e.workerSavings,e.recommendation,console.groupEnd(),e}reset(){this.metrics=[]}exportMetrics(){return{metrics:[...this.metrics],stats:this.getStats(),timestamp:Date.now()}}};function i(){return r.printReport()}"undefined"!=typeof window&&(window.__katexPerfReport=i,window.__katexPerfMonitor=r),exports.disablePerfMonitoring=function(){r.disable()},exports.enablePerfMonitoring=function(){r.enable()},exports.getPerfReport=i,exports.perfMonitor=r;
@@ -0,0 +1,55 @@
1
+ import katex from "katex";
2
+ import "katex/contrib/mhchem";
3
+ let DEBUG = false;
4
+ globalThis.addEventListener("message", (ev) => {
5
+ var _a, _b, _c, _d;
6
+ const data = ev.data || {};
7
+ if (data.type === "init") {
8
+ DEBUG = !!data.debug;
9
+ try {
10
+ if (DEBUG)
11
+ console.debug("[katexRenderer.worker] debug enabled");
12
+ } catch (e) {
13
+ }
14
+ return;
15
+ }
16
+ const id = (_a = data.id) != null ? _a : "";
17
+ const content = (_b = data.content) != null ? _b : "";
18
+ const displayMode = (_c = data.displayMode) != null ? _c : true;
19
+ try {
20
+ if (DEBUG)
21
+ console.debug("[katexRenderer.worker] render start", { id, displayMode, content });
22
+ const html = katex.renderToString(content, {
23
+ throwOnError: true,
24
+ displayMode,
25
+ output: "html",
26
+ strict: "ignore"
27
+ });
28
+ const out = { id, html, content, displayMode };
29
+ try {
30
+ ;
31
+ globalThis.postMessage(out);
32
+ if (DEBUG)
33
+ console.debug("[katexRenderer.worker] render success", { id });
34
+ } catch (postErr) {
35
+ console.error("[katexRenderer.worker] failed to postMessage result", postErr);
36
+ }
37
+ } catch (err) {
38
+ const out = { id, error: String((_d = err == null ? void 0 : err.message) != null ? _d : err), content, displayMode };
39
+ try {
40
+ ;
41
+ globalThis.postMessage(out);
42
+ } catch (postErr) {
43
+ console.error("[katexRenderer.worker] failed to postMessage error", postErr);
44
+ }
45
+ }
46
+ });
47
+ globalThis.addEventListener("error", (ev) => {
48
+ var _a;
49
+ console.error("[katexRenderer.worker] uncaught error", ev.message, ev.error);
50
+ try {
51
+ ;
52
+ globalThis.postMessage({ id: "__worker_uncaught__", error: String((_a = ev.message) != null ? _a : ev.error), content: "", displayMode: true });
53
+ } catch (e) {
54
+ }
55
+ });
@@ -0,0 +1,117 @@
1
+ var __getOwnPropNames = Object.getOwnPropertyNames;
2
+ var __commonJS = (cb, mod) => function __require() {
3
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
4
+ };
5
+ var __async = (__this, __arguments, generator) => {
6
+ return new Promise((resolve, reject) => {
7
+ var fulfilled = (value) => {
8
+ try {
9
+ step(generator.next(value));
10
+ } catch (e) {
11
+ reject(e);
12
+ }
13
+ };
14
+ var rejected = (value) => {
15
+ try {
16
+ step(generator.throw(value));
17
+ } catch (e) {
18
+ reject(e);
19
+ }
20
+ };
21
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
22
+ step((generator = generator.apply(__this, __arguments)).next());
23
+ });
24
+ };
25
+ import mermaid from "mermaid";
26
+ var require_mermaidParser_worker = __commonJS({
27
+ "workers/mermaidParser.worker.js"(exports) {
28
+ mermaid.initialize({ startOnLoad: false, securityLevel: "loose" });
29
+ function applyThemeTo(code, theme) {
30
+ const themeValue = theme === "dark" ? "dark" : "default";
31
+ const themeConfig = `%%{init: {"theme": "${themeValue}"}}%%
32
+ `;
33
+ const trimmed = code.trimStart();
34
+ if (trimmed.startsWith("%%{"))
35
+ return code;
36
+ return themeConfig + code;
37
+ }
38
+ function findHeaderIndex(lines) {
39
+ const headerRe = /^(?:graph|flowchart|flowchart\s+tb|flowchart\s+lr|sequenceDiagram|gantt|classDiagram|stateDiagram(?:-v2)?|erDiagram|journey|pie|quadrantChart|timeline|xychart(?:-beta)?)\b/;
40
+ for (let i = 0; i < lines.length; i++) {
41
+ const l = lines[i].trim();
42
+ if (!l)
43
+ continue;
44
+ if (l.startsWith("%%"))
45
+ continue;
46
+ if (headerRe.test(l))
47
+ return i;
48
+ }
49
+ return -1;
50
+ }
51
+ function canParse(code, theme) {
52
+ return __async(this, null, function* () {
53
+ var _a;
54
+ const themed = applyThemeTo(code, theme);
55
+ const anyMermaid = mermaid;
56
+ if (typeof anyMermaid.parse === "function") {
57
+ yield (_a = anyMermaid.parse) == null ? void 0 : _a.call(anyMermaid, themed);
58
+ return true;
59
+ }
60
+ throw new Error("mermaid.parse not available in worker");
61
+ });
62
+ }
63
+ function findLastRenderablePrefix(baseCode, theme) {
64
+ return __async(this, null, function* () {
65
+ const lines = baseCode.split("\n");
66
+ const headerIdx = findHeaderIndex(lines);
67
+ if (headerIdx === -1)
68
+ return null;
69
+ const head = lines.slice(0, headerIdx + 1);
70
+ yield canParse(head.join("\n"), theme);
71
+ let low = headerIdx + 1;
72
+ let high = lines.length;
73
+ let lastGood = headerIdx + 1;
74
+ let tries = 0;
75
+ const MAX_TRIES = 12;
76
+ while (low <= high && tries < MAX_TRIES) {
77
+ const mid = Math.floor((low + high) / 2);
78
+ const candidate = [...head, ...lines.slice(headerIdx + 1, mid)].join("\n");
79
+ tries++;
80
+ try {
81
+ yield canParse(candidate, theme);
82
+ lastGood = mid;
83
+ low = mid + 1;
84
+ } catch (e) {
85
+ high = mid - 1;
86
+ }
87
+ }
88
+ return [...head, ...lines.slice(headerIdx + 1, lastGood)].join("\n");
89
+ });
90
+ }
91
+ self.onmessage = (ev) => __async(exports, null, function* () {
92
+ var _a;
93
+ const msg = ev.data;
94
+ const send = (res) => self.postMessage(res);
95
+ const id = msg.id;
96
+ try {
97
+ if (msg.action === "canParse") {
98
+ const ok = yield canParse(msg.payload.code, msg.payload.theme);
99
+ send({ id, ok: true, result: ok });
100
+ return;
101
+ }
102
+ if (msg.action === "findPrefix") {
103
+ const res = yield findLastRenderablePrefix(
104
+ msg.payload.code,
105
+ msg.payload.theme
106
+ );
107
+ send({ id, ok: true, result: res });
108
+ return;
109
+ }
110
+ send({ id, ok: false, error: "Unknown action" });
111
+ } catch (e) {
112
+ send({ id, ok: false, error: (_a = e == null ? void 0 : e.message) != null ? _a : String(e) });
113
+ }
114
+ });
115
+ }
116
+ });
117
+ export default require_mermaidParser_worker();
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "markstream-vue2",
3
+ "type": "module",
4
+ "version": "0.0.1",
5
+ "description": "Vue 2 Markdown renderer optimized for large docs: progressive Mermaid, streaming diff code blocks, and fast real-time preview.",
6
+ "author": "Simon He",
7
+ "license": "MIT",
8
+ "sideEffects": [
9
+ "**/*.css"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ },
17
+ "./index.css": "./dist/index.css",
18
+ "./workers/katexRenderer.worker": "./dist/workers/katexRenderer.worker.js",
19
+ "./workers/mermaidParser.worker": "./dist/workers/mermaidParser.worker.js"
20
+ },
21
+ "main": "./dist/index.cjs",
22
+ "module": "./dist/index.js",
23
+ "types": "./dist/index.d.ts",
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "scripts": {
28
+ "build": "vite build -c vite.config.ts --mode npm && pnpm run build:dts && pnpm run copy:css",
29
+ "build:dts": "rollup -c ./scripts/rollup.dts.config.mjs && node ./scripts/clean-dts.cjs",
30
+ "copy:css": "node ./scripts/copy-css.mjs"
31
+ },
32
+ "peerDependencies": {
33
+ "@vue/composition-api": ">=1.7.2",
34
+ "katex": ">=0.16.22",
35
+ "mermaid": ">=11",
36
+ "shiki": "^3.13.0",
37
+ "stream-markdown": ">=0.0.11",
38
+ "stream-monaco": ">=0.0.8",
39
+ "vue": ">=2.6.14 <3",
40
+ "vue-i18n": ">=9"
41
+ },
42
+ "peerDependenciesMeta": {
43
+ "@vue/composition-api": {
44
+ "optional": true
45
+ },
46
+ "katex": {
47
+ "optional": true
48
+ },
49
+ "mermaid": {
50
+ "optional": true
51
+ },
52
+ "shiki": {
53
+ "optional": true
54
+ },
55
+ "stream-markdown": {
56
+ "optional": true
57
+ },
58
+ "stream-monaco": {
59
+ "optional": true
60
+ },
61
+ "vue-i18n": {
62
+ "optional": true
63
+ }
64
+ },
65
+ "dependencies": {
66
+ "@floating-ui/dom": "^1.7.4",
67
+ "stream-markdown-parser": "^0.0.51"
68
+ },
69
+ "devDependencies": {
70
+ "@vitejs/plugin-vue2": "^2.3.4",
71
+ "@vue/compiler-sfc": "2.7.16",
72
+ "rollup": "^3.29.5",
73
+ "rollup-plugin-dts": "^5.3.1",
74
+ "typescript": "^5.9.3",
75
+ "vite": "^4.5.14",
76
+ "vite-plugin-dts": "^4.5.4",
77
+ "vue-tsc": "^2.2.12"
78
+ }
79
+ }