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 += "
' end when "[/quote]" if options[:inline] "" else '' end else '
' + parse_inline(block) + "
" end end html.join("").html_safe end end