@typefm/react-markdown-viewer 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/ErrorBoundary.d.ts +25 -0
- package/dist/ErrorBoundary.d.ts.map +1 -0
- package/dist/ErrorBoundary.js +29 -0
- package/dist/ErrorBoundary.js.map +1 -0
- package/dist/MarkdownViewer.d.ts +41 -0
- package/dist/MarkdownViewer.d.ts.map +1 -0
- package/dist/MarkdownViewer.js +69 -0
- package/dist/MarkdownViewer.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cache-manager.d.ts +59 -0
- package/dist/lib/cache-manager.d.ts.map +1 -0
- package/dist/lib/cache-manager.js +160 -0
- package/dist/lib/cache-manager.js.map +1 -0
- package/dist/lib/cursor-controller.d.ts +13 -0
- package/dist/lib/cursor-controller.d.ts.map +1 -0
- package/dist/lib/cursor-controller.js +93 -0
- package/dist/lib/cursor-controller.js.map +1 -0
- package/dist/lib/defaults/code-block.d.ts +71 -0
- package/dist/lib/defaults/code-block.d.ts.map +1 -0
- package/dist/lib/defaults/code-block.js +104 -0
- package/dist/lib/defaults/code-block.js.map +1 -0
- package/dist/lib/defaults/image.d.ts +41 -0
- package/dist/lib/defaults/image.d.ts.map +1 -0
- package/dist/lib/defaults/image.js +45 -0
- package/dist/lib/defaults/image.js.map +1 -0
- package/dist/lib/defaults/link.d.ts +45 -0
- package/dist/lib/defaults/link.d.ts.map +1 -0
- package/dist/lib/defaults/link.js +76 -0
- package/dist/lib/defaults/link.js.map +1 -0
- package/dist/lib/defaults/math.d.ts +51 -0
- package/dist/lib/defaults/math.d.ts.map +1 -0
- package/dist/lib/defaults/math.js +119 -0
- package/dist/lib/defaults/math.js.map +1 -0
- package/dist/lib/defaults/table.d.ts +18 -0
- package/dist/lib/defaults/table.d.ts.map +1 -0
- package/dist/lib/defaults/table.js +19 -0
- package/dist/lib/defaults/table.js.map +1 -0
- package/dist/lib/highlighter.d.ts +81 -0
- package/dist/lib/highlighter.d.ts.map +1 -0
- package/dist/lib/highlighter.js +421 -0
- package/dist/lib/highlighter.js.map +1 -0
- package/dist/lib/hook-utils.d.ts +32 -0
- package/dist/lib/hook-utils.d.ts.map +1 -0
- package/dist/lib/hook-utils.js +42 -0
- package/dist/lib/hook-utils.js.map +1 -0
- package/dist/lib/html.d.ts +2 -0
- package/dist/lib/html.d.ts.map +1 -0
- package/dist/lib/html.js +12 -0
- package/dist/lib/html.js.map +1 -0
- package/dist/lib/morph.d.ts +57 -0
- package/dist/lib/morph.d.ts.map +1 -0
- package/dist/lib/morph.js +204 -0
- package/dist/lib/morph.js.map +1 -0
- package/dist/lib/parser.d.ts +32 -0
- package/dist/lib/parser.d.ts.map +1 -0
- package/dist/lib/parser.js +645 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/wasm-init.d.ts +33 -0
- package/dist/lib/wasm-init.d.ts.map +1 -0
- package/dist/lib/wasm-init.js +69 -0
- package/dist/lib/wasm-init.js.map +1 -0
- package/dist/styles/alerts.css +294 -0
- package/dist/styles/dotted.svg +3 -0
- package/dist/styles/hljs.css +332 -0
- package/dist/styles/index.css +17 -0
- package/dist/styles/katex.css +74 -0
- package/dist/styles/viewer.css +975 -0
- package/dist/types/hooks.d.ts +207 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +7 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/useMarkdownViewer.d.ts +18 -0
- package/dist/useMarkdownViewer.d.ts.map +1 -0
- package/dist/useMarkdownViewer.js +403 -0
- package/dist/useMarkdownViewer.js.map +1 -0
- package/dist/utils.d.ts +20 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +18 -0
- package/dist/utils.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import Idiomorph from 'idiomorph/dist/idiomorph.cjs.js';
|
|
2
|
+
// --------------------------------------------------------------------------
|
|
3
|
+
// Hashing Utility
|
|
4
|
+
// --------------------------------------------------------------------------
|
|
5
|
+
/** Simple djb2 hash for fast string comparison */
|
|
6
|
+
function simpleHash(str) {
|
|
7
|
+
let hash = 5381;
|
|
8
|
+
for (let i = 0; i < str.length; i++) {
|
|
9
|
+
hash = ((hash << 5) + hash) ^ str.charCodeAt(i);
|
|
10
|
+
}
|
|
11
|
+
return `${str.length}:${hash >>> 0}`;
|
|
12
|
+
}
|
|
13
|
+
/** Per-container morph state - auto-cleaned when element is GC'd */
|
|
14
|
+
const morphStates = new WeakMap();
|
|
15
|
+
/** Get or create state for a container */
|
|
16
|
+
function getState(container) {
|
|
17
|
+
let state = morphStates.get(container);
|
|
18
|
+
if (!state) {
|
|
19
|
+
state = {
|
|
20
|
+
prevHashes: [],
|
|
21
|
+
contentHash: '',
|
|
22
|
+
lastStats: { updated: 0, skipped: 0, added: 0, removed: 0 }
|
|
23
|
+
};
|
|
24
|
+
morphStates.set(container, state);
|
|
25
|
+
}
|
|
26
|
+
return state;
|
|
27
|
+
}
|
|
28
|
+
// --------------------------------------------------------------------------
|
|
29
|
+
// Shared Idiomorph Configuration
|
|
30
|
+
// --------------------------------------------------------------------------
|
|
31
|
+
const IDIOMORPH_OPTIONS = {
|
|
32
|
+
morphStyle: 'innerHTML',
|
|
33
|
+
callbacks: {
|
|
34
|
+
// Prevent removal of nodes with data-morph-ignore attribute
|
|
35
|
+
beforeNodeRemoved: (node) => {
|
|
36
|
+
if (node instanceof Element && node.hasAttribute('data-morph-ignore')) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
// --------------------------------------------------------------------------
|
|
44
|
+
// RAF-Batched Morphing (for non-streaming updates)
|
|
45
|
+
// --------------------------------------------------------------------------
|
|
46
|
+
// Track pending RAF to avoid stacking
|
|
47
|
+
let pendingMorph = null;
|
|
48
|
+
let pendingElement = null;
|
|
49
|
+
let pendingHtml = null;
|
|
50
|
+
/**
|
|
51
|
+
* Morph the content of an element using Idiomorph
|
|
52
|
+
* Uses requestAnimationFrame to batch updates and prevent jank
|
|
53
|
+
*
|
|
54
|
+
* @param element The container element to morph
|
|
55
|
+
* @param newHtml The new HTML content
|
|
56
|
+
*/
|
|
57
|
+
export function morphContent(element, newHtml) {
|
|
58
|
+
const newHash = simpleHash(newHtml);
|
|
59
|
+
const state = getState(element);
|
|
60
|
+
// Fast path: skip if content unchanged
|
|
61
|
+
if (state.contentHash === newHash)
|
|
62
|
+
return;
|
|
63
|
+
// Store for pending morph
|
|
64
|
+
pendingElement = element;
|
|
65
|
+
pendingHtml = newHtml;
|
|
66
|
+
// Cancel any pending morph and schedule new one
|
|
67
|
+
if (pendingMorph !== null) {
|
|
68
|
+
cancelAnimationFrame(pendingMorph);
|
|
69
|
+
}
|
|
70
|
+
pendingMorph = requestAnimationFrame(() => {
|
|
71
|
+
if (pendingElement && pendingHtml !== null) {
|
|
72
|
+
const pendingState = getState(pendingElement);
|
|
73
|
+
pendingState.contentHash = newHash;
|
|
74
|
+
Idiomorph.morph(pendingElement, pendingHtml, IDIOMORPH_OPTIONS);
|
|
75
|
+
}
|
|
76
|
+
pendingMorph = null;
|
|
77
|
+
pendingElement = null;
|
|
78
|
+
pendingHtml = null;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Morph content synchronously (for testing or immediate updates)
|
|
83
|
+
*
|
|
84
|
+
* @param element The container element to morph
|
|
85
|
+
* @param newHtml The new HTML content
|
|
86
|
+
*/
|
|
87
|
+
export function morphContentSync(element, newHtml) {
|
|
88
|
+
const newHash = simpleHash(newHtml);
|
|
89
|
+
const state = getState(element);
|
|
90
|
+
// Fast path: skip if content unchanged
|
|
91
|
+
if (state.contentHash === newHash)
|
|
92
|
+
return;
|
|
93
|
+
state.contentHash = newHash;
|
|
94
|
+
Idiomorph.morph(element, newHtml, IDIOMORPH_OPTIONS);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Reset morph state for a specific container, or clear all pending operations
|
|
98
|
+
*
|
|
99
|
+
* @param container Optional container to reset state for
|
|
100
|
+
*/
|
|
101
|
+
export function resetMorphCache(container) {
|
|
102
|
+
if (container) {
|
|
103
|
+
// Reset specific container's state
|
|
104
|
+
morphStates.delete(container);
|
|
105
|
+
}
|
|
106
|
+
// Cancel any pending morph
|
|
107
|
+
if (pendingMorph !== null) {
|
|
108
|
+
cancelAnimationFrame(pendingMorph);
|
|
109
|
+
pendingMorph = null;
|
|
110
|
+
}
|
|
111
|
+
pendingElement = null;
|
|
112
|
+
pendingHtml = null;
|
|
113
|
+
}
|
|
114
|
+
// --------------------------------------------------------------------------
|
|
115
|
+
// Element-Level Optimized Morphing (for streaming)
|
|
116
|
+
// --------------------------------------------------------------------------
|
|
117
|
+
/**
|
|
118
|
+
* Get morph stats for a specific container
|
|
119
|
+
*
|
|
120
|
+
* @param container The container to get stats for
|
|
121
|
+
* @returns Stats from the last morph operation on this container
|
|
122
|
+
*/
|
|
123
|
+
export function getMorphStats(container) {
|
|
124
|
+
if (!container) {
|
|
125
|
+
// Fallback for backwards compatibility - return empty stats
|
|
126
|
+
return { updated: 0, skipped: 0, added: 0, removed: 0 };
|
|
127
|
+
}
|
|
128
|
+
return getState(container).lastStats;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Optimized morph that skips unchanged elements
|
|
132
|
+
*
|
|
133
|
+
* Strategy:
|
|
134
|
+
* 1. Parse new HTML into temp container
|
|
135
|
+
* 2. Hash each top-level element
|
|
136
|
+
* 3. Compare with previous hashes for this container
|
|
137
|
+
* 4. Only morph elements that changed
|
|
138
|
+
*
|
|
139
|
+
* @param container The container element to morph
|
|
140
|
+
* @param newHtml The new HTML content
|
|
141
|
+
* @returns true if any elements were updated
|
|
142
|
+
*/
|
|
143
|
+
export function morphContentOptimized(container, newHtml) {
|
|
144
|
+
const state = getState(container);
|
|
145
|
+
// Parse new HTML into temp container
|
|
146
|
+
const temp = document.createElement('div');
|
|
147
|
+
temp.innerHTML = newHtml;
|
|
148
|
+
const newHashes = [];
|
|
149
|
+
const stats = { updated: 0, skipped: 0, added: 0, removed: 0 };
|
|
150
|
+
const oldLen = container.children.length;
|
|
151
|
+
const newLen = temp.children.length;
|
|
152
|
+
const maxLen = Math.max(oldLen, newLen);
|
|
153
|
+
// Process each element position
|
|
154
|
+
for (let i = 0; i < maxLen; i++) {
|
|
155
|
+
const oldChild = container.children[i];
|
|
156
|
+
const newChild = temp.children[i];
|
|
157
|
+
if (!newChild && oldChild) {
|
|
158
|
+
// Element removed - will handle after loop to avoid index shifting
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (!newChild)
|
|
162
|
+
continue;
|
|
163
|
+
const newHash = simpleHash(newChild.outerHTML);
|
|
164
|
+
newHashes.push(newHash);
|
|
165
|
+
if (!oldChild) {
|
|
166
|
+
// New element - append (clone since temp will be discarded)
|
|
167
|
+
container.appendChild(newChild.cloneNode(true));
|
|
168
|
+
stats.added++;
|
|
169
|
+
}
|
|
170
|
+
else if (state.prevHashes[i] !== newHash) {
|
|
171
|
+
// Element changed - morph it
|
|
172
|
+
Idiomorph.morph(oldChild, newChild.outerHTML, {
|
|
173
|
+
morphStyle: 'outerHTML',
|
|
174
|
+
callbacks: IDIOMORPH_OPTIONS.callbacks
|
|
175
|
+
});
|
|
176
|
+
stats.updated++;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// Element unchanged - skip!
|
|
180
|
+
stats.skipped++;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Remove extra elements from the end (if any)
|
|
184
|
+
while (container.children.length > newLen) {
|
|
185
|
+
container.lastElementChild?.remove();
|
|
186
|
+
stats.removed++;
|
|
187
|
+
}
|
|
188
|
+
// Update state for this container
|
|
189
|
+
state.prevHashes = newHashes;
|
|
190
|
+
state.lastStats = stats;
|
|
191
|
+
return stats.updated > 0 || stats.added > 0 || stats.removed > 0;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Reset element-level morph state for a container
|
|
195
|
+
* Note: Usually not needed since WeakMap auto-cleans when element is GC'd
|
|
196
|
+
*
|
|
197
|
+
* @param container Optional container to reset (if omitted, does nothing - use resetMorphCache)
|
|
198
|
+
*/
|
|
199
|
+
export function resetElementMorphState(container) {
|
|
200
|
+
if (container) {
|
|
201
|
+
morphStates.delete(container);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=morph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"morph.js","sourceRoot":"","sources":["../../src/lib/morph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { onLanguageLoaded, offLanguageLoaded, getNotificationGeneration } from "./highlighter";
|
|
2
|
+
import type { RenderHooks } from "../types/hooks";
|
|
3
|
+
import { preloadKaTeX as defaultPreloadKaTeX, isKaTeXReady as defaultIsKaTeXReady } from "./defaults/math";
|
|
4
|
+
export { onLanguageLoaded, offLanguageLoaded, getNotificationGeneration };
|
|
5
|
+
export declare const preloadKaTeX: typeof defaultPreloadKaTeX;
|
|
6
|
+
export declare const isKaTeXReady: typeof defaultIsKaTeXReady;
|
|
7
|
+
/**
|
|
8
|
+
* Cursor marker string and HTML replacement
|
|
9
|
+
* Word Joiner (U+2060) - invisible character used to mark cursor position.
|
|
10
|
+
* We use WJ instead of ZWSP (U+200B) because source markdown may contain ZWSP
|
|
11
|
+
* which gets escaped to HTML entities. WJ is rarely used in source text.
|
|
12
|
+
*/
|
|
13
|
+
export declare const CURSOR_MARKER = "\u2060";
|
|
14
|
+
export declare const CURSOR_HTML = "<span class='cursor' data-cursor></span>";
|
|
15
|
+
/**
|
|
16
|
+
* Sanitize HTML to remove XSS vectors while preserving safe content.
|
|
17
|
+
*/
|
|
18
|
+
export declare function sanitizeHtml(html: string): string;
|
|
19
|
+
export interface ColorOptions {
|
|
20
|
+
fences: boolean;
|
|
21
|
+
inline: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Render Markdown to HTML using @typefm/comrak-wasm + Post-processing.
|
|
25
|
+
*
|
|
26
|
+
* @param src Markdown source
|
|
27
|
+
* @param useSyncStrategy If true, uses sync morph path (streaming).
|
|
28
|
+
* @param colorOptions Options for color preview injection.
|
|
29
|
+
* @param hooks Optional hooks for customizing rendering.
|
|
30
|
+
*/
|
|
31
|
+
export declare function renderMarkdown(src: string, useSyncStrategy: boolean, colorOptions?: ColorOptions, hooks?: RenderHooks): string;
|
|
32
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/lib/parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAa,gBAAgB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,KAAK,EACX,WAAW,EAgBX,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EAEN,YAAY,IAAI,mBAAmB,EACnC,YAAY,IAAI,mBAAmB,EAEnC,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,CAAC;AAG1E,eAAO,MAAM,YAAY,4BAAsB,CAAC;AAChD,eAAO,MAAM,YAAY,4BAAsB,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,WAAW,CAAC;AACtC,eAAO,MAAM,WAAW,6CAA6C,CAAC;AAmFtE;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2CjD;AA0DD,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CAChB;AA0HD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC7B,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,OAAO,EACxB,YAAY,GAAE,YAA6C,EAC3D,KAAK,CAAC,EAAE,WAAW,GACjB,MAAM,CA6HR"}
|