lib/trac-wiki/parser.rb in trac-wiki-0.2.20 vs lib/trac-wiki/parser.rb in trac-wiki-0.2.21

- old
+ new

@@ -63,13 +63,12 @@ def no_link?; @no_link; end attr_writer :math def math?; @math; end - # allow {{{! ... html ... }}} + # allow some <b> <form> <html> # html will be sanitized - # {{{!\n html here \n}}}\n attr_writer :raw_html def raw_html?; @raw_html; end attr_writer :edit_heading def edit_heading?; @edit_heading; end @@ -118,11 +117,11 @@ '!ifeq' => proc { |env| env.expand_arg(0) == env.expand_arg(1) ? env.expand_arg(2) : env.expand_arg(3) }, '!ifdef' => proc { |env| env.at(env.expand_arg(0), nil, false).nil? ? env.expand_arg(2) : env.expand_arg(1) }, '!set' => proc { |env| env[env.expand_arg(0)] = env.expand_arg(1); '' }, '!yset' => proc { |env| env[env.expand_arg(0)] = YAML.load(env.arg(1)); '' }, - '!html' => proc { |env| "\n{{{!\n#{env.arg(0)}\n}}}\n" }, +# '!html' => proc { |env| "\n{{{!\n#{env.arg(0)}\n}}}\n" }, '!sub' => proc { |env| pat = env.expand_arg(1) pat = Regexp.new(pat[1..-2]) if pat =~ /\A\/.*\/\Z/ env.expand_arg(0).gsub(pat, env.expand_arg(2)) }, '!for' => proc { |env| i_name = env.arg(0) @@ -459,12 +458,13 @@ @tree.tag_end(:a) end def parse_inline_tag(str) case - when raw_html? && str =~ /\A\{\{\{!(.*?\}*)\}\}\}/ # inline {{{! raw html }}} - do_raw_html($1, true) + when raw_html? && str =~ /\A<(\/)?(\w+)(?:([^>]*?))?(\/\s*)?>/ # single inline <html> tag + eot, tag, args, closed = $1, $2, $3, $4 + do_raw_tag(eot, tag, args, closed, $'.size) when str =~ /\A\{\{\{(.*?\}*)\}\}\}/ # inline {{{ }}} pre (tt) @tree.tag(:tt, $1) when str =~ MACRO_BEG_REX # macro {{ str, lines = parse_macro($1, $') #print "MACRO.inline(#{$1}), next:#{str}" @@ -656,15 +656,38 @@ end_paragraph nowikiblock = make_nowikiblock(text) @tree.tag(:pre, nowikiblock) end - def do_raw_html(text, inline=false) - end_paragraph if !inline - @tree.add_raw(text) + def do_raw_tag(eot, tag, attrs, closed, tail_size) + if !eot + end_paragraph if tag == 'p' || tag == 'div' + #print "open tag #{tag},'#{attrs}'\n" + attrs_h = _parse_attrs_to_hash(attrs) + @tree.tag_beg(tag, attrs_h) + @tree.tag_end(tag) if closed + else + #print "close tag #{tag}\n" + @tree.tag_end(tag) + if tag == 'p' || tag == 'div' + end_paragraph + start_paragraph if tail_size > 0 + end + end end + def _parse_attrs_to_hash(str) + ret = {} + while str =~ /\A\s*(\w+)\s*=\s*'([^>']*)'/ || + str =~ /\A\s*(\w+)\s*=\s*"([^>"]*)"/ || + str =~ /\A\s*(\w+)\s*=\s*(\S*)/ + ret[$1] = $2 + str = $' + end + ret + end + def do_hr end_paragraph @tree.tag(:hr) end @@ -732,12 +755,9 @@ when math? && str =~ /\A\$\$(.*?)\$\$/m do_math($1) # merge when merge? && str =~ /\A(<{7}|={7}|>{7}|\|{7}) *(\S*).*$(\r?\n)?/ do_merge($1, $2) - # raw_html {{{! ... }}} - when raw_html? && str =~ /\A\{\{\{!\r?\n(.*?)\r?\n\}\}\}/m - do_raw_html($1) # pre {{{ ... }}} when str =~ /\A\{\{\{\r?\n(.*?)\r?\n\}\}\}/m do_pre($1) # horizontal rule when str =~ /\A\s*-{4,}\s*$/