diff --git a/exec/load/tdfonts_lib.js b/exec/load/tdfonts_lib.js index ed5c7cee9261d7de85eaf7280aa753219a2c0130..676baf2022e9e1979ff232994fbf936549789ed9 100755 --- a/exec/load/tdfonts_lib.js +++ b/exec/load/tdfonts_lib.js @@ -20,17 +20,13 @@ var CENTER_JUSTIFY = 2; var DEFAULT_WIDTH = 80; -// Default font directory and extension - adjust as needed for your Synchronet setup -var FONT_DIR = system.ctrl_dir + 'tdfonts/'; // Assuming fonts directory is relative to the script +var FONT_DIR = system.ctrl_dir + 'tdfonts/'; var FONT_EXT = "tdf"; var DEFAULT_FONT = "brndamgx"; // Character list var charlist = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; -// Synchronet JS does not have direct equivalents for gettimeofday and srand for seeding random. -// We will use Math.random() directly for random font selection if needed. - function loadfont(fn_arg) { var font = {}; // Use object for font_t var map = null; // Represents the font file data @@ -344,31 +340,45 @@ function reset_color() } function output(str, font) { - if (!font) { // Random font file selection - var fontDir = FONT_DIR; - var files = directory(fontDir + "/*.tdf"); // Get all .tdf files - if (files.length > 0) { - var randomIndex = random((files.length)+1); - var filename = file_getname(files[randomIndex]); - font = filename.replace(/\.tdf$/i, ""); - } - } - if (typeof font == "string") - font = loadfont(font); - var width = getwidth(str, font); - if (width > screen_width() || (this.opt && opt.wrap)) { // Word-wrap - var array = str.split(/\s+/); - if (array.length > 1) { - var out = ""; - while (str = array.shift()) { - out += output_line(str, font); - if (array.length && (!this.opt || opt.blankline !== false)) - out += "\r\n"; + var orgfont = font; + while (true) { + try { + if (!font) { // Random font file selection + var fontDir = FONT_DIR; + var files = directory(fontDir + "/*.tdf"); // Get all .tdf files + if (files.length > 0) { + var randomIndex = random((files.length)+1); + var filename = file_getname(files[randomIndex]); + font = filename.replace(/\.tdf$/i, ""); + } + } + if (typeof font == "string") + font = loadfont(font); + var width = getwidth(str, font); + if (width > screen_width() || (this.opt && opt.wrap)) { // Word-wrap + var array = str.split(/\s+/); + if (array.length > 1) { + var out = ""; + var word; + while (word = array.shift()) { + out += output_line(word, font); + if (array.length && (!this.opt || opt.blankline !== false)) + out += "\r\n"; + } + return out; + } + } + return output_line(str, font); + } catch(e) { + if (!orgfont && this.opt && opt.retry === true) { + if (opt.info) + alert("exception: " + e); + font = undefined; + continue; } - return out; + throw e; } } - return output_line(str, font); } // Calculate the total width of the string using the font @@ -420,9 +430,10 @@ function output_line(str, font) { if (justify === CENTER_JUSTIFY) { padding = Math.floor((width - linewidth) / 2); } else if (justify === RIGHT_JUSTIFY) { - padding = Math.floor(width - (linewidth + padding)); + padding = width - (linewidth + padding); } - linewidth += Math.max(0, padding); + padding = Math.max(0, padding); + linewidth += padding; if(linewidth > width) throw new Error(format("Rendered line width (%u) > screen width (%u)", linewidth, width)); diff --git a/exec/tdfiglet.js b/exec/tdfiglet.js index edbac735c1a99310ab82cb6bb3efc3eb405b79ad..579edb9fbc9f4ab9279156799b1761537e0af135 100644 --- a/exec/tdfiglet.js +++ b/exec/tdfiglet.js @@ -23,6 +23,7 @@ function usage() { writeln(" -W Always word-wrap the output"); writeln(" -i Print font details"); writeln(" -r Use random font and/or index (if not specified with -x)"); + writeln(" -R Use random font and auto-retry upon exception"); writeln(" -h Print usage"); writeln(""); exit(1); @@ -70,6 +71,9 @@ for(i = 0; i < argv.length; ++i) { tdf.opt.info = true; } else if (arg === "-r") { tdf.opt.random = true; + } else if (arg === "-R") { + tdf.opt.random = true; + tdf.opt.retry = true; } else if (arg === "-n") { tdf.opt.blankline = false; } else if (arg === "-W") {