diff -ur v34/ezmd.py v35/ezmd.py --- v34/ezmd.py 2019-10-13 23:34:07.000000000 +0900 +++ v35/ezmd.py 2019-10-15 20:11:07.000000000 +0900 @@ -163,9 +163,11 @@ n = 1 if is_lst(o) else len(delim) return ( o[:i], o[i+n:] ) +str_types = (str, unicode) if six.PY2 else (str,) + 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) +is_str = lambda o: not is_lst(o) and not is_tag(o) and type(o) in str_types lst_strip_is_str = lambda lst: list( map( lambda o: o.strip() if is_str(o) else o, lst ) ) def delim_pop(o, delim): @@ -600,7 +602,7 @@ add_k = '__ADD__' add_d = d.pop(add_k) if add_k in d else {} - cv = lambda o: list( map(cv, o) ) if is_lst(o) else str(o) + cv = lambda o: list( map(cv, o) ) if is_lst(o) else ( o if is_str(o) else str(o) ) d = dict( map( lambda kv: list( map(cv, kv) ), d.items() ) ) targ.update(d) d = dict( filter( lambda kv: kv[0] != kv[1], targ.items() ) ) @@ -608,23 +610,31 @@ for (k, v) in add_d.items(): if k in d: dv = d.get(k) - v = dv + v if str(dv) and is_str(v) else to_str(dv) + to_str(v) + v = dv + v if is_str(dv) and is_str(v) else to_str(dv) + to_str(v) d[k] = v targ.clear() targ.update(d) def do_macro(buf): - for (k, v) in macro_dic.items(): - def f(s): - if k in s: - if is_str(v): - return s.replace(k, v) - if is_lst(v): - lst = list( map( lambda a: [a] if a else [], s.split(k) ) ) - return sum( map( lambda b: b+v, lst[:-1] ), [] ) + lst[-1] - return s - buf = flat_map(f, buf) + def f_dic(buf): + for (k, v) in macro_dic.items(): + def f(s): + if k in s: + if is_str(v): + return s.replace(k, v) + if is_lst(v): + lst = list( map( lambda a: [a] if a else [], s.split(k) ) ) + return sum( map( lambda b: b+v, lst[:-1] ), [] ) + lst[-1] + return s + buf = flat_map(f, buf) + return buf + + for i in range(20): + bak = buf + buf = f_dic(buf) + if buf == bak: + break return buf def do_mode(mode, buf, hd_names): @@ -769,7 +779,7 @@ if is_lst(o): return list( map(rm_nl_tag, o) ) # o is tag - if o.name != 'pre': + if o.name not in ('pre', 'yaml') : o.v = rm_nl_tag(o.v) return o