sofancy

fun unicode font tool

sofancy

sofancy.js


#!/usr/bin/env node
const fs = require("fs").promises;
const path = require("path");
let charmap,
  find,
  font,
  str = "",
  titles = false;

function usage() {
  console.log(`usage: sofancy [-f (font) | -t] string

 flags:
  -f|--font (font) : output in a single font
  -t|--titles      : display titles in output

 examples:
  sofancy -f wide aesthetics
aesthetics
  sofancy -tf neon llamas | sed 's/neon.* /txt: /'
txt: ᒪᒪᗩᗰᗩᔕ
  sofancy -t some string | fzf | xsel -i
  git commit -m "style(docs): $(sofancy -f bolditalic STYLIN)"
`);
  process.exit();
}
function reverse(s) {
  return (s === '') ? '' : reverse(s.substr(1)) + s.charAt(0);
}
function setArgs() {
  const { parseArgs } = require("node:util");
  const args = process.argv.slice(2);
  const options = {
    font: {
      type: "string",
      short: "f",
    },
    titles: {
      type: "boolean",
      short: "t",
    },
  };
  try {
    const { values, positionals } = parseArgs({
      args,
      options,
      allowPositionals: true,
    });
    font = values.font || false;
    find = !font ? /.*json$/ : new RegExp(`\b${font}.json\b`, "gi");
    titles = values.titles || false;
    str = (font == "upsidedown" || font == "mirrorflip")
					? reverse(positionals.join(" "))
					: positionals.join(" ") || usage();
  } catch (e) {
    usage();
  }
}
const walk = async (dir, filelist = []) => {
  const files = await fs.readdir(dir);

  for (const file of files) {
    const filepath = path.join(dir, file);
    const stat = await fs.stat(filepath);

    if (stat.isDirectory()) {
      filelist = await walk(filepath, filelist);
    } else {
      if (file.match(find)) {
        filelist.push(file);
        charmap = require(__dirname + `/fonts/${file}`);
        let title = titles ? file.replace(".json", "").padEnd(15) : "";
        console.log(
          title +
            str.replace(/./g, function (s) {
              if (s in charmap) {
                return charmap[s];
              } else if (s.toLowerCase() in charmap) {
                return charmap[s.toLowerCase()];
              } else if (s.toUpperCase() in charmap) {
                return charmap[s.toUpperCase()];
              } else {
                return s;
              }
            }) + " "
        );
      }
    }
  }
};
setArgs();
walk(__dirname + "/fonts");

Download

raw zip tar