diff -ur v13/ezmd.py v14/ezmd.py --- v13/ezmd.py 2019-09-30 21:30:25.000000000 +0900 +++ v14/ezmd.py 2019-10-01 01:05:53.000000000 +0900 @@ -5,7 +5,7 @@ import nkf heads = [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9' ] -modes = heads + [ 'p', 'pre', 'ul', 'dl', 'index' ] +modes = heads + [ 'p', 'pre', 'ul', 'dl', 'tbl', 'index' ] is_all_ge_n = lambda s, c, n: all( map( lambda c_: c_ == c, s ) ) and len(s) >= n @@ -161,6 +161,54 @@ lst.append( { mode: do_str(mbuf) } ) res.append( { 'dl': lst } ) +def do_tr(s): + tgl = lambda md, n: md if n == 1 else ('th' if md == 'td' else 'td') + + def parse_bar(s, md): + i = 0 + while True: + j = s_idx( s[i:], '|' ) + i += j + if j < 0: + return [ (s, md) ] + if j == 0 or s[i-1] != '\\': + break + i += 1 + + n = 2 if s[i+1:i+2] == '|' else 1 + return [ ( s[:i], md ) ] + parse_bar( s[i+n:], tgl(md, n) ) + + lst = parse_bar(s, 'td') + + def split_num(s): + s1 = s[1:] + i = s_idx(s1, ' ') + (t, s_) = ( s1[:i], s1[i+1:] ) if i >= 0 else (s, '') + return (t, s_) if t.isdigit() else ('', s) + + def th_td(s, md): + if not s: + return [] + s = s.replace('\|', '|') + tag = md + if len(s) > 2 and s[0] in 'cr': + cr = 'col' if s[0] == 'c' else 'row' + (t, s) = split_num(s) + if t: + tag += ' {}span="{}"'.format(cr, t) + return { tag: do_str( s.strip() ) } + + lst = flat_map( lambda s_md: th_td(*s_md), lst ) + return { 'tr': lst } + +def do_mode_tbl(buf, res): + buf = esc_join(buf) + buf = lst_strip(buf) + buf = cut_empty(buf) + if buf: + tag = 'table border="1" cellspacing="0"' + res.append( { tag: list( map(do_tr, buf) ) } ) + def do_mode(mode, buf, res, hd_names): if mode in heads: buf = lst_strip(buf) @@ -195,6 +243,8 @@ do_mode_ul(buf, res) elif mode == 'dl': do_mode_dl(buf, res) + elif mode == 'tbl': + do_mode_tbl(buf, res) elif mode == 'hr': res.extend( [ { 'p': { 'hr': '/' } } ] * len(buf) ) elif mode == 'index':