Browse Source

Merge branch 'main' of gh:lcnetdev/scriptshifter

scossu 10 months ago
parent
commit
5a4e6a4941

+ 38 - 0
scriptshifter/hooks/adlam_hooks.py

@@ -0,0 +1,38 @@
+import logging
+import re
+from scriptshifter.exceptions import CONT
+
+
+__doc__ = """ Process contextual substitutions for prenasalization. """
+
+
+logger = logging.getLogger(__name__)
+
+
+def s2r_post(ctx):
+    # clean up word initial pre-nasalization
+    regex1 = r"\b([Nn])([Nn])([dgjDGJ])"
+    subst1 = r"\g<1>\g<3>"
+    ctx.dest = re.sub(regex1, subst1, ctx.dest, 0)
+    regex2 = r"\b([Mm])([Mm])([bB])"
+    subst2 = r"\g<1>\g<3>"
+    ctx.dest = re.sub(regex2, subst2, ctx.dest, 0)
+    regex3 = r"\b(N)(b)"
+    subst3 = r"M\g<2>"
+    # clean up nested lower case when source text is all caps
+    ctx.dest = re.sub(regex3, subst3, ctx.dest, 0)
+    regex4 = r"([ABƁCDƊEFGHIJKLMNŊÑOPQRSTUVWYƳZ])([abɓcdɗefghijklmnŋñopqrstuvwyƴz][bhp]?)([ABƁCDƊEFGHIJKLMNŊÑOPQRSTUVWYƳZ])"
+    nested_lower = re.search(regex4, ctx.dest)
+    if nested_lower:
+        ctx.dest = re.sub(regex4, nested_lower.string.upper(), ctx.dest, 0)
+    return(None)
+
+def r2s_post(ctx):
+    # clean up word initial pre-nasalization
+    regex1 = r"\b([𞤲𞤐])𞥋([𞤄𞤁𞤘𞤔𞤦𞤣𞤺𞤶])"
+    subst1 = r"\g<1>\g<2>"
+    ctx.dest = re.sub(regex1, subst1, ctx.dest, 0)
+    regex2 = r"\b([𞤃])([𞤦])"
+    subst2 = r"𞤐\g<2>"
+    ctx.dest = re.sub(regex2, subst2, ctx.dest, 0)
+    return(None)

+ 0 - 3
scriptshifter/rest_api.py

@@ -19,9 +19,6 @@ def create_app():
     app.config.update({
         "ENV": flask_env,
         "SECRET_KEY": environ.get("TXL_FLASK_SECRET", b64encode(urandom(64))),
-        # Prod requires the application to be behind a web server, or static
-        # files won't be served directly by Flask using this option.
-        "USE_X_SENDFILE": flask_env == "production",
         "JSON_AS_ASCII": False,
         "JSONIFY_PRETTYPRINT_REGULAR": True,
     })

+ 1 - 1
scriptshifter/tables/__init__.py

@@ -203,7 +203,7 @@ def load_table(tname):
         # Hooks.
         if "hooks" in tdata["roman_to_script"]:
             tdata["roman_to_script"]["hooks"] = load_hook_fn(
-                    tname, tdata["script_to_roman"])
+                    tname, tdata["roman_to_script"])
 
     return tdata
 

+ 9 - 5
scriptshifter/tables/data/armenian.yml

@@ -18,11 +18,11 @@ roman_to_script:
     "G": "\u0533"
     "g": "\u0563"
     # DZ combination
-    "DZ": "\u0541\u0566"
+    "DZ": "\u0541"
     # Dz combination
-    "Dz": "\u0541\u0566"
+    "Dz": "\u0541"
     # dz combination
-    "dz": "\u0571\u0566"
+    "dz": "\u0571"
     "D": "\u0534"
     "d": "\u0564"
     # E uppercase with macron
@@ -123,6 +123,8 @@ roman_to_script:
     "P\u02BB": "\u0553"
     # p lowercase + ayn
     "p\u02BB": "\u0583"
+    "P": "\u054A"
+    "p": "\u057A"
     "J": "\u054B"
     "j": "\u057B"
     # R uppercase with combining dot below
@@ -176,9 +178,9 @@ script_to_roman:
     "\u0533": "G"
     "\u0563": "g"
     # Dz combination
-    "\u0541\u0566": "Dz"
+    "\u0541": "Dz"
     # dz combination
-    "\u0571\u0566": "dz"
+    "\u0571": "dz"
     "\u0534": "D"
     "\u0564": "d"
     # E uppercase with macron
@@ -265,6 +267,8 @@ script_to_roman:
     "\u0553": "P\u02BB"
     # p lowercase + ayn
     "\u0583": "p\u02BB"
+    "\u054A": "P"
+    "\u057A": "p"
     "\u054B": "J"
     "\u057B": "j"
     # R uppercase with combining dot below

+ 17 - 0
scriptshifter/tables/data/azerbaijani.yml

@@ -7,14 +7,21 @@ roman_to_script:
   map:
     "A\u0306": "\u04D8"
     "a\u0306": "\u04D9"
+    "G": "\u0413"
+    "g": "\u0433"
     # Included to handle typos
     "GH": "\u0492"
     "Gh": "\u0492"
     "gh": "\u0493"
     # Included to handle typos
     "gH": "\u0493"
+    "ZH": "\u0416"
+    "Zh": "\u0416"
+    "zh": "\u0436"
     "I\u0310": "\u0408"
+    "I": "\u0418"
     "i\u0310": "\u0458"
+    "i": "\u0438"
     "G\u0307": "\u049C"
     "g\u0307": "\u049D"
     "O\u0307": "\u04E8"
@@ -25,13 +32,21 @@ roman_to_script:
     "h\u0307": "\u04BB"
     "J": "\u04B8"
     "j": "\u04B9"
+    "Y": "\u042B"
+    "y": "\u044B"
 
 script_to_roman:
   map:
     "\u04D8": "A\u0306"
     "\u04D9": "a\u0306"
+    "\u0413": "G"
+    "\u0433": "g"
     "\u0492": "Gh"
     "\u0493": "gh"
+    "\u0416": "Zh"
+    "\u0436": "zh"
+    "\u0418": "I"
+    "\u0438": "i"
     "\u0408": "I\u0310"
     "\u0458": "i\u0310"
     "\u049C": "G\u0307"
@@ -44,3 +59,5 @@ script_to_roman:
     "\u04BB": "h\u0307"
     "\u04B8": "J"
     "\u04B9": "j"
+    "\u042B": "Y"
+    "\u044B": "y"

