UNPKG

@paroicms/site-generator-plugin

Version:

ParoiCMS Site Generator Plugin

84 lines (83 loc) 2.91 kB
export function createGeneratedContentReport() { let totalEntryCount = 0; const llmReports = []; const internalIds = {}; const childNodeIds = new Map(); return { getResults() { return { entryCount: totalEntryCount, llmReports, idPicker: createIdPicker(internalIds, childNodeIds), }; }, add(entryCount, llmReport) { totalEntryCount += entryCount; if (llmReport) { llmReports.push(llmReport); } }, addId({ typeName, id: idOrIds, parentNodeId }) { for (const { language, nodeId } of Array.isArray(idOrIds) ? idOrIds : [idOrIds]) { let languageDict = internalIds[language]; if (!languageDict) { languageDict = {}; internalIds[language] = languageDict; } let nodeIds = languageDict[typeName]; if (!nodeIds) { nodeIds = new Set(); languageDict[typeName] = nodeIds; } nodeIds.add(nodeId); if (parentNodeId !== undefined) { let childIds = childNodeIds.get(parentNodeId); if (!childIds) { childIds = new Set(); childNodeIds.set(parentNodeId, childIds); } childIds.add(nodeId); } } }, }; } function createIdPicker(ids, childNodeIds) { const getNodeIdsByLanguageAndType = (language, typeName) => { const languageDict = ids[language]; if (!languageDict) return []; const nodeIds = languageDict[typeName]; if (!nodeIds) return []; return Array.from(nodeIds); }; const getNodeIdsByType = (typeName) => { const nodeIds = new Set(); for (const language of Object.keys(ids)) { const found = getNodeIdsByLanguageAndType(language, typeName); for (const id of found) { nodeIds.add(id); } } return Array.from(nodeIds); }; const getNodeIdsByParent = (parentNodeId) => { const nodeIds = childNodeIds.get(parentNodeId); if (!nodeIds) return []; return Array.from(nodeIds); }; const picker = { pickNodeIds(selector, count) { const nodeIds = "typeName" in selector ? getNodeIdsByType(selector.typeName) : getNodeIdsByParent(selector.parentNodeId); if (count === undefined || nodeIds.length <= count) return nodeIds; const shuffled = [...nodeIds].sort(() => Math.random() - 0.5); return shuffled.slice(0, count); }, }; return picker; }