In [1]:
import sys,json
sys.path.append('./graphparser')
import graphparser as gp
from networkx.readwrite import json_graph
urdu_data_file = './graphparser/settings/urdu.yaml'
devanagari_data_file = './graphparser/settings/devanagari.yaml'
diacritics_data_file = './graphparser/settings/diacritics.yaml'

In [2]:
parser = gp.GraphParser(urdu_data_file)
assert parser.parse("shaan").output==u'\u0634\u0627\u0646'
assert parser.parse('karegaa').output==u'\u06a9\u0631\u06d2\u06af\u0627'
parser.parse(' ay ')


Out[2]:
ParserOutput(matches=[ParserRule(production=' ', prev_classes=None, prev_tokens=None, tokens=[' '], next_tokens=None, next_classes=None, prev_length=0, next_length=1, match_tokens=[' '], tokens_length=1), ParserRule(production='اے', prev_classes=['wb'], prev_tokens=None, tokens=['a', 'y'], next_tokens=None, next_classes=['wb'], prev_length=0, next_length=2, match_tokens=['a', 'y'], tokens_length=2), ParserRule(production=' ', prev_classes=None, prev_tokens=None, tokens=[' '], next_tokens=None, next_classes=None, prev_length=0, next_length=1, match_tokens=[' '], tokens_length=1)], output=' اے ')

In [3]:
dev_parser = gp.GraphParser(devanagari_data_file)
print(dev_parser.parse('mudda((aa'))


ParserOutput(matches=[ParserRule(production='म', prev_classes=None, prev_tokens=None, tokens=['m'], next_tokens=None, next_classes=None, prev_length=0, next_length=1, match_tokens=['m'], tokens_length=1), ParserRule(production='ु', prev_classes=None, prev_tokens=None, tokens=['u'], next_tokens=None, next_classes=None, prev_length=0, next_length=1, match_tokens=['u'], tokens_length=1), ParserRule(production='द', prev_classes=None, prev_tokens=None, tokens=['d'], next_tokens=None, next_classes=None, prev_length=0, next_length=1, match_tokens=['d'], tokens_length=1), ParserRule(production='द', prev_classes=None, prev_tokens=None, tokens=['d'], next_tokens=None, next_classes=None, prev_length=0, next_length=1, match_tokens=['d'], tokens_length=1), ParserRule(production='आ', prev_classes=['consonant'], prev_tokens=None, tokens=['a', '((', 'aa'], next_tokens=None, next_classes=None, prev_length=0, next_length=3, match_tokens=['a', '((', 'aa'], tokens_length=3)], output='मुद््दआ')

In [4]:
def compress_nodes(parser):
#    ''' CSub'''
    dg = parser.DG.copy()

    def classes_int(classes):
        return [parser.token_class_names.index(c) for c in classes]

    

    for n,d in dg.nodes(data=True):
        if 'found' in d:
            d.pop('found') # not needed
        if 'rule' in d:
            r = d['rule']
            d.pop('rule') # already contained on edge, but signals end of road
            d['r'] ={'p':r.production,'tl':r.tokens_length}
        if 'token' in d:
            d['t'] = d['token']
            d.pop('token')
            
    return dg.node

def compress_edges(parser):
    
    def classes_int(classes):
        return [parser.token_class_names.index(c) for c in classes]


    def shorten_parser_rule(pr):
        o={}

        if pr.prev_classes:
            o['pc'] = classes_int(pr.prev_classes)
#        if pr.prev_tokens:
#            o['pt'] = classes_int(pr.prev_tokens)
        o['mt'] = pr.match_tokens 
#        o['t'] = pr.tokens

 #       if pr.next_tokens:
 #           o['nt'] = classes_int(pr.next_tokens)
        o['pl'] = pr.prev_length
        o['nl'] = pr.next_length
        if pr.next_classes:
            o['nc'] = classes_int(pr.next_classes)
        o['tl'] = pr.tokens_length
#        print(pr.tokens_length)
        o['p'] = pr.production

        return o
    dg = parser.DG.copy()

    x = dict(parser.get_sorted_out_edges(dg))

    for node_start, values in x.items():
        for u,v,d in values:
            if 'weight' in d: d.pop('weight')
            if 'rule' in d:
                d['r'] = shorten_parser_rule(d['rule'])
                d.pop('rule')
        
    
    return x

parser = gp.GraphParser(urdu_data_file)
#compress_edges(parser)