+ 6 - 4
scriptshifter/tables/data/index.yml

@@ -30,8 +30,6 @@ ethiopic:
   name: Ethiopic (Amharic)
 georgian:
   name: Georgian
-greek:
-  name: Greek (classic)
 hindi:
   name: Hindi (Devanagari)
 kazakh:
@@ -46,8 +44,12 @@ mongolian_mongol_bichig:
   name: Mongolian (Mongol bichig)
 russian:
   name: Russian
-serbian_macedonian:
-  name: Serbian and Macedonian
+macedonian:
+  name: Macedonian
+serbian:
+  name: Serbian
+pulaar:
+  name: Pulaar (Adlam)
 tajik:
   name: Tajik (Cyrillic)
 tatar:

+ 903 - 0
scriptshifter/tables/data/pulaar.yml

@@ -0,0 +1,903 @@
+general:
+  name: Pulaar (Adlam)
+
+roman_to_script:
+  hooks:
+    post_assembly:
+      -
+        - adlam_hooks.r2s_post
+
+  map:
+    # Non-Nyondal Cases
+    "MMB": "𞤐𞤄"
+    "mmb": "𞤲𞤦"
+    "NND": "𞤐𞤁"
+    "nnd": "𞤲𞤣"
+    "NNG": "𞤐𞤘"
+    "nng": "𞤲𞤺"
+    "NNJ": "𞤐𞤔"
+    "nnj": "𞤲𞤶"
+
+    "MB": "𞤐𞥋𞤄"
+    "mb": "𞤲𞥋𞤦"
+    "ND": "𞤐𞥋𞤁"
+    "nd": "𞤲𞥋𞤣"
+    "NG": "𞤐𞥋𞤘"
+    "ng": "𞤲𞥋𞤺"
+    "NJ": "𞤐𞥋𞤔"
+    "nj": "𞤲𞥋𞤶"
+    # Non-geminated combined vowels
+    ## modified vowels
+    "Ạ'Ạ": "𞤀𞥊𞤀𞥊"
+    "Ạ'ạ": "𞤀𞥊𞤢𞥊"
+    "ạ'ạ": "𞤢𞥊𞤢𞥊"
+    "Ɛ'Ɛ": "𞤉𞥊𞤉𞥊"
+    "Ɛ'ɛ": "𞤉𞥊𞤫𞥊"
+    "E'ɛ": "𞤉𞥊𞤫𞥊"
+    "Ị'Ị": "𞤋𞥊𞤋𞥊"
+    "Ị'ị": "𞤋𞥊𞤭𞥊"
+    "ị'ị": "𞤭𞥊𞤭𞥊"
+    "Ɔ'Ɔ": "𞤌𞥊𞤌𞥊"
+    "Ɔ'ɔ": "𞤌𞥊𞤮𞥊"
+    "ɔ'ɔ": "𞤮𞥊𞤮𞥊"
+    "Ụ'Ụ": "𞤓𞥊𞤓𞥊"
+    "Ụ'ụ": "𞤓𞥊𞤵𞥊"
+    "ụ'ụ": "𞤵𞥊𞤵𞥊"
+    ## standard vowels
+    "A'A": "𞤀𞤀"
+    "A'a": "𞤀𞤢"
+    "a'a": "𞤢𞤢"
+    "E'E": "𞤉𞤉"
+    "E'e": "𞤉𞤫"
+    "e'e": "𞤫𞤫"
+    "I'I": "𞤋𞤋"
+    "I'i": "𞤋𞤭"
+    "i'i": "𞤭𞤭"
+    "O'O": "𞤌𞤌"
+    "O'o": "𞤌𞤮"
+    "o'o": "𞤮𞤮"
+    "U'U": "𞤓𞤓"
+    "U'u": "𞤓𞤵"
+    "u'u": "𞤵𞤵"
+    # Geminated Nukta Modified Vowels
+    "ẠẠ": "𞤀𞥊𞥄"
+    "Ạạ": "𞤀𞥊𞥄"
+    "ạạ": "𞤢𞥊𞥄"
+    "ƐƐ": "𞤉𞥊𞥅"
+    "Ɛɛ": "𞤉𞥊𞥅"
+    "ɛɛ": "𞤫𞥊𞥅"
+    "ỊỊ": "𞤋𞥊𞥅"
+    "Ịị": "𞤋𞥊𞥅"
+    "ịị": "𞤭𞥊𞥅"
+    "ƆƆ": "𞤌𞥊𞥅"
+    "Ɔɔ": "𞤌𞥊𞥅"
+    "ɔɔ": "𞤮𞥊𞥅"
+    "ỤỤ": "𞤓𞥊𞥅"
+    "Ụụ": "𞤓𞥊𞥅"
+    "ụụ": "𞤵𞥊𞥅"
+    # consonant clusters
+    "G̣G̣Ḅ": "𞤞𞥉"
+    "G̣g̣ḅ": "𞤞𞥉"
+    "g̣g̣ḅ": "𞥀𞥉"
+    "ḲḲḤ": "𞤝𞥉"
+    "Ḳḳḥ": "𞤝𞥉"
+    "ḳḳḥ": "𞤿𞥉"
+    "ḲḲP̣": "𞤠𞥉"
+    "Ḳḳp̣": "𞤠𞥉"
+    "ḳḳp̣": "𞥂𞥉"
+    "ṢṢḤ": "𞤡𞥉"
+    "Ṣṣḥ": "𞤡𞥉"
+    "ṣṣḥ": "𞥃𞥉"
+    "GGB": "𞤞𞥆"
+    "Ggb": "𞤞𞥆"
+    "ggb": "𞥀𞥆"
+    "KKH": "𞤝𞥆"
+    "Kkh": "𞤝𞥆"
+    "kkh": "𞤿𞥆"
+    "KKP": "𞤠𞥆"
+    "Kkp": "𞤠𞥆"
+    "kkp": "𞥂𞥆"
+    "SSH": "𞤡𞥆"
+    "Ssh": "𞤡𞥆"
+    "ssh": "𞥃𞥆"
+    "TTH": "𞤅𞥊𞥆"
+    "Tth": "𞤅𞥊𞥆"
+    "tth": "𞤧𞥊𞥆"
+    "TH": "𞤅𞥊"
+    "Th": "𞤅𞥊"
+    "th": "𞤧𞥊"
+    "GB": "𞤞"
+    "Gb": "𞤞"
+    "gb": "𞥀"
+    "KH": "𞤝"
+    "Kh": "𞤝"
+    "kh": "𞤿"
+    "KP": "𞤠"
+    "Kp": "𞤠"
+    "kp": "𞥂"
+    "SH": "𞤡"
+    "Sh": "𞥃"
+    # Geminated Caron Modified Single Consonants
+    "ḄḄ": "𞤄𞥉"
+    "Ḅḅ": "𞤄𞥉"
+    "ḅḅ": "𞤦𞥉"
+    "Ɓ̣Ɓ̣": "𞤇𞥉"
+    "Ɓ̣ɓ̣": "𞤇𞥉"
+    "ɓ̣ɓ̣": "𞤩𞥉"
+    "C̣C̣": "𞤕𞥉"
+    "C̣c̣": "𞤕𞥉"
+    "c̣c̣": "𞤷𞥉"
+    "ḌḌ": "𞤁𞥉"
+    "Ḍḍ": "𞤁𞥉"
+    "ḍḍ": "𞤣𞥉"
+    "Ɗ̣Ɗ̣": "𞤍𞥉"
+    "Ɗ̣ɗ̣": "𞤍𞥉"
+    "ɗ̣ɗ̣": "𞤯𞥉"
+    "F̣F̣": "𞤊𞥉"
+    "F̣f̣": "𞤊𞥉"
+    "f̣f̣": "𞤬𞥉"
+    "G̣G̣": "𞤘𞥉"
+    "G̣g̣": "𞤘𞥉"
+    "g̣g̣": "𞤺𞥉"
+    "ḤḤ": "𞤖𞥉"
+    "Ḥḥ": "𞤖𞥉"
+    "ḥḥ": "𞤸𞥉"
+    "J̣J̣": "𞤔𞥉"
+    "J̣j̣": "𞤔𞥉"
+    "j̣j̣": "𞤶𞥉"
+    "ḲḲ": "𞤑𞥉"
+    "Ḳḳ": "𞤑𞥉"
+    "ḳḳ": "𞤳𞥉"
+    "ḶḶ": "𞤂𞥉"
+    "Ḷḷ": "𞤂𞥉"
+    "ḷḷ": "𞤤𞥉"
+    "ṂṂ": "𞤃𞥉"
+    "Ṃṃ": "𞤃𞥉"
+    "ṃṃ": "𞤥𞥉"
+    "ṆṆ": "𞤐𞥉"
+    "Ṇṇ": "𞤐𞥉"
+    "ṇṇ": "𞤲𞥉"
+    "Ŋ̣Ŋ̣": "𞤛𞥉"
+    "Ŋ̣ŋ̣": "𞤛𞥉"
+    "ŋ̣ŋ̣": "𞤽𞥉"
+    "Ṇ̃Ṇ̃": "𞤙𞥉"
+    "Ṇ̃ṇ̃": "𞤙𞥉"
+    "ṇ̃ṇ̃": "𞤻𞥉"
+    "P̣P̣": "𞤆𞥉"
+    "P̣p̣": "𞤆𞥉"
+    "p̣p̣": "𞤨𞥉"
+    "Q̣Q̣": "𞤗𞥉"
+    "Q̣q̣": "𞤗𞥉"
+    "q̣q̣": "𞤹𞥉"
+    "ṚṚ": "𞤈𞥉"
+    "Ṛṛ": "𞤈𞥉"
+    "ṛṛ": "𞤪𞥉"
+    "ṢṢ": "𞤅𞥉"
+    "Ṣṣ": "𞤅𞥉"
+    "ṣṣ": "𞤧𞥉"
+    "ṬṬ": "𞤚𞥉"
+    "Ṭṭ": "𞤚𞥉"
+    "ṭṭ": "𞤼𞥉"
+    "ṾṾ": "𞤜𞥉"
+    "Ṿṿ": "𞤜𞥉"
+    "ṿṿ": "𞤾𞥉"
+    "ẈẈ": "𞤏𞥉"
+    "Ẉẉ": "𞤏𞥉"
+    "ẉẉ": "𞤱𞥉"
+    "ỴỴ": "𞤒𞥉"
+    "Ỵỵ": "𞤒𞥉"
+    "ỵỵ": "𞤴𞥉"
+    "Ƴ̣Ƴ̣": "𞤎𞥉"
+    "Ƴ̣ƴ̣": "𞤎𞥉"
+    "ƴ̣ƴ̣": "𞤰𞥉"
+    "ẒẒ": "𞤟𞥉"
+    "Ẓẓ": "𞤟𞥉"
+    "ẓẓ": "𞥁𞥉"                
+    # Nukta Modified Single Vowels
+    "Ạ": "𞤀𞥊"
+    "ạ": "𞤢𞥊"
+    "Ɛ": "𞤉𞥊"
+    "ɛ": "𞤫𞥊"
+    "Ị": "𞤋𞥊"
+    "ị": "𞤭𞥊"
+    "Ɔ": "𞤌𞥊"
+    "ɔ": "𞤮𞥊"
+    "Ụ": "𞤓𞥊"
+    "ụ": "𞤵𞥊"
+    # Caron modified single consonants
+    "Ḅ": "𞤄𞥈"
+    "ḅ": "𞤦𞥈"
+    "Ɓ̣": "𞤇𞥈"
+    "ɓ̣": "𞤩𞥈"
+    "C̣": "𞤕𞥈"
+    "c̣": "𞤷𞥈"
+    "Ḍ": "𞤁𞥈"
+    "ḍ": "𞤣𞥈"
+    "Ɗ̣": "𞤍𞥈"
+    "ɗ̣": "𞤯𞥈"
+    "F̣": "𞤊𞥈"
+    "f̣": "𞤬𞥈"
+    "G̣": "𞤘𞥈"
+    "g̣": "𞤺𞥈"
+    "Ḥ": "𞤖𞥈"
+    "ḥ": "𞤸𞥈"
+    "J̣": "𞤔𞥈"
+    "j̣": "𞤶𞥈"
+    "Ḳ": "𞤑𞥈"
+    "ḳ": "𞤳𞥈"
+    "Ḷ": "𞤂𞥈"
+    "ḷ": "𞤤𞥈"
+    "Ṃ": "𞤃𞥈"
+    "ṃ": "𞤥𞥈"
+    "Ṇ": "𞤐𞥈"
+    "ṇ": "𞤲𞥈"
+    "Ṇ̃": "𞤙𞥈"
+    "ṇ̃": "𞤻𞥈"
+    "Ŋ̣": "𞤛𞥈"
+    "ŋ̣": "𞤽𞥈"
+    "P̣": "𞤆𞥈"
+    "p̣": "𞤨𞥈"
+    "Q̣": "𞤗𞥈"
+    "q̣": "𞤹𞥈"
+    "Ṛ": "𞤈𞥈"
+    "ṛ": "𞤪𞥈"
+    "Ṣ": "𞤅𞥈"
+    "ṣ": "𞤧𞥈"
+    "Ṭ": "𞤚𞥈"
+    "ṭ": "𞤼𞥈"
+    "Ṿ": "𞤜𞥈"
+    "ṿ": "𞤾𞥈"
+    "Ẉ": "𞤏𞥈"
+    "ẉ": "𞤱𞥈"
+    "X̣": "𞤝𞥈"
+    "x̣": "𞤿𞥈"
+    "Ỵ": "𞤒𞥈"
+    "ỵ": "𞤴𞥈"
+    "Ƴ̣": "𞤎𞥈"
+    "ƴ̣": "𞤰𞥈"
+    "Ẓ": "𞤟𞥈"
+    "ẓ": "𞥁𞥈𞥈"
+    # Geminated Unmodified Letters
+    "AA": "𞤀𞥄"
+    "Aa": "𞤀𞥄"
+    "aa": "𞤢𞥄"
+    "BB": "𞤄𞥆"
+    "Bb": "𞤄𞥆"
+    "bb": "𞤦𞥆"
+    "ƁƁ": "𞤇𞥆"
+    "Ɓɓ": "𞤇𞥆"
+    "ɓɓ": "𞤩𞥆"
+    "CC": "𞤕𞥆"
+    "Cc": "𞤕𞥆"
+    "cc": "𞤷𞥆"
+    "DD": "𞤁𞥆"
+    "Dd": "𞤁𞥆"
+    "dd": "𞤣𞥆"
+    "ƊƊ": "𞤍𞥆"
+    "Ɗɗ": "𞤍𞥆"
+    "ɗɗ": "𞤯𞥆"
+    "EE": "𞤉𞥅"
+    "Ee": "𞤉𞥅"
+    "ee": "𞤫𞥅"
+    "FF": "𞤊𞥆"
+    "Ff": "𞤊𞥆"
+    "ff": "𞤬𞥆"
+    "GG": "𞤘𞥆"
+    "Gg": "𞤘𞥆"
+    "gg": "𞤺𞥆"
+    "HH": "𞤖𞥆"
+    "Hh": "𞤖𞥆"
+    "hh": "𞤸𞥆"
+    "II": "𞤋𞥅"
+    "Ii": "𞤋𞥅"
+    "ii": "𞤭𞥅"
+    "JJ": "𞤔𞥆"
+    "Jj": "𞤔𞥆"
+    "jj": "𞤶𞥆"
+    "KK": "𞤑𞥆"
+    "Kk": "𞤑𞥆"
+    "kk": "𞤳𞥆"
+    "LL": "𞤂𞥆"
+    "Ll": "𞤂𞥆"
+    "ll": "𞤤𞥆"
+    "MM": "𞤃𞥆"
+    "Mm": "𞤃𞥆"
+    "mm": "𞤥𞥆"
+    "NN": "𞤐𞥆"
+    "Nn": "𞤐𞥆"
+    "nn": "𞤲𞥆"
+    "ÑÑ": "𞤙𞥆"
+    "Ññ": "𞤙𞥆"
+    "ññ": "𞤻𞥆"
+    "ŊŊ": "𞤛𞥆"
+    "Ŋŋ": "𞤛𞥆"
+    "ŋŋ": "𞤽𞥆"
+    "OO": "𞤌𞥅"
+    "Oo": "𞤌𞥅"
+    "oo": "𞤮𞥅"
+    "PP": "𞤆𞥆"
+    "Pp": "𞤆𞥆"
+    "pp": "𞤨𞥆"
+    "QQ": "𞤗𞥆"
+    "Qq": "𞤗𞥆"
+    "qq": "𞤹𞥆"
+    "RR": "𞤈𞥆"
+    "Rr": "𞤈𞥆"
+    "rr": "𞤪𞥆"
+    "SS": "𞤅𞥆"
+    "Ss": "𞤅𞥆"
+    "ss": "𞤧𞥆"
+    "TT": "𞤚𞥆"
+    "Tt": "𞤚𞥆"
+    "tt": "𞤼𞥆"
+    "UU": "𞤓𞥅"
+    "Uu": "𞤓𞥅"
+    "uu": "𞤵𞥅"
+    "VV": "𞤜𞥆"
+    "Vv": "𞤜𞥆"
+    "vv": "𞤾𞥆"
+    "WW": "𞤏𞥆"
+    "Ww": "𞤏𞥆"
+    "ww": "𞤱𞥆"
+    "YY": "𞤒𞥆"
+    "Yy": "𞤒𞥆"
+    "yy": "𞤴𞥆"
+    "ƳƳ": "𞤎𞥆"
+    "Ƴƴ": "𞤎𞥆"
+    "ƴƴ": "𞤰𞥆"
+    "ZZ": "𞤟𞥆"
+    "Zz": "𞤟𞥆"
+    "zz": "𞥁𞥆"
+    # Single Substitutions
+    "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": "𞥁"
+    "0": "𞥐"
+    "1": "𞥑"
+    "2": "𞥒"
+    "3": "𞥓"
+    "4": "𞥔"
+    "5": "𞥕"
+    "6": "𞥖"
+    "7": "𞥗"
+    "8": "𞥘"
+    "9": "𞥙"
+    ",": "\u2E41\u200F"
+    ";": "⁏"
+    "\u00A1": "𞥞"
+    "\u003F": "\u061F"
+    "\u00BF": "𞥟"
+    "\u201C": "\u201D"
+    "\u201D": "\u201C"
+
+
+
+script_to_roman:
+  hooks:
+    post_assembly:
+      -
+        - adlam_hooks.s2r_post
+        
+  map:
+    # Medial nyondal Cases
+    "𞤐𞥋𞤁": "ND"
+    "𞤲𞥋𞤣": "nd"
+    "𞤐𞥋𞤄": "MB"
+    "𞤲𞥋𞤦": "mb"
+    "𞤐𞥋𞤔": "NJ"
+    "𞤲𞥋𞤶": "nj"
+    "𞤐𞥋𞤘": "NG"
+    "𞤲𞥋𞤺": "ng"
+    "𞤐𞤁": "NND"
+    "𞤲𞤣": "nnd"
+    "𞤐𞤄": "MMB"
+    "𞤲𞤦": "mmb"
+    "𞤐𞤔": "NNJ"
+    "𞤲𞤶": "nnj"
+    "𞤐𞤘": "NNG"
+    "𞤲𞤺": "nng"
+    # Non-geminated combined vowels
+    ## modified vowels
+    "𞤀𞥊𞤀𞥊": "Ạ'Ạ"
+    "𞤀𞥊𞤢𞥊": "Ạ'ạ"
+    "𞤢𞥊𞤢𞥊": "ạ'ạ"
+    "𞤉𞥊𞤉𞥊": "Ɛ'Ɛ"
+    "𞤉𞥊𞤫𞥊": "Ɛ'ɛ"
+    "𞤉𞥊𞤫𞥊": "E'ɛ"
+    "𞤋𞥊𞤋𞥊": "Ị'Ị"
+    "𞤋𞥊𞤭𞥊": "Ị'ị"
+    "𞤭𞥊𞤭𞥊": "ị'ị"
+    "𞤌𞥊𞤌𞥊": "Ɔ'Ɔ"
+    "𞤌𞥊𞤮𞥊": "Ɔ'ɔ"
+    "𞤮𞥊𞤮𞥊": "ɔ'ɔ"
+    "𞤓𞥊𞤓𞥊": "Ụ'Ụ"
+    "𞤓𞥊𞤵𞥊": "Ụ'ụ"
+    "𞤵𞥊𞤵𞥊": "ụ'ụ"
+    ## standard vowels
+    "𞤀𞤀": "A'A"
+    "𞤀𞤢": "A'a"
+    "𞤢𞤢": "a'a"
+    "𞤉𞤉": "E'E"
+    "𞤉𞤫": "E'e"
+    "𞤫𞤫": "e'e"
+    "𞤋𞤋": "I'I"
+    "𞤋𞤭": "I'i"
+    "𞤭𞤭": "i'i"
+    "𞤌𞤌": "O'O"
+    "𞤌𞤮": "O'o"
+    "𞤮𞤮": "o'o"
+    "𞤓𞤓": "U'U"
+    "𞤓𞤵": "U'u"
+    "𞤵𞤵": "u'u"
+    # Geminated Nukta Modified Vowels
+    "𞤀𞥊𞥄": "Ạạ"
+    "𞤢𞥊𞥄": "ạạ"
+    "𞤉𞥊𞥅": "Ɛɛ"
+    "𞤫𞥊𞥅": "ɛɛ"
+    "𞤋𞥊𞥅": "Ịị"
+    "𞤭𞥊𞥅": "ịị"
+    "𞤌𞥊𞥅": "Ɔɔ"
+    "𞤮𞥊𞥅": "ɔɔ"
+    "𞤓𞥊𞥅": "Ụụ"
+    "𞤵𞥊𞥅": "ụụ"
+    # Modified Vowels
+    "𞤀𞥊": "Ạ"
+    "𞤢𞥊": "ạ"
+    "𞤉𞥊": "Ɛ"
+    "𞤫𞥊": "ɛ"
+    "𞤋𞥊": "Ị"
+    "𞤭𞥊": "ị"
+    "𞤌𞥊": "Ɔ"
+    "𞤮𞥊": "ɔ"
+    "𞤓𞥊": "Ụ"
+    "𞤵𞥊": "ụ"
+    # Geminated Nukta Modified Consonants
+    "𞤄𞥊𞥆": "Ḅḅ"
+    "𞤦𞥊𞥆": "ḅḅ"
+    "𞤇𞥊𞥆": "Ɓ̣ɓ̣"
+    "𞤩𞥊𞥆": "ɓ̣ɓ̣"
+    "𞤕𞥊𞥆": "C̣c̣"
+    "𞤷𞥊𞥆": "c̣c̣"
+    "𞤁𞥊𞥆": "Ḍḍ"
+    "𞤣𞥊𞥆": "ḍḍ"
+    "𞤍𞥊𞥆": "Ɗ̣ɗ̣"
+    "𞤯𞥊𞥆": "ɗ̣ɗ̣"
+    "𞤊𞥊𞥆": "F̣f̣"
+    "𞤬𞥊𞥆": "f̣f̣"
+    "𞤘𞥊𞥆": "G̣g̣"
+    "𞤺𞥊𞥆": "g̣g̣"
+    "𞤞𞥊𞥆": "G̣g̣ḅ"
+    "𞥀𞥊𞥆": "g̣g̣ḅ"
+    "𞤖𞥊𞥆": "Ḥḥ"
+    "𞤸𞥊𞥆": "ḥḥ"
+    "𞤔𞥊𞥆": "J̣j̣"
+    "𞤶𞥊𞥆": "j̣j̣"
+    "𞤑𞥊𞥆": "Ḳḳ"
+    "𞤳𞥊𞥆": "ḳḳ"
+    "𞤝𞥊𞥆": "Ḳḳḥ"
+    "𞤿𞥊𞥆": "ḳḳḥ"
+    "𞤂𞥊𞥆": "Ḷḷ"
+    "𞤤𞥊𞥆": "ḷḷ"
+    "𞤃𞥊𞥆": "Ṃṃ"
+    "𞤥𞥊𞥆": "ṃṃ"
+    "𞤐𞥊𞥆": "Ṇṇ"
+    "𞤲𞥊𞥆": "ṇṇ"
+    "𞤛𞥊𞥆": "Ŋ̣ŋ̣"
+    "𞤽𞥊𞥆": "ŋ̣ŋ̣"
+    "𞤙𞥊𞥆": "Ṇ̃ṇ̃"
+    "𞤻𞥊𞥆": "ṇ̃ṇ̃"
+    "𞤆𞥊𞥆": "P̣p̣"
+    "𞤨𞥊𞥆": "p̣p̣"
+    "𞤠𞥊𞥆": "Ḳḳp̣"
+    "𞥂𞥊𞥆": "ḳḳp̣"
+    "𞤗𞥊𞥆": "Q̣q̣"
+    "𞤹𞥊𞥆": "q̣q̣"
+    "𞤈𞥊𞥆": "Ṛṛ"
+    "𞤪𞥊𞥆": "ṛṛ"
+    "𞤅𞥊𞥆": "Tth"
+    "𞤧𞥊𞥆": "tth"
+    "𞤡𞥊𞥆": "Ṣṣḥ"
+    "𞥃𞥊𞥆": "ṣṣḥ"
+    "𞤚𞥊𞥆": "Ṭṭ"
+    "𞤼𞥊𞥆": "ṭṭ"
+    "𞤜𞥊𞥆": "Ṿṿ"
+    "𞤾𞥊𞥆": "ṿṿ"
+    "𞤏𞥊𞥆": "Ẉẉ"
+    "𞤱𞥊𞥆": "ẉẉ"
+    "𞤒𞥊𞥆": "Ỵỵ"
+    "𞤴𞥊𞥆": "ỵỵ"
+    "𞤎𞥊𞥆": "Ƴ̣ƴ̣"
+    "𞤰𞥊𞥆": "ƴ̣ƴ̣"
+    "𞤟𞥊𞥆": "Ẓẓ"
+    "𞥁𞥊𞥆": "ẓẓ"
+    # Geminated Caron Modified Consonants
+    "𞤄𞥉": "Ḅḅ"
+    "𞤦𞥉": "ḅḅ"
+    "𞤇𞥉": "Ɓ̣ɓ̣"
+    "𞤩𞥉": "ɓ̣ɓ̣"
+    "𞤕𞥉": "C̣c̣"
+    "𞤷𞥉": "c̣c̣"
+    "𞤁𞥉": "Ḍḍ"
+    "𞤣𞥉": "ḍḍ"
+    "𞤍𞥉": "Ɗ̣ɗ̣"
+    "𞤯𞥉": "ɗ̣ɗ̣"
+    "𞤊𞥉": "F̣f̣"
+    "𞤬𞥉": "f̣f̣"
+    "𞤘𞥉": "G̣g̣"
+    "𞤺𞥉": "g̣g̣"
+    "𞤞𞥉": "G̣g̣ḅ"
+    "𞥀𞥉": "ggb"
+    "𞤖𞥉": "Ḥḥ"
+    "𞤸𞥉": "ḥḥ"
+    "𞤔𞥉": "J̣j̣"
+    "𞤶𞥉": "j̣j̣"
+    "𞤑𞥉": "Ḳḳ"
+    "𞤳𞥉": "ḳḳ"
+    "𞤝𞥉": "Ḳḳḥ"
+    "𞤿𞥉": "ḳḳḥ"
+    "𞤂𞥉": "Ḷḷ"
+    "𞤤𞥉": "ḷḷ"
+    "𞤃𞥉": "Ṃṃ"
+    "𞤥𞥉": "ṃṃ"
+    "𞤐𞥉": "Ṇṇ"
+    "𞤲𞥉": "ṇṇ"
+    "𞤛𞥉": "Ŋ̣ŋ̣"
+    "𞤽𞥉": "ŋ̣ŋ̣"
+    "𞤙𞥉": "Ṇ̃ṇ̃"
+    "𞤻𞥉": "ṇ̃ṇ̃"
+    "𞤆𞥉": "P̣p̣"
+    "𞤨𞥉": "p̣p̣"
+    "𞤠𞥉": "Ḳḳp̣"
+    "𞥂𞥉": "ḳḳp̣"
+    "𞤗𞥉": "Q̣q̣"
+    "𞤹𞥉": "q̣q̣"
+    "𞤈𞥉": "Ṛṛ"
+    "𞤪𞥉": "ṛṛ"
+    "𞤅𞥉": "Ṣṣ"
+    "𞤧𞥉": "ṣṣ"
+    "𞤡𞥉": "Ṣṣḥ"
+    "𞥃𞥉": "ṣṣḥ"
+    "𞤚𞥉": "Ṭṭ"
+    "𞤼𞥉": "ṭṭ"
+    "𞤜𞥉": "Ṿṿ"
+    "𞤾𞥉": "ṿṿ"
+    "𞤏𞥉": "Ẉẉ"
+    "𞤱𞥉": "ẉẉ"
+    "𞤒𞥉": "Ỵỵ"
+    "𞤴𞥉": "ỵỵ"
+    "𞤎𞥉": "Ƴ̣ƴ̣"
+    "𞤰𞥉": "ƴ̣ƴ̣"
+    "𞤟𞥉": "Ẓẓ"
+    "𞥁𞥉": "ẓẓ"
+    # Nukta Modified Consonants
+    "𞤄𞥊": "Ḅ"
+    "𞤦𞥊": "ḅ"
+    "𞤇𞥊": "Ɓ̣"
+    "𞤩𞥊": "ɓ̣"
+    "𞤕𞥊": "C̣"
+    "𞤷𞥊": "c̣"
+    "𞤁𞥊": "Ḍ"
+    "𞤣𞥊": "ḍ"
+    "𞤍𞥊": "Ɗ̣"
+    "𞤯𞥊": "ɗ̣"
+    "𞤊𞥊": "F̣"
+    "𞤬𞥊": "f̣"
+    "𞤘𞥊": "G̣"
+    "𞤺𞥊": "g̣"
+    "𞤞𞥊": "G̣ḅ"
+    "𞥀𞥊": "g̣ḅ"
+    "𞤖𞥊": "Ḥ"
+    "𞤸𞥊": "ḥ"
+    "𞤔𞥊": "J̣"
+    "𞤶𞥊": "j̣"
+    "𞤑𞥊": "Ḳ"
+    "𞤳𞥊": "ḳ"
+    "𞤝𞥊": "Ḳḥ"
+    "𞤿𞥊": "ḳḥ"
+    "𞤂𞥊": "Ḷ"
+    "𞤤𞥊": "ḷ"
+    "𞤃𞥊": "Ṃ"
+    "𞤥𞥊": "ṃ"
+    "𞤐𞥊": "Ṇ"
+    "𞤲𞥊": "ṇ"
+    "𞤛𞥊": "Ŋ̣"
+    "𞤽𞥊": "ŋ̣"
+    "𞤙𞥊": "Ṇ̃"
+    "𞤻𞥊": "ṇ̃"
+    "𞤆𞥊": "P̣"
+    "𞤨𞥊": "p̣"
+    "𞤠𞥊": "Ḳp̣"
+    "𞥂𞥊": "ḳp̣"
+    "𞤗𞥊": "Q̣"
+    "𞤹𞥊": "q̣q̣"
+    "𞤈𞥊": "Ṛ"
+    "𞤪𞥊": "ṛ"
+    "𞤅𞥊": "Th"
+    "𞤧𞥊": "th"
+    "𞤡𞥊": "Ṣḥ"
+    "𞥃𞥊": "ṣḥ"
+    "𞤚𞥊": "Ṭ"
+    "𞤼𞥊": "ṭ"
+    "𞤜𞥊": "Ṿ"
+    "𞤾𞥊": "ṿ"
+    "𞤏𞥊": "Ẉ"
+    "𞤱𞥊": "ẉ"
+    "𞤒𞥊": "Ỵ"
+    "𞤴𞥊": "ỵ"
+    "𞤎𞥊": "Ƴ̣"
+    "𞤰𞥊": "ƴ̣"
+    "𞤟𞥊": "Ẓ"
+    "𞥁𞥊": "ẓ"
+    # Caron Modified Consonants
+    "𞤄𞥈": "Ḅ"
+    "𞤦𞥈": "ḅ"
+    "𞤇𞥈": "Ɓ̣"
+    "𞤩𞥈": "ɓ̣"
+    "𞤕𞥈": "C̣"
+    "𞤷𞥈": "c̣"
+    "𞤁𞥈": "Ḍ"
+    "𞤣𞥈": "ḍ"
+    "𞤍𞥈": "Ɗ̣"
+    "𞤯𞥈": "ɗ̣"
+    "𞤊𞥈": "F̣"
+    "𞤬𞥈": "f̣"
+    "𞤘𞥈": "G̣"
+    "𞤺𞥈": "g̣"
+    "𞤞𞥈": "G̣ḅ"
+    "𞥀𞥈": "g̣ḅ"
+    "𞤖𞥈": "Ḥ"
+    "𞤸𞥈": "ḥ"
+    "𞤔𞥈": "J̣"
+    "𞤶𞥈": "j̣"
+    "𞤑𞥈": "Ḳ"
+    "𞤳𞥈": "ḳ"
+    "𞤝𞥈": "Ḳḥ"
+    "𞤿𞥈": "ḳḥ"
+    "𞤂𞥈": "Ḷ"
+    "𞤤𞥈": "ḷ"
+    "𞤃𞥈": "Ṃ"
+    "𞤥𞥈": "ṃ"
+    "𞤐𞥈": "Ṇ"
+    "𞤲𞥈": "ṇ"
+    "𞤛𞥈": "Ŋ̣"
+    "𞤽𞥈": "ŋ̣"
+    "𞤙𞥈": "Ṇ̃"
+    "𞤻𞥈": "ṇ̃"
+    "𞤆𞥈": "P̣"
+    "𞤨𞥈": "p̣"
+    "𞤠𞥈": "Ḳp̣"
+    "𞥂𞥈": "ḳp̣"
+    "𞤗𞥈": "Q̣"
+    "𞤹𞥈": "q̣q̣"
+    "𞤈𞥈": "Ṛ"
+    "𞤪𞥈": "ṛ"
+    "𞤅𞥈": "Ṣ"
+    "𞤧𞥈": "ṣ"
+    "𞤡𞥈": "Ṣḥ"
+    "𞥃𞥈": "ṣḥ"
+    "𞤚𞥈": "Ṭ"
+    "𞤼𞥈": "ṭ"
+    "𞤜𞥈": "Ṿ"
+    "𞤾𞥈": "ṿ"
+    "𞤏𞥈": "Ẉ"
+    "𞤱𞥈": "ẉ"
+    "𞤒𞥈": "Ỵ"
+    "𞤴𞥈": "ỵ"
+    "𞤎𞥈": "Ƴ̣"
+    "𞤰𞥈": "ƴ̣"
+    "𞤟𞥈": "Ẓ"
+    "𞥁𞥈": "ẓ"
+    # Geminated Vowels
+    "𞤀𞥄": "Aa"
+    "𞤢𞥄": "aa"
+    "𞤉𞥅": "Ee"
+    "𞤫𞥅": "ee"
+    "𞤋𞥅": "Ii"
+    "𞤭𞥅": "ii"
+    "𞤌𞥅": "Oo"
+    "𞤮𞥅": "oo"
+    "𞤓𞥅": "Uu"
+    "𞤵𞥅": "uu"
+    # Geminated Consonants
+    "𞤄𞥆": "Bb"
+    "𞤦𞥆": "bb"
+    "𞤇𞥆": "Ɓɓ"
+    "𞤩𞥆": "ɓɓ"
+    "𞤕𞥆": "Cc"
+    "𞤷𞥆": "cc"
+    "𞤁𞥆": "Dd"
+    "𞤣𞥆": "dd"
+    "𞤍𞥆": "Ɗɗ"
+    "𞤯𞥆": "ɗɗ"
+    "𞤊𞥆": "Ff"
+    "𞤬𞥆": "ff"
+    "𞤘𞥆": "Gg"
+    "𞤺𞥆": "gg"
+    "𞤞𞥆": "Ggb"
+    "𞥀𞥆": "ggb"
+    "𞤖𞥆": "Hh"
+    "𞤸𞥆": "hh"
+    "𞤔𞥆": "Jj"
+    "𞤶𞥆": "jj"
+    "𞤑𞥆": "Kk"
+    "𞤳𞥆": "kk"
+    "𞤝𞥆": "Kkh"
+    "𞤿𞥆": "kkh"
+    "𞤂𞥆": "Ll"
+    "𞤤𞥆": "ll"
+    "𞤃𞥆": "Mm"
+    "𞤥𞥆": "mm"
+    "𞤐𞥆": "Nn"
+    "𞤲𞥆": "nn"
+    "𞤛𞥆": "Ŋŋ"
+    "𞤽𞥆": "ŋŋ"
+    "𞤙𞥆": "Ññ"
+    "𞤻𞥆": "ññ"
+    "𞤆𞥆": "Pp"
+    "𞤨𞥆": "pp"
+    "𞤠𞥆": "Kkp"
+    "𞥂𞥆": "kkp"
+    "𞤗𞥆": "Qq"
+    "𞤹𞥆": "qq"
+    "𞤈𞥆": "Rr"
+    "𞤪𞥆": "rr"
+    "𞤅𞥆": "Ss"
+    "𞤧𞥆": "ss"
+    "𞤡𞥆": "Ssh"
+    "𞥃𞥆": "ssh"
+    "𞤚𞥆": "Tt"
+    "𞤼𞥆": "tt"
+    "𞤜𞥆": "Vv"
+    "𞤾𞥆": "vv"
+    "𞤏𞥆": "Ww"
+    "𞤱𞥆": "ww"
+    "𞤒𞥆": "Yy"
+    "𞤴𞥆": "yy"
+    "𞤎𞥆": "Ƴƴ"
+    "𞤰𞥆": "ƴƴ"
+    "𞤟𞥆": "Zz"
+    "𞥁𞥆": "zz"
+    # Simple Substitutions
+    "𞤀": "A"
+    "𞤢": "a"
+    "𞤄": "B"
+    "𞤦": "b"
+    "𞤇": "Ɓ"
+    "𞤩": "ɓ"
+    "𞤕": "C"
+    "𞤷": "c"
+    "𞤁": "D"
+    "𞤣": "d"
+    "𞤍": "Ɗ"
+    "𞤯": "ɗ"
+    "𞤉": "E"
+    "𞤫": "e"
+    "𞤊": "F"
+    "𞤬": "f"
+    "𞤘": "G"
+    "𞤺": "g"
+    "𞤞": "Gb"
+    "𞥀": "gb"
+    "𞤖": "H"
+    "𞤸": "h"
+    "𞤋": "I"
+    "𞤭": "i"
+    "𞤔": "J"
+    "𞤶": "j"
+    "𞤑": "K"
+    "𞤳": "k"
+    "𞤝": "Kh"
+    "𞤿": "kh"
+    "𞤂": "L"
+    "𞤤": "l"
+    "𞤃": "M"
+    "𞤥": "m"
+    "𞤐": "N"
+    "𞤲": "n"
+    "𞤛": "Ŋ"
+    "𞤽": "ŋ"
+    "𞤙": "Ñ"
+    "𞤻": "ñ"
+    "𞤌": "O"
+    "𞤮": "o"
+    "𞤆": "P"
+    "𞤨": "p"
+    "𞤠": "Kp"
+    "𞥂": "kp"
+    "𞤗": "Q"
+    "𞤹": "q"
+    "𞤈": "R"
+    "𞤪": "r"
+    "𞤅": "S"
+    "𞤧": "s"
+    "𞤡": "Sh"
+    "𞥃": "sh"
+    "𞤚": "T"
+    "𞤼": "t"
+    "𞤓": "U"
+    "𞤵": "u"
+    "𞤜": "V"
+    "𞤾": "v"
+    "𞤏": "W"
+    "𞤱": "w"
+    "𞤒": "Y"
+    "𞤴": "y"
+    "𞤎": "Ƴ"
+    "𞤰": "ƴ"
+    "𞤟": "Z"
+    "𞥁": "z"
+
+    "𞥐": "0"
+    "𞥑": "1"
+    "𞥒": "2"
+    "𞥓": "3"
+    "𞥔": "4"
+    "𞥕": "5"
+    "𞥖": "6"
+    "𞥗": "7"
+    "𞥘": "8"
+    "𞥙": "9"
+    "𞥞": "\u00A1"
+    "𞥟": "¿"
+    "𞥇": "'"
+    "⹁": ","
+    "؟": "?"

