165 lines
6.1 KiB
JavaScript
165 lines
6.1 KiB
JavaScript
// MNote debug /tree shell filetree row normalization helpers.
|
|
|
|
import {
|
|
normalizeTreeShellNumber,
|
|
normalizeTreeShellText,
|
|
} from "./tree-shell-state-runtime.js";
|
|
|
|
export function buildFileTreeRuntimeEnvironment(runtimeContext) {
|
|
const fileTreeRowById = runtimeContext.fileTreeRowById || new Map();
|
|
return {
|
|
visibleRowIds: Array.isArray(runtimeContext.visibleFileTreeRowIds)
|
|
? runtimeContext.visibleFileTreeRowIds
|
|
: [],
|
|
rows: Array.from(fileTreeRowById.values()).map((entry) => ({
|
|
rowId: entry.rowId,
|
|
rowKind: entry.rowKind,
|
|
documentId: entry.documentId || null,
|
|
assetId: entry.assetId || null,
|
|
})),
|
|
rootUri: runtimeContext.sourceKind === "local_folder" ? runtimeContext.rootUri || null : null,
|
|
};
|
|
}
|
|
|
|
export function compareTreeShellItems(left, right) {
|
|
const byPosition = left.position - right.position;
|
|
if (byPosition !== 0) return byPosition;
|
|
return left.title.localeCompare(right.title, "zh-CN");
|
|
}
|
|
|
|
export function normalizeTreeShellResourceMeta(value) {
|
|
if (!value || typeof value !== "object") {
|
|
return {
|
|
resourceKind: "",
|
|
documentId: "",
|
|
assetId: "",
|
|
assetKind: "",
|
|
objectIdentity: null,
|
|
blockAssetRelation: null,
|
|
};
|
|
}
|
|
const objectIdentity =
|
|
value?.objectIdentity && typeof value.objectIdentity === "object"
|
|
? value.objectIdentity
|
|
: null;
|
|
const blockAssetRelation =
|
|
value?.blockAssetRelation && typeof value.blockAssetRelation === "object"
|
|
? value.blockAssetRelation
|
|
: null;
|
|
return {
|
|
resourceKind: normalizeTreeShellText(value?.resourceKind),
|
|
documentId: normalizeTreeShellText(value?.documentId),
|
|
assetId: normalizeTreeShellText(value?.assetId),
|
|
assetKind: normalizeTreeShellText(value?.assetKind),
|
|
objectIdentity,
|
|
blockAssetRelation,
|
|
};
|
|
}
|
|
|
|
export function normalizeTreeShellRowKind(value) {
|
|
const normalized = normalizeTreeShellText(value).toLowerCase();
|
|
if (normalized === "index") return "index";
|
|
if (normalized === "asset") return "asset";
|
|
if (normalized === "folder") return "folder";
|
|
if (normalized === "markdown") return "markdown";
|
|
if (normalized === "asset_folder") return "asset_folder";
|
|
return "document";
|
|
}
|
|
|
|
export function normalizeTreeShellTreeItems(items, options = {}) {
|
|
const excludedIds = options.excludedIds instanceof Set ? options.excludedIds : new Set();
|
|
return Array.isArray(items)
|
|
? items
|
|
.map((item) => {
|
|
const nodeId = normalizeTreeShellText(item?.nodeId);
|
|
const resourceMeta = normalizeTreeShellResourceMeta(item?.resourceMeta);
|
|
const rowKind = normalizeTreeShellRowKind(item?.rowKind);
|
|
const fallbackRowId =
|
|
rowKind === "index"
|
|
? `index:${resourceMeta.documentId || nodeId.replace(/^index:/, "")}`
|
|
: rowKind === "asset"
|
|
? `asset:${resourceMeta.assetId || nodeId.replace(/^asset:/, "")}`
|
|
: rowKind === "asset_folder"
|
|
? `asset-folder:${resourceMeta.assetId || nodeId.replace(/^asset-folder:/, "")}`
|
|
: `doc:${resourceMeta.documentId || nodeId}`;
|
|
return {
|
|
rowId: normalizeTreeShellText(item?.rowId, fallbackRowId),
|
|
rowKind,
|
|
nodeId,
|
|
parentNodeId: normalizeTreeShellText(item?.parentNodeId) || null,
|
|
title: normalizeTreeShellText(item?.title, rowKind === "index" ? "index.md" : "无标题"),
|
|
depth: normalizeTreeShellNumber(item?.depth, 0),
|
|
childCount: normalizeTreeShellNumber(item?.childCount, 0),
|
|
position: normalizeTreeShellNumber(item?.position),
|
|
expandedByDefault: item?.expandedByDefault !== false,
|
|
iconHint: normalizeTreeShellText(item?.iconHint),
|
|
capabilities: Array.isArray(item?.capabilities)
|
|
? item.capabilities
|
|
.map((capability) => normalizeTreeShellText(capability))
|
|
.filter(Boolean)
|
|
: [],
|
|
resourceMeta,
|
|
};
|
|
})
|
|
.filter((item) => item.nodeId && !excludedIds.has(item.nodeId))
|
|
: [];
|
|
}
|
|
|
|
export function getFileTreeRowDocumentId(item) {
|
|
if (!item) return "";
|
|
if (item.rowKind === "document" || item.rowKind === "markdown") return item.nodeId;
|
|
if (item.rowKind === "index") return item.nodeId.replace(/^index:/, "");
|
|
return "";
|
|
}
|
|
|
|
export function getFileTreeRowOwnerDocumentId(item) {
|
|
if (!item) return "";
|
|
if (item.resourceMeta?.documentId) return item.resourceMeta.documentId;
|
|
return getFileTreeRowDocumentId(item);
|
|
}
|
|
|
|
export function getFileTreeRowAssetId(item) {
|
|
if (!item) return "";
|
|
if (item.resourceMeta?.assetId) return item.resourceMeta.assetId;
|
|
if (item.rowKind === "asset") return item.nodeId.replace(/^asset:/, "");
|
|
if (item.rowKind === "asset_folder") return item.nodeId.replace(/^asset-folder:/, "");
|
|
return "";
|
|
}
|
|
|
|
export function getFileTreeRowIconKind(item) {
|
|
if (!item) return "file";
|
|
const iconHint = normalizeTreeShellText(item.iconHint).toLowerCase();
|
|
if (iconHint === "mindmap") return "mindmap";
|
|
if (iconHint === "table") return "table";
|
|
if (iconHint === "index") return "index";
|
|
if (iconHint === "page") return "page";
|
|
if (item.rowKind === "document") return "page";
|
|
if (item.rowKind === "folder") return "folder";
|
|
if (item.rowKind === "markdown") return "file";
|
|
if (item.rowKind === "index") return "index";
|
|
if (item.rowKind === "asset_folder") return "mindmap";
|
|
if (item.resourceMeta?.resourceKind === "table") return "table";
|
|
if (item.resourceMeta?.resourceKind === "mindmap") return "mindmap";
|
|
return "file";
|
|
}
|
|
|
|
export function getFileTreeRowMetaLabel(item) {
|
|
if (!item) return "";
|
|
if (item.rowKind === "document") {
|
|
return `${getFileTreeRowDocumentId(item)} · 页面`;
|
|
}
|
|
if (item.rowKind === "folder") {
|
|
return "本地文件夹";
|
|
}
|
|
if (item.rowKind === "markdown") {
|
|
return `${getFileTreeRowDocumentId(item)} · Markdown`;
|
|
}
|
|
if (item.rowKind === "index") {
|
|
return "页面正文";
|
|
}
|
|
if (item.rowKind === "asset_folder") {
|
|
return `${item.resourceMeta?.resourceKind || "mindmap"} · 资源目录`;
|
|
}
|
|
return `${item.resourceMeta?.resourceKind || item.resourceMeta?.assetKind || "asset"} · ${getFileTreeRowAssetId(item)}`;
|
|
}
|