changeset 39:f53ea742b57f

Refactor output mode handling.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 26 May 2021 01:07:04 +0300
parents 0e586b4ab62c
children bc8d8ef4a248
files lxmldump.py
diffstat 1 files changed, 28 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/lxmldump.py	Tue May 25 23:51:56 2021 +0300
+++ b/lxmldump.py	Wed May 26 01:07:04 2021 +0300
@@ -17,6 +17,7 @@
 import xml.etree.ElementTree as xmlET
 import unicodedata
 import argparse
+import textwrap
 
 assert sys.version_info >= (3, 7)
 
@@ -41,7 +42,7 @@
 
 pkk_mode_defaults = {
     # Default Ptr URL format strings
-    "ptr_url_fmt": {
+    "ptr_fmt": {
         PKK_MODE_NORMAL: u"<PTR:{href}>{text}</PTR>",
         PKK_MODE_ANKI: u"<a href='https://kaino.kotus.fi/cgi-bin/kks/karjala.cgi?a={href}'>{text}</a>",
     },
@@ -49,14 +50,13 @@
     "word_fmt": {
         PKK_MODE_NORMAL: "\"{text}\"",
     },
+    "word_attr_fmt": {
+        PKK_MODE_NORMAL: " ({alist})",
+    },
     "word_attr_sep": {
         PKK_MODE_NORMAL: " ; ",
         PKK_MODE_ANKI: ":",
     },
-    "word_attr_fmt": {
-        PKK_MODE_NORMAL: " ({alist})",
-    },
-
     "word_eol": {
         PKK_MODE_NORMAL: "\n",
     },
@@ -155,6 +155,17 @@
     sys.exit(1)
 
 
+class pkk_set_mode(argparse.Action):
+    def __call__(self, parser, namespace, value, option_string=None):
+        lvalue = value.strip().lower()
+        for mode in pkk_modes_list:
+            if pkk_modes_list[mode] == lvalue:
+                setattr(namespace, self.dest, mode)
+                return
+
+        pkk_fatal(f"Invalid output mode '{lvalue}'.")
+
+
 ## Value handling
 class pkk_set_value(argparse.Action):
 
@@ -225,7 +236,7 @@
 
 ## Format a "Ptr" node as text
 def pkk_ptr_to_text(pnode):
-    pfmt = pkk_get_fmt("ptr_url_fmt")
+    pfmt = pkk_get_fmt("ptr_fmt")
     return pfmt.format(
         text=("".join(pnode.itertext())).strip(),
         href=pnode.attrib["{http://www.w3.org/TR/xlink}href"])
@@ -355,23 +366,13 @@
 optparser.add_argument("-h", "--help",
     dest="show_help",
     action="store_true",
-    help="show this help message and exit")
+    help="show this help message")
 
-optparser.add_argument("-d", "--dump",
-    dest="mode",
-    action="store_const", const=PKK_MODE_DUMP, default=PKK_MODE_NORMAL,
-    help="output as simple dump")
-
-optparser.add_argument("-x", "--xml",
+optparser.add_argument("-m", "--mode",
     dest="mode",
-    action="store_const", const=PKK_MODE_XML,
-    help="output as XML")
-
-optparser.add_argument("-A", "--anki",
-    dest="mode",
-    action="store_const", const=PKK_MODE_ANKI,
-    help=argparse.SUPPRESS)
-#    help="output Anki compatible")
+    action=pkk_set_mode,
+    default=PKK_MODE_NORMAL,
+    help="set output mode (see below)")
 
 optparser.add_argument("-s", "--set",
     action=pkk_set_value,
@@ -407,13 +408,13 @@
 ### Show help if needed
 if len(pkk_cfg.filenames) == 0 or pkk_cfg.show_help:
     optparser.print_help()
+    print(u"\nAvailable output modes:")
+    print("  " + ", ".join(pkk_modes_list.values()))
 
-#    print(u"\nDefault Ptr format strings per mode:")
-#    for pmode in pkk_modes_list:
-#        if pmode in pkk_ptr_url_fmt:
-#            print(u" {:6s} : \"{}\"".format(pkk_modes_list[pmode], pkk_ptr_url_fmt[pmode]))
-
-    print(u"")
+    print(u"\nAvailable format strings and values:")
+    for mid in pkk_mode_defaults:
+        stmp = pkk_mode_defaults[mid][PKK_MODE_NORMAL].replace("\\", "\\\\").replace("\n", "\\n")
+        print(u"  {:18s} : '{}'".format(mid, stmp))
     sys.exit(0)