jwebsite/_libs/lunr/build_index.js

104 lines
2.8 KiB
JavaScript
Executable File

var path = require("path");
var fs = require("fs");
var lunr = require("lunr");
var cheerio = require("cheerio");
// don't modify this, it'll be modified on the fly by lunr() in Franklin
const PATH_PREPEND = "..";
const HTML_FOLDER = "../../__site";
const OUTPUT_INDEX = "lunr_index.js";
function isHtml(filename) {
lower = filename.toLowerCase();
return (lower.endsWith(".htm") || lower.endsWith(".html"));
}
function findHtml(folder) {
if (!fs.existsSync(folder)) {
console.log("Could not find folder: ", folder);
return;
}
var files = fs.readdirSync(folder);
var htmls = [];
for (var i = 0; i < files.length; i++) {
var filename = path.join(folder, files[i]);
var stat = fs.lstatSync(filename);
if (stat.isDirectory()) {
if (stat == "assets" || stat == "css" || stat == "libs" ) {
continue
}
var recursed = findHtml(filename);
for (var j = 0; j < recursed.length; j++) {
recursed[j] = path.join(files[i], recursed[j]).replace(/\\/g, "/");
}
htmls.push.apply(htmls, recursed);
}
else if (isHtml(filename)){
htmls.push(files[i]);
};
};
return htmls;
};
function readHtml(root, file, fileId) {
var filename = path.join(root, file);
var txt = fs.readFileSync(filename).toString();
var $ = cheerio.load(txt);
var title = $("title").text();
if (typeof title == 'undefined') title = file;
var body = $("body").text()
if (typeof body == 'undefined') body = "";
var data = {
"id": fileId,
"l": filename,
"t": title,
"b": body
}
return data;
}
function buildIndex(docs) {
var idx = lunr(function () {
this.ref('id');
this.field('t'); // title
this.field('b'); // body
docs.forEach(function (doc) {
this.add(doc);
}, this);
});
return idx;
}
function buildPreviews(docs) {
var result = {};
for (var i = 0; i < docs.length; i++) {
var doc = docs[i];
result[doc["id"]] = {
"t": doc["t"],
"l": doc["l"].replace(/^\.\.\/\.\.\/__site/gi, '/' + PATH_PREPEND)
}
}
return result;
}
function main() {
files = findHtml(HTML_FOLDER);
var docs = [];
for (var i = 0; i < files.length; i++) {
docs.push(readHtml(HTML_FOLDER, files[i], i));
}
var idx = buildIndex(docs);
var prev = buildPreviews(docs);
var js = "const LUNR_DATA = " + JSON.stringify(idx) + ";\n" +
"const PREVIEW_LOOKUP = " + JSON.stringify(prev) + ";";
fs.writeFile(OUTPUT_INDEX, js, function(err) {
if(err) {
return console.log(err);
}
});
}
main();