109 lines
4.6 KiB
JavaScript
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
|
|
};
|