diff -ur v10/ezmd.py v11/ezmd.py --- v10/ezmd.py 2019-09-27 22:16:31.000000000 +0900 +++ v11/ezmd.py 2019-09-30 00:19:27.000000000 +0900 @@ -26,31 +26,30 @@ return (s, mode) +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 ), [] ) + lst_strip = lambda lst: list( map( lambda s: s.strip(), lst ) ) -def strip_head(s): - while s and s[0] in (' ', '\t'): - s = s[1:] - return s +strip_head = lambda s: strip_head(s[1:]) if s and s[0] in (' ', '\t') else s +strip_tail = lambda s: strip_tail(s[:-1]) if s and s[-1] in (' ', '\t') else s -def strip_tail(s): - while s and s[-1] in (' ', '\t'): - s = s[:-1] - return s +idt_get = lambda s: 1 + idt_get(s[1:]) if s and s[0] in (' ', '\t') else 0 def idt_cnt(s): - i = 0 - while s and s[0] in (' ', '\t'): - i += 1 - s = s[1:] - return (i, s) + i = idt_get(s) + return ( i, s[i:] ) + +cut_empty = lambda lst: list( filter( lambda s: s != '', lst ) ) def cut_verb_idt(lst): - lst_ = list( filter( lambda s: s != '', lst ) ) - i = min( map( lambda s: idt_cnt(s)[0], lst_ ) ) - if i > 0: - lst = list( map( lambda s: s[i:], lst ) ) - return lst + i = min( map( idt_get, cut_empty(lst) ) ) + return list( map( lambda s: s[i:], lst ) ) if i > 0 else lst + +cut_h_empty = lambda lst: cut_h_empty(lst[1:]) if lst and lst[0] == '' else lst +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 esc_join(lst): res = [] @@ -83,8 +82,7 @@ if m: (v1, v2) = lst_strip( m.split('|') ) if '|' in m else (m, m) s3[1] = do_v1v2(v1, v2) - lst = list( filter( lambda o: o, s3 ) ) - return lst[0] if len(lst) == 1 else lst + return from_lst( cut_empty(s3) ) return s def do_mode_ul(buf, res): @@ -125,7 +123,7 @@ def do_mode(mode, buf, res, hd_names): if mode in heads: buf = lst_strip(buf) - buf = list( filter( lambda s: s!='', buf ) ) + buf = cut_empty(buf) s = ''.join(buf) (h_i, n) = ( int(mode[1:]), len(hd_names) ) name = 'c_{}_{}'.format(h_i, n) @@ -144,14 +142,10 @@ lsts.append(lst) lst = [] for lst in lsts: - to_lst = lambda o: o if type(o) == list else [o] - lst = sum( map( lambda s: to_lst( do_str(s) ), lst ), [] ) + lst = flat_map(do_str, lst) res.append( { 'p': lst } ) elif mode == 'pre': - while buf and buf[0] == '': - buf.pop(0) - while buf and buf[-1] == '': - buf.pop() + buf = cut_ht_empty(buf) if buf: buf = cut_verb_idt(buf) s = '\n'.join(buf) + '\n' @@ -159,10 +153,10 @@ elif mode == 'ul': do_mode_ul(buf, res) elif mode == 'hr': - res.extend( list( map( lambda s: { 'p': { 'hr': '/' } }, buf ) ) ) + res.extend( [ { 'p': { 'hr': '/' } } ] * len(buf) ) elif mode == 'index': buf = lst_strip(buf) - buf = list( filter( lambda s: s!='', buf ) ) + buf = cut_empty(buf) res.append( { 'index': buf } ) # continue to 2 pass def do_index(lst, hd_names): @@ -186,21 +180,17 @@ pass return list( filter( lambda vs: vs[0] in sel, hd_names ) ) - res = [] - for d in lst: - if 'index' in d: - slc =slice_get( d.get('index') ) - names = names_get(hd_names, slc) - - func = lambda h_i, n, name, s: ' ' * h_i + '[[#{}|'.format(name) + s + ']]' - buf = list( map( lambda vs: func(*vs), names ) ) - ul_res = [] - do_mode_ul(buf, ul_res) + def f(buf): + names = names_get(hd_names, slice_get(buf) ) - res.extend(ul_res) - else: - res.append(d) - return res + func = lambda h_i, n, name, s: ' ' * h_i + '[[#{}|'.format(name) + s + ']]' + buf = list( map( lambda vs: func(*vs), names ) ) + + ul_res = [] + 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 ) def ezmd(lst): lst = ['p'] + lst