@canalplus/readme.doc
Version:
Readme's an Extremely Accessible Documentation MakEr
111 lines (110 loc) • 3.61 kB
JavaScript
import { load } from "cheerio";
/**
* Generate search data linked to the given content.
* @param {string} contentHtml
* @returns {Array.<Object>}
*/
export default function getSearchDataForContent(contentHtml, fileURL) {
const indexForFile = [];
const $ = load(contentHtml);
const children = $("body").children().toArray();
let currentH1;
let currentH2;
let currentH3;
let currentH1Anchor;
let currentH2Anchor;
let currentH3Anchor;
const currentBody = [];
let currentLevel;
let lastAnchor;
for (let i = 0; i < children.length; i++) {
const child = children[i];
switch (child.name.toLowerCase()) {
case "a":
// TODO That's pretty ugly but it works for now.
// Find better solution
lastAnchor = children[i];
break;
case "h1":
anounceLastElement();
currentH1 = $(child).text();
currentH1Anchor = getAnchorName(lastAnchor);
currentH2 = undefined;
currentH2Anchor = undefined;
currentH3 = undefined;
currentH3Anchor = undefined;
currentLevel = "h1";
break;
case "h2":
anounceLastElement();
currentH2 = $(child).text();
currentH2Anchor = getAnchorName(lastAnchor);
currentH3 = undefined;
currentH3Anchor = undefined;
currentLevel = "h2";
break;
case "h3":
anounceLastElement();
currentH3 = $(child).text();
currentH3Anchor = getAnchorName(lastAnchor);
currentLevel = "h3";
break;
// case "pre":
// // code - do nothing?
// break;
default:
const text = $(child).text().replace(/\n/g, " ");
if (text !== undefined && text.length > 0) {
currentBody.push(text);
}
break;
}
}
anounceLastElement();
return indexForFile;
function anounceLastElement() {
if (currentLevel === "h3") {
const body = currentBody.length > 0 ? currentBody.join(" ") : "";
indexForFile.push({
fileURL,
h1: currentH1,
h2: currentH2,
h3: currentH3,
body,
anchorH1: currentH1Anchor,
anchorH2: currentH2Anchor,
anchorH3: currentH3Anchor,
});
}
else if (currentLevel === "h2") {
const body = currentBody.length > 0 ? currentBody.join(" ") : "";
indexForFile.push({
fileURL,
h1: currentH1,
h2: currentH2,
body,
anchorH1: currentH1Anchor,
anchorH2: currentH2Anchor,
});
}
else if (currentLevel === "h1") {
const body = currentBody.length > 0 ? currentBody.join(" ") : "";
indexForFile.push({
fileURL,
h1: currentH1,
body,
anchorH1: currentH1Anchor,
});
}
currentBody.length = 0;
}
function getAnchorName(elt) {
if (elt === undefined) {
return;
}
const name = $(elt).attr("name");
if (name !== undefined && name.length > 0) {
return name;
}
}
}