git.schokokeks.org
Repositories
Help
Report an Issue
fs-draft.git
Code
Commits
Branches
Tags
Suche
Strukturansicht:
b6b276c
Branches
Tags
master
midgard
vorlage
fs-draft.git
tools
vorlage
vorlage.js
weitere Anpassungen; nimmt langsam wieder Gestalt an
Christian Fraß
commited
b6b276c
at 2018-08-21 22:38:20
vorlage.js
Blame
History
Raw
; var lib_code; (function (lib_code) { /** * @author fenris */ function base64_encode(x) { return (new Buffer(x)).toString("base64"); } lib_code.base64_encode = base64_encode; /** * @author fenris */ function json_encode(x) { return JSON.stringify(x); } lib_code.json_encode = json_encode; /** * @author fenris */ function json_decode(x) { return JSON.parse(x); } lib_code.json_decode = json_decode; })(lib_code || (lib_code = {})); var lib_objekt; (function (lib_objekt) { /** * @author fenris */ function pfad_lesen(objekt, pfad) { var schritte = ((pfad === "") ? [] : pfad.split(".")); var position = objekt; schritte .some(function (schritt) { if (position.hasOwnProperty(schritt)) { position = position[schritt]; return false; } else { position = null; return true; } }); return position; } lib_objekt.pfad_lesen = pfad_lesen; })(lib_objekt || (lib_objekt = {})); var lib_datei; (function (lib_datei) { /** * @author fenris */ function lesen(pfad) { var _fs = require("fs"); var inhalt_ = _fs.readFileSync(pfad); var inhalt = inhalt_.toString(); return inhalt; } lib_datei.lesen = lesen; })(lib_datei || (lib_datei = {})); var lib_regexp; (function (lib_regexp) { /** * @author fenris */ function erstellen_symbol(symbol) { return { "art": "symbol", "angaben": { "symbol": symbol } }; } lib_regexp.erstellen_symbol = erstellen_symbol; /** * @author fenris */ function erstellen_joker() { return { "art": "joker", "angaben": {} }; } lib_regexp.erstellen_joker = erstellen_joker; /** * @author fenris */ function erstellen_sequenz(teile) { return { "art": "sequenz", "angaben": { "teile": teile } }; } lib_regexp.erstellen_sequenz = erstellen_sequenz; /** * @author fenris */ function erstellen_alternative(teile) { return { "art": "alternative", "angaben": { "teile": teile } }; } lib_regexp.erstellen_alternative = erstellen_alternative; /** * @author fenris */ function erstellen_wiederholung(subjekt, min_, max_) { return { "art": "wiederholung", "angaben": { "subjekt": subjekt, "min": min_, "max": max_ } }; } lib_regexp.erstellen_wiederholung = erstellen_wiederholung; /** * @author fenris */ function erstellen_klasse(modus, teile) { return { "art": "klasse", "angaben": { "modus": modus, "teile": teile } }; } lib_regexp.erstellen_klasse = erstellen_klasse; /** * @author fenris */ function erstellen_gruppe(kern, greedy) { if (greedy === void 0) { greedy = false; } return { "art": "gruppe", "angaben": { "kern": kern, "greedy": greedy } }; } lib_regexp.erstellen_gruppe = erstellen_gruppe; /** * @author fenris */ function umwandeln(ausdruck, tiefe) { if (tiefe === void 0) { tiefe = 0; } var kern = null; switch (ausdruck.art) { case "symbol": { kern = (ausdruck.angaben["symbol"] .replace("?", "\\?") .replace("+", "\\+") .replace("*", "\\*") .replace(".", "\\.") .replace("\\", "\\\\") .replace("(", "\\(") .replace(")", "\\)") .replace("[", "\\[") .replace("]", "\\]") .replace("{", "\\{") .replace("}", "\\}")); break; } case "joker": { kern = "."; break; } case "sequenz": { kern = (ausdruck.angaben["teile"] .map(function (x) { return umwandeln(x, tiefe + 1); }) .join("")); break; } case "alternative": { kern = (ausdruck.angaben["teile"] .map(function (x) { return umwandeln(x, tiefe + 1); }) .join("|")); break; } case "wiederholung": { var nachsatz = void 0; if (((ausdruck.angaben["min"] === null) || (ausdruck.angaben["min"] === 0)) && (ausdruck.angaben["max"] === 1)) { nachsatz = "?"; } else if (((ausdruck.angaben["min"] === null) || (ausdruck.angaben["min"] === 0)) && (ausdruck.angaben["max"] === null)) { nachsatz = "*"; } else if (((ausdruck.angaben["min"] === 1)) && (ausdruck.angaben["max"] === null)) { nachsatz = "+"; } else { nachsatz = ("{" + ausdruck.angaben["min"].toFixed(0) + "," + ausdruck.angaben["max"].toFixed(0) + "}"); } kern = (umwandeln(ausdruck.angaben["subjekt"], tiefe + 1) + nachsatz); break; } case "klasse": { kern = ("[" + (ausdruck.angaben["modus"] ? "" : "^") + (ausdruck.angaben["teile"] .map(function (x) { return umwandeln(x, tiefe + 1); }) .join("")) + "]"); break; } case "gruppe": { kern = ("(" + umwandeln(ausdruck.angaben["kern"], tiefe + 1) + (ausdruck.angaben["greedy"] ? "?" : "") + ")"); break; } default: { kern = "FCKU"; break; } } return ((tiefe === 0) ? ("" + kern + "") : kern); } lib_regexp.umwandeln = umwandeln; /** * @author fenris */ function suchen_umgewandelt(ausdruck_, kette) { var regexp = (new RegExp(ausdruck_, "g")); var funde = []; while (true) { var ergebnis = regexp.exec(kette); if (ergebnis === null) { break; } else { funde.push({ "bereich": ergebnis[0], "kern": ergebnis[1] }); } } return funde; } lib_regexp.suchen_umgewandelt = suchen_umgewandelt; /** * @author fenris */ function suchen(ausdruck, kette) { var ausdruck_ = umwandeln(ausdruck); // console.info(ausdruck_ + "\n") return suchen_umgewandelt(ausdruck_, kette); } lib_regexp.suchen = suchen; })(lib_regexp || (lib_regexp = {})); var lib_args; (function (lib_args) { /** * @author fenris */ var muster_positioniert = (new RegExp("(.*)")); var muster_benannt_lang = (new RegExp("--([^=]+)(?:=(.+))?")); /** * @author fenris */ function zerlegen(kette) { var ergebnis = { "benannt": {}, "positioniert": [] }; var teile = (kette .split(new RegExp("\\s", "g")) .filter(function (x) { return (x.length > 0); })); teile .forEach(function (teil) { // benannt { var foo = muster_benannt_lang.exec(teil); if (foo !== null) { var name_1 = foo[1]; var wert = foo[2]; if (!ergebnis.benannt.hasOwnProperty(name_1)) ergebnis.benannt[name_1] = []; ergebnis.benannt[name_1].push(wert); return; } } // positioniert { var foo = muster_positioniert.exec(teil); if (foo !== null) { var wert = foo[1]; ergebnis.positioniert.push(wert); return; } } }); return ergebnis; } /** * @author fenris */ function erzeugen(liste) { return liste; } lib_args.erzeugen = erzeugen; /** * @author fenris */ function parsen(argdesc, args) { var args_ = zerlegen(args.join(" ")); var args__ = {}; Object.keys(argdesc) .forEach(function (id) { var eintrag = argdesc[id]; switch (eintrag["art"]) { case "positioniert": { if (args_.positioniert.length > eintrag["index"]) { var rawval = args_.positioniert[eintrag["index"]]; var entnahme = (eintrag.hasOwnProperty("entnahme") ? eintrag["entnahme"] : (function (x) { return x; })); var wert = entnahme(rawval); args__[id] = wert; } else { throw (new Error("zu wenig positionierte Argumente übergeben")); } break; } case "benannt": { var rawvals = (args_.benannt.hasOwnProperty(eintrag["kennung"]) ? args_.benannt[eintrag["kennung"]] : []); var entnahme = (eintrag.hasOwnProperty("entnahme") ? eintrag["entnahme"] : (function (x) { return x; })); var wert = entnahme(rawvals); args__[id] = wert; break; } default: { console.warn("unbehandelt"); break; } } }); return args__; } lib_args.parsen = parsen; /** * @author fenris */ function hilfe(argdesc) { /* Object.keys(argdesc) .forEach( ) */ return "SYNTAX: vorlage.js <pfad-zur-vorlagedatei> [--habitus=<habitus>] [--zeichen-auf=<zeichen-auf>] [--zeichen-zu=<zeichen-zu>] [--modul=<pfad-zu-modul>] [--modul=<pfad-zu-modul>] [--modul=<pfad-zu-modul>] …"; } lib_args.hilfe = hilfe; })(lib_args || (lib_args = {})); var mod_kern; (function (mod_kern) { /** * @author fenris */ var _befehle = {}; /** * @author fenris */ var _modifikatoren_encode = {}; /** * @author fenris */ var _modifikatoren_escape = {}; /** * @author fenris */ var _modifikatoren_squelch = {}; /** * @author fenris */ var _habiti = {}; /** * @author fenris */ var _erweiterungen = {}; /** * @author fenris */ function befehl_hinzufuegen(name, funktion) { _befehle[name] = funktion; } mod_kern.befehl_hinzufuegen = befehl_hinzufuegen; /** * @author fenris */ function modifikator_id_ermitteln(weg) { return weg.join("."); } /** * @author fenris */ function modifikator_hinzufuegen_escape(name, funktion) { _modifikatoren_escape[name] = funktion; } mod_kern.modifikator_hinzufuegen_escape = modifikator_hinzufuegen_escape; /** * @author fenris */ function modifikator_hinzufuegen_squelch(name, funktion) { _modifikatoren_squelch[name] = funktion; } mod_kern.modifikator_hinzufuegen_squelch = modifikator_hinzufuegen_squelch; /** * @author fenris */ function modifikator_hinzufuegen_encode(name, funktion) { _modifikatoren_encode[name] = funktion; } mod_kern.modifikator_hinzufuegen_encode = modifikator_hinzufuegen_encode; /** * @author fenris */ function habitus_hinzufuegen(name, funktion) { _habiti[name] = funktion; } mod_kern.habitus_hinzufuegen = habitus_hinzufuegen; /** * @author fenris */ function erweiterung_erfassen(name, einrichtung) { _erweiterungen[name] = einrichtung; } mod_kern.erweiterung_erfassen = erweiterung_erfassen; /** * @author fenris */ function erweiterung_laden(name) { if (_erweiterungen.hasOwnProperty(name)) { _erweiterungen[name](); } else { var nachricht = ("keine Erweiterung namens '" + name + "' gefunden"); throw (new Error(nachricht)); } } mod_kern.erweiterung_laden = erweiterung_laden; /** * @author kcf */ function erweiterung_einrichten(raw) { erweiterung_erfassen(raw["name"], function () { // befehle { (raw["befehle"] || []) .forEach(function (raw_cmd) { befehl_hinzufuegen(raw_cmd["name"], raw_cmd["funktion"]); }); } // modifikator_encode { if (raw.hasOwnProperty("modifikatoren") && raw["modifikatoren"].hasOwnProperty("encode")) { raw["modifikatoren"]["encode"] .forEach(function (raw_mod) { modifikator_hinzufuegen_encode(raw_mod["name"], raw_mod["funktion"]); }); } else { // nichts tun } } // modifikator_escape { if (raw.hasOwnProperty("modifikatoren") && raw["modifikatoren"].hasOwnProperty("escape")) { raw["modifikatoren"]["escape"] .forEach(function (raw_mod) { modifikator_hinzufuegen_escape(raw_mod["name"], raw_mod["funktion"]); }); } else { // nichts tun } } // modifikator_squelch { if (raw.hasOwnProperty("modifikatoren") && raw["modifikatoren"].hasOwnProperty("squelch")) { raw["modifikatoren"]["squelch"] .forEach(function (raw_mod) { modifikator_hinzufuegen_squelch(raw_mod["name"], raw_mod["funktion"]); }); } else { // nichts tun } } // modifikator_habitus { if (raw.hasOwnProperty("habiti")) { raw["habiti"] .forEach(function (raw_hab) { habitus_hinzufuegen(raw_hab["name"], raw_hab["funktion"]); }); } else { // nichts tun } } }); // erweiterung_laden(raw["name"]); } mod_kern.erweiterung_einrichten = erweiterung_einrichten; /** * @author fenris */ function befehl_show(angaben, vardesc, modifikatoren, habitus) { var wert = lib_objekt.pfad_lesen(angaben, vardesc); if (!(wert === null)) { // habitus { if (!(habitus === null)) { if (_habiti.hasOwnProperty(habitus)) { modifikatoren = _habiti[habitus](modifikatoren); } else { var nachricht = ("-- unbekannter Habitus \"" + habitus + "\""); console.warn(nachricht + "\n"); } } else { // nichts tun } } // modifikatoren { modifikatoren .forEach(function (modifikator) { switch (modifikator.art) { case "format": { var nachricht = "-- Formatierung nicht korrekt implemtiert"; console.error(nachricht + "\n"); var format = modifikator.angaben["format"]; // wert = (format_ % wert) wert = String(wert); break; } case "encode": { var kodierung = modifikator.angaben["kodierung"]; if (_modifikatoren_encode.hasOwnProperty(kodierung)) { wert = _modifikatoren_encode[kodierung](modifikator.angaben["argumente"])(wert); } else { var nachricht = ("-- unbekannte Kodierung \"" + kodierung + "\""); console.warn(nachricht + "\n"); } break; } case "escape": { var ziel = modifikator.angaben["ziel"]; if (_modifikatoren_escape.hasOwnProperty(ziel)) { wert = _modifikatoren_escape[ziel](modifikator.angaben["argumente"])(wert); } else { var nachricht = ("-- unbekanntes Ziel \"" + ziel + "\""); console.warn(nachricht + "\n"); } break; } case "squelch": { var ziel = modifikator.angaben["ziel"]; if (_modifikatoren_squelch.hasOwnProperty(ziel)) { wert = _modifikatoren_squelch[ziel](modifikator.angaben["argumente"])(wert); } else { var nachricht = ("-- unbekanntes Ziel \"" + ziel + "\""); console.warn(nachricht + "\n"); } break; } default: { var nachricht = ("-- unbekannter Modifikator \"" + modifikator.art + "\""); console.warn(nachricht + "\n"); break; } } }); } if (!(typeof (wert) === "string")) { wert = String(wert); var nachricht = ("-- implizite Konversion zu Zeichenkette bei \"" + vardesc + "\""); console.warn(nachricht + "\n"); } else { // nichts tun } return wert; } else { var nachricht = ("-- fehlende Angabe: \"" + vardesc + "\""); console.warn(nachricht + "\n"); return null; } } /** * @author fenris */ function befehl_dataurl(angaben, vardesc, mimetype) { var wert = lib_objekt.pfad_lesen(angaben, vardesc); if (!(wert === null)) { wert = ("data" + ":" + mimetype + ";" + "base64" + "," + lib_code.base64_encode(wert)); return wert; } else { var nachricht = ("-- fehlende Angabe: \"" + vardesc + "\""); console.warn(nachricht + "\n"); return null; } } /** * @author fenris */ function befehl_call(einstellungen, angaben, vardesc, pfad) { var wert = lib_objekt.pfad_lesen(angaben, vardesc); if (!(wert === null)) { var angaben_ = wert; var ergebnis = ausfuellen(einstellungen, pfad, angaben_); return ergebnis; } else { var nachricht = ("-- fehlende Angabe: \"" + vardesc + "\""); console.warn(nachricht + "\n"); return null; } } /** * @author fenris */ function befehl_branch(einstellungen, angaben, vardesc_bedingung, pfad_falls, vardesc_falls, pfad_sonst, vardesc_sonst) { var wert = lib_objekt.pfad_lesen(angaben, vardesc_bedingung); if (!(wert === null)) { if (typeof (wert) === "boolean") { var wert_ = (wert); var pfad_ = void 0; var angaben_ = void 0; if (wert_) { pfad_ = pfad_falls; angaben_ = angaben[vardesc_falls]; } else { pfad_ = pfad_sonst; angaben_ = angaben[vardesc_sonst]; } var ergebnis = ausfuellen(einstellungen, pfad_, angaben_); return ergebnis; } else { var nachricht = ("-- kein Boolean: \"" + vardesc_bedingung + "\""); console.warn(nachricht + "\n"); return null; } } else { var nachricht = ("-- fehlende Angabe: \"" + vardesc_bedingung + "\""); console.warn(nachricht + "\n"); return null; } } /** * @author fenris */ function befehl_list(einstellungen, angaben, vardesc, pfad_) { var wert = lib_objekt.pfad_lesen(angaben, vardesc); if (!(wert === null)) { if ((typeof (wert) === "object") && (wert instanceof Array)) { var ergebnis = (wert .map(function (angaben_) { return (ausfuellen(einstellungen, pfad_, angaben_)); }) .join("")); return ergebnis; } else { var nachricht = ("-- kein Array: \"" + vardesc + "\""); console.warn(nachricht + "\n"); return null; } } else { var nachricht = ("-- fehlende Angabe: \"" + vardesc + "\""); console.warn(nachricht + "\n"); return null; } } /** * @author fenris */ function ausfuellen(einstellungen, pfad, angaben) { var vorlage = lib_datei.lesen(pfad); var funde = lib_regexp.suchen_umgewandelt(einstellungen["ausdruck_umgewandelt"], vorlage); funde .forEach(function (_a) { var bereich = _a["bereich"], kern = _a["kern"]; // let fund : string = (einstellungen["zeichen_auf"] + kern + einstellungen["zeichen_zu"]); var teile = kern.split("|").map(function (x) { return x.split(":"); }); var befehl = teile.shift(); var art = befehl.shift(); switch (art) { case "show": { var vardesc = befehl.shift(); var modifikatoren_1 = []; teile .forEach(function (teil) { var art = teil.shift(); switch (art) { case "format": { var format = teil.shift(); modifikatoren_1.push({ "art": art, "angaben": { "format": format } }); break; } case "encode": { var kodierung = teil.shift(); modifikatoren_1.push({ "art": art, "angaben": { "kodierung": kodierung } }); break; } case "escape": { var ziel = teil.shift(); modifikatoren_1.push({ "art": art, "angaben": { "ziel": ziel, "argumente": teil } }); break; } case "squelch": { var ziel = teil.shift(); modifikatoren_1.push({ "art": art, "angaben": { "ziel": ziel, "argumente": teil } }); break; } default: { var nachricht = ("-- unbekannter Modifikator \"" + art + "\""); console.warn(nachricht + "\n"); } } }); var ersetzung = befehl_show(angaben, vardesc, modifikatoren_1, einstellungen["habitus"]); if (!(ersetzung === null)) vorlage = vorlage.replace(bereich, ersetzung); break; } case "dataurl": { var vardesc = befehl.shift(); var mimetype = ((befehl.length > 0) ? befehl.shift() : "text/plain"); var ersetzung = befehl_dataurl(angaben, vardesc, mimetype); if (!(ersetzung === null)) vorlage = vorlage.replace(bereich, ersetzung); break; } case "call": { var vardesc = befehl.shift(); var pfad_ = befehl.shift(); var ersetzung = befehl_call(einstellungen, angaben, vardesc, pfad_); if (!(ersetzung === null)) vorlage = vorlage.replace(bereich, ersetzung); break; } case "branch": { var vardesc_bedingung = befehl.shift(); var pfad_falls = befehl.shift(); var vardesc_falls = befehl.shift(); var pfad_sonst = befehl.shift(); var vardesc_sonst = befehl.shift(); var ersetzung = befehl_branch(einstellungen, angaben, vardesc_bedingung, pfad_falls, vardesc_falls, pfad_sonst, vardesc_sonst); if (!(ersetzung === null)) vorlage = vorlage.replace(bereich, ersetzung); break; } case "list": { var vardesc = befehl.shift(); var pfad_ = befehl.shift(); var ersetzung = befehl_list(einstellungen, angaben, vardesc, pfad_); if (!(ersetzung === null)) vorlage = vorlage.replace(bereich, ersetzung); break; } default: { if (_befehle.hasOwnProperty(art)) { var vardesc = befehl.shift(); var wert = lib_objekt.pfad_lesen(angaben, vardesc); var ersetzung = _befehle[art](befehl)(wert); if (!(ersetzung === null)) vorlage = vorlage.replace(bereich, ersetzung); } else { var nachricht = ("-- unbehandelte Art \"" + art + "\""); // raise ValueError(nachricht) console.warn(nachricht + "\n"); } break; } } }); return vorlage; } /** * @author fenris */ function anwenden(einstellungen, pfad, angaben) { var ausdruck_umgewandelt = (lib_regexp.umwandeln(lib_regexp.erstellen_sequenz([] .concat(einstellungen["zeichen_auf"].split("").map(function (x) { return lib_regexp.erstellen_symbol(x); })) .concat([ lib_regexp.erstellen_gruppe(lib_regexp.erstellen_wiederholung(lib_regexp.erstellen_klasse(false, einstellungen["zeichen_zu"].split("").map(function (x) { return lib_regexp.erstellen_symbol(x); })), 1, null)) ]) .concat(einstellungen["zeichen_zu"].split("").map(function (x) { return lib_regexp.erstellen_symbol(x); }))))); einstellungen["ausdruck_umgewandelt"] = ausdruck_umgewandelt; var pfad_teile = pfad.split("/"); var dirname = ((pfad_teile.length === 1) ? "." : pfad_teile.slice(0, -1).join("/")); var basename = pfad_teile.slice(-1)[0]; process.chdir(dirname); var ergebnis = ausfuellen(einstellungen, basename, angaben); return ergebnis; } mod_kern.anwenden = anwenden; })(mod_kern || (mod_kern = {})); /** * @author fenris */ function haupt(args) { var argdesc = lib_args.erzeugen({ "pfad": { "art": "positioniert", "index": 0 }, "habitus": { "art": "benannt", "kennung": "habitus", "entnahme": function (x) { return ((x.length > 0) ? x.slice(-1)[0] : null); } }, "zeichen_auf": { "art": "benannt", "kennung": "zeichen-auf", "entnahme": function (x) { return ((x.length > 0) ? x.slice(-1)[0] : "{{"); } }, "zeichen_zu": { "art": "benannt", "kennung": "zeichen-zu", "entnahme": function (x) { return ((x.length > 0) ? x.slice(-1)[0] : "}}"); } }, "modul": { "art": "benannt", "kennung": "modul" } }); var args_; try { args_ = lib_args.parsen(argdesc, args); } catch (exception) { console.error(lib_args.hilfe(argdesc)); process.exit(-1); } // Module laden { (args_["modul"]) .forEach(function (pfad_) { var erweiterung = require(/*"./" + */ pfad_); var definition = erweiterung.definieren(); mod_kern.erweiterung_einrichten(definition); mod_kern.erweiterung_laden(definition["name"]); }); } // let inhalt : string; process.stdin.resume(); inhalt = lib_datei.lesen(process.stdin.fd); process.stdin.pause(); var inhalt = lib_datei.lesen("/dev/stdin"); var angaben = lib_code.json_decode(inhalt); var ergebnis = mod_kern.anwenden({ "zeichen_auf": args_["zeichen_auf"], "zeichen_zu": args_["zeichen_zu"], "habitus": args_["habitus"] }, args_["pfad"], angaben); console.info(ergebnis); } haupt(process.argv.slice(2));