Skip to content

Commit d217dd9

Browse files
committed
refactor
1 parent 9943219 commit d217dd9

File tree

5 files changed

+44
-57
lines changed

5 files changed

+44
-57
lines changed

web_src/js/features/file-view.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
1-
import {findFileRenderPlugin} from '../modules/file-render-plugin.ts';
1+
import type {FileRenderPlugin} from '../render/plugin.ts';
2+
import {newRenderPlugin3DViewer} from '../render/plugins/3d-viewer.ts';
3+
import {newRenderPluginPdfViewer} from '../render/plugins/pdf-viewer.ts';
24
import {registerGlobalInitFunc} from '../modules/observer.ts';
35
import {createElementFromHTML} from '../utils/dom.ts';
4-
import {register3DViewerPlugin} from '../render/plugins/3d-viewer.ts';
5-
import {registerPdfViewerPlugin} from '../render/plugins/pdf-viewer.ts';
66
import {htmlEscape} from 'escape-goat';
77
import {basename} from '../utils.ts';
88

9-
export function initFileViewRender(): void {
10-
let pluginRegistered = false;
9+
const plugins: FileRenderPlugin[] = [];
10+
11+
function initPluginsOnce(): void {
12+
if (plugins.length) return;
13+
plugins.push(newRenderPlugin3DViewer(), newRenderPluginPdfViewer());
14+
}
1115

16+
function findFileRenderPlugin(filename: string, mimeType: string): FileRenderPlugin | null {
17+
return plugins.find((plugin) => plugin.canHandle(filename, mimeType)) || null;
18+
}
19+
20+
export function initFileViewRender(): void {
1221
registerGlobalInitFunc('initFileViewRender', async (container: HTMLElement) => {
13-
if (!pluginRegistered) {
14-
pluginRegistered = true;
15-
register3DViewerPlugin();
16-
registerPdfViewerPlugin();
17-
}
22+
initPluginsOnce();
1823

1924
const rawFileLink = container.getAttribute('data-raw-file-link');
2025
const mimeType = container.getAttribute('data-mime-type') || ''; // not used yet

web_src/js/modules/file-render-plugin.ts

Lines changed: 0 additions & 26 deletions
This file was deleted.

web_src/js/render/plugin.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export type FileRenderPlugin = {
2+
// unique plugin name
3+
name: string;
4+
5+
// test if plugin can handle a specified file
6+
canHandle: (filename: string, mimeType: string) => boolean;
7+
8+
// render file content
9+
render: (container: HTMLElement, fileUrl: string, options?: any) => Promise<void>;
10+
}
Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
1-
import type {FileRenderPlugin} from '../../modules/file-render-plugin.ts';
2-
import {registerFileRenderPlugin} from '../../modules/file-render-plugin.ts';
1+
import type {FileRenderPlugin} from '../plugin.ts';
2+
import {extname} from '../../utils.ts';
33

4-
/**
5-
* 3D model file render plugin
6-
*
7-
* support common 3D model file formats, use online-3d-viewer library for rendering
8-
*/
9-
export function register3DViewerPlugin(): void {
10-
// supported 3D file extensions
4+
// support common 3D model file formats, use online-3d-viewer library for rendering
5+
export function newRenderPlugin3DViewer(): FileRenderPlugin {
6+
// Some extensions are text-based formats:
7+
// .3mf .amf .brep: XML
8+
// .fbx: XML or BINARY
9+
// .dae .gltf: JSON
10+
// .ifc, .igs, .iges, .stp, .step are: TEXT
11+
// .stl .ply: TEXT or BINARY
12+
// .obj .off .wrl: TEXT
13+
// TODO: So we need to be able to render when the file is recognized as plaintext file by backend
1114
const SUPPORTED_EXTENSIONS = [
1215
'.3dm', '.3ds', '.3mf', '.amf', '.bim', '.brep',
1316
'.dae', '.fbx', '.fcstd', '.glb', '.gltf',
1417
'.ifc', '.igs', '.iges', '.stp', '.step',
1518
'.stl', '.obj', '.off', '.ply', '.wrl',
1619
];
1720

18-
// create and register plugin
19-
const plugin: FileRenderPlugin = {
21+
return {
2022
name: '3d-model-viewer',
2123

22-
// check if file extension is a supported 3D file
2324
canHandle(filename: string, _mimeType: string): boolean {
24-
const ext = filename.substring(filename.lastIndexOf('.')).toLowerCase();
25+
const ext = extname(filename).toLowerCase();
2526
return SUPPORTED_EXTENSIONS.includes(ext);
2627
},
2728

28-
// render 3D model
2929
async render(container: HTMLElement, fileUrl: string): Promise<void> {
3030
const OV = await import(/* webpackChunkName: "online-3d-viewer" */'online-3d-viewer');
3131
container.classList.add('model3d-content');
@@ -37,6 +37,4 @@ export function register3DViewerPlugin(): void {
3737
viewer.LoadModelFromUrlList([fileUrl]);
3838
},
3939
};
40-
41-
registerFileRenderPlugin(plugin);
4240
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import type {FileRenderPlugin} from '../../modules/file-render-plugin.ts';
2-
import {registerFileRenderPlugin} from '../../modules/file-render-plugin.ts';
1+
import type {FileRenderPlugin} from '../plugin.ts';
32

4-
export function registerPdfViewerPlugin(): void {
5-
const plugin: FileRenderPlugin = {
3+
export function newRenderPluginPdfViewer(): FileRenderPlugin {
4+
return {
65
name: 'pdf-viewer',
6+
77
canHandle(filename: string, _mimeType: string): boolean {
88
return filename.toLowerCase().endsWith('.pdf');
99
},
10+
1011
async render(container: HTMLElement, fileUrl: string): Promise<void> {
1112
const PDFObject = await import(/* webpackChunkName: "pdfobject" */'pdfobject');
1213
// TODO: the PDFObject library does not support dynamic height adjustment,
@@ -16,5 +17,4 @@ export function registerPdfViewerPlugin(): void {
1617
}
1718
},
1819
};
19-
registerFileRenderPlugin(plugin);
2020
}

0 commit comments

Comments
 (0)