@file-viewer/renderer-text 2.2.2 → 2.2.3
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/markdown.js +80 -9
- package/package.json +5 -5
package/dist/markdown.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { marked } from 'marked';
|
|
2
|
-
import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter, readFileViewerText as readText, registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from '@file-viewer/core';
|
|
2
|
+
import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter, readFileViewerText as readText, registerFileViewerZoomProvider, resolveFileViewerFitScale, unregisterFileViewerZoomProvider, } from '@file-viewer/core';
|
|
3
3
|
const markdownStyle = `
|
|
4
4
|
.markdown-viewer{min-height:100%;padding:28px 16px 48px;background:var(--file-viewer-render-surface-background,#eef1f4);overflow:auto;box-sizing:border-box}
|
|
5
5
|
.markdown-body{color-scheme:light;--bgColor-default:#fff;--bgColor-muted:#f6f8fa;--bgColor-neutral-muted:#818b981f;--borderColor-default:#d1d9e0;--borderColor-muted:#d1d9e0b3;--borderColor-neutral-muted:#d1d9e0b3;--fgColor-default:#1f2328;--fgColor-muted:#59636e;--fgColor-accent:#0969da;background:var(--bgColor-default);border:1px solid rgba(20,35,53,.1);border-radius:12px;margin:0 auto;box-sizing:border-box;min-width:200px;max-width:var(--markdown-max-width,980px);padding:var(--markdown-padding,45px);color:var(--fgColor-default);font-size:var(--markdown-font-size,16px);box-shadow:0 18px 42px rgba(15,23,42,.1)}
|
|
@@ -31,13 +31,40 @@ const createStyle = () => {
|
|
|
31
31
|
style.textContent = markdownStyle;
|
|
32
32
|
return style;
|
|
33
33
|
};
|
|
34
|
+
const MARKDOWN_BASE_MAX_WIDTH = 980;
|
|
35
|
+
const MARKDOWN_BASE_PADDING = 45;
|
|
36
|
+
const MARKDOWN_BASE_FONT_SIZE = 16;
|
|
37
|
+
const MARKDOWN_MIN_SCALE = 0.6;
|
|
38
|
+
const MARKDOWN_MAX_SCALE = 2.4;
|
|
34
39
|
const clampZoom = (value) => {
|
|
35
|
-
return Math.min(
|
|
40
|
+
return Math.min(MARKDOWN_MAX_SCALE, Math.max(MARKDOWN_MIN_SCALE, Number(value.toFixed(2))));
|
|
36
41
|
};
|
|
37
42
|
const applyMarkdownZoom = (host, zoom) => {
|
|
38
|
-
host.style.setProperty('--markdown-max-width', `${
|
|
39
|
-
host.style.setProperty('--markdown-padding', `${
|
|
40
|
-
host.style.setProperty('--markdown-font-size', `${
|
|
43
|
+
host.style.setProperty('--markdown-max-width', `${MARKDOWN_BASE_MAX_WIDTH * zoom}px`);
|
|
44
|
+
host.style.setProperty('--markdown-padding', `${MARKDOWN_BASE_PADDING * zoom}px`);
|
|
45
|
+
host.style.setProperty('--markdown-font-size', `${MARKDOWN_BASE_FONT_SIZE * zoom}px`);
|
|
46
|
+
};
|
|
47
|
+
const readCssPixels = (value) => {
|
|
48
|
+
const pixels = Number.parseFloat(value || '');
|
|
49
|
+
return Number.isFinite(pixels) ? pixels : 0;
|
|
50
|
+
};
|
|
51
|
+
const readMarkdownViewport = (root, request) => {
|
|
52
|
+
var _a;
|
|
53
|
+
const viewportWidth = Math.max(1, request.viewportWidth || root.clientWidth || 0);
|
|
54
|
+
const viewportHeight = Math.max(1, request.viewportHeight || root.clientHeight || 0);
|
|
55
|
+
const view = root.ownerDocument.defaultView;
|
|
56
|
+
const computed = (_a = view === null || view === void 0 ? void 0 : view.getComputedStyle) === null || _a === void 0 ? void 0 : _a.call(view, root);
|
|
57
|
+
const mobile = viewportWidth <= 767;
|
|
58
|
+
const horizontalPadding = computed
|
|
59
|
+
? readCssPixels(computed.paddingLeft) + readCssPixels(computed.paddingRight)
|
|
60
|
+
: mobile ? 20 : 32;
|
|
61
|
+
const verticalPadding = computed
|
|
62
|
+
? readCssPixels(computed.paddingTop) + readCssPixels(computed.paddingBottom)
|
|
63
|
+
: mobile ? 42 : 76;
|
|
64
|
+
return {
|
|
65
|
+
width: Math.max(1, viewportWidth - horizontalPadding),
|
|
66
|
+
height: Math.max(1, viewportHeight - verticalPadding),
|
|
67
|
+
};
|
|
41
68
|
};
|
|
42
69
|
let mermaidRenderSequence = 0;
|
|
43
70
|
let mermaidRenderQueue = Promise.resolve();
|
|
@@ -153,14 +180,15 @@ export default async function renderMarkdown(buffer, target, context) {
|
|
|
153
180
|
root.append(article);
|
|
154
181
|
target.replaceChildren(createStyle(), root);
|
|
155
182
|
await renderEmbeddedMermaid(article, (_a = context === null || context === void 0 ? void 0 : context.options) === null || _a === void 0 ? void 0 : _a.theme);
|
|
183
|
+
const baseContentHeight = Math.max(article.scrollHeight || 0, article.offsetHeight || 0, 0);
|
|
156
184
|
const getZoomState = () => ({
|
|
157
185
|
scale: zoom,
|
|
158
186
|
label: `${Math.round(zoom * 100)}%`,
|
|
159
|
-
canZoomIn: zoom <
|
|
160
|
-
canZoomOut: zoom >
|
|
187
|
+
canZoomIn: zoom < MARKDOWN_MAX_SCALE,
|
|
188
|
+
canZoomOut: zoom > MARKDOWN_MIN_SCALE,
|
|
161
189
|
canReset: zoom !== 1,
|
|
162
|
-
minScale:
|
|
163
|
-
maxScale:
|
|
190
|
+
minScale: MARKDOWN_MIN_SCALE,
|
|
191
|
+
maxScale: MARKDOWN_MAX_SCALE,
|
|
164
192
|
});
|
|
165
193
|
const setZoom = (scale) => {
|
|
166
194
|
zoom = clampZoom(scale);
|
|
@@ -168,11 +196,54 @@ export default async function renderMarkdown(buffer, target, context) {
|
|
|
168
196
|
zoomEmitter.emit();
|
|
169
197
|
return getZoomState();
|
|
170
198
|
};
|
|
199
|
+
const fitMarkdown = (request) => {
|
|
200
|
+
var _a, _b;
|
|
201
|
+
const viewport = readMarkdownViewport(root, request);
|
|
202
|
+
const minScale = (_a = request.minScale) !== null && _a !== void 0 ? _a : MARKDOWN_MIN_SCALE;
|
|
203
|
+
const requestedMaxScale = (_b = request.maxScale) !== null && _b !== void 0 ? _b : MARKDOWN_MAX_SCALE;
|
|
204
|
+
// A flowing document must not be fitted against its full scroll height.
|
|
205
|
+
// Auto therefore follows the readable content width. It stays at 1:1 by
|
|
206
|
+
// default, but an explicit maxScale can opt into the wider DOCX-like fit
|
|
207
|
+
// requested by the caller.
|
|
208
|
+
const maxScale = request.mode === 'auto' && request.maxScale == null
|
|
209
|
+
? Math.max(minScale, Math.min(1, requestedMaxScale))
|
|
210
|
+
: requestedMaxScale;
|
|
211
|
+
const scale = resolveFileViewerFitScale({
|
|
212
|
+
mode: request.mode === 'auto' ? 'width' : request.mode,
|
|
213
|
+
viewportWidth: viewport.width,
|
|
214
|
+
viewportHeight: viewport.height,
|
|
215
|
+
contentWidth: MARKDOWN_BASE_MAX_WIDTH,
|
|
216
|
+
contentHeight: baseContentHeight || viewport.height,
|
|
217
|
+
currentScale: zoom,
|
|
218
|
+
minScale,
|
|
219
|
+
maxScale,
|
|
220
|
+
});
|
|
221
|
+
if (!scale) {
|
|
222
|
+
return {
|
|
223
|
+
applied: false,
|
|
224
|
+
mode: request.mode,
|
|
225
|
+
resize: request.resize,
|
|
226
|
+
source: request.source,
|
|
227
|
+
reason: 'unmeasurable',
|
|
228
|
+
provider: 'zoom',
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const state = setZoom(scale);
|
|
232
|
+
return {
|
|
233
|
+
applied: true,
|
|
234
|
+
mode: request.mode,
|
|
235
|
+
resize: request.resize,
|
|
236
|
+
scale: state.scale,
|
|
237
|
+
source: request.source,
|
|
238
|
+
provider: 'zoom',
|
|
239
|
+
};
|
|
240
|
+
};
|
|
171
241
|
registerFileViewerZoomProvider(root, {
|
|
172
242
|
zoomIn: () => setZoom(zoom + 0.1),
|
|
173
243
|
zoomOut: () => setZoom(zoom - 0.1),
|
|
174
244
|
resetZoom: () => setZoom(1),
|
|
175
245
|
setZoom,
|
|
246
|
+
fit: fitMarkdown,
|
|
176
247
|
getState: getZoomState,
|
|
177
248
|
subscribe: zoomEmitter.subscribe,
|
|
178
249
|
});
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@file-viewer/renderer-text",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
|
-
"description": "Standalone code, text, Markdown, patch diff, and Git bundle renderer plugin for
|
|
6
|
+
"description": "Standalone code, text, Markdown, patch diff, and Git bundle renderer plugin for File Viewer.",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"file-viewer",
|
|
9
9
|
"renderer",
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"registry": "https://registry.npmjs.org/"
|
|
24
24
|
},
|
|
25
25
|
"author": {
|
|
26
|
-
"name": "
|
|
27
|
-
"email": "
|
|
26
|
+
"name": "Yu Wang",
|
|
27
|
+
"email": "admin@flyfish.dev"
|
|
28
28
|
},
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"LICENSE"
|
|
58
58
|
],
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@file-viewer/core": "2.2.
|
|
60
|
+
"@file-viewer/core": "2.2.3",
|
|
61
61
|
"diff2html": "^3.4.56",
|
|
62
62
|
"highlight.js": "^11.11.1",
|
|
63
63
|
"marked": "^18.0.5",
|