]> granicus.if.org Git - icu/commitdiff
ICU-9538 parse CLDR scriptMetadata.txt
authorMarkus Scherer <markus.icu@gmail.com>
Sun, 17 Feb 2013 23:16:09 +0000 (23:16 +0000)
committerMarkus Scherer <markus.icu@gmail.com>
Sun, 17 Feb 2013 23:16:09 +0000 (23:16 +0000)
X-SVN-Rev: 33259

tools/unicode/py/parsescriptmetadata.py [new file with mode: 0755]

diff --git a/tools/unicode/py/parsescriptmetadata.py b/tools/unicode/py/parsescriptmetadata.py
new file mode 100755 (executable)
index 0000000..46823ba
--- /dev/null
@@ -0,0 +1,80 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright (c) 2013 International Business Machines
+# Corporation and others. All Rights Reserved.
+#
+# parsescriptmetadata.py
+#
+# 2013feb15 Markus W. Scherer
+#
+# ./parsescriptmetadata.py
+#   ~/svn.icu/trunk/src/source/common/unicode/uscript.h
+#   ~/svn.cldr/trunk/common/properties/scriptMetadata.txt
+
+"""Parses ICU4C uscript.h & CLDR scriptMetadata.txt,
+and writes ICU script data initializers."""
+
+import re
+import sys
+
+def main():
+  if len(sys.argv) < 3:
+    print ("Usage: {}  path/to/ICU4C/uscript.h  "
+           "path/to/CLDR/scriptMetadata.txt".format(sys.argv[0]))
+    return
+  (uscript_path, smd_path) = sys.argv[1:3]
+
+  iso_to_icu = {}
+  max_icu_num = 0
+
+  # Parse lines like
+  #   USCRIPT_ARABIC       =  2,  /* Arab */
+  # and extract the ICU numeric script code and the ISO script code.
+  script_num_re = re.compile(r" *= *([0-9]+), */\* *([A-Z][a-z]{3}) *\*/")
+  with open(uscript_path, "r") as uscript_file:
+    for line in uscript_file:
+      line = line.strip()
+      if not line: continue
+      if line.startswith("#"): continue  # whole-line comment
+      match = script_num_re.search(line)
+      if match:
+        icu_num = int(match.group(1))
+        iso_to_icu[match.group(2)] = icu_num
+        if icu_num > max_icu_num: max_icu_num = icu_num
+
+  icu_data = [None] * (max_icu_num + 1)
+
+  # Parse lines like
+  #   Arab; 8; 0628; SA; 1; RECOMMENDED; YES; NO; YES; NO; NO
+  # and put the data (as strings) into the icu_data list.
+  with open(smd_path, "r") as smd_file:
+    for line in smd_file:
+      line = line.strip()
+      if not line: continue
+      if line.startswith("#"): continue  # whole-line comment
+
+      fields = line.split(";")
+      if not fields or len(fields) < 11: continue
+      iso_code = fields[0].strip()
+      icu_num = iso_to_icu[iso_code]
+      icu_data[icu_num] = (iso_code,
+          # sample, usage
+          fields[2].strip(), fields[5].strip(),
+          # RTL, LB, cased
+          fields[6].strip(), fields[7].strip(), fields[10].strip())
+
+  # Print ICU array initializers with the relevant data.
+  for t in icu_data:
+    if t:
+      (iso_code, sample, usage, rtl, lb, cased) = t
+      s = "0x" + sample + " | " + usage
+      if rtl == "YES": s += " | RTL"
+      if lb == "YES": s += " | LB_LETTERS"
+      if cased == "YES": s += " | CASED"
+      print "    " + s + ",  // " + iso_code
+    else:
+      print "    0,"
+
+
+if __name__ == "__main__":
+  main()