@paroicms/site-generator-plugin
Version:
ParoiCMS Site Generator Plugin
84 lines (83 loc) • 2.91 kB
JavaScript
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;
}