+ 4 - 0
scriptshifter/tables/data/russian.yml

@@ -58,6 +58,8 @@ roman_to_script:
     "\u0027": "\u044C"
     # this conversion is ambiguous - \u044C is also theoretically possible
     "\u02BA": "\u044A"
+    "\u201F": "\u00AB"
+    "\u201D": "\u00BB"
 
 script_to_roman:
   map:
@@ -93,3 +95,5 @@ script_to_roman:
     "\u04BB": "h\u0307"
     "\u04E8": "O\u0307"
     "\u04E9": "o\u0307"
+    "\u00AB": "\u0022"
+    "\u00BB": "\u0022"

+ 120 - 2
scriptshifter/templates/index.html

@@ -1,7 +1,31 @@
 {% extends "layout.html" %}
-{% set title ='Transliterate string' %}
+{% set title ='BIBFRAME ScriptShifter' %}
 {% block body %}
-    <form action="/transliterate" method="POST">
+
+    <style>
+
+        body{
+            font-family: Avenir,Helvetica,Arial,sans-serif;
+        }
+
+        textarea{
+            width: 99%;
+            height: 15vh;
+            padding: 0.5em;
+        }
+        #results{
+            font-size: 1.25em;
+            background-color: whitesmoke;
+            margin-top: 1em;
+            padding: 1em;
+        }
+
+    </style>
+
+
+
+
+    <form id="transliterate" action="/transliterate" method="POST">
         <fieldset>
             <label for="text">Input text</label>
             <textarea id="text" name="text"></textarea>
