lib/trac-wiki/parser.rb in trac-wiki-0.1.3 vs lib/trac-wiki/parser.rb in trac-wiki-0.1.5

- old
+ new

@@ -41,15 +41,10 @@ # Allowed url schemes # Examples: http https ftp ftps attr_accessor :allowed_schemes - # Non-standard wiki text extensions enabled? - # E.g. underlined, deleted text etc - attr_writer :extensions - def extensions?; @extensions; end - # Disable url escaping for local links # Escaping: [[/Test]] --> %2FTest # No escaping: [[/Test]] --> Test attr_writer :no_escape def no_escape?; @no_escape; end @@ -57,25 +52,28 @@ # Disable url escaping for local links # [[whatwerver]] stays [[whatwerver]] attr_writer :no_link def no_link?; @no_link; end + attr_writer :math + def math?; @math; end + # Create a new Parser instance. def initialize(text, options = {}) @allowed_schemes = %w(http https ftp ftps) @text = text - @extensions = @no_escape = nil + @no_escape = nil options.each_pair {|k,v| send("#{k}=", v) } end # Convert CCreole text to HTML and return # the result. The resulting HTML does not contain <html> and # <body> tags. # # Example: # - # parser = CreoleParser.new("**Hello //World//**", :extensions => true) + # parser = Parser.new("**Hello //World//**") # parser.to_html # #=> "<p><strong>Hello <em>World</em></strong></p>" def to_html @out = '' @p = false @@ -237,12 +235,16 @@ a['style'] = style.join(';') if ! style.empty? return '' if a.empty? return ' ' + a.map{|k,v| "#{k}=\"#{v}\"" }.sort.join(' ') end - def make_headline(level, text) - "<h#{level}>" << escape_html(text) << "</h#{level}>" + def make_headline(level, text, aname) + ret = "<h#{level}>" << escape_html(text) << "</h#{level}>" + if aname + ret = "<a name=\"#{ escape_html(aname) }\"/>" + ret + end + ret end def make_explicit_link(link) begin uri = URI.parse(link) @@ -317,54 +319,53 @@ end @out << '</a>' end def parse_inline_tag(str) - case str - when /\A\{\{\{(.*?\}*)\}\}\}/ # inline pre (tt) + case + when str =~ /\A\{\{\{(.*?\}*)\}\}\}/ # inline pre (tt) @out << '<tt>' << escape_html($1) << '</tt>' - when /\A`(.*?)`/ # inline pre (tt) + when str =~ /\A`(.*?)`/ # inline pre (tt) @out << '<tt>' << escape_html($1) << '</tt>' + + when math? && str =~ /\A\$(.+?)\$/ # inline math (tt) + @out << '\( ' << escape_html($1) << ' \)' # when /\A\[\[Image\(([^|].*?)(\|(.*?))?\)\]\]/ # image # @out << make_image($1, $3) # when /\A\{\{\s*(.*?)\s*(\|\s*(.*?)\s*)?\}\}/ # if uri = make_image_link($1) # @out << make_image(uri, $3) # else # @out << escape_html($&) # end # link - when /\A([:alpha:]|[:digit:])+/ + when str =~ /\A([:alpha:]|[:digit:])+/ @out << $& # word - when /\A\s+/ + when str =~ /\A\s+/ @out << ' ' if @out[-1] != ?\s # spaces - when /\A'''''/ + when str =~ /\A'''''/ toggle_tag 'strongem', $& # bolditallic - when /\A\*\*/, /\A'''/ + when str =~ /\A\*\*/ || str =~ /\A'''/ toggle_tag 'strong', $& # bold - when /\A''/, /\A\/\// + when str =~ /\A''/ || str =~ /\A\/\// toggle_tag 'em', $& # italic - when /\A\\\\/, /\A\[\[br\]\]/i + when str =~ /\A\\\\/ || str =~ /\A\[\[br\]\]/i @out << '<br/>' # newline - when /\A__/ + when str =~ /\A__/ toggle_tag 'u', $& # underline - when /\A~~/ + when str =~ /\A~~/ toggle_tag 'del', $& # delete # when /\A\+\+/ # toggle_tag 'ins', $& # insert - when /\A\^/ + when str =~ /\A\^/ toggle_tag 'sup', $& # ^{} - when /\A,,/ + when str =~ /\A,,/ toggle_tag 'sub', $& # _{} - when /\A\(R\)/i - @out << '&#174;' # (R) - when /\A\(C\)/i - @out << '&#169;' # (C) - when /\A!([^\s])/ + when str =~ /\A!([^\s])/ @out << escape_html($1) # !neco - when /./ + when str =~ /./ @out << escape_html($&) # ordinal char end return $' end @@ -470,62 +471,68 @@ end end def parse_block(str) until str.empty? - case str - + case # pre {{{ ... }}} - when /\A\{\{\{\r?\n(.*?)\r?\n\}\}\}/m + when math? && str =~ /\A\$\$(.*?)\$\$/ end_paragraph nowikiblock = make_nowikiblock($1) + @out << "$$" << escape_html(nowikiblock) << "$$\n" + when str =~ /\A\{\{\{\r?\n(.*?)\r?\n\}\}\}/m + end_paragraph + nowikiblock = make_nowikiblock($1) @out << '<pre>' << escape_html(nowikiblock) << '</pre>' # horizontal rule - when /\A\s*-{4,}\s*$/ + when str =~ /\A\s*-{4,}\s*$/ end_paragraph @out << '<hr/>' # heading == Wiki Ruless == - when /\A\s*(={1,6})\s*(.*?)\s*=*\s*$(\r?\n)?/ - end_paragraph + # heading == Wiki Ruless == #tag + when str =~ /\A\s*(={1,6})\s*(.*?)\s*=*\s*(#(\S*))?\s*$(\r?\n)?/ level = $1.size - @out << make_headline(level, $2) + title= $2 + aname= $4 + end_paragraph + @out << make_headline(level, title, aname) # table row - when /\A[ \t]*\|\|(.*)$(\r?\n)?/ + when str =~ /\A[ \t]*\|\|(.*)$(\r?\n)?/ if !@stack.include?('table') end_paragraph start_tag('table') end parse_table_row($1) # empty line - when /\A\s*$(\r?\n)?/ + when str =~ /\A\s*$(\r?\n)?/ end_paragraph - when /\A([:\w\s]+)::(\s+|\r?\n)/ + when str =~ /\A([:\w\s]+)::(\s+|\r?\n)/ term = $1 start_tag('dl') start_tag('dt') @out << escape_html(term) end_tag start_tag('dd') # li - when /\A(\s*)([*-]|[aAIi\d]\.)\s+(.*?)$(\r?\n)?/ + when str =~ /\A(\s*)([*-]|[aAIi\d]\.)\s+(.*?)$(\r?\n)?/ parse_li_line($1.size, $2, $3) - when /\A(>[>\s]*)(.*?)$(\r?\n)?/ + when str =~ /\A(>[>\s]*)(.*?)$(\r?\n)?/ # citation level, quote = $1.count('>'), $2 start_paragraph if !@stack.include? 'p' blockquote_level_to(level) parse_inline(quote.strip) # ordinary line - when /\A(\s*)(\S+.*?)$(\r?\n)?/ + when str =~ /\A(\s*)(\S+.*?)$(\r?\n)?/ spc_size, text = $1.size, $2 text.rstrip! if @stack.include?('li') ||@stack.include?('dl')