diff -ur v15/ezmd.py v16/ezmd.py --- v15/ezmd.py 2019-10-02 03:11:30.000000000 +0900 +++ v16/ezmd.py 2019-10-02 04:11:00.000000000 +0900 @@ -78,15 +78,31 @@ cut_t_empty = lambda lst: cut_t_empty(lst[:-1]) if lst and lst[-1] == '' else lst cut_ht_empty = lambda lst: cut_t_empty( cut_h_empty(lst) ) +def buf_loop_new(buf, is_call, func): + e = Empty() + e.mode = e.next_mode = None + e.tmp = [] + + def run(): + for e.s in buf: + if is_call(e): + func(e) + e.tmp = [] + e.mode = e.next_mode + + if e.s != None: + e.tmp.append(e.s) + func(e) + + return e.to_attr( locals() ) + def esc_join(lst): - res = [] - for s in lst: - if res and res[-1] and res[-1][-1] == '\\': - t = res[-1][:-1] - res[-1] = strip_tail(t) + strip_head(s) - else: - res.append(s) - return res + if len(lst) < 2: + return lst + if lst[0] and lst[0][-1] == '\\': + lst = [ strip_tail( lst[0][:-1] ) + strip_head( lst[1] ) ] + lst[2:] + return esc_join(lst) + return lst[:1] + esc_join( lst[1:] ) s_idx = lambda s, p, dv=-1: s.index(p) if p in s else dv @@ -174,17 +190,20 @@ buf = cut_ht_empty(buf) if buf: buf = cut_verb_idt(buf) - (lst, mode, mbuf) = ( [], '', [] ) - for s in buf: - mode_ = '' if s == '' else ( 'dd' if s[0] in (' ', '\t') else 'dt' ) - if mode_ != mode: - if mode and 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( tag_new( mode, {}, do_str(mbuf) ) ) + lst = [] + + def is_call(e): + e.next_mode = '' if e.s == '' else ( 'dd' if e.s[0] in (' ', '\t') else 'dt' ) + e.s = e.s.strip() + return e.next_mode != e.mode + + def func(e): + if e.mode and e.tmp: + lst.append( tag_new( e.mode, {}, do_str(e.tmp) ) ) + + e = buf_loop_new(buf, is_call, func) + e.run() + res.append( tag_new('dl', {}, lst) ) def do_tr(s): @@ -315,16 +334,16 @@ def ezmd(lst): lst = ['p'] + lst (buf, res, hd_names) = ( [], [], [] ) - mode = '' - while lst: - s = lst.pop(0) - (s, nmd) = next_mode_switch(s, mode); - if nmd != mode: - do_mode(mode, buf, res, hd_names) - (mode, buf) = (nmd, []) - if s != None: - buf.append(s) - do_mode(mode, buf, res, hd_names) + + def is_call(e): + (e.s, e.next_mode) = next_mode_switch(e.s, e.mode) + return e.next_mode != e.mode + + func = lambda e: do_mode(e.mode, e.tmp, res, hd_names) + + e = buf_loop_new(lst, is_call, func) + e.run() + res = do_index(res, hd_names) return res