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.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 = parse_aliased_wiki_links(str) str = parse_wiki_links(str) str = parse_post_links(str) str = parse_id_links(str) 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 %{#{text}} else %{#{text}} 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 %{#{title}} else %{#{title}} end end end def self.parse_post_links(str) str.gsub(/\{\{(.+?)\}\}/, %{\\1}) end def self.parse_id_links(str) str = str.gsub(/\bpost #(\d+)/i, %{post #\\1}) str = str.gsub(/\bforum #(\d+)/i, %{forum #\\1}) str = str.gsub(/\bcomment #(\d+)/i, %{comment #\\1}) str = str.gsub(/\bpool #(\d+)/i, %{pool #\\1}) 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 += "