Simple Java and GraalVM toy to play with unicode formatting.
There are many websites that perform fancy Unicode text transformation. For fun, I wanted to try to implement these features in Java.
$ java -jar build/libs/jufmt-all.jar -h
░░▒█░█▒█▒█▀░█▄▒▄█░▀█▀
░▀▄█░▀▄█░█▀░█▒▀▒█░▒█▒
Usage: jufmt [-dhrV] [--strip-diacritic-marks] [-c=CONVERTER] [-n=FORM]
[-o=ORNAMENT] [-s=STYLE] [STR] [COMMAND]
Format input latin string with fancy unicode chars
[STR] The string to process
-c, --converter=CONVERTER Converter, valid converters: none, normal, sans,
sansBold, sansItalic, sansBoldItalic, monospace,
fullwidth, fraktur, boldFraktur, serifBold,
serifItalic, serifBoldItalic, doubleStruck,
script, boldScript, circled, circledNegative,
squared, squaredNegative, parenthesized,
smallCaps, subscript, superscript, inverted,
mirrored, rounded, greek, japanese,
fauxEthiopian, ogham, asciiBrailleGrade1, morse
-d, --describe Describe characters, or more precisely codepoints
-h, --help Show this help message and exit.
-o, --ornament=ORNAMENT Ornaments, valid ornaments: curvedAngleBracket,
blackLenticularBracket, whiteLenticularBracket,
tortoiseBracket, whiteTortoiseBracket,
angleBracket, doubleAngleBracket, cornerBracket,
whiteCornerBracket, lightShade, mediumShade,
darkShade, wave, tibetanKuRuKhaBzhiMigCan,
ethiopicSectionMark
-r, --reversed Reverse string
-s, --style=STYLE Styles, valid styles: strikethrough, macron,
macronBelow, lowline, doubleLowline, overline,
doubleOverline, shadow, upwardArrowBelow,
hotFumes, doubleArrow, electric, snow, smeared
-V, --version Print version information and exit.
Commands:
figlet Renders input string as a text banner (FIGlet)
normalize Normalize input string using the given Unicode Normalization Forms
zalgo Renders input with Zalgo
If using GraalVM, micronaut offers the nativeImage
task :
$ asdf local java java graalvm-community-20.0.1
$ java --version
openjdk 20.0.1 2023-04-18
OpenJDK Runtime Environment GraalVM CE 20.0.1+9.1 (build 20.0.1+9-jvmci-23.0-b12)
OpenJDK 64-Bit Server VM GraalVM CE 20.0.1+9.1 (build 20.0.1+9-jvmci-23.0-b12, mixed mode, sharing)
$ ./gradlew nativeCompile
...
$ ./jufmt-cli/build/native/nativeCompile/jufmt figlet -r bric3
___. .__ ________
\_ |__ _______ |__| ____ \_____ \
| __ \\_ __ \| |_/ ___\ _(__ <
| \_\ \| | \/| |\ \___ / \
|___ /|__| |__| \___ >/______ /
\/ \/ \/
The tool supports the following charset:
Font | Character Set |
---|---|
Normal |
"\ !#$%&'()*+,-./0123456789:;<⇒?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~ |
Sans bold |
"\ !#$%&'()*+,-./𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵:;<⇒?@𝗔𝗕𝗖𝗗𝗘𝗙𝗚𝗛𝗜𝗝𝗞𝗟𝗠𝗡𝗢𝗣𝗤𝗥𝗦𝗧𝗨𝗩𝗪𝗫𝗬𝗭[]^_`𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇{|}~ |
Sans italic |
"\ !#$%&'()*+,-./0123456789:;<⇒?@𝘈𝘉𝘊𝘋𝘌𝘍𝘎𝘏𝘐𝘑𝘒𝘓𝘔𝘕𝘖𝘗𝘘𝘙𝘚𝘛𝘜𝘝𝘞𝘟𝘠𝘡[]^_`𝘢𝘣𝘤𝘥𝘦𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮𝘯𝘰𝘱𝘲𝘳𝘴𝘵𝘶𝘷𝘸𝘹𝘺𝘻{}~ |
Bold italic |
"\ !#$%&'()*+,-./0123456789:;<⇒?@𝘼𝘽𝘾𝘿𝙀𝙁𝙂𝙃𝙄𝙅𝙆𝙇𝙈𝙉𝙊𝙋𝙌𝙍𝙎𝙏𝙐𝙑𝙒𝙓𝙔𝙕[]^_`𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯{|}~ |
Monospace |
"\ !#$%&'()*+,-./𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿:;<⇒?@𝙰𝙱𝙲𝙳𝙴𝙵𝙶𝙷𝙸𝙹𝙺𝙻𝙼𝙽𝙾𝙿𝚀𝚁𝚂𝚃𝚄𝚅𝚆𝚇𝚈𝚉[]^_`𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣{|}~ |
Fullwidth |
"\ !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~ |
Math Fraktur |
"\ !#$%&'()*+,-./0123456789:;<⇒?@𝔄𝔅ℭ𝔇𝔈𝔉𝔊ℌℑ𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔ℜ𝔖𝔗𝔘𝔙𝔚𝔛𝔜ℨ[]^_`𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷{|}~ |
Math Fraktur bold |
"\ !#$%&'()*+,-./0123456789:;<⇒?@𝕬𝕭𝕮𝕯𝕰𝕱𝕲𝕳𝕴𝕵𝕶𝕷𝕸𝕹𝕺𝕻𝕼𝕽𝕾𝕿𝖀𝖁𝖂𝖃𝖄𝖅[]^_`𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟{|}~ |
Serif bold |
"\ !#$%&'()*+,-./𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗:;<⇒?@𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙[]^_`𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳{|}~ |
Serif italic |
"\ !#$%&'()*+,-./0123456789:;<⇒?@𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍[]^_`𝑎𝑏𝑐𝑑𝑒𝑓𝑔ℎ𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧{}~ |
Serif bold italic |
"\ !#$%&'()*+,-./0123456789:;<⇒?@𝑨𝑩𝑪𝑫𝑬𝑭𝑮𝑯𝑰𝑱𝑲𝑳𝑴𝑵𝑶𝑷𝑸𝑹𝑺𝑻𝑼𝑽𝑾𝑿𝒀𝒁[]^_`𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛{|}~ |
Math double-struck |
"\ !#$%&'()*+,-./𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡:;<⇒?@𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ[]^_`𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫{|}~ |
Script |
"\ !#$%&'()*+,-./0123456789:;<⇒?@𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵[]^_`𝒶𝒷𝒸𝒹ℯ𝒻ℊ𝒽𝒾𝒿𝓀𝓁𝓂𝓃ℴ𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏{|}~ |
Bold script |
"\ !#$%&'()*+,-./0123456789:;<⇒?@𝓐𝓑𝓒𝓓𝓔𝓕𝓖𝓗𝓘𝓙𝓚𝓛𝓜𝓝𝓞𝓟𝓠𝓡𝓢𝓣𝓤𝓥𝓦𝓧𝓨𝓩[]^_`𝓪𝓫𝓬𝓭𝓮𝓯𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃{|}~ |
Circled |
"⦸ !#$%&'()⊛⊕,⊖⨀⊘⓪①②③④⑤⑥⑦⑧⑨:;⧀⊜⧁?@ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ[]^_`ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ{⦶}~ |
Circled negative |
"\ !#$%&'()*+,-./⓿❶❷❸❹❺❻❼❽❾:;<⇒?@🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩[]^_`🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩{}~ |
Squared |
"\ !#$%&'()*+,-./0123456789:;<⇒?@🄰🄱🄲🄳🄴🄵🄶🄷🄸🄹🄺🄻🄼🄽🄾🄿🅀🅁🅂🅃🅄🅅🅆🅇🅈🅉[]^_`🄰🄱🄲🄳🄴🄵🄶🄷🄸🄹🄺🄻🄼🄽🄾🄿🅀🅁🅂🅃🅄🅅🅆🅇🅈🅉{}~ |
Squared negative |
"⧅ !#$%&'()⧆⊞,⊟⊡⧄0123456789:;<⇒?@🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽🅾🅿🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉[]^_`🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽🅾🅿🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉{}~ |
Parenthesized |
"\ !#$%&'()*+,-./0⑴⑵⑶⑷⑸⑹⑺⑻⑼:;<⇒?@⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵[]^_`⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵{}~ |
Small caps |
"\ !#$%&'()*+,-./0123456789:;<⇒?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴩꞯʀꜱᴛᴜᴠᴡxʏᴢ{}~ |
Subscript |
"\ !#$%&'()*₊,₋./₀₁₂₃₄₅₆₇₈₉:;<₌>?@ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴘ🇶ʀꜱᴛᴜᴠᴡxʏᴢ[]^_`ₐᵦ𝒸𝒹ₑ𝒻𝓰ₕᵢⱼₖₗₘₙₒₚᵩᵣₛₜᵤᵥ𝓌ₓᵧ𝓏{}~ |
Superscript |
"\ !#$%&'()*⁺,⁻./⁰¹²³⁴⁵⁶⁷⁸⁹:;<⁼>?@ᴬᴮᶜᴰᴱᶠᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᵠᴿˢᵀᵁⱽᵂˣʸᶻ[]^_`ᵃᵇᶜᵈᵉᶠᵍʰⁱʲᵏˡᵐⁿᵒᵖᵠʳˢᵗᵘᵛʷˣʸᶻ{}~ |
Inverted |
„\ ¡#$%⅋,)(*+‘-˙/0ƖՇƐᔭϛ9Ɫ86:;<⇒¿@∀ꓭↃꓷƎℲ⅁HIſꓘ⅂WNOԀῸꓤS⊥∩ꓥMX⅄Z][^‾`ɐqɔpǝɟƃɥıɾʞןɯuodbɹsʇnʌʍxʎz}|{~ |
Mirrored |
"/ !#$%&')(*+,-.\0߁ςƐ߂टმ٢8୧:;<⇒⸮@AꓭↃꓷƎꟻӘHIႱꓘ⅃MИOꟼϘЯꙄTUVWXYZ][^_`ɒdↄbɘʇϱʜiįʞlmᴎoqpᴙꙅɈυvwxγz}|{~ |
Rounded |
"\ !#$%&'()*+,-./0123456789:;<⇒?@ᗩᗷᑕᗪEᖴGᕼIᒍKᒪᗰᑎOᑭᑫᖇᔕTᑌᐯᗯ᙭Yᘔ[]^_`ᗩᗷᑕᗪEᖴGᕼIᒍKᒪᗰᑎOᑭᑫᖇᔕTᑌᐯᗯ᙭Yᘔ{|}~ |
Greek |
"\ !#$%&'()*+,-./0123456789:;<⇒?@ΛBᑕDΣFGΉIJKᒪMПӨPQЯƧƬЦVЩXYZ[]^_`ΛBᑕDΣFGΉIJKᒪMПӨPQЯƧƬЦVЩXYZ{|}~ |
Japanese |
"\ !#$%&'()*+,-./0123456789:;<⇒?@卂乃匚ᗪ乇千Ꮆ卄丨フҜㄥ爪几ㄖ卩Ɋ尺丂ㄒㄩᐯ山乂ㄚ乙[]^_`卂乃匚ᗪ乇千Ꮆ卄丨フҜㄥ爪几ㄖ卩Ɋ尺丂ㄒㄩᐯ山乂ㄚ乙{|}~ |
Faux Ethiopian |
"\ !#$%&'()*+,-./0123456789:;<⇒?@ልጌርዕቿቻኗዘጎጋጕረጠክዐየዒዪነፕሁሀሠሸሃጊ[]^_`ልጌርዕቿቻኗዘጎጋጕረጠክዐየዒዪነፕሁሀሠሸሃጊ{|}~ |
Font | Example |
---|---|
Underline |
U͟n͟d͟e͟r͟l͟i͟n͟e͟ |
Strikethrough |
𝖲̶𝗍̶𝗋̶𝗂̶𝗄̶𝖾̶𝗍̶𝗁̶𝗋̶𝗈̶𝗎̶𝗀̶𝗁̶ |
Short Strikethrough |
S̵h̵o̵r̵t̵ ̵S̵t̵r̵i̵k̵e̵t̵h̵r̵o̵u̵g̵h̵ |
-
✓ unicode fonts
-
✓ braille
-
✓ morse
-
✓ figlet
-
❏ other utf-8 ascii, possibly other figlet fonts
▄▌ ▐▄█ █▀ █▚▞▌ ▀█▀ ░░▒█░█▒█▒█▀░█▄▒▄█░▀█▀ ░▀▄█░▀▄█░█▀░█▒▀▒█░▒█▒ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ███▄█ ██ █ ▄▄█ ▄▀▄ █▄ ▄ ███ █ ██ █ ▄██ █▄█ ██ █ █ ▀ ██▄▄▄█▄███▄███▄██▄█ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ███▄█░██░█░▄▄█░▄▀▄░█▄░▄ ███░█░██░█░▄██░█▄█░██░█ █░▀░██▄▄▄█▄███▄███▄██▄█ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▄▄▄ ▄▄ ▄▄ ▄▄▄▄▄▄▄ ▄▄ ▄▄ ▄▄▄▄▄▄▄ █ █ █ █ █ █ █▄█ █ █ █ █ █ █ █ ▄▄▄█ █▄ ▄█ ▄ █ █ █▄█ █ █▄▄▄█ █ █ █ █ █▄█ █ █ ▄▄▄█ █ █ █ █ █ █ █ █ ██▄██ █ █ █ █▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█▄▄▄█ █▄█ █▄█ █▄▄▄█ ╋╋╋╋╋╋╋╋╋╋╋╋╋╋╋ ╋╋╋╋╋╋╭━╮╋╋╋╭╮╋ ╋╭╮╋╋╋┃╭╯╋╋╋╯╰╮ ╋╰╯╮╭╮╯╰╮╮╭╮╮╭╯ ╋╭╮┃┃┃╮╭╯╰╯┃┃┃╋ ╋┃┃╰╯┃┃┃╋┃┃┃┃╰╮ ╋┃┃━━╯╰╯╋┻┻╯╰━╯ ╭╯┃╋╋╋╋╋╋╋╋╋╋╋╋ ╰━╯╋╋╋╋╋╋╋╋╋╋╋╋ ░░ ░░ ░░ ░░░░░░░ ░░░ ░░░ ░░░░░░░░ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ █████ ██████ ██ ██ ██ ██ ╱╱╱╱╱╱╭━╮╱╱╭╮ ╱╭╮╱╱╱┃╭╯╱╭╯╰╮ ╱╰╋╮╭┳╯╰┳╮┣╮╭╯ ╱╭┫┃┃┣╮╭┫╰╯┃┃ ╱┃┃╰╯┃┃┃┃┃┃┃╰╮ ╱┃┣━━╯╰╯╰┻┻┻━╯ ╭╯┃ ╰━╯ ╱╱╱╱╭━╮╱╱╭╮ ╱╭┳┳┫━╋━━┫╰╮ ╱┣┫┃┃╭┫┃┃┃╭┫ ╭╯┣━┻╯╰┻┻┻━╯ ╰━╯
-
✓ ornaments
-
✓ wrapping chars, e.g. : 【b】【r】【i】【c】【3】, 〖b〗〖r〗〖i〗〖c〗〖3〗, ⧼b⧽⧼r⧽⧼i⧽⧼c⧽⧼3⧽, etc.
-
✓ insert chars, e.g. : b྿r྿i྿c྿3, ፠b፠r፠i፠c፠3, b࿐r࿐i࿐c࿐3, etc.
-
-
✓ zalgo: b̼̖̹͉̽̾r͎͔͉͙̽ͭ̈́͛͊i̮̿c̥̦̥̅̈́͐ͮ̚3͎͇ͨ
-
✓ styles
-
✓ shadow: b̷r̷i̷c̷3̷
-
✓ sweating: b̾r̾i̾c̾3̾ ̾
-
✓ smeared ink: b҉r҉i҉c҉3҉
-
-
✓ normalize (NFD, NFKD, NFC, NFKC)
This feature is inspired by this nice js project (demo).
-
This project
jufmt
Copyright (c) 2020, today - Brice DUTHEIL
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
-
In order to render figlet font this project uses a fork of yihleego/banana, tat is licensed under Apache License 2.0.
-
Fonts comes from
-
xero/figlet-fonts (unknown license)
-
thugcrowd/gangshit (unknown license)
-
Patrick Gillespie’s Text ASCII Art Generator (unknown license)
-