diff -ur v27/ezmd.py v28/ezmd.py --- v27/ezmd.py 2019-10-10 00:20:14.000000000 +0900 +++ v28/ezmd.py 2019-10-10 23:57:05.000000000 +0900 @@ -85,16 +85,17 @@ k = ' '.join(lst) def v_get(v): - if type(v) == list: - return list( map(v_get, v) ) - if isinstance(v, Empty): + if is_lst(v): + #return list( map(v_get, v) ) + return flat_map(v_get, v) + if is_tag(v): return tag_to_dic(v) return v - return { k: v_get(tag.v) } + return tag.v if tag.name == 'yaml' else { 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 if lst else '' ) +to_lst = lambda o: o if is_lst(o) 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 ) ) @@ -151,15 +152,18 @@ def div_delim(o, delim): i = s_idx(o, delim) - n = 1 if type(o) == list else len(delim) + n = 1 if is_lst(o) else len(delim) return ( o[:i], o[i+n:] ) -is_str = lambda o: type(o) != list and not isinstance(o, Empty) # !!! +is_lst = lambda o: type(o) == list +is_tag = lambda o: isinstance(o, Empty) # !!! +is_str = lambda o: not is_lst(o) and not is_tag(o) lst_strip_is_str = lambda lst: list( map( lambda o: o.strip() if is_str(o) else o, lst ) ) -def delim_pop(s, delim): - f = lambda lst: ( lst[0], delim.join( lst[1:] ) ) - return f( s.split(delim) ) +def delim_pop(o, delim): + if delim in o: + return div_delim(o, delim) + return ( o, [] if is_lst(o) else '' ) def do_prop(v1, v2): tag_props.clear() @@ -172,21 +176,23 @@ pass return [] -def do_detail(v2): - if '|' in v2: - v2 = lst_strip_is_str( div_delim(v2, '|') ) - elif type(v2) == list and v2 and is_str( v2[0] ) and '|' in v2[0]: - (a, b) = lst_strip_is_str( div_delim(v2[0], '|') ) - v2 = ( a, ( [b] if b else [] ) + v2[1:] ) - elif type(v2) == list and v2 and is_str( v2[-1] ) and '|' in v2[-1]: - (a, b) = lst_strip_is_str( div_delim(v2[-1], '|') ) - v2 = ( v2[:-1] + ( [a] if a else [] ), b ) - else: - return None +def do_detail(o): + v2 = [] + if is_str(o) and '|' in o: + v2 = lst_strip( div_delim(o, '|') ) + elif is_lst(o): + i_s = list( filter( lambda i: is_str(o[i]) and '|' in o[i], range( len(o) ) ) ) + if i_s: + i = i_s[0] + (h, t) = div_delim( o[i], '|' ) + v2 = ( join_o( o[:i], h ), join_o( t, o[i+1:] ) ) + if len(v2) != 2: + return [] + (summary, detail) = v2 if is_str(detail): detail = outbuf.lst_get(detail) - v = [ tag_new('summary', {}, summary) ] + to_lst(detail) + v = join_o( tag_new('summary', {}, summary), detail ) return tag_new('details', {}, v) def do_v1v2(v1, v2): @@ -208,6 +214,8 @@ return outbuf.lst_get(v2) if v1 == 'prop': return do_prop(v1, v2) + if v1 == 'yaml': + return tag_new( 'yaml', {}, yaml.load(v2) ) if v1 == 'detail': r = do_detail(v2) if r: @@ -235,44 +243,63 @@ w = w.strip() return (w, s) if w else get_token(s, ks) # ! -def join_str(lst): - if len(lst) < 2: - return lst - (v, lst) = ( lst[0], join_str( lst[1:] ) ) - if is_str(v) and lst and is_str( lst[0] ): - return [ v + lst[0] ] + lst[1:] - return [v] + lst +def join_o(a, b): + if is_str(a) and is_str(b): + return a + b + (a, b) = map( lambda o: o.strip() if is_str(o) else o, (a, b) ) + (a, b) = map( lambda o: [] if o == '' else to_lst(o), (a, b) ) + return from_lst(a + b) + +def try_a_href(s): # (o, t) + s_ = s[ len('[['): ] + (i_a, i_b, i_c) = map( lambda p: s_idx(s_, p), ('[[', '|', ']]') ) + if i_c < 0: + return (s, '') + if i_c < i_b: + i_b = -1 + if i_a >= 0 and i_a < (i_c if i_b < 0 else i_b): + return ('[[', s_) + + if i_b < 0: + (h, t) = div_delim(s_, ']]') + v = h.strip() + return ( do_v1v2(v, v), t ) + + (h, t) = div_delim(s_, '|') + v1 = h.strip() + if i_a < 0: + (h, t) = div_delim(t, ']]') + v2 = h.strip() + return ( do_v1v2(v1, v2), t ) + + o = do_a_href(t) + if is_tag(o): + return ('[[', s_) + + if is_str(o): + if ']]' not in o: + return (s, '') + (h, t) = div_delim(o, ']]') + v2 = h.strip() + return ( do_v1v2(v1, v2), t ) + + # o is list + for i in range( len(o) ): + o_ = o[i] + if is_str(o_) and ']]' in o_: + (h, t) = div_delim(o_, ']]') + v2 = join_o( o[:i], h ) + r = do_v1v2(v1, v2) + r = join_o( r, join_o( t, o[i+1:] ) ) + return (r, '') + return ('[[', s_) def do_a_href(s): - def eval_targ(lst): - lst_ = lst[1:-1] - if not lst_: - return lst - - vs = [ lst_, lst_ ] # default - i = s_idx(lst_, '|') - if i >= 0: - vs = [ lst_[:i], lst_[i+1:] ] - - (v1, v2) = vs = list( map( from_lst, vs ) ) - if not is_str(v1): - return lst - (v1, v2) = lst_strip_is_str(vs) - if type(v2) == list: - v2 = from_lst( join_str(v2) ) - - return do_v1v2(v1, v2) - - if s and '[[' in s and ']]' in s: - lst = [] - while s: - (k, s) = get_token( s, ('[[', '|', ']]') ) - lst.append(k) - if k == ']]' and '[[' in lst: - (lst, targ) = div_idx( lst, r_idx(lst, '[[') ) - lst = lst + to_lst( eval_targ(targ) ) - lst = join_str(lst) - return from_lst(lst) if lst else [] + if '[[' in s: + (h, t) = div_delim(s, '[[') + (o, t) = try_a_href('[[' + t) + r = join_o(h, o) + return join_o( r, do_a_href(t) ) if t else r return s do_out_quote = lambda s: s [1:-1] if len(s) >= 2 and s[0] == s[-1] and s[0] in ("'", '"') else s @@ -281,8 +308,8 @@ # sol : str or lst # def map_sol(f_s_ret_sol, sol): - 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(sol) + f = lambda o: o if is_tag(o) else f_s_ret_sol(o) + return flat_map(f, sol) if is_lst(sol) else f(sol) def do_str(sol): # str or list cvs = (do_out_quote, do_br, do_a_href) @@ -322,7 +349,7 @@ def fs(s): sol = do_str(s) return tag_new( 'li', {'/': None}, sol ) if sol != [] else [] - f = lambda o: lst_to(o) if type(o) == list else fs(o) + f = lambda o: lst_to(o) if is_lst(o) else fs(o) lst = list( flat_map(f, lst) ) return tag_new('ul', {}, lst) @@ -426,9 +453,9 @@ def li_to_name_v(o): dv = ('td', o) - if not o or isinstance(o, Empty): + if not o or is_tag(o): return dv - if type(o) == list: + if is_lst(o): (name, v) = li_to_name_v( o[0] ) return ( name, [v] + o[1:] ) return ( 'th', o[2:] ) if o.startswith('||') else dv @@ -637,7 +664,7 @@ lst = list( map( strip_tail, lst ) ) lst = ezmd(lst) - lst = list( map( tag_to_dic, lst ) ) + lst = flat_map( tag_to_dic, lst ) u8 = yaml_dump(lst) b = nkf.cvt(u8, nkf_opt) if nkf_opt != '-u' else u8