diff options
Diffstat (limited to 'lulua/report.py')
| -rw-r--r-- | lulua/report.py | 51 | 
1 files changed, 34 insertions, 17 deletions
| diff --git a/lulua/report.py b/lulua/report.py index b25201d..0e5ec00 100644 --- a/lulua/report.py +++ b/lulua/report.py @@ -18,7 +18,7 @@  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  # THE SOFTWARE. -import sys, argparse, logging, pickle, math +import sys, argparse, logging, pickle, math, unicodedata  from gettext import GNUTranslations, NullTranslations  from decimal import Decimal  from fractions import Fraction @@ -60,21 +60,6 @@ def arabnum (s):      m = {'0': '٠', '1': '١', '2': '٢', '3': '٣', '4': '٤', '5': '٥', '6': '٦', '7': '٧', '8': '٨', '9': '٩', ',': '٬', '.': '٫'}      return ''.join (map (lambda x: m.get (x, x), s)) -def clamp (v, lower, upper): -    return max (min (v, upper), lower) - -def blend (v, a, b): -    v = clamp (v, 0, 1) -    return (b-a)*v+a - -def blendn (v, *l): -    assert 0 <= v <= 1 -    n = len (l) -    step = 1/(n-1) -    i = min (int (math.floor (v/step)), n-2) -    stretchedv = (v-i*step)/step -    return [blend (stretchedv, x, y) for x, y in zip (l[i], l[i+1])] -  def render ():      parser = argparse.ArgumentParser(description='Create lulua report.')      parser.add_argument('-c', '--corpus', nargs='+', metavar='FILE', help='Corpus metadata files') @@ -88,9 +73,41 @@ def render ():      env.filters['approx'] = approx      env.filters['numspace'] = numspace      env.filters['arabnum'] = arabnum -    env.filters['blendn'] = blendn      env.filters['fraction'] = fraction +    # Map global variables to Arabic letter romanizations, so we can use +    # them easily in text. +    # Taken from Abu-Chacra’s Arabic – An Essential Grammar. It’s +    # too difficult for now to write a general-purpose romanization +    # function, because it would need a dictionary. +    letterNames = { +        'Hamzah': ('Hamzah', 'ء'), +        'Alif': ('ᵓAlif', 'ا'), +        'Alifhamzah': ('ᵓAlif-hamzah', 'أ'), +        'Wawhamzah': ('Wa\u0304w-hamzah', 'ؤ'), +        'Yahamzah': ('Ya\u0304ᵓ-hamzah', 'ئ'), +        'Ba': ('Baᵓ', 'ب'), +        'Ta': ('Taᵓ', 'ت'), +        'Tha': ('T\u0331aᵓ', 'ث'), +        'Ra': ('Raᵓ', 'ر'), +        'Dal': ('Da\u0304l', 'د'), +        'Dhal': ('D\u0331a\u0304l', 'ذ'), +        'Qaf': ('Qa\u0304f', 'ق'), +        'Lam': ('La\u0304m', 'ل'), +        'Lamalif': ('La\u0304m-ᵓalif', 'لا'), +        'Mim': ('Mi\u0304m', 'م'), +        'Nun': ('Nu\u0304n', 'ن'), +        'Waw': ('Wa\u0304w', 'و'), +        'Ya': ('Ya\u0304ᵓ', 'ي'), +        'Tamarbutah': ('Ta\u0304ᵓ marbu\u0304t\u0323ah', 'ة'), +        'Alifmaqsurah': ('ᵓAlif maqs\u0323u\u0304rah', 'ى'), +        } +    for k, (romanized, arabic) in letterNames.items (): +        env.globals[k] = f'{romanized} <bdo lang="ar">({arabic})</bdo>' +        env.globals[k.lower ()] = env.globals[k].lower () +        env.globals[k + '_'] = romanized +        env.globals[k.lower () + '_'] = romanized.lower () +      corpus = []      for x in args.corpus:          with open (x) as fd: | 
