require 'cgi' require 'uri' class DText def self.u(string) CGI.escape(string) end def self.h(string) CGI.escapeHTML(string) end def self.parse_inline(str, options = {}) str = parse_aliased_wiki_links(str) str = parse_wiki_links(str) str = parse_post_links(str) str = parse_id_links(str) str.gsub!(/\n/m, "
") str.gsub!(/\[b\](.+?)\[\/b\]/i, '\1') str.gsub!(/\[i\](.+?)\[\/i\]/i, '\1') str.gsub!(/\[spoilers?\](.+?)\[\/spoilers?\]/m, '\1') str.gsub!(/\[url\](.+?)\[\/url\]/i) do %{#{h($1)}} end str.gsub!(/\[url=(.+?)\](.+?)\[\/url\]/m) do %{#{h($2)}} end str end def self.parse_aliased_wiki_links(str) str.gsub(/\[\[(.+?)\|(.+?)\]\]/m) do text = $1 title = $2 wiki_page = WikiPage.find_title_and_id(title) if wiki_page %{[url=/wiki_pages/#{wiki_page.id}]#{text}[/url]} else %{[url=/wiki_pages/new?title=#{title}]#{text}[/url]} end end end def self.parse_wiki_links(str) str.gsub(/\[\[(.+?)\]\]/) do title = $1 wiki_page = WikiPage.find_title_and_id(title) if wiki_page %{[url=/wiki_pages/#{wiki_page.id}]#{title}[/url]} else %{[url=/wiki_pages/new?title=#{title}]#{title}[/url]} end end end def self.parse_post_links(str) str.gsub(/\{\{(.+?)\}\}/, %{[url=/posts?tags=\1]\1[/url]}) end def self.parse_id_links(str) str = str.gsub(/\bpost #(\d+)/i, %{[url=/posts/\1]post #\1[/url]}) str = str.gsub(/\bforum #(\d+)/i, %{[url=/forum_posts/\1]forum #\1[/url]}) str = str.gsub(/\bcomment #(\d+)/i, %{[url=/comments/\1]comment #\1[/url]}) str = str.gsub(/\bpool #(\d+)/i, %{[url=/pools/\1]pool #\1[/url]}) end def self.parse_list(str, options = {}) html = "" layout = [] nest = 0 str.split(/\n/).each do |line| if line =~ /^\s*(\*+) (.+)/ nest = $1.size content = parse_inline($2) else content = parse_inline(line) end if nest > layout.size html += "