@file-viewer/renderer-text 2.2.2 → 2.2.4

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.
Files changed (2) hide show
  1. package/dist/markdown.js +80 -9
  2. 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(2.4, Math.max(0.6, Number(value.toFixed(2))));
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', `${980 * zoom}px`);
39
- host.style.setProperty('--markdown-padding', `${45 * zoom}px`);
40
- host.style.setProperty('--markdown-font-size', `${16 * zoom}px`);
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 < 2.4,
160
- canZoomOut: zoom > 0.6,
187
+ canZoomIn: zoom < MARKDOWN_MAX_SCALE,
188
+ canZoomOut: zoom > MARKDOWN_MIN_SCALE,
161
189
  canReset: zoom !== 1,
162
- minScale: 0.6,
163
- maxScale: 2.4,
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.2",
3
+ "version": "2.2.4",
4
4
  "private": false,
5
5
  "type": "module",
6
- "description": "Standalone code, text, Markdown, patch diff, and Git bundle renderer plugin for Flyfish File Viewer.",
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": "Wangyu",
27
- "email": "wybaby168@gmail.com"
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.2",
60
+ "@file-viewer/core": "2.2.4",
61
61
  "diff2html": "^3.4.56",
62
62
  "highlight.js": "^11.11.1",
63
63
  "marked": "^18.0.5",