You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
8.2 KiB
269 lines
8.2 KiB
// .vuepress/get_sidebar.js |
|
|
|
import path from "path"; |
|
import fs from "fs"; |
|
import readline from "readline"; |
|
|
|
function getEntryArray(parent) { |
|
let returnEntryArray = null; |
|
//console.log("getEntryArray(): parent"); |
|
//console.log(parent); |
|
//Gets returns the child array |
|
//if (parent === "undefined") { |
|
// return []; |
|
//} |
|
|
|
if (Array.isArray(parent)) { |
|
//This parent is an array, so return it (it is the sidebar top level) |
|
returnEntryArray = parent; |
|
//console.log("isArray"); |
|
} |
|
parent.items = parent?.items ? parent.items : []; |
|
//console.log("isNotArray"); |
|
//console.log("returnEntryArray:"); |
|
returnEntryArray = parent.items; |
|
//console.log(returnEntryArray); |
|
return returnEntryArray; |
|
} |
|
|
|
function parseGitbookSidebarToVuepress(sidebarContent, lang, section) { |
|
const lines = sidebarContent.split("\n"); |
|
|
|
const newSidebar = []; |
|
|
|
let first_iteration = true; |
|
let indent_divider = 0; |
|
|
|
const parents = []; |
|
//console.log("parents - empty after creaton"); |
|
//console.log(parents); |
|
|
|
const topLevelParent = { |
|
title: "DUMMY", |
|
path: "DUMMY", |
|
//level: "0", |
|
//items: [], |
|
}; |
|
topLevelParent.items = []; |
|
//console.log("topLevelParent - empty after creaton"); |
|
//console.log(topLevelParent); |
|
|
|
parents.push(topLevelParent); // So last item is always the sidebar |
|
//console.log("parents after pushing topLevelParent:"); |
|
//console.log(parents); |
|
|
|
let current_parent; |
|
|
|
let lastlevel = 0; |
|
let last_item; |
|
|
|
//let currentSection; |
|
//let currentLevel = 0; |
|
|
|
lines.forEach((line) => { |
|
if (line.startsWith("#") || line.trim() === "") { |
|
// Ignore lines that start with "#" or are empty |
|
// Note, we should perhaps create sections for these. TBD. |
|
return; |
|
} |
|
|
|
//console.log("DEBUG: Line: " + line); |
|
|
|
let regex = /(\s*?)[\*-]\s\[(.*?)\]\((.*?)\)/g; |
|
|
|
let indent_level = ""; |
|
let link_title = ""; |
|
let link_url = ""; |
|
let link_path = ""; |
|
|
|
try { |
|
//console.log(`DEBUG: Lastitem at start: ${JSON.stringify(last_item)}`); |
|
let match = regex.exec(line); |
|
//console.log('0: '+ match[0]) |
|
indent_level = match[1].length; |
|
link_title = match[2]; |
|
link_url = match[3].trim(); |
|
link_path = link_url; |
|
} catch (err) { |
|
//Just skip empty lines that don't match |
|
console.log(err); |
|
console.log("DEBUG: Couldn't match line, skip line using return"); |
|
return; |
|
} |
|
|
|
try { |
|
/* |
|
if (link_url.endsWith("README.md")) { |
|
link_url = link_url.replace("README.md", ""); |
|
} |
|
*/ |
|
if (link_url.endsWith(".md")) { |
|
link_url = link_url.replace(".md", ".html"); |
|
//link_path = link_path.replace(".md", ".html"); |
|
} |
|
|
|
if (!link_url.startsWith("http")) { |
|
if (lang) { |
|
link_url = `/${lang}/${link_url}`; |
|
} else { |
|
link_url = `/${link_url}`; |
|
} |
|
} |
|
|
|
//Tidy up some of the title escaping that isn't used by VuePress |
|
link_title = link_title.replace("\\(", "("); |
|
link_title = link_title.replace("\\)", ")"); |
|
link_title = link_title.replace("\\_", "_"); |
|
|
|
//set indent_divider level (easier to think in levels, numbers of zero prefixes) |
|
if ((indent_divider == 0) & (indent_level > 0.0)) { |
|
indent_divider = indent_level; |
|
} |
|
if (indent_divider > 0) { |
|
indent_level = indent_level / indent_divider; |
|
} |
|
|
|
let entry = { |
|
text: link_title, |
|
link: link_url, |
|
//collapsed: true, |
|
//link_path, |
|
//level: indent_level, |
|
//collapsible: true, |
|
}; |
|
//console.log("entry:"); |
|
//console.log(entry); |
|
|
|
//console.log("parents:"); |
|
//console.log(parents); |
|
//console.log("current_parent - before pop"); |
|
//console.log(current_parent); |
|
current_parent = parents.pop(); |
|
//console.log("current_parent - after pop"); |
|
//console.log(current_parent); |
|
|
|
//console.log(`XX ST: indent: ${indent_level} lastlevel: ${lastlevel}`); |
|
if (indent_level == lastlevel) { |
|
//console.log(`XX EQ:`); |
|
//console.log(current_parent); |
|
const parentArray = getEntryArray(current_parent); |
|
parentArray.push(entry); |
|
//console.log("current_parent after pushing last entry"); |
|
//console.log(current_parent); |
|
|
|
//console.log("eq parents before pushing back current parent"); |
|
//console.log(parents); |
|
parents.push(current_parent); |
|
//console.log("EQ parents after pushing current parent"); |
|
//console.log(parents); |
|
|
|
//console.log("XX EQ3"); |
|
} else if (indent_level > lastlevel) { |
|
//console.log("XX NEST"); |
|
//console.log( |
|
// ` DEBUG:NEST: lastlev: ${lastlevel}/indent lev: ${indent_level}` |
|
// ); |
|
// This is a child of the last element added to current parent |
|
|
|
//console.log(current_parent); |
|
//console.log("NEST: current_parent - after pop"); |
|
//console.log("NEST: parents before"); |
|
//console.log(parents); |
|
|
|
const parentArray = getEntryArray(current_parent); |
|
|
|
//console.log( |
|
// "parentArray - we want to add entry to last entry in this array." |
|
//); |
|
//console.log(parentArray); |
|
|
|
//Get the last element |
|
//console.log(`how many elements in array ${parentArray.length}`); |
|
// |
|
const lastElement = parentArray.pop(); |
|
lastElement.collapsed = true; |
|
//console.log(`NEST: last element in array:`); |
|
//console.log(lastElement); |
|
const lastElementArray = getEntryArray(lastElement); |
|
//console.log(`NEST: last element array:`); |
|
lastElementArray.push(entry); |
|
//console.log(`NEST: last element after pushing event:`); |
|
//console.log(lastElement); |
|
// Push the last element back on to the parentArray |
|
parentArray.push(lastElement); |
|
//push current parent onto the parents array |
|
parents.push(current_parent); |
|
// push the element we just edited back onto the array so it can be current parent. |
|
parents.push(lastElement); |
|
//console.log("NEST: parents after"); |
|
//console.log(parents); |
|
} else if (indent_level < lastlevel) { |
|
// gone up a level |
|
//console.log(`XX UP`); |
|
while (indent_level < lastlevel--) { |
|
//console.log(`pop ${lastlevel}`); |
|
//Here we have no item. Group has finished (with a group) |
|
//So add the current parent (finished) to its parent. |
|
//console.log('DEBUG: Gone UP from level: '+ indent_level + ' TO: ' + lastlevel) |
|
|
|
current_parent = parents.pop(); |
|
} |
|
const parentArray = getEntryArray(current_parent); |
|
parentArray.push(entry); |
|
//console.log("current_parent after pushing last entry"); |
|
//console.log(current_parent); |
|
|
|
//console.log("eq parents before pushing back current parent"); |
|
//console.log(parents); |
|
parents.push(current_parent); |
|
} |
|
|
|
//console.log("AFTER ADDING Entry:"); |
|
//console.log("entry:"); |
|
//console.log(entry); |
|
//console.log("parents:"); |
|
//console.log(parents); |
|
} catch (err) { |
|
console.log(err); |
|
console.log(` DEBUG SOME ACTUAL PROBLEMXX2: ${err}`); |
|
} |
|
|
|
//last_item = entry; |
|
|
|
lastlevel = indent_level; //reset |
|
//console.log(`END OF ONE LINE:${indent_level} lastlevel: ${lastlevel}`); |
|
//console.log("PARENTS"); |
|
//console.log(JSON.stringify(parents)); |
|
}); |
|
|
|
//all lines done |
|
//console.log("All lines done parents:"); |
|
//console.log(JSON.stringify(parents)); |
|
|
|
//console.log("topLevelParent"); |
|
//console.log(topLevelParent); |
|
return topLevelParent.items; |
|
} |
|
|
|
module.exports = { |
|
sidebar: function ({ lang = "", section = "" }) { |
|
const summaryfile_path = path.resolve(__dirname, "..", lang, "SUMMARY.md"); |
|
//console.log("DEBUG: summaryfile_path: " + summaryfile_path); |
|
let data = ""; |
|
|
|
try { |
|
// read contents of the file |
|
data = fs.readFileSync(summaryfile_path, "UTF-8"); |
|
} catch (err) { |
|
console.log( |
|
`DEBUG: ${lang} (${summaryfile_path}) - SIDEBAR DEFINITION NOT FOUND`, |
|
); |
|
} |
|
|
|
const module_sidebar = parseGitbookSidebarToVuepress(data, lang); |
|
//console.log(`DEBUG: Before`); |
|
//console.log(`DEBUG: ${JSON.stringify(module_sidebar)}`); |
|
//console.log(`DEBUG: After`); |
|
return module_sidebar; |
|
}, |
|
};
|
|
|