joplin/CliClient/app/build-doc.js

142 lines
3.7 KiB
JavaScript

const fs = require("fs-extra");
const { fileExtension, basename, dirname } = require("lib/path-utils.js");
const wrap_ = require("word-wrap");
const { _, setLocale, languageCode } = require("lib/locale.js");
const rootDir = dirname(dirname(__dirname));
const MAX_WIDTH = 78;
const INDENT = " ";
function wrap(text, indent) {
return wrap_(text, {
width: MAX_WIDTH - indent.length,
indent: indent,
});
}
function renderOptions(options) {
let output = [];
const optionColWidth = getOptionColWidth(options);
for (let i = 0; i < options.length; i++) {
let option = options[i];
const flag = option[0];
const indent = INDENT + INDENT + " ".repeat(optionColWidth + 2);
let r = wrap(option[1], indent);
r = r.substr(flag.length + (INDENT + INDENT).length);
r = INDENT + INDENT + flag + r;
output.push(r);
}
return output.join("\n");
}
function renderCommand(cmd) {
let output = [];
output.push(INDENT + cmd.usage());
output.push("");
output.push(wrap(cmd.description(), INDENT + INDENT));
const optionString = renderOptions(cmd.options());
if (optionString) {
output.push("");
output.push(optionString);
}
return output.join("\n");
}
function getCommands() {
let output = [];
fs.readdirSync(__dirname).forEach(path => {
if (path.indexOf("command-") !== 0) return;
const ext = fileExtension(path);
if (ext != "js") return;
let CommandClass = require("./" + path);
let cmd = new CommandClass();
if (!cmd.enabled()) return;
if (cmd.hidden()) return;
output.push(cmd);
});
return output;
}
function getOptionColWidth(options) {
let output = 0;
for (let j = 0; j < options.length; j++) {
const option = options[j];
if (option[0].length > output) output = option[0].length;
}
return output;
}
function getHeader() {
let output = [];
output.push("NAME");
output.push("");
output.push(wrap("joplin - a note taking and to-do app with synchronisation capabilities"), INDENT);
output.push("");
output.push("DESCRIPTION");
output.push("");
let description = [];
description.push("Joplin is a note taking and to-do application, which can handle a large number of notes organised into notebooks.");
description.push("The notes are searchable, can be copied, tagged and modified with your own text editor.");
description.push("\n\n");
description.push("The notes can be synchronised with various target including the file system (for example with a network directory) or with Microsoft OneDrive.");
description.push("\n\n");
description.push(
"Notes exported from Evenotes via .enex files can be imported into Joplin, including the formatted content, resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.)."
);
output.push(wrap(description.join(""), INDENT));
return output.join("\n");
}
function getFooter() {
let output = [];
output.push("WEBSITE");
output.push("");
output.push(INDENT + "http://joplin.cozic.net");
output.push("");
output.push("LICENSE");
output.push("");
let filePath = rootDir + "/LICENSE_" + languageCode();
if (!fs.existsSync(filePath)) filePath = rootDir + "/LICENSE";
const licenseText = fs.readFileSync(filePath, "utf8");
output.push(wrap(licenseText, INDENT));
return output.join("\n");
}
async function main() {
// setLocale('fr_FR');
const commands = getCommands();
let commandBlocks = [];
for (let i = 0; i < commands.length; i++) {
let cmd = commands[i];
commandBlocks.push(renderCommand(cmd));
}
const headerText = getHeader();
const commandsText = commandBlocks.join("\n\n");
const footerText = getFooter();
console.info(headerText + "\n\n" + "USAGE" + "\n\n" + commandsText + "\n\n" + footerText);
}
main().catch(error => {
console.error(error);
});