Files
mnote/rust/crates/mnote-web/browser/resource-open-runtime.js
T

109 lines
4.6 KiB
JavaScript

// MNote 资源打开运行时外置模块。
// 当前先承接 SIDEBAR_TREE_JS 中的低风险纯辅助函数。
// 本文件以 type="module" 加载,执行时机可能晚于 inline script。
// SIDEBAR_TREE_JS 会在运行时优先委托到 window.__mnoteResourceOpenRuntime。
// 模块尚未加载或加载失败时,inline script 保留原实现兜底。
function localFilePathFromAssetId(assetId) {
var value = String(assetId || '').trim();
return value.indexOf('local-file:') === 0
? value.slice('local-file:'.length)
: value.indexOf('local:asset:') === 0
? value.slice('local:asset:'.length)
: '';
}
function buildLocalFileOpenUrl(relativePath, download) {
var rootUri = currentRootUri();
if (!rootUri || !relativePath) return '';
var url = new URL('/api/local-folder/files/open', window.location.origin);
url.searchParams.set('rootUri', rootUri);
url.searchParams.set('path', relativePath);
if (download) url.searchParams.set('download', 'true');
return url.toString();
}
function buildPdfPreviewOpenUrl(fileUrl, fileName) {
var rawUrl = String(fileUrl || '').trim();
if (!rawUrl) return '';
var url = new URL('/pdf-preview', window.location.origin);
url.searchParams.set('fileUrl', rawUrl);
if (fileName) url.searchParams.set('fileName', fileName);
return url.toString();
}
function shouldUseOfficePreview(fileType, mode) {
var normalizedMode = String(mode || 'view').trim().toLowerCase();
if (normalizedMode === 'edit') return false;
var ext = String(fileType || '').trim().toLowerCase();
return ['docx', 'xlsx', 'xls', 'csv', 'pptx'].indexOf(ext) >= 0;
}
function buildOfficePreviewOpenUrl(input) {
var target = new URL('/office-preview', window.location.origin);
var workspacePath = input && input.workspacePath && typeof input.workspacePath === 'object' ? input.workspacePath : {};
var fileUrl = String(input.fileUrl || '').trim();
if (fileUrl) {
try {
fileUrl = new URL(fileUrl, window.location.origin).toString();
} catch (_error) {}
}
target.searchParams.set('fileUrl', fileUrl);
target.searchParams.set('fileName', input.fileName || '未命名资源');
target.searchParams.set('fileType', input.fileType || 'docx');
if (input.assetId) target.searchParams.set('assetId', input.assetId);
if (input.documentId) target.searchParams.set('documentId', input.documentId);
if (input.userId) target.searchParams.set('userId', input.userId);
var workspaceId = String(input.workspaceId || workspacePath.workspaceId || '').trim();
var sourceKind = String(input.sourceKind || workspacePath.sourceKind || currentSourceKind() || '').trim();
var rootUri = String(input.rootUri || workspacePath.rootUri || currentRootUri() || '').trim();
if (workspaceId) target.searchParams.set('workspaceId', workspaceId);
if (sourceKind) target.searchParams.set('sourceKind', sourceKind);
if (rootUri) target.searchParams.set('rootUri', rootUri);
return target.toString();
}
function buildOnlyOfficeOpenPath(input) {
if (shouldUseOfficePreview(input.fileType, input.mode)) {
return buildOfficePreviewOpenUrl(input);
}
var params = new URLSearchParams();
params.set('fileUrl', input.fileUrl || '');
params.set('fileName', input.fileName || '未命名资源');
params.set('fileType', input.fileType || 'docx');
if (input.assetId) params.set('assetId', input.assetId);
if (input.documentId) params.set('documentId', input.documentId);
if (input.userId) params.set('userId', input.userId);
params.set('mode', input.mode || 'view');
if (input.documentId && input.assetId) {
return '/office/' + encodeURIComponent(input.documentId) + '/' + encodeURIComponent(input.assetId) + '?' + params.toString();
}
return '/onlyoffice?' + params.toString();
}
function currentRootUri() {
var params = new URLSearchParams(window.location.search);
var fromUrl = (params.get('rootUri') || '').trim();
if (fromUrl) return fromUrl;
return document.body instanceof HTMLElement
? (document.body.getAttribute('data-mnote-root-uri') || '').trim()
: '';
}
function currentSourceKind() {
var params = new URLSearchParams(window.location.search);
var fromUrl = (params.get('sourceKind') || '').trim();
if (fromUrl) return fromUrl;
return document.body instanceof HTMLElement
? (document.body.getAttribute('data-mnote-source-kind') || '').trim()
: '';
}
window.__mnoteResourceOpenRuntime = {
localFilePathFromAssetId: localFilePathFromAssetId,
buildLocalFileOpenUrl: buildLocalFileOpenUrl,
buildPdfPreviewOpenUrl: buildPdfPreviewOpenUrl,
buildOfficePreviewOpenUrl: buildOfficePreviewOpenUrl,
buildOnlyOfficeOpenPath: buildOnlyOfficeOpenPath
};