diff -ur v31/ezmd.py v32/ezmd.py --- v31/ezmd.py 2019-10-12 16:46:42.000000000 +0900 +++ v32/ezmd.py 2019-10-13 02:24:13.000000000 +0900 @@ -6,7 +6,7 @@ import nkf heads = [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9' ] -modes = heads + [ 'p', 'pre', 'ul', 'dl', 'tbl', 'index', 'swbuf' ] +modes = heads + [ 'p', 'pre', 'ul', 'dl', 'tbl', 'index', 'swbuf', 'macro' ] is_all_ge_n = lambda s, c, n: all( map( lambda c_: c_ == c, s ) ) and len(s) >= n @@ -589,7 +589,35 @@ outbuf.append( tbls_join( outbuf.pop_tmp() ) ) +macro_dic = {} + +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) + return buf + def do_mode(mode, buf, hd_names): + if mode == 'macro': + d = yaml.load( '\n'.join(buf) ) + if type(d) == dict: + cv = lambda o: list( map(cv, o) ) if is_lst(o) else str(o) + d = dict( map( lambda kv: list( map(cv, kv) ), d.items() ) ) + macro_dic.update(d) + d = dict( filter( lambda kv: kv[0] != kv[1], macro_dic.items() ) ) + macro_dic.clear() + macro_dic.update(d) + return + if mode != 'pre': + buf = do_macro(buf) + if mode in heads: buf = lst_strip(buf) buf = cut_empty(buf)