Browse Source

Capitalize first or all words.

Stefano Cossu 1 year ago
parent
commit
9fac3605a7
4 changed files with 36 additions and 11 deletions
  1. 2 2
      TODO.md
  2. 2 1
      transliterator/rest_api.py
  3. 21 2
      transliterator/templates/index.html
  4. 11 6
      transliterator/trans.py

+ 2 - 2
TODO.md

@@ -21,10 +21,10 @@ discussion, etc.); *X* = not implementing.
 - *B* Optimize token lookup
   - *D* Break loop early based on alphabetical order
   - *B* Ignore word break characters
-  - *P* Capitalization
+  - *W* Capitalization
     - *P* Separate capitalization function
     - *P* Capitalize ligated letters (e.g. Cyrillic T͡͡S)
-    - *P* Option for capitalizing first word, all words, none, unchanged
+    - *D* Option for capitalizing first word, all words, none, unchanged
 - *D* API documentation
 - *D* Config file documentation
 - *D* Hooks documentation

+ 2 - 1
transliterator/rest_api.py

@@ -67,11 +67,12 @@ def transliterate_form():
 @app.route("/trans/<lang>", methods=["POST"])
 def transliterate_req(lang, r2s=False):
     in_txt = request.form["text"]
+    capitalize = request.form.get("capitalize", False)
     if not len(in_txt):
         return ("No input text provided! ", 400)
 
     try:
-        out = transliterate(in_txt, lang, r2s)
+        out = transliterate(in_txt, lang, r2s, capitalize)
     except (NotImplementedError, ValueError) as e:
         return (str(e), 400)
 

+ 21 - 2
transliterator/templates/index.html

@@ -11,8 +11,27 @@
                     <option value="{{ k }}">{{ v["name"] }}</option>
                 {% endfor %}
             </select>
-            <label class="label-inline" for="r2s">Roman to Script</label>
-            <input type="checkbox" id="r2s" name="r2s">
+            <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!">

+ 11 - 6
transliterator/trans.py

@@ -37,7 +37,7 @@ class Context:
         self.dest_ls = []
 
 
-def transliterate(src, lang, r2s=False):
+def transliterate(src, lang, r2s=False, capitalize=False):
     """
     Transliterate a single string.
 
@@ -75,7 +75,7 @@ def transliterate(src, lang, r2s=False):
         )
 
     langsec = cfg["script_to_roman"] if not r2s else cfg["roman_to_script"]
-    langsec_dir = langsec.get("directives", {})
+    # langsec_dir = langsec.get("directives", {})
     langsec_hooks = langsec.get("hooks", {})
 
     ctx = Context(src, general, langsec)
@@ -183,7 +183,15 @@ def transliterate(src, lang, r2s=False):
 
                 # A match is found. Stop scanning tokens, append result, and
                 # proceed scanning the source.
-                ctx.dest_ls.append(ctx.dest_tk)
+                tk = ctx.dest_tk
+                # Capitalization.
+                if (
+                    (capitalize == "first" and ctx.cur == 0)
+                    or
+                    (capitalize == "all" and ctx.cur_flags & CUR_BOW)
+                ):
+                    tk = tk.capitalize()
+                ctx.dest_ls.append(tk)
                 ctx.cur += step
                 break
 
@@ -213,9 +221,6 @@ def transliterate(src, lang, r2s=False):
     if hret is not None:
         return hret
 
-    if langsec_dir.get("capitalize", False):
-        ctx.dest_ls[0] = ctx.dest_ls[0].capitalize()
-
     logger.debug(f"Output list: {ctx.dest_ls}")
     ctx.dest = "".join(ctx.dest_ls)