diff -urN v6/ezhtml.py v7/ezhtml.py --- v6/ezhtml.py 2018-09-18 21:51:22.000000000 +0900 +++ v7/ezhtml.py 2018-09-18 21:52:05.000000000 +0900 @@ -79,6 +79,39 @@ return { h + ' '.join(e): '/' } return e +def is_solo_tag_has_v(e): + lst = ['li'] + if type(e) != dict: + return False + (tag, v) = e.items()[0] + return v == '/' and tag.split(' ')[0] in lst + +def solo_tag_has_v_idx(lst): + for i in range( len(lst) ): + if is_solo_tag_has_v( lst[i] ): + return i + return -1 + +def strip_lst1(o): + while type(o) == list and len(o) == 1: + o = o[0] + return o + +def solo_tags_modify(lst): + def div_lst(lst): + i = solo_tag_has_v_idx(lst) + return ( lst[:i], lst[i:] ) if i >= 0 else ( lst, [] ) + r = [] + while lst: + (p, lst) = div_lst(lst) + r += p + if lst: + (e, lst) = ( lst[0], lst[1:] ) + (tag, v) = e.items()[0] # v == '/' + (p, lst) = div_lst(lst) + r += [ { tag + ' /': strip_lst1(p) } ] + return r + def solo_tags(lst): return list( map( solo_tag, lst ) ) @@ -95,7 +128,7 @@ lst = map(f, lst) return '\n'.join(lst) -def strip_lst(lst, pre=False): +def strip_lst(lst, pre): def f(e): if type(e) == dict: return e @@ -107,10 +140,16 @@ return list( filter( lambda e: e != '', map(f, lst) ) ) +def close_solo_tag(lst, pre=False): + lst = solo_tags(lst) + lst = strip_lst(lst, pre) + lst = solo_tags_modify(lst) + return lst + def close_tag(lst): - tag = lst[0] - lst = solo_tags( lst[1:] ) - lst = strip_lst( lst, tag[0].lower() == 'pre' ) + (tag, lst) = ( lst[0], lst[1:] ) + lst = close_solo_tag( lst, tag[0].lower() == 'pre' ) + v = lst if len(lst) == 1: v = lst[0] @@ -135,10 +174,8 @@ else: stk.append( solo_tag(tag) ) - o = strip_lst( solo_tags(stk) ) - while type(o) == list and len(o) == 1: - o = o[0] - return o + o = close_solo_tag(stk) + return strip_lst1(o) def yaml_dump(o): def represent_str(dumper, instance):