In [5]:
def compress_onmatch_rules(parser):
    omr = parser.onmatch_rules
    if omr==None: return omr
    x = list()
    for ((prev_class, next_class), output) in omr:
        x.append( ( ( parser.classes_int(prev_class), parser.classes_int(next_class) ), output) )
    return x

#for x in parser.onmatch_rules

def compress_tokens(parser):
    
    def classes_int(classes):
        return [parser.token_class_names.index(c) for c in classes]
    output ={}
    for token,classes in parser.tokens.items():
        output[token]=classes_int(classes)
    return output

In [35]:
import itertools

def gen_parser_data(parser_name = 'urdu',
                    parser_data_file = './graphparser/settings/urdu.yaml',
                    output_file = 'lib/urdu_parser_data.js',
                    compress=True):
    parser = gp.GraphParser(parser_data_file)
    assert parser
    token_match_re_string=parser.get_token_match_re_string()
    
    graph = parser.DG

    compress=True
    
    if compress:
        nodes = compress_nodes(parser)
        sorted_edges = compress_edges(parser)
    else:
        nodes = parser.DG.node
        sorted_edges = parser.get_sorted_out_edges(parser.DG)
        

    tokens = parser.tokens
   
    if compress:
        tokens = compress_tokens(parser)
# sorted by weight, reversed
    
    

    onmatch = parser.onmatch_rules
    
    if onmatch!=None and compress:

        onmatch = compress_onmatch_rules(parser)
    
    onmatch_rules_json = json.dumps(onmatch ,separators=(',', ':') ) #skinny_onmatch_rules(parser))
    
     

   
    graph_json = json.dumps( {'node': dict(nodes.data()), 'edge': sorted_edges, 'compressed': compress} ,separators=(',', ':') )
    
    js_template = """
{PARSER_NAME}_tokens = {TOKENS};
token_match_re_string = {TOKEN_MATCH_RE_STRING};
{PARSER_NAME}_token_regex = new RegExp(token_match_re_string, 'g');
graph_json = {GRAPH_JSON};
onmatch_json = {ONMATCH_RULES_JSON};

function decode_json(x){{return x}};

{PARSER_NAME}_graph = decode_json(graph_json);
{PARSER_NAME}_onmatch = decode_json(onmatch_json);

console.log('parser loaded; len of graph: '+graph_json);
"""
    
    js_output = js_template.format(PARSER_NAME = parser_name,
           TOKENS = json.dumps( tokens ),
           TOKEN_MATCH_RE_STRING = json.dumps(token_match_re_string),
           GRAPH_JSON = graph_json,
           ONMATCH_RULES_JSON = onmatch_rules_json)
    
    with open(output_file,'w') as f:
        f.write(js_output)
    
    return js_output

gen_parser_data()

gen_parser_data(parser_name = 'devanagari',
                parser_data_file = './graphparser/settings/devanagari.yaml',
                output_file = 'lib/devanagari_parser_data.js',
                compress=True)

gen_parser_data(parser_name = 'diacritics',
                parser_data_file = './graphparser/settings/diacritics.yaml',
                output_file = 'lib/diacritics_parser_data.js',
                compress=True)

#!coffee --compile --bare --output lib/ src/