@@ -37,5 +61,99 @@
             <input class="button-primary" type="submit" value="Transliterate!">
         </fieldset>
     </form>
+
+    <div id="results">
+        Results will appear here.
+    </div>
+
+    <script type="text/javascript">
+        document.getElementById('transliterate').addEventListener('submit',(event)=>{
+
+
+
+            const data = new URLSearchParams();
+
+            let capitalize = Array.from(document.getElementsByName("capitalize")).find(r => r.checked).value;
+
+
+            data.append('text',document.getElementById('text').value)
+            data.append('lang',document.getElementById('lang').value)
+
+            if (document.getElementById('r2s').checked){
+                data.append('r2s','on')
+            }
+
+            data.append('capitalize',capitalize)
+
+
+            fetch('/transliterate', {
+                method: 'post',
+                body: data,
+            })
+            .then(response=>response.text())
+            .then((text)=>{
+
+                document.getElementById('results').innerText = text
+
+            }).catch((error) => {
+              alert("Error:\n" + error)
+            });
+
+
+
+
+
+
+
+            event.preventDefault()
+            return false
+
+        })
+
+
+
+    </script>
+
+
+<!-- 
+    <form action="/transliterate" method="POST">
+        <fieldset>
+            <label for="text">Input text</label>
+            <textarea id="text" name="text"></textarea>
+            <label for="lang">Language</label>
+            <select id="lang" name="lang">
+                {% for k, v in languages.items() %}
+                    <option value="{{ k }}">{{ v["name"] }}</option>
+                {% endfor %}
+            </select>
+            <div>
+                <label class="label-inline" for="r2s">Roman to Script</label>
+                <input type="checkbox" id="r2s" name="r2s">
+            </div>
+        </fieldset>
+        <fieldset>
+            <legend>Capitalize</legend>
+            <div>
+                <label class="label-inline" for="no-change">No change</label>
+                <input
+                        type="radio" id="no-change" name="capitalize"
+                                                     value="no_change" checked>
+            </div>
+            <div>
+                <label class="label-inline" for="first">First word</label>
+                <input type="radio" id="first" name="capitalize" value="first">
+            </div>
+            <div>
+                <label class="label-inline" for="all">All words</label>
+                <input type="radio" id="all" name="capitalize" value="all">
+            </div>
+        </fieldset>
+        <fieldset>
+            <input class="button-primary" type="submit" value="Transliterate!">
+        </fieldset>
+    </form> -->
+
+
+
     </div>
 {% endblock %}