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 << '®' # (R)
- when /\A\(C\)/i
- @out << '©' # (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')