diff -ur v14/ezmd.py v15/ezmd.py --- v14/ezmd.py 2019-10-01 01:05:53.000000000 +0900 +++ v15/ezmd.py 2019-10-02 03:11:30.000000000 +0900 @@ -26,6 +26,32 @@ return (s, mode) +class Empty: + def __init__(self, dic={}): + self.to_attr(dic) + + def to_attr(self, dic): + for (k, v) in dic.items(): + setattr(self, k, v) + return self + +def tag_new(name, prop, v): + return Empty( locals() ) + +def tag_to_dic(tag): + pstr = lambda k, v: '{}="{}"'.format(k, v) if v != None else k + lst = [ tag.name ] + list( map( lambda kv: pstr(*kv), tag.prop.items() ) ) + k = ' '.join(lst) + + def v_get(v): + if type(v) == list: + return list( map(v_get, v) ) + if isinstance(v, Empty): + return tag_to_dic(v) + return v + + return { k: v_get(tag.v) } + to_lst = lambda o: o if type(o) == list else [o] from_lst = lambda lst: lst[0] if len(lst) == 1 else lst flat_map = lambda f, lst: sum( map( lambda o: to_lst( f(o) ), lst ), [] ) @@ -66,17 +92,17 @@ def do_v1v2(v1, v2): if v1 == 'img': - return { 'img src="{}"'.format(v2): '/' } + return tag_new('img', {'src': v2}, '/') if v1 == 'video': - return { 'video src="{}" controls playsinline'.format(v2): '' } + return tag_new('video', {'src': v2, 'controls': None, 'playsinline': None}, '') if v1 == '-': - return { 's': v2 } - return { 'a href="{}"'.format(v1): v2 } if v1 else v2 + return tag_new('s', {}, v2) + return tag_new('a', {'href': v1}, v2) if v1 else v2 def do_br(s): p = '\\n' if p in s: - lst = flat_map( lambda s_: [ s_, { 'br': '/' } ], s.split(p) )[:-1] + lst = flat_map( lambda s_: [ s_, tag_new('br', {}, '/') ], s.split(p) )[:-1] return from_lst( cut_empty(lst) ) return s @@ -99,7 +125,7 @@ # sol : str or lst # def map_sol(f_s_ret_sol, sol): - f = lambda o: o if type(o) == dict else f_s_ret_sol(o) + f = lambda o: o if isinstance(o, Empty) else f_s_ret_sol(o) return flat_map(f, sol) if type(sol) == list else f_s_ret_sol(sol) def do_str(sol): # str or list @@ -137,9 +163,9 @@ list( map(buf_to_stk_lsts, buf) ) # make lists def lst_to(lst): - f = lambda o: lst_to(o) if type(o) == list else {'li /': do_str(o) } + f = lambda o: lst_to(o) if type(o) == list else tag_new( 'li', {'/': None}, do_str(o) ) lst = list( map(f, lst) ) - return { 'ul': lst } + return tag_new('ul', {}, lst) res.extend( list( map(lst_to, lsts) ) ) @@ -153,13 +179,13 @@ mode_ = '' if s == '' else ( 'dd' if s[0] in (' ', '\t') else 'dt' ) if mode_ != mode: if mode and mbuf: - lst.append( { mode: do_str(mbuf) } ) + lst.append( tag_new( mode, {}, do_str(mbuf) ) ) (mode, mbuf) = ( mode_, [ s.strip() ] ) elif s: mbuf.append( s.strip() ) if mode and mbuf: - lst.append( { mode: do_str(mbuf) } ) - res.append( { 'dl': lst } ) + lst.append( tag_new( mode, {}, do_str(mbuf) ) ) + res.append( tag_new('dl', {}, lst) ) def do_tr(s): tgl = lambda md, n: md if n == 1 else ('th' if md == 'td' else 'td') @@ -190,24 +216,25 @@ if not s: return [] s = s.replace('\|', '|') - tag = md + prop = {} if len(s) > 2 and s[0] in 'cr': cr = 'col' if s[0] == 'c' else 'row' (t, s) = split_num(s) if t: - tag += ' {}span="{}"'.format(cr, t) - return { tag: do_str( s.strip() ) } + prop[ '{}span'.format(cr) ] = int(t) + return tag_new( md, prop, do_str( s.strip() ) ) lst = flat_map( lambda s_md: th_td(*s_md), lst ) - return { 'tr': lst } + return tag_new('tr', {}, lst) def do_mode_tbl(buf, res): buf = esc_join(buf) buf = lst_strip(buf) buf = cut_empty(buf) if buf: - tag = 'table border="1" cellspacing="0"' - res.append( { tag: list( map(do_tr, buf) ) } ) + prop = {'border': 1, 'cellspacing': 0} + v = list( map(do_tr, buf) ) + res.append( tag_new('table', prop, v) ) def do_mode(mode, buf, res, hd_names): if mode in heads: @@ -216,7 +243,7 @@ s = ''.join(buf) (h_i, n) = ( int(mode[1:]), len(hd_names) ) name = 'c_{}_{}'.format(h_i, n) - res.append( { mode: { 'a name="{}"'.format(name): s } } ) + res.append( tag_new( mode, {}, tag_new('a', {'name': name}, s) ) ) hd_names.append( (h_i, n, name, s) ) elif mode == 'p': @@ -232,13 +259,13 @@ lst = [] for lst in lsts: lst = flat_map(do_str, lst) - res.append( { 'p': lst } ) + res.append( tag_new('p', {}, lst) ) elif mode == 'pre': buf = cut_ht_empty(buf) if buf: buf = cut_verb_idt(buf) s = '\n'.join(buf) + '\n' - res.append( { 'pre': s } ) + res.append( tag_new('pre', {}, s) ) elif mode == 'ul': do_mode_ul(buf, res) elif mode == 'dl': @@ -246,11 +273,11 @@ elif mode == 'tbl': do_mode_tbl(buf, res) elif mode == 'hr': - res.extend( [ { 'p': { 'hr': '/' } } ] * len(buf) ) + res.extend( [ tag_new('p', {}, tag_new('hr', {}, '/') ) ] * len(buf) ) elif mode == 'index': buf = lst_strip(buf) buf = cut_empty(buf) - res.append( { 'index': buf } ) # continue to 2 pass + res.append( tag_new('index', {}, buf) ) # continue to 2 pass def do_index(lst, hd_names): @@ -283,7 +310,7 @@ do_mode_ul(buf, ul_res) return ul_res - return flat_map( lambda d: f( d.get('index') ) if 'index' in d else d, lst ) + return flat_map( lambda tag: f(tag.v) if tag.name == 'index' else tag, lst ) def ezmd(lst): lst = ['p'] + lst @@ -319,6 +346,7 @@ lst = list( map( strip_tail, lst ) ) lst = ezmd(lst) + lst = list( map( tag_to_dic, lst ) ) u8 = yaml_dump(lst) b = nkf.cvt(u8, nkf_opt) if nkf_opt != '-u' else u8