@ng-doc/builder
Version:
<!-- PROJECT LOGO --> <br /> <div align="center"> <a href="https://github.com/ng-doc/ng-doc"> <img src="https://ng-doc.com/assets/images/ng-doc.svg?raw=true" alt="Logo" height="150px"> </a>
100 lines • 2.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildIndexes = buildIndexes;
const orama_1 = require("@orama/orama");
const plugin_parsedoc_1 = require("@orama/plugin-parsedoc");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const import_esm_1 = require("./import-esm");
/**
* Builds the indexes for a given content
* @param config
*/
async function buildIndexes(config) {
const pages = [];
const db = await (0, orama_1.create)({
schema: {
...plugin_parsedoc_1.defaultHtmlSchema,
},
});
const indexableContent = await removeNotIndexableContent(config.content);
await (0, plugin_parsedoc_1.populate)(db, indexableContent, 'html', {
transformFn: (node) => transformFn(node),
mergeStrategy: 'split',
});
let section;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
Object.values(db.data.docs.docs)
.filter(isIndexable)
.forEach((doc) => {
if (doc) {
if (isHeading(doc)) {
section = doc;
}
else {
pages.push({
breadcrumbs: config.breadcrumbs,
pageType: config.pageType,
title: config.title,
section: section?.content ?? '',
route: config.route,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
fragment: section?.properties && section.properties['id'],
content: doc.content,
});
}
}
});
return pages;
}
/**
*
* @param doc
*/
function isIndexable(doc) {
return !!doc?.content?.trim();
}
/**
*
* @param node
* @param doc
*/
function isHeading(doc) {
return (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(doc.type) &&
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
!!doc?.properties &&
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
!!doc.properties['id']);
}
/**
*
* @param node
* @param entity
*/
function transformFn(node) {
switch (node.tag) {
case 'strong':
case 'a':
case 'time':
case 'span':
case 'small':
case 'b':
case 'p':
case 'ul':
return { ...node, raw: `<p>${node.content}</p>` };
default:
return node;
}
}
/**
*
* @param html
*/
async function removeNotIndexableContent(html) {
return (0, rxjs_1.firstValueFrom)((0, rxjs_1.from)((0, import_esm_1.importEsm)('@ng-doc/utils')).pipe((0, operators_1.switchMap)((utils) => utils.removeNotIndexableContent(html))));
}
//# sourceMappingURL=build-indexes.js.map