Packages

Small library to convert text into pseudofonts via Unicode shenanigans.

Current section

Files

Jump to
fonticode lib fonticode.ex
Raw

lib/fonticode.ex

defmodule Fonticode do
@moduledoc """
Small library that takes a string and reformats it into a pseudofont.
This is accomplished by using Unicode codepoints that resemble a font.
|Format mode | Example |
|------------|-----------|
|:noop | ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 1234567890 |
|:sans_serif | ๐– ๐–ก๐–ข๐–ฃ๐–ค๐–ฅ๐–ฆ๐–ง๐–จ๐–ฉ๐–ช๐–ซ๐–ฌ๐–ญ๐–ฎ๐–ฏ๐–ฐ๐–ฑ๐–ฒ๐–ณ๐–ด๐–ต๐–ถ๐–ท๐–ธ๐–น ๐–บ๐–ป๐–ผ๐–ฝ๐–พ๐–ฟ๐—€๐—๐—‚๐—ƒ๐—„๐—…๐—†๐—‡๐—ˆ๐—‰๐—Š๐—‹๐—Œ๐—๐—Ž๐—๐—๐—‘๐—’๐—“ ๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ๐Ÿข |
|:cursive | ๐’œโ„ฌ๐’ž๐’Ÿโ„ฐโ„ฑ๐’ขโ„‹โ„๐’ฅ๐’ฆโ„’โ„ณ๐’ฉ๐’ช๐’ซ๐’ฌโ„›๐’ฎ๐’ฏ๐’ฐ๐’ฑ๐’ฒ๐’ณ๐’ด๐’ต ๐’ถ๐’ท๐’ธ๐’นโ„ฏ๐’ปโ„Š๐’ฝ๐’พ๐’ฟ๐“€๐“๐“‚๐“ƒโ„ด๐“…๐“†๐“‡๐“ˆ๐“‰๐“Š๐“‹๐“Œ๐“๐“Ž๐“ 1234567890 |
|:blackboard_bold | ๐”ธ๐”นโ„‚๐”ป๐”ผ๐”ฝ๐”พโ„๐•€๐•๐•‚๐•ƒ๐•„โ„•๐•†โ„™โ„šโ„๐•Š๐•‹๐•Œ๐•๐•Ž๐•๐•โ„ค ๐•’๐•“๐•”๐••๐•–๐•—๐•˜๐•™๐•š๐•›๐•œ๐•๐•ž๐•Ÿ๐• ๐•ก๐•ข๐•ฃ๐•ค๐•ฅ๐•ฆ๐•ง๐•จ๐•ฉ๐•ช๐•ซ ๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ ๐Ÿก๐Ÿ˜ |
|:block | ๐Ÿ„ฐ๐Ÿ„ฑ๐Ÿ„ฒ๐Ÿ„ณ๐Ÿ„ด๐Ÿ„ต๐Ÿ„ถ๐Ÿ„ท๐Ÿ„ธ๐Ÿ„น๐Ÿ„บ๐Ÿ„ป๐Ÿ„ผ๐Ÿ„ฝ๐Ÿ„พ๐Ÿ„ฟ๐Ÿ…€๐Ÿ…๐Ÿ…‚๐Ÿ…ƒ๐Ÿ…„๐Ÿ……๐Ÿ…†๐Ÿ…‡๐Ÿ…ˆ๐Ÿ…‰ ๐Ÿ„ฐ๐Ÿ„ฑ๐Ÿ„ฒ๐Ÿ„ณ๐Ÿ„ด๐Ÿ„ต๐Ÿ„ถ๐Ÿ„ท๐Ÿ„ธ๐Ÿ„น๐Ÿ„บ๐Ÿ„ป๐Ÿ„ผ๐Ÿ„ฝ๐Ÿ„พ๐Ÿ„ฟ๐Ÿ…€๐Ÿ…๐Ÿ…‚๐Ÿ…ƒ๐Ÿ…„๐Ÿ……๐Ÿ…†๐Ÿ…‡๐Ÿ…ˆ๐Ÿ…‰ 1234567890 |
|:block_filled | ๐Ÿ…ฐ๐Ÿ…ฑ๐Ÿ…ฒ๐Ÿ…ณ๐Ÿ…ด๐Ÿ…ต๐Ÿ…ถ๐Ÿ…ท๐Ÿ…ธ๐Ÿ…น๐Ÿ…บ๐Ÿ…ป๐Ÿ…ผ๐Ÿ…ฝ๐Ÿ…พ๐Ÿ…ฟ๐Ÿ†€๐Ÿ†๐Ÿ†‚๐Ÿ†ƒ๐Ÿ†„๐Ÿ†…๐Ÿ††๐Ÿ†‡๐Ÿ†ˆ๐Ÿ†‰ ๐Ÿ…ฐ๐Ÿ…ฑ๐Ÿ…ฒ๐Ÿ…ณ๐Ÿ…ด๐Ÿ…ต๐Ÿ…ถ๐Ÿ…ท๐Ÿ…ธ๐Ÿ…น๐Ÿ…บ๐Ÿ…ป๐Ÿ…ผ๐Ÿ…ฝ๐Ÿ…พ๐Ÿ…ฟ๐Ÿ†€๐Ÿ†๐Ÿ†‚๐Ÿ†ƒ๐Ÿ†„๐Ÿ†…๐Ÿ††๐Ÿ†‡๐Ÿ†ˆ๐Ÿ†‰ 1234567890 |
|:bubble | โ’ถโ’ทโ’ธโ’นโ’บโ’ปโ’ผโ’ฝโ’พโ’ฟโ“€โ“โ“‚โ“ƒโ“„โ“…โ“†โ“‡โ“ˆโ“‰โ“Šโ“‹โ“Œโ“โ“Žโ“ โ“โ“‘โ“’โ““โ“”โ“•โ“–โ“—โ“˜โ“™โ“šโ“›โ“œโ“โ“žโ“Ÿโ“ โ“กโ“ขโ“ฃโ“คโ“ฅโ“ฆโ“งโ“จโ“ฉ โ‘ โ‘กโ‘ขโ‘ฃโ‘คโ‘ฅโ‘ฆโ‘งโ‘จโ“ช |
|:bubble_filled | ๐Ÿ…๐Ÿ…‘๐Ÿ…’๐Ÿ…“๐Ÿ…”๐Ÿ…•๐Ÿ…–๐Ÿ…—๐Ÿ…˜๐Ÿ…™๐Ÿ…š๐Ÿ…›๐Ÿ…œ๐Ÿ…๐Ÿ…ž๐Ÿ…Ÿ๐Ÿ… ๐Ÿ…ก๐Ÿ…ข๐Ÿ…ฃ๐Ÿ…ค๐Ÿ…ฅ๐Ÿ…ฆ๐Ÿ…ง๐Ÿ…จ๐Ÿ…ฉ ๐Ÿ…๐Ÿ…‘๐Ÿ…’๐Ÿ…“๐Ÿ…”๐Ÿ…•๐Ÿ…–๐Ÿ…—๐Ÿ…˜๐Ÿ…™๐Ÿ…š๐Ÿ…›๐Ÿ…œ๐Ÿ…๐Ÿ…ž๐Ÿ…Ÿ๐Ÿ… ๐Ÿ…ก๐Ÿ…ข๐Ÿ…ฃ๐Ÿ…ค๐Ÿ…ฅ๐Ÿ…ฆ๐Ÿ…ง๐Ÿ…จ๐Ÿ…ฉ โžŠโž‹โžŒโžโžŽโžโžโž‘โž’โ“ฟ|
|:gothic | ๐”„๐”…โ„ญ๐”‡๐”ˆ๐”‰๐”Šโ„Œโ„‘๐”๐”Ž๐”๐”๐”‘๐”’๐”“๐””โ„œ๐”–๐”—๐”˜๐”™๐”š๐”›๐”œโ„จ ๐”ž๐”Ÿ๐” ๐”ก๐”ข๐”ฃ๐”ค๐”ฅ๐”ฆ๐”ง๐”จ๐”ฉ๐”ช๐”ซ๐”ฌ๐”ญ๐”ฎ๐”ฏ๐”ฐ๐”ฑ๐”ฒ๐”ณ๐”ด๐”ต๐”ถ๐”ท 1234567890 |
|:small_caps | ABCDEFGHIJKLMNOPQRSTUVWXYZ แด€ส™แด„แด…แด‡า“ษขสœษชแดŠแด‹สŸแดษดแดแด˜วซส€sแด›แดœแด แดกxสแดข 1234567890 |
|:aesthetic | ๏ผก๏ผข๏ผฃ๏ผค๏ผฅ๏ผฆ๏ผง๏ผจ๏ผฉ๏ผช๏ผซ๏ผฌ๏ผญ๏ผฎ๏ผฏ๏ผฐ๏ผฑ๏ผฒ๏ผณ๏ผด๏ผต๏ผถ๏ผท๏ผธ๏ผน๏ผบ ๏ฝ๏ฝ‚๏ฝƒ๏ฝ„๏ฝ…๏ฝ†๏ฝ‡๏ฝˆ๏ฝ‰๏ฝŠ๏ฝ‹๏ฝŒ๏ฝ๏ฝŽ๏ฝ๏ฝ๏ฝ‘๏ฝ’๏ฝ“๏ฝ”๏ฝ•๏ฝ–๏ฝ—๏ฝ˜๏ฝ™๏ฝš ๏ผ‘๏ผ’๏ผ“๏ผ”๏ผ•๏ผ–๏ผ—๏ผ˜๏ผ™๏ผ ๏ผœ๏ผž๏ผŽ๏ผ๏ผผ๏ผŸ๏ผ›๏ผš๏ผ‡๏ผ‚ ๏ฝž๏ผ๏ผ ๏ผƒ๏ผ„๏ผ…๏ผพ๏ผ†๏ผŠ๏ผˆ๏ผ‰๏ผฟ๏ผ‹ |
|:monospace | ๐™ฐ๐™ฑ๐™ฒ๐™ณ๐™ด๐™ต๐™ถ๐™ท๐™ธ๐™น๐™บ๐™ป๐™ผ๐™ฝ๐™พ๐™ฟ๐š€๐š๐š‚๐šƒ๐š„๐š…๐š†๐š‡๐šˆ๐š‰ ๐šŠ๐š‹๐šŒ๐š๐šŽ๐š๐š๐š‘๐š’๐š“๐š”๐š•๐š–๐š—๐š˜๐š™๐šš๐š›๐šœ๐š๐šž๐šŸ๐š ๐šก๐šข๐šฃ ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ0 |
|:bold | ๐€๐๐‚๐ƒ๐„๐…๐†๐‡๐ˆ๐‰๐Š๐‹๐Œ๐๐Ž๐๐๐‘๐’๐“๐”๐•๐–๐—๐˜๐™ ๐š๐›๐œ๐๐ž๐Ÿ๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ฐ๐ฑ๐ฒ๐ณ ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—๐ŸŽ |
|:superscript | แดฌแดฎ๊Ÿฒแดฐแดฑ๊Ÿณแดณแดดแดตแดถแดทแดธแดนแดบแดผแดพ๊Ÿดแดฟหขแต€แตโฑฝแต‚หฃสธแถป แตƒแต‡แถœแตˆแต‰แถ แตสฐแถฆสฒแตหกแตโฟแต’แต–๐žฅสณหขแต—แต˜แต›สทหฃสธแถป ยนยฒยณโดโตโถโทโธโนโฐ |
|:italic | ๐ด๐ต๐ถ๐ท๐ธ๐น๐บ๐ป๐ผ๐ฝ๐พ๐ฟ๐‘€๐‘๐‘‚๐‘ƒ๐‘„๐‘…๐‘†๐‘‡๐‘ˆ๐‘‰๐‘Š๐‘‹๐‘Œ๐‘ ๐‘Ž๐‘๐‘๐‘‘๐‘’๐‘“๐‘”โ„Ž๐‘–๐‘—๐‘˜๐‘™๐‘š๐‘›๐‘œ๐‘๐‘ž๐‘Ÿ๐‘ ๐‘ก๐‘ข๐‘ฃ๐‘ค๐‘ฅ๐‘ฆ๐‘ง 1234567890 |
"""
@type format_mode ::
:noop
| :sans_serif
| :cursive
| :blackboard_bold
| :block
| :block_filled
| :bubble
| :bubble_filled
| :gothic
| :small_caps
| :aesthetic
| :monospace
| :bold
| :superscript
| :italic
@type substitution_map :: %{String.t() => String.t()}
@doc """
Gets the available formatting modes.
## Examples
iex> Fonticode.modes()
[ :noop,
:sans_serif,
:cursive,
:blackboard_bold,
:block,
:block_filled,
:bubble,
:bubble_filled,
:gothic,
:small_caps,
:aesthetic,
:monospace,
:bold,
:superscript,
:italic]
"""
def modes() do
[
:noop,
:sans_serif,
:cursive,
:blackboard_bold,
:block,
:block_filled,
:bubble,
:bubble_filled,
:gothic,
:small_caps,
:aesthetic,
:monospace,
:bold,
:superscript,
:italic
]
end
@doc """
Formats a string, replacing codepoints to mimic a pseudostyle.
Use `modes/0` to get available options.
## Examples
iex> Fonticode.format("ABC", :noop)
"ABC"
iex> Fonticode.format("ABC", :gothic)
"๐”„๐”…โ„ญ"
"""
@spec format(String.t(), format_mode) :: String.t()
def format(text, :noop), do: text
def format(text, :sans_serif) do
substitute(text, %{
"a" => "๐–บ",
"A" => "๐– ",
"b" => "๐–ป",
"B" => "๐–ก",
"c" => "๐–ผ",
"C" => "๐–ข",
"d" => "๐–ฝ",
"D" => "๐–ฃ",
"e" => "๐–พ",
"E" => "๐–ค",
"f" => "๐–ฟ",
"F" => "๐–ฅ",
"g" => "๐—€",
"G" => "๐–ฆ",
"h" => "๐—",
"H" => "๐–ง",
"i" => "๐—‚",
"I" => "๐–จ",
"j" => "๐—ƒ",
"J" => "๐–ฉ",
"k" => "๐—„",
"K" => "๐–ช",
"l" => "๐—…",
"L" => "๐–ซ",
"m" => "๐—†",
"M" => "๐–ฌ",
"n" => "๐—‡",
"N" => "๐–ญ",
"o" => "๐—ˆ",
"O" => "๐–ฎ",
"p" => "๐—‰",
"P" => "๐–ฏ",
"q" => "๐—Š",
"Q" => "๐–ฐ",
"r" => "๐—‹",
"R" => "๐–ฑ",
"s" => "๐—Œ",
"S" => "๐–ฒ",
"t" => "๐—",
"T" => "๐–ณ",
"u" => "๐—Ž",
"U" => "๐–ด",
"v" => "๐—",
"V" => "๐–ต",
"w" => "๐—",
"W" => "๐–ถ",
"x" => "๐—‘",
"X" => "๐–ท",
"y" => "๐—’",
"Y" => "๐–ธ",
"z" => "๐—“",
"Z" => "๐–น",
"1" => "๐Ÿฃ",
"2" => "๐Ÿค",
"3" => "๐Ÿฅ",
"4" => "๐Ÿฆ",
"5" => "๐Ÿง",
"6" => "๐Ÿจ",
"7" => "๐Ÿฉ",
"8" => "๐Ÿช",
"9" => "๐Ÿซ",
"0" => "๐Ÿข"
})
end
def format(text, :cursive) do
substitute(text, %{
"a" => "๐’ถ",
"A" => "๐’œ",
"b" => "๐’ท",
"B" => "โ„ฌ",
"c" => "๐’ธ",
"C" => "๐’ž",
"d" => "๐’น",
"D" => "๐’Ÿ",
"e" => "โ„ฏ",
"E" => "โ„ฐ",
"f" => "๐’ป",
"F" => "โ„ฑ",
"g" => "โ„Š",
"G" => "๐’ข",
"h" => "๐’ฝ",
"H" => "โ„‹",
"i" => "๐’พ",
"I" => "โ„",
"j" => "๐’ฟ",
"J" => "๐’ฅ",
"k" => "๐“€",
"K" => "๐’ฆ",
"l" => "๐“",
"L" => "โ„’",
"m" => "๐“‚",
"M" => "โ„ณ",
"n" => "๐“ƒ",
"N" => "๐’ฉ",
"o" => "โ„ด",
"O" => "๐’ช",
"p" => "๐“…",
"P" => "๐’ซ",
"q" => "๐“†",
"Q" => "๐’ฌ",
"r" => "๐“‡",
"R" => "โ„›",
"s" => "๐“ˆ",
"S" => "๐’ฎ",
"t" => "๐“‰",
"T" => "๐’ฏ",
"u" => "๐“Š",
"U" => "๐’ฐ",
"v" => "๐“‹",
"V" => "๐’ฑ",
"w" => "๐“Œ",
"W" => "๐’ฒ",
"x" => "๐“",
"X" => "๐’ณ",
"y" => "๐“Ž",
"Y" => "๐’ด",
"z" => "๐“",
"Z" => "๐’ต"
})
end
def format(text, :blackboard_bold) do
substitute(text, %{
"a" => "๐•’",
"A" => "๐”ธ",
"b" => "๐•“",
"B" => "๐”น",
"c" => "๐•”",
"C" => "โ„‚",
"d" => "๐••",
"D" => "๐”ป",
"e" => "๐•–",
"E" => "๐”ผ",
"f" => "๐•—",
"F" => "๐”ฝ",
"g" => "๐•˜",
"G" => "๐”พ",
"h" => "๐•™",
"H" => "โ„",
"i" => "๐•š",
"I" => "๐•€",
"j" => "๐•›",
"J" => "๐•",
"k" => "๐•œ",
"K" => "๐•‚",
"l" => "๐•",
"L" => "๐•ƒ",
"m" => "๐•ž",
"M" => "๐•„",
"n" => "๐•Ÿ",
"N" => "โ„•",
"o" => "๐• ",
"O" => "๐•†",
"p" => "๐•ก",
"P" => "โ„™",
"q" => "๐•ข",
"Q" => "โ„š",
"r" => "๐•ฃ",
"R" => "โ„",
"s" => "๐•ค",
"S" => "๐•Š",
"t" => "๐•ฅ",
"T" => "๐•‹",
"u" => "๐•ฆ",
"U" => "๐•Œ",
"v" => "๐•ง",
"V" => "๐•",
"w" => "๐•จ",
"W" => "๐•Ž",
"x" => "๐•ฉ",
"X" => "๐•",
"y" => "๐•ช",
"Y" => "๐•",
"z" => "๐•ซ",
"Z" => "โ„ค",
"1" => "๐Ÿ™",
"2" => "๐Ÿš",
"3" => "๐Ÿ›",
"4" => "๐Ÿœ",
"5" => "๐Ÿ",
"6" => "๐Ÿž",
"7" => "๐ŸŸ",
"8" => "๐Ÿ ",
"9" => "๐Ÿก",
"0" => "๐Ÿ˜"
})
end
def format(text, :block) do
substitute(text, %{
"a" => "๐Ÿ„ฐ",
"A" => "๐Ÿ„ฐ",
"b" => "๐Ÿ„ฑ",
"B" => "๐Ÿ„ฑ",
"c" => "๐Ÿ„ฒ",
"C" => "๐Ÿ„ฒ",
"d" => "๐Ÿ„ณ",
"D" => "๐Ÿ„ณ",
"e" => "๐Ÿ„ด",
"E" => "๐Ÿ„ด",
"f" => "๐Ÿ„ต",
"F" => "๐Ÿ„ต",
"g" => "๐Ÿ„ถ",
"G" => "๐Ÿ„ถ",
"h" => "๐Ÿ„ท",
"H" => "๐Ÿ„ท",
"i" => "๐Ÿ„ธ",
"I" => "๐Ÿ„ธ",
"j" => "๐Ÿ„น",
"J" => "๐Ÿ„น",
"k" => "๐Ÿ„บ",
"K" => "๐Ÿ„บ",
"l" => "๐Ÿ„ป",
"L" => "๐Ÿ„ป",
"m" => "๐Ÿ„ผ",
"M" => "๐Ÿ„ผ",
"n" => "๐Ÿ„ฝ",
"N" => "๐Ÿ„ฝ",
"o" => "๐Ÿ„พ",
"O" => "๐Ÿ„พ",
"p" => "๐Ÿ„ฟ",
"P" => "๐Ÿ„ฟ",
"q" => "๐Ÿ…€",
"Q" => "๐Ÿ…€",
"r" => "๐Ÿ…",
"R" => "๐Ÿ…",
"s" => "๐Ÿ…‚",
"S" => "๐Ÿ…‚",
"t" => "๐Ÿ…ƒ",
"T" => "๐Ÿ…ƒ",
"u" => "๐Ÿ…„",
"U" => "๐Ÿ…„",
"v" => "๐Ÿ……",
"V" => "๐Ÿ……",
"w" => "๐Ÿ…†",
"W" => "๐Ÿ…†",
"x" => "๐Ÿ…‡",
"X" => "๐Ÿ…‡",
"y" => "๐Ÿ…ˆ",
"Y" => "๐Ÿ…ˆ",
"z" => "๐Ÿ…‰",
"Z" => "๐Ÿ…‰"
})
end
def format(text, :block_filled) do
substitute(text, %{
"a" => "๐Ÿ…ฐ",
"A" => "๐Ÿ…ฐ",
"b" => "๐Ÿ…ฑ",
"B" => "๐Ÿ…ฑ",
"c" => "๐Ÿ…ฒ",
"C" => "๐Ÿ…ฒ",
"d" => "๐Ÿ…ณ",
"D" => "๐Ÿ…ณ",
"e" => "๐Ÿ…ด",
"E" => "๐Ÿ…ด",
"f" => "๐Ÿ…ต",
"F" => "๐Ÿ…ต",
"g" => "๐Ÿ…ถ",
"G" => "๐Ÿ…ถ",
"h" => "๐Ÿ…ท",
"H" => "๐Ÿ…ท",
"i" => "๐Ÿ…ธ",
"I" => "๐Ÿ…ธ",
"j" => "๐Ÿ…น",
"J" => "๐Ÿ…น",
"k" => "๐Ÿ…บ",
"K" => "๐Ÿ…บ",
"l" => "๐Ÿ…ป",
"L" => "๐Ÿ…ป",
"m" => "๐Ÿ…ผ",
"M" => "๐Ÿ…ผ",
"n" => "๐Ÿ…ฝ",
"N" => "๐Ÿ…ฝ",
"o" => "๐Ÿ…พ",
"O" => "๐Ÿ…พ",
"p" => "๐Ÿ…ฟ",
"P" => "๐Ÿ…ฟ",
"q" => "๐Ÿ†€",
"Q" => "๐Ÿ†€",
"r" => "๐Ÿ†",
"R" => "๐Ÿ†",
"s" => "๐Ÿ†‚",
"S" => "๐Ÿ†‚",
"t" => "๐Ÿ†ƒ",
"T" => "๐Ÿ†ƒ",
"u" => "๐Ÿ†„",
"U" => "๐Ÿ†„",
"v" => "๐Ÿ†…",
"V" => "๐Ÿ†…",
"w" => "๐Ÿ††",
"W" => "๐Ÿ††",
"x" => "๐Ÿ†‡",
"X" => "๐Ÿ†‡",
"y" => "๐Ÿ†ˆ",
"Y" => "๐Ÿ†ˆ",
"z" => "๐Ÿ†‰",
"Z" => "๐Ÿ†‰"
})
end
def format(text, :bubble) do
substitute(text, %{
"a" => "โ“",
"A" => "โ’ถ",
"b" => "โ“‘",
"B" => "โ’ท",
"c" => "โ“’",
"C" => "โ’ธ",
"d" => "โ““",
"D" => "โ’น",
"e" => "โ“”",
"E" => "โ’บ",
"f" => "โ“•",
"F" => "โ’ป",
"g" => "โ“–",
"G" => "โ’ผ",
"h" => "โ“—",
"H" => "โ’ฝ",
"i" => "โ“˜",
"I" => "โ’พ",
"j" => "โ“™",
"J" => "โ’ฟ",
"k" => "โ“š",
"K" => "โ“€",
"l" => "โ“›",
"L" => "โ“",
"m" => "โ“œ",
"M" => "โ“‚",
"n" => "โ“",
"N" => "โ“ƒ",
"o" => "โ“ž",
"O" => "โ“„",
"p" => "โ“Ÿ",
"P" => "โ“…",
"q" => "โ“ ",
"Q" => "โ“†",
"r" => "โ“ก",
"R" => "โ“‡",
"s" => "โ“ข",
"S" => "โ“ˆ",
"t" => "โ“ฃ",
"T" => "โ“‰",
"u" => "โ“ค",
"U" => "โ“Š",
"v" => "โ“ฅ",
"V" => "โ“‹",
"w" => "โ“ฆ",
"W" => "โ“Œ",
"x" => "โ“ง",
"X" => "โ“",
"y" => "โ“จ",
"Y" => "โ“Ž",
"z" => "โ“ฉ",
"Z" => "โ“",
"1" => "โ‘ ",
"2" => "โ‘ก",
"3" => "โ‘ข",
"4" => "โ‘ฃ",
"5" => "โ‘ค",
"6" => "โ‘ฅ",
"7" => "โ‘ฆ",
"8" => "โ‘ง",
"9" => "โ‘จ",
"0" => "โ“ช"
})
end
def format(text, :bubble_filled) do
substitute(text, %{
"a" => "๐Ÿ…",
"A" => "๐Ÿ…",
"b" => "๐Ÿ…‘",
"B" => "๐Ÿ…‘",
"c" => "๐Ÿ…’",
"C" => "๐Ÿ…’",
"d" => "๐Ÿ…“",
"D" => "๐Ÿ…“",
"e" => "๐Ÿ…”",
"E" => "๐Ÿ…”",
"f" => "๐Ÿ…•",
"F" => "๐Ÿ…•",
"g" => "๐Ÿ…–",
"G" => "๐Ÿ…–",
"h" => "๐Ÿ…—",
"H" => "๐Ÿ…—",
"i" => "๐Ÿ…˜",
"I" => "๐Ÿ…˜",
"j" => "๐Ÿ…™",
"J" => "๐Ÿ…™",
"k" => "๐Ÿ…š",
"K" => "๐Ÿ…š",
"l" => "๐Ÿ…›",
"L" => "๐Ÿ…›",
"m" => "๐Ÿ…œ",
"M" => "๐Ÿ…œ",
"n" => "๐Ÿ…",
"N" => "๐Ÿ…",
"o" => "๐Ÿ…ž",
"O" => "๐Ÿ…ž",
"p" => "๐Ÿ…Ÿ",
"P" => "๐Ÿ…Ÿ",
"q" => "๐Ÿ… ",
"Q" => "๐Ÿ… ",
"r" => "๐Ÿ…ก",
"R" => "๐Ÿ…ก",
"s" => "๐Ÿ…ข",
"S" => "๐Ÿ…ข",
"t" => "๐Ÿ…ฃ",
"T" => "๐Ÿ…ฃ",
"u" => "๐Ÿ…ค",
"U" => "๐Ÿ…ค",
"v" => "๐Ÿ…ฅ",
"V" => "๐Ÿ…ฅ",
"w" => "๐Ÿ…ฆ",
"W" => "๐Ÿ…ฆ",
"x" => "๐Ÿ…ง",
"X" => "๐Ÿ…ง",
"y" => "๐Ÿ…จ",
"Y" => "๐Ÿ…จ",
"z" => "๐Ÿ…ฉ",
"Z" => "๐Ÿ…ฉ",
"1" => "โžŠ",
"2" => "โž‹",
"3" => "โžŒ",
"4" => "โž",
"5" => "โžŽ",
"6" => "โž",
"7" => "โž",
"8" => "โž‘",
"9" => "โž’",
"0" => "โ“ฟ"
})
end
def format(text, :gothic) do
substitute(text, %{
"a" => "๐”ž",
"A" => "๐”„",
"b" => "๐”Ÿ",
"B" => "๐”…",
"c" => "๐” ",
"C" => "โ„ญ",
"d" => "๐”ก",
"D" => "๐”‡",
"e" => "๐”ข",
"E" => "๐”ˆ",
"f" => "๐”ฃ",
"F" => "๐”‰",
"g" => "๐”ค",
"G" => "๐”Š",
"h" => "๐”ฅ",
"H" => "โ„Œ",
"i" => "๐”ฆ",
"I" => "โ„‘",
"j" => "๐”ง",
"J" => "๐”",
"k" => "๐”จ",
"K" => "๐”Ž",
"l" => "๐”ฉ",
"L" => "๐”",
"m" => "๐”ช",
"M" => "๐”",
"n" => "๐”ซ",
"N" => "๐”‘",
"o" => "๐”ฌ",
"O" => "๐”’",
"p" => "๐”ญ",
"P" => "๐”“",
"q" => "๐”ฎ",
"Q" => "๐””",
"r" => "๐”ฏ",
"R" => "โ„œ",
"s" => "๐”ฐ",
"S" => "๐”–",
"t" => "๐”ฑ",
"T" => "๐”—",
"u" => "๐”ฒ",
"U" => "๐”˜",
"v" => "๐”ณ",
"V" => "๐”™",
"w" => "๐”ด",
"W" => "๐”š",
"x" => "๐”ต",
"X" => "๐”›",
"y" => "๐”ถ",
"Y" => "๐”œ",
"z" => "๐”ท",
"Z" => "โ„จ"
})
end
def format(text, :small_caps) do
substitute(text, %{
"a" => "แด€",
"b" => "ส™",
"c" => "แด„",
"d" => "แด…",
"e" => "แด‡",
"f" => "า“",
"g" => "ษข",
"h" => "สœ",
"i" => "ษช",
"j" => "แดŠ",
"k" => "แด‹",
"l" => "สŸ",
"m" => "แด",
"n" => "ษด",
"o" => "แด",
"p" => "แด˜",
"q" => "วซ",
"r" => "ส€",
"s" => "s",
"t" => "แด›",
"u" => "แดœ",
"v" => "แด ",
"w" => "แดก",
"x" => "x",
"y" => "ส",
"z" => "แดข"
})
end
def format(text, :aesthetic) do
substitute(text, %{
"a" => "๏ฝ",
"A" => "๏ผก",
"b" => "๏ฝ‚",
"B" => "๏ผข",
"c" => "๏ฝƒ",
"C" => "๏ผฃ",
"d" => "๏ฝ„",
"D" => "๏ผค",
"e" => "๏ฝ…",
"E" => "๏ผฅ",
"f" => "๏ฝ†",
"F" => "๏ผฆ",
"g" => "๏ฝ‡",
"G" => "๏ผง",
"h" => "๏ฝˆ",
"H" => "๏ผจ",
"i" => "๏ฝ‰",
"I" => "๏ผฉ",
"j" => "๏ฝŠ",
"J" => "๏ผช",
"k" => "๏ฝ‹",
"K" => "๏ผซ",
"l" => "๏ฝŒ",
"L" => "๏ผฌ",
"m" => "๏ฝ",
"M" => "๏ผญ",
"n" => "๏ฝŽ",
"N" => "๏ผฎ",
"o" => "๏ฝ",
"O" => "๏ผฏ",
"p" => "๏ฝ",
"P" => "๏ผฐ",
"q" => "๏ฝ‘",
"Q" => "๏ผฑ",
"r" => "๏ฝ’",
"R" => "๏ผฒ",
"s" => "๏ฝ“",
"S" => "๏ผณ",
"t" => "๏ฝ”",
"T" => "๏ผด",
"u" => "๏ฝ•",
"U" => "๏ผต",
"v" => "๏ฝ–",
"V" => "๏ผถ",
"w" => "๏ฝ—",
"W" => "๏ผท",
"x" => "๏ฝ˜",
"X" => "๏ผธ",
"y" => "๏ฝ™",
"Y" => "๏ผน",
"z" => "๏ฝš",
"Z" => "๏ผบ",
"1" => "๏ผ‘",
"2" => "๏ผ’",
"3" => "๏ผ“",
"4" => "๏ผ”",
"5" => "๏ผ•",
"6" => "๏ผ–",
"7" => "๏ผ—",
"8" => "๏ผ˜",
"9" => "๏ผ™",
"0" => "๏ผ",
"<" => "๏ผœ",
"~" => "๏ฝž",
">" => "๏ผž",
"!" => "๏ผ",
"." => "๏ผŽ",
"@" => "๏ผ ",
"/" => "๏ผ",
"#" => "๏ผƒ",
"\\" => "๏ผผ",
"$" => "๏ผ„",
"?" => "๏ผŸ",
"%" => "๏ผ…",
";" => "๏ผ›",
"^" => "๏ผพ",
":" => "๏ผš",
"&" => "๏ผ†",
"'" => "๏ผ‡",
"*" => "๏ผŠ",
"\"" => "๏ผ‚",
"(" => "๏ผˆ",
")" => "๏ผ‰",
"_" => "๏ผฟ",
"+" => "๏ผ‹"
})
end
def format(text, :monospace) do
substitute(text, %{
"a" => "๐šŠ",
"A" => "๐™ฐ",
"b" => "๐š‹",
"B" => "๐™ฑ",
"c" => "๐šŒ",
"C" => "๐™ฒ",
"d" => "๐š",
"D" => "๐™ณ",
"e" => "๐šŽ",
"E" => "๐™ด",
"f" => "๐š",
"F" => "๐™ต",
"g" => "๐š",
"G" => "๐™ถ",
"h" => "๐š‘",
"H" => "๐™ท",
"i" => "๐š’",
"I" => "๐™ธ",
"j" => "๐š“",
"J" => "๐™น",
"k" => "๐š”",
"K" => "๐™บ",
"l" => "๐š•",
"L" => "๐™ป",
"m" => "๐š–",
"M" => "๐™ผ",
"n" => "๐š—",
"N" => "๐™ฝ",
"o" => "๐š˜",
"O" => "๐™พ",
"p" => "๐š™",
"P" => "๐™ฟ",
"q" => "๐šš",
"Q" => "๐š€",
"r" => "๐š›",
"R" => "๐š",
"s" => "๐šœ",
"S" => "๐š‚",
"t" => "๐š",
"T" => "๐šƒ",
"u" => "๐šž",
"U" => "๐š„",
"v" => "๐šŸ",
"V" => "๐š…",
"w" => "๐š ",
"W" => "๐š†",
"x" => "๐šก",
"X" => "๐š‡",
"y" => "๐šข",
"Y" => "๐šˆ",
"z" => "๐šฃ",
"Z" => "๐š‰",
"1" => "๐Ÿท",
"2" => "๐Ÿธ",
"3" => "๐Ÿน",
"4" => "๐Ÿบ",
"5" => "๐Ÿป",
"6" => "๐Ÿผ",
"7" => "๐Ÿฝ",
"8" => "๐Ÿพ",
"9" => "๐Ÿฟ"
})
end
def format(text, :bold) do
substitute(text, %{
"a" => "๐š",
"A" => "๐€",
"b" => "๐›",
"B" => "๐",
"c" => "๐œ",
"C" => "๐‚",
"d" => "๐",
"D" => "๐ƒ",
"e" => "๐ž",
"E" => "๐„",
"f" => "๐Ÿ",
"F" => "๐…",
"g" => "๐ ",
"G" => "๐†",
"h" => "๐ก",
"H" => "๐‡",
"i" => "๐ข",
"I" => "๐ˆ",
"j" => "๐ฃ",
"J" => "๐‰",
"k" => "๐ค",
"K" => "๐Š",
"l" => "๐ฅ",
"L" => "๐‹",
"m" => "๐ฆ",
"M" => "๐Œ",
"n" => "๐ง",
"N" => "๐",
"o" => "๐จ",
"O" => "๐Ž",
"p" => "๐ฉ",
"P" => "๐",
"q" => "๐ช",
"Q" => "๐",
"r" => "๐ซ",
"R" => "๐‘",
"s" => "๐ฌ",
"S" => "๐’",
"t" => "๐ญ",
"T" => "๐“",
"u" => "๐ฎ",
"U" => "๐”",
"v" => "๐ฏ",
"V" => "๐•",
"w" => "๐ฐ",
"W" => "๐–",
"x" => "๐ฑ",
"X" => "๐—",
"y" => "๐ฒ",
"Y" => "๐˜",
"z" => "๐ณ",
"Z" => "๐™",
"1" => "๐Ÿ",
"2" => "๐Ÿ",
"3" => "๐Ÿ‘",
"4" => "๐Ÿ’",
"5" => "๐Ÿ“",
"6" => "๐Ÿ”",
"7" => "๐Ÿ•",
"8" => "๐Ÿ–",
"9" => "๐Ÿ—",
"0" => "๐ŸŽ"
})
end
def format(text, :superscript) do
substitute(text, %{
"a" => "แตƒ",
"A" => "แดฌ",
"b" => "แต‡",
"B" => "แดฎ",
"c" => "แถœ",
"C" => "๊Ÿฒ",
"d" => "แตˆ",
"D" => "แดฐ",
"e" => "แต‰",
"E" => "แดฑ",
"f" => "แถ ",
"F" => "๊Ÿณ",
"g" => "แต",
"G" => "แดณ",
"h" => "สฐ",
"H" => "แดด",
"i" => "แถฆ",
"I" => "แดต",
"j" => "สฒ",
"J" => "แดถ",
"k" => "แต",
"K" => "แดท",
"l" => "หก",
"L" => "แดธ",
"m" => "แต",
"M" => "แดน",
"n" => "โฟ",
"N" => "แดบ",
"o" => "แต’",
"O" => "แดผ",
"p" => "แต–",
"P" => "แดพ",
"q" => "๐žฅ",
"Q" => "๊Ÿด",
"r" => "สณ",
"R" => "แดฟ",
"s" => "หข",
"S" => "หข",
"t" => "แต—",
"T" => "แต€",
"u" => "แต˜",
"U" => "แต",
"v" => "แต›",
"V" => "โฑฝ",
"w" => "สท",
"W" => "แต‚",
"x" => "หฃ",
"X" => "หฃ",
"y" => "สธ",
"Y" => "สธ",
"z" => "แถป",
"Z" => "แถป",
"1" => "ยน",
"2" => "ยฒ",
"3" => "ยณ",
"4" => "โด",
"5" => "โต",
"6" => "โถ",
"7" => "โท",
"8" => "โธ",
"9" => "โน",
"0" => "โฐ",
"(" => "โฝ",
")" => "โพ",
"+" => "โบ"
})
end
def format(text, :italic) do
substitute(text, %{
"a" => "๐‘Ž",
"A" => "๐ด",
"b" => "๐‘",
"B" => "๐ต",
"c" => "๐‘",
"C" => "๐ถ",
"d" => "๐‘‘",
"D" => "๐ท",
"e" => "๐‘’",
"E" => "๐ธ",
"f" => "๐‘“",
"F" => "๐น",
"g" => "๐‘”",
"G" => "๐บ",
"h" => "โ„Ž",
"H" => "๐ป",
"i" => "๐‘–",
"I" => "๐ผ",
"j" => "๐‘—",
"J" => "๐ฝ",
"k" => "๐‘˜",
"K" => "๐พ",
"l" => "๐‘™",
"L" => "๐ฟ",
"m" => "๐‘š",
"M" => "๐‘€",
"n" => "๐‘›",
"N" => "๐‘",
"o" => "๐‘œ",
"O" => "๐‘‚",
"p" => "๐‘",
"P" => "๐‘ƒ",
"q" => "๐‘ž",
"Q" => "๐‘„",
"r" => "๐‘Ÿ",
"R" => "๐‘…",
"s" => "๐‘ ",
"S" => "๐‘†",
"t" => "๐‘ก",
"T" => "๐‘‡",
"u" => "๐‘ข",
"U" => "๐‘ˆ",
"v" => "๐‘ฃ",
"V" => "๐‘‰",
"w" => "๐‘ค",
"W" => "๐‘Š",
"x" => "๐‘ฅ",
"X" => "๐‘‹",
"y" => "๐‘ฆ",
"Y" => "๐‘Œ",
"z" => "๐‘ง",
"Z" => "๐‘"
})
end
# taken from:
#
# TODO: I suspect this could be replaced with macro douchebaggery. -crertel
@doc """
Given a binary and a map of codepoint replacements, does so.
Implementation cribbed from [here](https://elixirforum.com/t/is-there-a-faster-way-to-write-this-code/18486/3).
## Examples
iex> Fonticode.substitute("ABCDE", %{"C" => "X", "D" => "Y"})
"ABXYE"
iex> Fonticode.substitute("ABCDE", %{"C" => "D", "D" => "C"})
"ABDCE"
"""
@spec substitute(String.t(), substitution_map) :: String.t()
def substitute(data, subs) when is_binary(data) and is_map(subs) do
match_list = :binary.matches(data, Map.keys(subs))
IO.iodata_to_binary(do_replace(data, match_list, subs, 0))
end
@spec do_replace(String.t(), [{non_neg_integer, integer}], substitution_map, non_neg_integer) ::
[any]
defp do_replace(h, [], _, n)
when is_binary(h) and is_integer(n) do
[:binary.part(h, {n, byte_size(h) - n})]
end
defp do_replace(h, [{a, b} | t], subs, n)
when is_binary(h) and
is_map(subs) and
is_list(t) and
is_integer(a) and
is_integer(b) and
is_integer(n) do
[
:binary.part(h, {n, a - n}),
Map.get(subs, :binary.part(h, {a, b}))
| do_replace(h, t, subs, a + b)
]
end
end