Last active
December 15, 2019 13:24
-
-
Save shaggyrogers/3a36f58d51382c9859a2a8a0bfddceee to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# -*- coding: UTF-8 -*- | |
""" | |
fonts.py | |
======== | |
Description: Substitutes alphanumeric characters with a 'font' from | |
the 'Mathematical Alphanumeric Symbols' block. | |
Author: Michael De Pasquale | |
Creation Date: 2019-12-14 | |
Modification Date: 2019-12-16 | |
""" | |
import argparse | |
import sys | |
class Font: | |
def __init__(self, upper: str, lower: str, digits: str = None) -> None: | |
if len(upper) != 26: | |
raise ValueError('Expected 2y uppercase charaters') | |
if len(lower) != 26: | |
raise ValueError('Expected 26 lowercase charaters') | |
if digits is not None and len(digits) != 10: | |
raise ValueError('Expected 10 digits') | |
self._upper = upper | |
self._lower = lower | |
self._digits = digits if digits else '0123456789' | |
def mapChar(self, char: str) -> str: | |
nr = ord(char) | |
if 0x30 <= nr <= 0x39: # 0-9 | |
return self._digits[nr & 0xF] | |
if 0x41 <= nr <= 0x5A: # A-Z | |
return self._upper[nr - 0x41] | |
if 0x61 <= nr <= 0x7A: # a-z | |
return self._upper[nr - 0x61] | |
return char | |
FONTS = { | |
'serif-bold': Font( | |
'๐๐๐๐๐๐ ๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐', | |
'๐๐๐๐๐๐๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ', | |
'๐๐๐๐๐๐๐๐๐๐', | |
), | |
'serif-italic': Font( | |
'๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐๐๐๐๐๐ ๐๐๐๐๐๐๐๐', | |
'๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง', | |
'๐๐๐๐๐๐๐๐๐๐', | |
), | |
'serif-bold-italic': Font( | |
'๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐๐', | |
'๐๐๐๐ ๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐', | |
'๐๐๐๐๐๐๐๐๐๐', | |
), | |
'sans': Font( | |
'๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น', | |
'๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐๐๐๐๐๐ ๐๐๐๐๐๐๐๐๐๐๐๐๐๐', | |
'๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ', | |
), | |
'sans-italic': Font( | |
'๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐ ๐ก', | |
'๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป', | |
'๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ', | |
), | |
'sans-bold-italic': Font( | |
'๐ผ๐ฝ๐พ๐ฟ๐๐๐๐๐๐ ๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐', | |
'๐๐๐๐๐๐๐๐๐๐๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ', | |
'๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต', | |
), | |
'monospace': Font( | |
'๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐๐๐๐๐๐ ๐๐๐๐', | |
'๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐ ๐ก๐ข๐ฃ', | |
'๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ', | |
), | |
'double-struck': Font( | |
'๐ธ๐นโ๐ป๐ผ๐ฝ๐พโ๐๐๐๐๐โ๐โโโ๐๐๐๐๐๐๐โค', | |
'๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ', | |
'๐๐๐๐๐๐๐๐๐ ๐ก', | |
), | |
'fraktur': Font( | |
'๐๐ โญ๐๐๐๐โโ๐๐๐๐๐๐๐๐โ๐๐๐๐๐๐๐โจ', | |
'๐๐๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท', | |
), | |
'fraktur-bold': Font( | |
'๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐๐๐๐๐๐ ', | |
'๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐', | |
), | |
'script': Font( | |
'๐โฌ๐๐โฐโฑ๐ขโโ๐ฅ๐ฆโโณ๐ฉ๐ช๐ซ๐ฌโ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต', | |
'๐ถ๐ท๐ธ๐นโฏ๐ปโ๐ฝ๐พ๐ฟ๐๐๐๐โด๐ ๐๐๐๐๐๐๐๐๐๐' | |
), | |
'script-bold': Font( | |
'๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ', | |
'๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐๐๐๐', | |
), | |
'circled': Font( | |
'โถโทโธโนโบโปโผโฝโพโฟโโโโโโ โโโโโโโโโโ', | |
'โโโโโโโโโโโโโโโโโ โกโขโฃโคโฅโฆโงโจโฉ', | |
'๐โ โกโขโฃโคโฅโฆโงโจ', | |
), | |
'circled-dark': Font( | |
'๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ก๐ ข๐ ฃ๐ ค๐ ฅ๐ ฆ๐ ง๐ จ๐ ฉ', | |
'๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ก๐ ข๐ ฃ๐ ค๐ ฅ๐ ฆ๐ ง๐ จ๐ ฉ', | |
), | |
'boxed': Font( | |
'๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ', | |
'๐ฐ๐ฑ๐ฒ๐ณ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ๐ ', | |
), | |
} | |
def main(*argv) -> int: | |
""" """ | |
args = argparse.ArgumentParser() | |
args.add_argument( | |
'--font', | |
type=str, | |
nargs=1, | |
help=f'The target font, or "all". Available fonts: {", ".join(FONTS.keys())}' | |
) | |
ns = args.parse_args(argv) | |
if ns.font is None: | |
sys.stderr.write('No font selected! See --help.') | |
return 1 | |
fontName = ns.font[0].lower().strip().replace(' ', '-') | |
if fontName == 'all': | |
text = sys.stdin.read() | |
for font in FONTS.values(): | |
for char in text: | |
sys.stdout.write(font.mapChar(char)) | |
return 0 | |
font = FONTS[fontName] | |
for char in sys.stdin.read(): | |
sys.stdout.write(font.mapChar(char)) | |
return 0 | |
if __name__ == '__main__': | |
sys.exit(main(*sys.argv[1:])) | |
# vim: set ts=4 sw=4 tw=79 fdm=marker ff=unix fenc=utf-8 et : |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment