@file-viewer/renderer-text 2.1.1 → 2.1.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/code.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type FileViewerRenderedInstance } from '@file-viewer/core';
1
+ import { type FileRenderContext, type FileViewerRenderedInstance } from '@file-viewer/core';
2
2
  /**
3
3
  * Framework-neutral text/code renderer.
4
4
  *
@@ -8,4 +8,4 @@ import { type FileViewerRenderedInstance } from '@file-viewer/core';
8
8
  * @param target 目标
9
9
  * @param type 文件扩展名,用于选择 highlight.js 语言
10
10
  */
11
- export default function renderText(buffer: ArrayBuffer, target: HTMLDivElement, type?: string): Promise<FileViewerRenderedInstance>;
11
+ export default function renderText(buffer: ArrayBuffer, target: HTMLDivElement, type?: string, context?: FileRenderContext): Promise<FileViewerRenderedInstance>;
package/dist/code.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter, readFileViewerText as readText, registerFileViewerZoomProvider, unregisterFileViewerZoomProvider } from '@file-viewer/core';
1
+ import { createFileViewerTranslator, createFileViewerZoomChangeEmitter as createZoomChangeEmitter, readFileViewerText as readText, registerFileViewerZoomProvider, unregisterFileViewerZoomProvider } from '@file-viewer/core';
2
2
  const languageMap = {
3
3
  bash: 'bash',
4
4
  c: 'cpp',
@@ -159,16 +159,17 @@ const lineCountOf = (value) => {
159
159
  * @param target 目标
160
160
  * @param type 文件扩展名,用于选择 highlight.js 语言
161
161
  */
162
- export default async function renderText(buffer, target, type) {
162
+ export default async function renderText(buffer, target, type, context) {
163
+ const t = createFileViewerTranslator(context === null || context === void 0 ? void 0 : context.options);
163
164
  const extension = type || 'txt';
164
165
  const normalizedExtension = extension.trim().toLowerCase();
165
166
  if (normalizedExtension === 'patch') {
166
167
  const { default: renderPatch } = await import('./patch.js');
167
- return renderPatch(buffer, target, extension);
168
+ return renderPatch(buffer, target, extension, context);
168
169
  }
169
170
  if (normalizedExtension === 'bundle' || normalizedExtension === 'bdl') {
170
171
  const { default: renderGitBundle } = await import('./gitBundle.js');
171
- return renderGitBundle(buffer, target, extension);
172
+ return renderGitBundle(buffer, target, extension, context);
172
173
  }
173
174
  const text = await readText(buffer);
174
175
  const language = resolveLanguage(extension);
@@ -183,7 +184,7 @@ export default async function renderText(buffer, target, type) {
183
184
  const code = createElement('code', `hljs language-${language}`);
184
185
  code.innerHTML = language === 'plaintext'
185
186
  ? escapeHtml(text)
186
- : '正在加载高亮...';
187
+ : t('text.code.loadingHighlight');
187
188
  pre.append(code);
188
189
  root.append(toolbar, pre);
189
190
  root.style.setProperty('--code-font-size', `${13 * zoom}px`);
@@ -1,2 +1,2 @@
1
- import { type FileViewerRenderedInstance } from '@file-viewer/core';
2
- export default function renderGitBundle(buffer: ArrayBuffer, target: HTMLDivElement, type?: string): Promise<FileViewerRenderedInstance>;
1
+ import { type FileRenderContext, type FileViewerRenderedInstance } from '@file-viewer/core';
2
+ export default function renderGitBundle(buffer: ArrayBuffer, target: HTMLDivElement, type?: string, context?: FileRenderContext): Promise<FileViewerRenderedInstance>;
package/dist/gitBundle.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter, registerFileViewerZoomProvider, unregisterFileViewerZoomProvider } from '@file-viewer/core';
1
+ import { createFileViewerTranslator, createFileViewerZoomChangeEmitter as createZoomChangeEmitter, registerFileViewerZoomProvider, unregisterFileViewerZoomProvider } from '@file-viewer/core';
2
2
  import { Inflate } from 'pako';
3
3
  const textDecoder = new TextDecoder('utf-8');
4
4
  const asciiDecoder = new TextDecoder('latin1');
@@ -60,7 +60,7 @@ const concatBytes = (items) => {
60
60
  }
61
61
  return merged;
62
62
  };
63
- const parseHeader = (bytes) => {
63
+ const parseHeader = (bytes, t) => {
64
64
  const lines = [];
65
65
  let offset = 0;
66
66
  while (offset < bytes.length) {
@@ -78,7 +78,7 @@ const parseHeader = (bytes) => {
78
78
  }
79
79
  const signature = lines.shift() || '';
80
80
  if (!signature.startsWith('# v') || !signature.includes('git bundle')) {
81
- throw new Error('当前文件不是标准 Git bundle。');
81
+ throw new Error(t('gitBundle.error.invalid'));
82
82
  }
83
83
  const capabilities = [];
84
84
  const refs = [];
@@ -268,10 +268,10 @@ const resolvePackDeltas = async (objects, format) => {
268
268
  }
269
269
  }
270
270
  };
271
- const parsePack = async (bytes, header) => {
271
+ const parsePack = async (bytes, header, t) => {
272
272
  const offset = header.packOffset;
273
273
  if (asciiDecoder.decode(bytes.subarray(offset, offset + 4)) !== 'PACK') {
274
- throw new Error('Git bundle header 后未找到 PACK 数据。');
274
+ throw new Error(t('gitBundle.error.missingPack'));
275
275
  }
276
276
  const version = readUInt32(bytes, offset + 4);
277
277
  const count = readUInt32(bytes, offset + 8);
@@ -421,10 +421,10 @@ const collectTree = (objectMap, treeOid, basePath = '', depth = 0) => {
421
421
  }
422
422
  return { treeEntries, files };
423
423
  };
424
- const parseBundleModel = async (buffer) => {
424
+ const parseBundleModel = async (buffer, t) => {
425
425
  const bytes = new Uint8Array(buffer);
426
- const header = parseHeader(bytes);
427
- const pack = await parsePack(bytes, header);
426
+ const header = parseHeader(bytes, t);
427
+ const pack = await parsePack(bytes, header, t);
428
428
  const objectMap = new Map(pack.objects.flatMap(object => object.oid ? [[object.oid, object]] : []));
429
429
  const refsByOid = new Map();
430
430
  header.refs.forEach(ref => {
@@ -450,20 +450,20 @@ const commitTitle = (commit) => commit.message.split(/\r?\n/)[0] || '(no message
450
450
  const clampZoom = (value) => {
451
451
  return Math.min(2.2, Math.max(0.65, Number(value.toFixed(2))));
452
452
  };
453
- const renderMeta = (documentRef, panel, model) => {
453
+ const renderMeta = (documentRef, panel, model, t) => {
454
454
  const meta = createElement(documentRef, 'div', 'git-bundle-meta');
455
455
  const counts = new Map();
456
456
  model.objects.forEach(object => {
457
457
  counts.set(object.kind, (counts.get(object.kind) || 0) + 1);
458
458
  });
459
459
  const items = [
460
- ['Bundle', model.header.signature],
461
- ['Refs', String(model.header.refs.length)],
462
- ['Commits', String(model.commits.length)],
463
- ['Objects', String(model.objects.length)],
464
- ['Deltas', String(model.deltaCount)],
465
- ['Object format', model.header.objectFormat],
466
- ['Object types', Array.from(counts).map(([kind, count]) => `${kind}:${count}`).join(' · ') || '-']
460
+ [t('gitBundle.meta.bundle'), model.header.signature],
461
+ [t('gitBundle.meta.refs'), String(model.header.refs.length)],
462
+ [t('gitBundle.meta.commits'), String(model.commits.length)],
463
+ [t('gitBundle.meta.objects'), String(model.objects.length)],
464
+ [t('gitBundle.meta.deltas'), String(model.deltaCount)],
465
+ [t('gitBundle.meta.objectFormat'), model.header.objectFormat],
466
+ [t('gitBundle.meta.objectTypes'), Array.from(counts).map(([kind, count]) => `${kind}:${count}`).join(' · ') || '-']
467
467
  ];
468
468
  items.forEach(([label, value]) => {
469
469
  const row = createElement(documentRef, 'div');
@@ -472,30 +472,34 @@ const renderMeta = (documentRef, panel, model) => {
472
472
  });
473
473
  panel.appendChild(meta);
474
474
  if (model.deltaCount > 0) {
475
- panel.appendChild(createElement(documentRef, 'div', 'git-bundle-notice', '当前 bundle 包含 delta 压缩对象。预览器已在浏览器端解析常规 OFS_DELTA / REF_DELTA;若仍有缺失文件,通常是包体过大、对象过多或依赖外部 prerequisite。'));
475
+ panel.appendChild(createElement(documentRef, 'div', 'git-bundle-notice', t('gitBundle.notice.delta')));
476
476
  }
477
477
  };
478
- export default async function renderGitBundle(buffer, target, type = 'bundle') {
478
+ export default async function renderGitBundle(buffer, target, type = 'bundle', context) {
479
479
  const documentRef = target.ownerDocument || document;
480
- const model = await parseBundleModel(buffer);
480
+ const t = createFileViewerTranslator(context === null || context === void 0 ? void 0 : context.options);
481
+ const model = await parseBundleModel(buffer, t);
481
482
  let zoom = 1;
482
483
  const zoomEmitter = createZoomChangeEmitter();
483
484
  const root = createElement(documentRef, 'div', 'git-bundle-viewer');
484
485
  root.dataset.viewerZoomProvider = 'git-bundle';
485
486
  const toolbar = createElement(documentRef, 'div', 'git-bundle-toolbar');
486
- toolbar.append(createElement(documentRef, 'span', undefined, type.toUpperCase()), createElement(documentRef, 'strong', undefined, `${model.commits.length} commits · ${model.files.length} files`));
487
+ toolbar.append(createElement(documentRef, 'span', undefined, type.toUpperCase()), createElement(documentRef, 'strong', undefined, t('gitBundle.toolbar.summary', {
488
+ commits: model.commits.length,
489
+ files: model.files.length
490
+ })));
487
491
  const layout = createElement(documentRef, 'div', 'git-bundle-layout');
488
492
  const historyPanel = createElement(documentRef, 'section', 'git-bundle-panel');
489
- historyPanel.appendChild(createElement(documentRef, 'h3', undefined, '历史记录'));
490
- renderMeta(documentRef, historyPanel, model);
493
+ historyPanel.appendChild(createElement(documentRef, 'h3', undefined, t('gitBundle.title.history')));
494
+ renderMeta(documentRef, historyPanel, model, t);
491
495
  const historyList = createElement(documentRef, 'ul', 'git-bundle-list');
492
496
  historyPanel.appendChild(historyList);
493
497
  const treePanel = createElement(documentRef, 'section', 'git-bundle-panel');
494
- treePanel.appendChild(createElement(documentRef, 'h3', undefined, '文件树'));
498
+ treePanel.appendChild(createElement(documentRef, 'h3', undefined, t('gitBundle.title.fileTree')));
495
499
  const tree = createElement(documentRef, 'div', 'git-bundle-tree');
496
500
  treePanel.appendChild(tree);
497
501
  const filePanel = createElement(documentRef, 'section', 'git-bundle-panel git-bundle-file');
498
- const fileHeader = createElement(documentRef, 'div', 'git-bundle-file-header', '选择文件查看内容');
502
+ const fileHeader = createElement(documentRef, 'div', 'git-bundle-file-header', t('gitBundle.file.choose'));
499
503
  const fileCode = createElement(documentRef, 'pre', 'git-bundle-code', '');
500
504
  filePanel.append(fileHeader, fileCode);
501
505
  layout.append(historyPanel, treePanel, filePanel);
@@ -504,8 +508,8 @@ export default async function renderGitBundle(buffer, target, type = 'bundle') {
504
508
  const renderFiles = (files) => {
505
509
  tree.replaceChildren();
506
510
  if (!files.length) {
507
- tree.appendChild(createElement(documentRef, 'div', 'git-bundle-notice', '当前 bundle 的 tree/blob 可能被 delta 压缩,暂未解析到可展开文件。'));
508
- fileHeader.textContent = '未解析到文件';
511
+ tree.appendChild(createElement(documentRef, 'div', 'git-bundle-notice', t('gitBundle.file.noTree')));
512
+ fileHeader.textContent = t('gitBundle.file.none');
509
513
  fileCode.textContent = '';
510
514
  return;
511
515
  }
@@ -543,7 +547,7 @@ export default async function renderGitBundle(buffer, target, type = 'bundle') {
543
547
  }
544
548
  });
545
549
  if (!model.commits.length) {
546
- historyList.appendChild(createElement(documentRef, 'li', 'git-bundle-notice', '当前 bundle 未解析到 commit 对象,仅展示 refs 和 pack 摘要。'));
550
+ historyList.appendChild(createElement(documentRef, 'li', 'git-bundle-notice', t('gitBundle.history.empty')));
547
551
  renderFiles(model.files);
548
552
  }
549
553
  const getZoomState = () => ({
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ if (textDefinitions.length !== textRendererIds.length) {
5
5
  throw new Error('@file-viewer/renderer-text could not locate the shared code/markdown format definitions.');
6
6
  }
7
7
  export const textRendererDefinitions = textDefinitions;
8
- export const renderFileViewerCode = (buffer, target, type) => import('./code.js').then(({ default: renderCode }) => renderCode(buffer, target, type));
8
+ export const renderFileViewerCode = (buffer, target, type, context) => import('./code.js').then(({ default: renderCode }) => renderCode(buffer, target, type, context));
9
9
  export const renderFileViewerMarkdown = (buffer, target) => import('./markdown.js').then(({ default: renderMarkdown }) => renderMarkdown(buffer, target));
10
10
  export const textRenderer = {
11
11
  id: 'file-viewer-renderer-text',
package/dist/patch.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { type FileViewerRenderedInstance } from '@file-viewer/core';
2
- export default function renderPatch(buffer: ArrayBuffer, target: HTMLDivElement, type?: string): Promise<FileViewerRenderedInstance>;
1
+ import { type FileRenderContext, type FileViewerRenderedInstance } from '@file-viewer/core';
2
+ export default function renderPatch(buffer: ArrayBuffer, target: HTMLDivElement, type?: string, _context?: FileRenderContext): Promise<FileViewerRenderedInstance>;
package/dist/patch.js CHANGED
@@ -64,7 +64,7 @@ const escapeHtml = (value) => {
64
64
  return entities[char];
65
65
  });
66
66
  };
67
- export default async function renderPatch(buffer, target, type = 'patch') {
67
+ export default async function renderPatch(buffer, target, type = 'patch', _context) {
68
68
  const documentRef = target.ownerDocument || document;
69
69
  const text = await readText(buffer);
70
70
  let zoom = 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/renderer-text",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Standalone code, text, Markdown, patch diff, and Git bundle renderer plugin for Flyfish File Viewer.",
@@ -57,7 +57,7 @@
57
57
  "LICENSE"
58
58
  ],
59
59
  "dependencies": {
60
- "@file-viewer/core": "^2.1.1",
60
+ "@file-viewer/core": "^2.1.3",
61
61
  "diff2html": "^3.4.56",
62
62
  "highlight.js": "^11.11.1",
63
63
  "marked": "^18.0.5",