@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 +2 -2
- package/dist/code.js +6 -5
- package/dist/gitBundle.d.ts +2 -2
- package/dist/gitBundle.js +31 -27
- package/dist/index.js +1 -1
- package/dist/patch.d.ts +2 -2
- package/dist/patch.js +1 -1
- package/package.json +2 -2
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`);
|
package/dist/gitBundle.d.ts
CHANGED
|
@@ -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('
|
|
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('
|
|
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
|
-
['
|
|
461
|
-
['
|
|
462
|
-
['
|
|
463
|
-
['
|
|
464
|
-
['
|
|
465
|
-
['
|
|
466
|
-
['
|
|
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', '
|
|
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
|
|
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,
|
|
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', '
|
|
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', '
|
|
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.
|
|
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.
|
|
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",
|