From 17da8a27253bd5097fd2a7efce5077224f060733 Mon Sep 17 00:00:00 2001 From: Lanius Trolling Date: Sun, 3 Sep 2023 08:15:47 -0400 Subject: [PATCH] Add Pokhwalish language --- src/main/kotlin/info/mechyrdia/Factbooks.kt | 4 ++ .../lore/{tylan_language.kt => languages.kt} | 41 ++++++++++++++++++ .../kotlin/info/mechyrdia/lore/parser_tags.kt | 18 +++++++- .../static/font/pokhval-alphabet.woff | Bin 0 -> 2884 bytes src/main/resources/static/init.js | 25 +++++++++++ src/main/resources/static/style.css | 18 ++++++++ 6 files changed, 104 insertions(+), 2 deletions(-) rename src/main/kotlin/info/mechyrdia/lore/{tylan_language.kt => languages.kt} (69%) create mode 100644 src/main/resources/static/font/pokhval-alphabet.woff diff --git a/src/main/kotlin/info/mechyrdia/Factbooks.kt b/src/main/kotlin/info/mechyrdia/Factbooks.kt index 867d0df..6d43060 100644 --- a/src/main/kotlin/info/mechyrdia/Factbooks.kt +++ b/src/main/kotlin/info/mechyrdia/Factbooks.kt @@ -223,6 +223,10 @@ fun Application.factbooks() { call.respondText(TylanAlphabet.tylanToFontAlphabet(call.receiveText())) } + post("/pokhwal-lang") { + call.respondText(PokhwalishAlphabet.pokhwalToFontAlphabet(call.receiveText())) + } + post("/preview-comment") { call.respondText( text = TextParserState.parseText(call.receiveText(), TextParserCommentTags.asTags, Unit), diff --git a/src/main/kotlin/info/mechyrdia/lore/tylan_language.kt b/src/main/kotlin/info/mechyrdia/lore/languages.kt similarity index 69% rename from src/main/kotlin/info/mechyrdia/lore/tylan_language.kt rename to src/main/kotlin/info/mechyrdia/lore/languages.kt index f4d5395..1e4d6a4 100644 --- a/src/main/kotlin/info/mechyrdia/lore/tylan_language.kt +++ b/src/main/kotlin/info/mechyrdia/lore/languages.kt @@ -84,3 +84,44 @@ object TylanAlphabet { partial.replace(regex, replacement) } } + +object PokhwalishAlphabet { + private val allowedTranslitCharacters = setOf( + ' ', '\r', '\n', '\t', + 'a', 'b', 'c', 'd', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'y', 'z', + '.', ',', '\'', '?', '!', + ) + + private val replacements = listOf( + // Vowels + Regex("aa") to "A", + Regex("ae") to "A", + Regex("ee") to "E", + Regex("ei") to "E", + Regex("ey") to "E", + Regex("ie") to "I", + Regex("ii") to "I", + Regex("iy") to "I", + Regex("ao") to "O", + Regex("au") to "O", + Regex("oo") to "O", + Regex("ou") to "U", + Regex("uu") to "U", + // Consonants + Regex("tz") to "C", + Regex("hh") to "K", + Regex("kh") to "K", + Regex("gh") to "G", + Regex("ng(?![aeiouAEIOU])") to "N", + Regex("n'g") to "ng", + Regex("qh") to "Q", + Regex("th") to "T", + + Regex("ck") to "q", + Regex("k") to "q", + ) + + fun pokhwalToFontAlphabet(pokhwal: String) = replacements.fold(pokhwal.lowercase().filter { it in allowedTranslitCharacters }) { partial, (regex, replacement) -> + partial.replace(regex, replacement) + } +} diff --git a/src/main/kotlin/info/mechyrdia/lore/parser_tags.kt b/src/main/kotlin/info/mechyrdia/lore/parser_tags.kt index 7c37e5d..f56ccdf 100644 --- a/src/main/kotlin/info/mechyrdia/lore/parser_tags.kt +++ b/src/main/kotlin/info/mechyrdia/lore/parser_tags.kt @@ -294,7 +294,12 @@ enum class TextParserFormattingTag(val type: TextParserTagType) { "$recensored" } else if (tagParam?.equals("thedish", ignoreCase = true) == true) "$content" - else if (tagParam?.equals("gothic", ignoreCase = true) == true) + else if (tagParam?.equals("pokhval", ignoreCase = true) == true || tagParam?.equals("pokhwal", ignoreCase = true) == true) { + val uncensored = TextParserState.uncensorText(content) + val pokhwal = PokhwalishAlphabet.pokhwalToFontAlphabet(uncensored) + val recensored = TextParserState.censorText(pokhwal) + "$recensored" + } else if (tagParam?.equals("gothic", ignoreCase = true) == true) "$content" else content } @@ -319,7 +324,16 @@ enum class TextParserFormattingTag(val type: TextParserTagType) { | | """.trimMargin() - } else content + } else if (content.equals("pokhval", ignoreCase = true) || content.equals("pokhwal", ignoreCase = true)) { + """ + |
+ |

Latin Alphabet:

+ | + |

Pokhwalish Alphabet:

+ | + |
+ """.trimMargin() + } else "" } ), ; diff --git a/src/main/resources/static/font/pokhval-alphabet.woff b/src/main/resources/static/font/pokhval-alphabet.woff new file mode 100644 index 0000000000000000000000000000000000000000..2fa7d678735532c307c1f9fbfe7e2197f935e7ab GIT binary patch literal 2884 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%0D3pt|>s696O_2$V7(9#3h!9Pv zUy|+DB*BvJjf!+H_K6j!r8KV~bY>~&``%kN+%Jt)ue-?D!q8#u1m=NrGpliy^Y&bl zkZFZJc3;H0to5tuS?S4?aL1jCT&(b5e`8BSuc-x!L!qs@TvnFXl~Hfkyqtqo!-7oF z)x7S-syGF|`p$svd0Yhe86He@RSnw~5-{y=uTYk@tu9M6-mLQ-P8BtuDmN+jHBlSg zHJykUM)zN>UZlRp9a*~mdJ^|upkyv2K(b&;`l5!b;$N1-sJ+7J#GmIfO{n4BpO4qB z$4PduRASm@$|g6De_SIh|L8q+RO0_vf7lQ9xg>Qn#N=6g?<ir$6+V*Cj%w7^4cE0RwhrOShpI3mZ zuP5n5byY>Ug@)#t)6Py`tXD*{{m@AR^{|v&P7^RUK*0P7{hi0gz`P*t1$8^h&J94d g0O@~o8j pokhwalToFont(inputBox, outputBox)); + } + }); + window.addEventListener("load", function () { // Preview themes const themeChoices = document.getElementsByName("theme"); diff --git a/src/main/resources/static/style.css b/src/main/resources/static/style.css index 831710e..acf0aba 100644 --- a/src/main/resources/static/style.css +++ b/src/main/resources/static/style.css @@ -902,6 +902,24 @@ textarea.lang-thedish { line-height: 1.0; } +@font-face { + font-family: 'Pochvalsk'; + src: url(/static/font/pokhval-alphabet.woff) format('woff'); +} + +.lang-pokhwal { + font-family: Pochvalsk, monospace; + font-size: 1em; + line-height: 1.0; + font-variant: normal !important; +} + +textarea.lang-pokhwal { + font-family: Pochvalsk, monospace; + font-size: 2em; + line-height: 1.0; +} + #thumb-view { display: none; } -- 2.25.1