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