Out[35]:
'\ndiacritics_tokens = {"0": [7, 14], "1": [7, 14], "2": [7, 14], "3": [7, 14], "4": [7, 14], "5": [7, 14], "6": [7, 14], "7": [7, 14], "8": [7, 14], "9": [7, 14], "\\"": [14], "\\n": [14], "\\r": [14], " ": [14], "!": [8, 14], "\'": [6], "(": [8, 14], "((": [1, 3], ")": [8, 14], "))": [3], ",": [8, 14], "-": [14], "--": [8, 14], "----": [8, 14], ".r": [3], ".s": [3], ".z": [3], "/": [14], ":": [8, 14], ":n": [3], ":t": [3], ":z": [3], ";": [8, 14], ";aa": [12], ";d": [3], ";dh": [3], ";e": [9], ";o": [9, 11], ";g": [3], ";h": [3], ";m": [13], ";n": [3], ";r": [3], ";rh": [3], ";s": [3], ";t": [3], ";th": [3], ";x": [0, 3], ";z": [3], "?": [8, 14], "\\u0000": [14], "[": [8, 14], "]": [8, 14], "a": [9, 10], "^a": [9, 10], "aa": [2, 12], "ai": [12], "^ai": [12], "au": [12], "^au": [12], "b": [3], "bh": [3], "ch": [3], "chh": [3], "d": [3], "dh": [3], "e": [12], "f": [3], "g": [3], "gh": [3], "h": [3, 4], "i": [9], "^i": [9], "ii": [12], "^ii": [12], "j": [3], "jh": [3], "k": [3], "kh": [3], "l": [3], "m": [3], "n": [3], "o": [12], "p": [3], "ph": [3], "q": [3], "r": [3], "s": [3], "sh": [3], "t": [3], "th": [3], "u": [9], "^u": [9], "uu": [12], "^uu": [12], "v": [3], "w": [3], "y": [3], "z": [3], "zh": [3], "|": [5], "\\t": [14], "_": [14], ".": [14], "*": [14]};\ntoken_match_re_string = "\\\\-\\\\-\\\\-\\\\-|\\\\;aa|\\\\;dh|\\\\;rh|\\\\;th|\\\\^ai|\\\\^au|chh|\\\\^ii|\\\\^uu|\\\\(\\\\(|\\\\)\\\\)|\\\\-\\\\-|\\\\.r|\\\\.s|\\\\.z|\\\\:n|\\\\:t|\\\\:z|\\\\;d|\\\\;e|\\\\;o|\\\\;g|\\\\;h|\\\\;m|\\\\;n|\\\\;r|\\\\;s|\\\\;t|\\\\;x|\\\\;z|\\\\^a|aa|ai|au|bh|ch|dh|gh|\\\\^i|ii|jh|kh|ph|sh|th|\\\\^u|uu|zh|0|1|2|3|4|5|6|7|8|9|\\\\\\"|\\\\\\n|\\\\\\r|\\\\ |\\\\!|\\\\\'|\\\\(|\\\\)|\\\\,|\\\\-|\\\\/|\\\\:|\\\\;|\\\\?|\\\\000|\\\\[|\\\\]|a|b|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|y|z|\\\\||\\\\\\t|_|\\\\.|\\\\*|.";\ndiacritics_token_regex = new RegExp(token_match_re_string, \'g\');\ngraph_json = {"node":{"0":{"t":null},"1":{"t":" "},"2":{"r":{"p":" ","tl":1}},"3":{"t":"*"},"4":{"r":{"p":"*","tl":1}},"5":{"t":"."},"6":{"r":{"p":".","tl":1}},"7":{"t":"\\u0000"},"8":{"r":{"p":"","tl":1}},"9":{"t":"_"},"10":{"r":{"p":"-","tl":1}},"11":{"t":"\\t"},"12":{"r":{"p":"\\t","tl":1}},"13":{"t":"\\n"},"14":{"r":{"p":"\\n","tl":1}},"15":{"t":"!"},"16":{"r":{"p":"!","tl":1}},"17":{"t":"\'"},"18":{"r":{"p":"\'","tl":1}},"19":{"t":"\\""},"20":{"r":{"p":"\\"","tl":1}},"21":{"t":"("},"22":{"r":{"p":"(","tl":1}},"23":{"t":"i"},"24":{"t":"(("},"25":{"r":{"p":"\\u011b","tl":2}},"26":{"t":"(("},"27":{"r":{"p":"\\u02bf","tl":1}},"28":{"t":")"},"29":{"r":{"p":")","tl":1}},"30":{"t":"))"},"31":{"r":{"p":"\\u02be","tl":1}},"32":{"t":","},"33":{"r":{"p":",","tl":1}},"34":{"t":"-"},"35":{"r":{"p":"-","tl":1}},"36":{"t":"--"},"37":{"r":{"p":"--","tl":1}},"38":{"t":"----"},"39":{"r":{"p":"----","tl":1}},"40":{"t":".s"},"41":{"r":{"p":"\\u1e63","tl":1}},"42":{"t":".z"},"43":{"r":{"p":"\\u1e93","tl":1}},"44":{"t":"/"},"45":{"r":{"p":"/","tl":1}},"46":{"t":":"},"47":{"r":{"p":":","tl":1}},"48":{"t":":n"},"49":{"r":{"p":"\\u1e45","tl":1}},"50":{"t":":t"},"51":{"r":{"p":"t\\u0324","tl":1}},"52":{"t":":z"},"53":{"r":{"p":"z\\u0324","tl":1}},"54":{"t":";"},"55":{"r":{"p":";","tl":1}},"56":{"t":";aa"},"57":{"r":{"p":"\\u00e2","tl":1}},"58":{"t":";e"},"59":{"r":{"p":"\\u011b","tl":1}},"60":{"t":";o"},"61":{"r":{"p":"\\u01d2","tl":1}},"62":{"t":";d"},"63":{"r":{"p":"\\u1e0d","tl":1}},"64":{"t":";dh"},"65":{"r":{"p":"\\u1e0dh","tl":1}},"66":{"t":";g"},"67":{"r":{"p":"\\u0121h","tl":1}},"68":{"t":";h"},"69":{"r":{"p":"\\u1e25","tl":1}},"70":{"t":";n"},"71":{"r":{"p":"\\u00f1","tl":1}},"72":{"t":";r"},"73":{"r":{"p":"\\u1e5b","tl":1}},"74":{"t":";rh"},"75":{"r":{"p":"\\u1e5bh","tl":1}},"76":{"t":";s"},"77":{"r":{"p":"\\u1e61","tl":1}},"78":{"t":";t"},"79":{"r":{"p":"\\u1e6d","tl":1}},"80":{"t":";th"},"81":{"r":{"p":"\\u1e6dh","tl":1}},"82":{"t":";x"},"83":{"r":{"p":"\\u1e33h","tl":1}},"84":{"t":";z"},"85":{"r":{"p":"\\u017c","tl":1}},"86":{"t":"?"},"87":{"r":{"p":"?","tl":1}},"88":{"t":"["},"89":{"r":{"p":"[","tl":1}},"90":{"t":"]"},"91":{"r":{"p":"]","tl":1}},"92":{"t":"a"},"93":{"r":{"p":"a","tl":1}},"94":{"t":"^a"},"95":{"r":{"p":"a","tl":1}},"96":{"t":"aa"},"97":{"r":{"p":"\\u0101","tl":1}},"98":{"t":"ai"},"99":{"r":{"p":"ai","tl":1}},"100":{"t":"^ai"},"101":{"r":{"p":"ai","tl":1}},"102":{"t":"au"},"103":{"r":{"p":"au","tl":1}},"104":{"t":"^au"},"105":{"r":{"p":"au","tl":1}},"106":{"t":"b"},"107":{"r":{"p":"b","tl":1}},"108":{"t":"bh"},"109":{"r":{"p":"bh","tl":1}},"110":{"t":"ch"},"111":{"r":{"p":"ch","tl":1}},"112":{"t":"chh"},"113":{"r":{"p":"chh","tl":1}},"114":{"t":"d"},"115":{"r":{"p":"d","tl":1}},"116":{"t":"dh"},"117":{"r":{"p":"dh","tl":1}},"118":{"t":"e"},"119":{"r":{"p":"e","tl":1}},"120":{"t":"f"},"121":{"r":{"p":"f","tl":1}},"122":{"t":"g"},"123":{"r":{"p":"g","tl":1}},"124":{"t":"gh"},"125":{"r":{"p":"gh","tl":1}},"126":{"t":"h"},"127":{"r":{"p":"h","tl":1}},"128":{"r":{"p":"i","tl":1}},"129":{"t":"^i"},"130":{"r":{"p":"i","tl":1}},"131":{"t":"ii"},"132":{"r":{"p":"\\u012b","tl":1}},"133":{"t":"^ii"},"134":{"r":{"p":"\\u012b","tl":1}},"135":{"t":"j"},"136":{"r":{"p":"j","tl":1}},"137":{"t":"jh"},"138":{"r":{"p":"jh","tl":1}},"139":{"t":"k"},"140":{"r":{"p":"k","tl":1}},"141":{"t":"kh"},"142":{"r":{"p":"kh","tl":1}},"143":{"t":"l"},"144":{"r":{"p":"l","tl":1}},"145":{"t":"m"},"146":{"r":{"p":"m","tl":1}},"147":{"t":"n"},"148":{"r":{"p":"n","tl":1}},"149":{"t":"o"},"150":{"r":{"p":"o","tl":1}},"151":{"t":"p"},"152":{"r":{"p":"p","tl":1}},"153":{"t":"ph"},"154":{"r":{"p":"ph","tl":1}},"155":{"t":"q"},"156":{"r":{"p":"q","tl":1}},"157":{"t":"r"},"158":{"r":{"p":"r","tl":1}},"159":{"t":"s"},"160":{"r":{"p":"s","tl":1}},"161":{"t":"sh"},"162":{"r":{"p":"sh","tl":1}},"163":{"t":"t"},"164":{"r":{"p":"t","tl":1}},"165":{"t":"th"},"166":{"r":{"p":"th","tl":1}},"167":{"t":"u"},"168":{"r":{"p":"u","tl":1}},"169":{"t":"^u"},"170":{"r":{"p":"u","tl":1}},"171":{"t":"uu"},"172":{"r":{"p":"\\u016b","tl":1}},"173":{"t":"^uu"},"174":{"r":{"p":"\\u016b","tl":1}},"175":{"t":"v"},"176":{"r":{"p":"v","tl":1}},"177":{"t":"w"},"178":{"r":{"p":"w","tl":1}},"179":{"t":"y"},"180":{"r":{"p":"y","tl":1}},"181":{"t":"z"},"182":{"r":{"p":"z","tl":1}},"183":{"t":"zh"},"184":{"r":{"p":"zh","tl":1}},"185":{"t":"|"},"186":{"r":{"p":"","tl":1}},"187":{"t":"1"},"188":{"r":{"p":"1","tl":1}},"189":{"t":"2"},"190":{"r":{"p":"2","tl":1}},"191":{"t":"3"},"192":{"r":{"p":"3","tl":1}},"193":{"t":"4"},"194":{"r":{"p":"4","tl":1}},"195":{"t":"5"},"196":{"r":{"p":"5","tl":1}},"197":{"t":"6"},"198":{"r":{"p":"6","tl":1}},"199":{"t":"7"},"200":{"r":{"p":"7","tl":1}},"201":{"t":"8"},"202":{"r":{"p":"8","tl":1}},"203":{"t":"9"},"204":{"r":{"p":"9","tl":1}},"205":{"t":"0"},"206":{"r":{"p":"0","tl":1}}},"edge":{"0":[[0,1,{}],[0,3,{}],[0,5,{}],[0,7,{}],[0,9,{}],[0,11,{}],[0,13,{}],[0,15,{}],[0,17,{}],[0,19,{}],[0,21,{}],[0,23,{}],[0,26,{}],[0,28,{}],[0,30,{}],[0,32,{}],[0,34,{}],[0,36,{}],[0,38,{}],[0,40,{}],[0,42,{}],[0,44,{}],[0,46,{}],[0,48,{}],[0,50,{}],[0,52,{}],[0,54,{}],[0,56,{}],[0,58,{}],[0,60,{}],[0,62,{}],[0,64,{}],[0,66,{}],[0,68,{}],[0,70,{}],[0,72,{}],[0,74,{}],[0,76,{}],[0,78,{}],[0,80,{}],[0,82,{}],[0,84,{}],[0,86,{}],[0,88,{}],[0,90,{}],[0,92,{}],[0,94,{}],[0,96,{}],[0,98,{}],[0,100,{}],[0,102,{}],[0,104,{}],[0,106,{}],[0,108,{}],[0,110,{}],[0,112,{}],[0,114,{}],[0,116,{}],[0,118,{}],[0,120,{}],[0,122,{}],[0,124,{}],[0,126,{}],[0,129,{}],[0,131,{}],[0,133,{}],[0,135,{}],[0,137,{}],[0,139,{}],[0,141,{}],[0,143,{}],[0,145,{}],[0,147,{}],[0,149,{}],[0,151,{}],[0,153,{}],[0,155,{}],[0,157,{}],[0,159,{}],[0,161,{}],[0,163,{}],[0,165,{}],[0,167,{}],[0,169,{}],[0,171,{}],[0,173,{}],[0,175,{}],[0,177,{}],[0,179,{}],[0,181,{}],[0,183,{}],[0,185,{}],[0,187,{}],[0,189,{}],[0,191,{}],[0,193,{}],[0,195,{}],[0,197,{}],[0,199,{}],[0,201,{}],[0,203,{}],[0,205,{}]],"1":[[1,2,{"r":{"mt":[" "],"pl":0,"nl":1,"tl":1,"p":" "}}]],"3":[[3,4,{"r":{"mt":["*"],"pl":0,"nl":1,"tl":1,"p":"*"}}]],"5":[[5,6,{"r":{"mt":["."],"pl":0,"nl":1,"nc":[14],"tl":1,"p":"."}}]],"7":[[7,8,{"r":{"mt":["\\u0000"],"pl":0,"nl":1,"tl":1,"p":""}}]],"9":[[9,10,{"r":{"mt":["_"],"pl":0,"nl":1,"tl":1,"p":"-"}}]],"11":[[11,12,{"r":{"mt":["\\t"],"pl":0,"nl":1,"tl":1,"p":"\\t"}}]],"13":[[13,14,{"r":{"mt":["\\n"],"pl":0,"nl":1,"tl":1,"p":"\\n"}}]],"15":[[15,16,{"r":{"mt":["!"],"pl":0,"nl":1,"tl":1,"p":"!"}}]],"17":[[17,18,{"r":{"mt":["\'"],"pl":0,"nl":1,"tl":1,"p":"\'"}}]],"19":[[19,20,{"r":{"mt":["\\""],"pl":0,"nl":1,"tl":1,"p":"\\""}}]],"21":[[21,22,{"r":{"mt":["("],"pl":0,"nl":1,"tl":1,"p":"("}}]],"23":[[23,24,{}],[23,128,{"r":{"mt":["i"],"pl":0,"nl":1,"tl":1,"p":"i"}}]],"24":[[24,25,{"r":{"pc":[14],"mt":["i","(("],"pl":0,"nl":2,"tl":2,"p":"\\u011b"}}]],"26":[[26,27,{"r":{"mt":["(("],"pl":0,"nl":1,"tl":1,"p":"\\u02bf"}}]],"28":[[28,29,{"r":{"mt":[")"],"pl":0,"nl":1,"tl":1,"p":")"}}]],"30":[[30,31,{"r":{"mt":["))"],"pl":0,"nl":1,"tl":1,"p":"\\u02be"}}]],"32":[[32,33,{"r":{"mt":[","],"pl":0,"nl":1,"tl":1,"p":","}}]],"34":[[34,35,{"r":{"mt":["-"],"pl":0,"nl":1,"tl":1,"p":"-"}}]],"36":[[36,37,{"r":{"mt":["--"],"pl":0,"nl":1,"tl":1,"p":"--"}}]],"38":[[38,39,{"r":{"mt":["----"],"pl":0,"nl":1,"tl":1,"p":"----"}}]],"40":[[40,41,{"r":{"mt":[".s"],"pl":0,"nl":1,"tl":1,"p":"\\u1e63"}}]],"42":[[42,43,{"r":{"mt":[".z"],"pl":0,"nl":1,"tl":1,"p":"\\u1e93"}}]],"44":[[44,45,{"r":{"mt":["/"],"pl":0,"nl":1,"tl":1,"p":"/"}}]],"46":[[46,47,{"r":{"mt":[":"],"pl":0,"nl":1,"tl":1,"p":":"}}]],"48":[[48,49,{"r":{"mt":[":n"],"pl":0,"nl":1,"tl":1,"p":"\\u1e45"}}]],"50":[[50,51,{"r":{"mt":[":t"],"pl":0,"nl":1,"tl":1,"p":"t\\u0324"}}]],"52":[[52,53,{"r":{"mt":[":z"],"pl":0,"nl":1,"tl":1,"p":"z\\u0324"}}]],"54":[[54,55,{"r":{"mt":[";"],"pl":0,"nl":1,"tl":1,"p":";"}}]],"56":[[56,57,{"r":{"mt":[";aa"],"pl":0,"nl":1,"tl":1,"p":"\\u00e2"}}]],"58":[[58,59,{"r":{"mt":[";e"],"pl":0,"nl":1,"tl":1,"p":"\\u011b"}}]],"60":[[60,61,{"r":{"mt":[";o"],"pl":0,"nl":1,"tl":1,"p":"\\u01d2"}}]],"62":[[62,63,{"r":{"mt":[";d"],"pl":0,"nl":1,"tl":1,"p":"\\u1e0d"}}]],"64":[[64,65,{"r":{"mt":[";dh"],"pl":0,"nl":1,"tl":1,"p":"\\u1e0dh"}}]],"66":[[66,67,{"r":{"mt":[";g"],"pl":0,"nl":1,"tl":1,"p":"\\u0121h"}}]],"68":[[68,69,{"r":{"mt":[";h"],"pl":0,"nl":1,"tl":1,"p":"\\u1e25"}}]],"70":[[70,71,{"r":{"mt":[";n"],"pl":0,"nl":1,"tl":1,"p":"\\u00f1"}}]],"72":[[72,73,{"r":{"mt":[";r"],"pl":0,"nl":1,"tl":1,"p":"\\u1e5b"}}]],"74":[[74,75,{"r":{"mt":[";rh"],"pl":0,"nl":1,"tl":1,"p":"\\u1e5bh"}}]],"76":[[76,77,{"r":{"mt":[";s"],"pl":0,"nl":1,"tl":1,"p":"\\u1e61"}}]],"78":[[78,79,{"r":{"mt":[";t"],"pl":0,"nl":1,"tl":1,"p":"\\u1e6d"}}]],"80":[[80,81,{"r":{"mt":[";th"],"pl":0,"nl":1,"tl":1,"p":"\\u1e6dh"}}]],"82":[[82,83,{"r":{"mt":[";x"],"pl":0,"nl":1,"tl":1,"p":"\\u1e33h"}}]],"84":[[84,85,{"r":{"mt":[";z"],"pl":0,"nl":1,"tl":1,"p":"\\u017c"}}]],"86":[[86,87,{"r":{"mt":["?"],"pl":0,"nl":1,"tl":1,"p":"?"}}]],"88":[[88,89,{"r":{"mt":["["],"pl":0,"nl":1,"tl":1,"p":"["}}]],"90":[[90,91,{"r":{"mt":["]"],"pl":0,"nl":1,"tl":1,"p":"]"}}]],"92":[[92,93,{"r":{"mt":["a"],"pl":0,"nl":1,"tl":1,"p":"a"}}]],"94":[[94,95,{"r":{"mt":["^a"],"pl":0,"nl":1,"tl":1,"p":"a"}}]],"96":[[96,97,{"r":{"mt":["aa"],"pl":0,"nl":1,"tl":1,"p":"\\u0101"}}]],"98":[[98,99,{"r":{"mt":["ai"],"pl":0,"nl":1,"tl":1,"p":"ai"}}]],"100":[[100,101,{"r":{"mt":["^ai"],"pl":0,"nl":1,"tl":1,"p":"ai"}}]],"102":[[102,103,{"r":{"mt":["au"],"pl":0,"nl":1,"tl":1,"p":"au"}}]],"104":[[104,105,{"r":{"mt":["^au"],"pl":0,"nl":1,"tl":1,"p":"au"}}]],"106":[[106,107,{"r":{"mt":["b"],"pl":0,"nl":1,"tl":1,"p":"b"}}]],"108":[[108,109,{"r":{"mt":["bh"],"pl":0,"nl":1,"tl":1,"p":"bh"}}]],"110":[[110,111,{"r":{"mt":["ch"],"pl":0,"nl":1,"tl":1,"p":"ch"}}]],"112":[[112,113,{"r":{"mt":["chh"],"pl":0,"nl":1,"tl":1,"p":"chh"}}]],"114":[[114,115,{"r":{"mt":["d"],"pl":0,"nl":1,"tl":1,"p":"d"}}]],"116":[[116,117,{"r":{"mt":["dh"],"pl":0,"nl":1,"tl":1,"p":"dh"}}]],"118":[[118,119,{"r":{"mt":["e"],"pl":0,"nl":1,"tl":1,"p":"e"}}]],"120":[[120,121,{"r":{"mt":["f"],"pl":0,"nl":1,"tl":1,"p":"f"}}]],"122":[[122,123,{"r":{"mt":["g"],"pl":0,"nl":1,"tl":1,"p":"g"}}]],"124":[[124,125,{"r":{"mt":["gh"],"pl":0,"nl":1,"tl":1,"p":"gh"}}]],"126":[[126,127,{"r":{"mt":["h"],"pl":0,"nl":1,"tl":1,"p":"h"}}]],"129":[[129,130,{"r":{"mt":["^i"],"pl":0,"nl":1,"tl":1,"p":"i"}}]],"131":[[131,132,{"r":{"mt":["ii"],"pl":0,"nl":1,"tl":1,"p":"\\u012b"}}]],"133":[[133,134,{"r":{"mt":["^ii"],"pl":0,"nl":1,"tl":1,"p":"\\u012b"}}]],"135":[[135,136,{"r":{"mt":["j"],"pl":0,"nl":1,"tl":1,"p":"j"}}]],"137":[[137,138,{"r":{"mt":["jh"],"pl":0,"nl":1,"tl":1,"p":"jh"}}]],"139":[[139,140,{"r":{"mt":["k"],"pl":0,"nl":1,"tl":1,"p":"k"}}]],"141":[[141,142,{"r":{"mt":["kh"],"pl":0,"nl":1,"tl":1,"p":"kh"}}]],"143":[[143,144,{"r":{"mt":["l"],"pl":0,"nl":1,"tl":1,"p":"l"}}]],"145":[[145,146,{"r":{"mt":["m"],"pl":0,"nl":1,"tl":1,"p":"m"}}]],"147":[[147,148,{"r":{"mt":["n"],"pl":0,"nl":1,"tl":1,"p":"n"}}]],"149":[[149,150,{"r":{"mt":["o"],"pl":0,"nl":1,"tl":1,"p":"o"}}]],"151":[[151,152,{"r":{"mt":["p"],"pl":0,"nl":1,"tl":1,"p":"p"}}]],"153":[[153,154,{"r":{"mt":["ph"],"pl":0,"nl":1,"tl":1,"p":"ph"}}]],"155":[[155,156,{"r":{"mt":["q"],"pl":0,"nl":1,"tl":1,"p":"q"}}]],"157":[[157,158,{"r":{"mt":["r"],"pl":0,"nl":1,"tl":1,"p":"r"}}]],"159":[[159,160,{"r":{"mt":["s"],"pl":0,"nl":1,"tl":1,"p":"s"}}]],"161":[[161,162,{"r":{"mt":["sh"],"pl":0,"nl":1,"tl":1,"p":"sh"}}]],"163":[[163,164,{"r":{"mt":["t"],"pl":0,"nl":1,"tl":1,"p":"t"}}]],"165":[[165,166,{"r":{"mt":["th"],"pl":0,"nl":1,"tl":1,"p":"th"}}]],"167":[[167,168,{"r":{"mt":["u"],"pl":0,"nl":1,"tl":1,"p":"u"}}]],"169":[[169,170,{"r":{"mt":["^u"],"pl":0,"nl":1,"tl":1,"p":"u"}}]],"171":[[171,172,{"r":{"mt":["uu"],"pl":0,"nl":1,"tl":1,"p":"\\u016b"}}]],"173":[[173,174,{"r":{"mt":["^uu"],"pl":0,"nl":1,"tl":1,"p":"\\u016b"}}]],"175":[[175,176,{"r":{"mt":["v"],"pl":0,"nl":1,"tl":1,"p":"v"}}]],"177":[[177,178,{"r":{"mt":["w"],"pl":0,"nl":1,"tl":1,"p":"w"}}]],"179":[[179,180,{"r":{"mt":["y"],"pl":0,"nl":1,"tl":1,"p":"y"}}]],"181":[[181,182,{"r":{"mt":["z"],"pl":0,"nl":1,"tl":1,"p":"z"}}]],"183":[[183,184,{"r":{"mt":["zh"],"pl":0,"nl":1,"tl":1,"p":"zh"}}]],"185":[[185,186,{"r":{"mt":["|"],"pl":0,"nl":1,"tl":1,"p":""}}]],"187":[[187,188,{"r":{"mt":["1"],"pl":0,"nl":1,"tl":1,"p":"1"}}]],"189":[[189,190,{"r":{"mt":["2"],"pl":0,"nl":1,"tl":1,"p":"2"}}]],"191":[[191,192,{"r":{"mt":["3"],"pl":0,"nl":1,"tl":1,"p":"3"}}]],"193":[[193,194,{"r":{"mt":["4"],"pl":0,"nl":1,"tl":1,"p":"4"}}]],"195":[[195,196,{"r":{"mt":["5"],"pl":0,"nl":1,"tl":1,"p":"5"}}]],"197":[[197,198,{"r":{"mt":["6"],"pl":0,"nl":1,"tl":1,"p":"6"}}]],"199":[[199,200,{"r":{"mt":["7"],"pl":0,"nl":1,"tl":1,"p":"7"}}]],"201":[[201,202,{"r":{"mt":["8"],"pl":0,"nl":1,"tl":1,"p":"8"}}]],"203":[[203,204,{"r":{"mt":["9"],"pl":0,"nl":1,"tl":1,"p":"9"}}]],"205":[[205,206,{"r":{"mt":["0"],"pl":0,"nl":1,"tl":1,"p":"0"}}]]},"compressed":true};\nonmatch_json = null;\n\nfunction decode_json(x){return x};\n\ndiacritics_graph = decode_json(graph_json);\ndiacritics_onmatch = decode_json(onmatch_json);\n\nconsole.log(\'parser loaded; len of graph: \'+graph_json);\n'

In [15]:
#!coffee --compile --bare --output lib/ src/

In [ ]: