UNPKG

tstosc

Version:

A transpiler that convert TypeScript to SuperCollider's SCLang.

128 lines (121 loc) 6.13 kB
'use strict'; var ansis = require('ansis'); var console_cjs = require('./console.cjs'); var util_cjs = require('../util/util.cjs'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var ansis__default = /*#__PURE__*/_interopDefault(ansis); const lang_flag = Intl.DateTimeFormat().resolvedOptions().locale; const space_number_between_option_and_brief = 2; function showHelp(about = "") { function getHelp() { switch (lang_flag.split(/[-_]/)[0]) { case "en": return getEnHelpText(about); default: return getHelpTextDefaultLanguage(about); } } console.log(getHelp()); } function showBriefHelp() { console.log(getBriefHelp()); } function getBriefHelp() { switch (lang_flag.split(/[-_]/)[0]) { case "en": return getEnBriefHelpText(); default: return getBriefHelpTextDefaultLanguage(); } } const getHelpTextDefaultLanguage = getEnHelpText; const getBriefHelpTextDefaultLanguage = getEnBriefHelpText; function getEnFullHelpTextFrom(help_text_dict) { const description_of_tstosc = "" + console_cjs.bold("What is `tstosc` ?") + ` A transpiler that translate TypeScipt to SuperCollider's builtin language "SCLang". `; const caution_for_arg_order = "" + console_cjs.bold("Caution for Argument's Order") + "\n`tstosc` has " + console_cjs.italic("global option") + " and " + console_cjs.italic("positional option") + ". Global option comes after `tstosc`, and before the first file name/path argument. Positional option comes after file name/path, and being effective only on it. Here is the example on that:\n" + [ console_cjs.cmd("tstosc"), console_cjs.param("--global-option"), console_cjs.fileArg("a.ts"), console_cjs.param("--for-a-ts"), console_cjs.fileArg("b.ts"), console_cjs.param("--for-b-ts") ].join(" ") + "\n\n"; const how_to_see_detail_of_option = "" + console_cjs.bold("For Detailed Help on Option") + "\nPlease run `" + [console_cjs.cmd("tstosc"), console_cjs.param("-h"), console_cjs.fileArg("option-to-search")].join(" ") + "`, do not add dashes before the option that you want to search.\n\n"; const [option_and_brief__global, option_and_brief__positional] = util_cjs.bifilter( [...help_text_dict.keys()].map( (a) => { const info = help_text_dict.get(a); return [ console_cjs.param(`--${a}`) + console_cjs.dim(", ") + info.alias.map((a2) => console_cjs.param(a2.length > 1 ? `--${a2}` : `-${a2}`)).join(", "), info.brief ?? info.description, info.is_global ]; } ), /** Divide by whether `is_global` is true. */ (e) => e[2] ); const option_line_max_len = Math.max( Math.max(...[...option_and_brief__global, ...option_and_brief__positional].map((e) => e[0].ansi_length)), 30 // At least give 30 to column size, to make it look better. ); const brief_max_len = console_cjs.console_width - option_line_max_len - space_number_between_option_and_brief; function createOptionHelpTextList(option_and_brief) { return option_and_brief.map( ([option, brief]) => { const cut_brief = console_cjs.wrapText(brief, brief_max_len).split("\n"); const remaining_brief = cut_brief.slice(1); return ( // First line. option.padANSIStart(option_line_max_len) + " ".repeat(space_number_between_option_and_brief) + cut_brief[0] + // Second and following line, if exists. (remaining_brief.length > 0 ? "\n" + remaining_brief.map((b) => " ".repeat(option_line_max_len + space_number_between_option_and_brief) + b).join("\n") : "") ); } ).join("\n"); } const list_of_global_options_help_text = console_cjs.wrapText(console_cjs.bold("List of Global Option")) + "\n" + createOptionHelpTextList(option_and_brief__global) + "\n"; const list_of_positional_options_help_text = console_cjs.wrapText(console_cjs.bold("List of Positional Option")) + "\n" + createOptionHelpTextList(option_and_brief__positional) + "\n"; return console_cjs.wrapText(description_of_tstosc) + console_cjs.wrapText(caution_for_arg_order) + console_cjs.wrapText(how_to_see_detail_of_option) + list_of_global_options_help_text + "\n" + list_of_positional_options_help_text; } function findByAlias(help_text_dict, alias) { for (const value of help_text_dict.values()) { if (value.alias.includes(alias)) { return value; } } } function getSpecifiedHelpTextFrom(help_text_dict, about) { const info = help_text_dict.get(about) ?? findByAlias(help_text_dict, about); if (info == void 0) { return console_cjs.error(`Error: Option "${about}" does not exist.`); } return "" + console_cjs.bold(`--${about}`) + ", " + info.alias.map((a) => console_cjs.bold(a.length > 1 ? `--${a}` : `-${a}`)).join(", ") + "\n" + info.description; } function getEnHelpText(about = "") { const help_text_dict = /* @__PURE__ */ new Map([ ["version", { is_global: true, alias: ["v"], description: "Print the current version of tstosc." }], ["help", { is_global: true, alias: ["h"], description: "Print help text (can specify the command to query)." }], ["out-dir", { is_global: true, alias: ["d"], description: "The output dir of the files. If not specified, `cwd`." }] ]); return about == "" ? getEnFullHelpTextFrom(help_text_dict) : getSpecifiedHelpTextFrom(help_text_dict, about); } function getEnBriefHelpText() { return "" + ansis__default.default.bold.open + "Basic Usage" + ansis__default.default.reset.close + "\nSimply put the TypeScript file name/path after this command, like this:\n" + console_cjs.cmd("tstosc") + " " + console_cjs.fileArg("program.ts") + "\n" + ("A SCLang file " + console_cjs.fileArg("program.scd") + " will be generated at current working directory.\n\n") + ansis__default.default.bold.open + "Detailed Options" + ansis__default.default.reset.close + "\n" + ("Please run `" + console_cjs.cmd("tstosc") + " " + console_cjs.param("--help") + "` for more information."); } exports.showBriefHelp = showBriefHelp; exports.showHelp = showHelp;