2
0
mirror of https://github.com/moebooru/moebooru synced 2025-08-23 02:17:32 +00:00
moebooru/lib/dtext.rb

105 lines
3.3 KiB
Ruby
Raw Normal View History

2012-05-13 08:22:42 +07:00
require 'cgi'
require 'nokogiri'
module DText
def parse(str)
2012-05-13 14:57:31 +07:00
state = ['newline']
2012-05-13 08:22:42 +07:00
result = ""
# Normalize newlines
2012-05-13 08:22:42 +07:00
str.strip
str.gsub!(/(\r?\n)/, "\n")
str.gsub!(/\n{3,}/, "\n\n")
2012-05-18 21:28:38 +07:00
str = CGI.escapeHTML str
2012-05-10 12:35:11 +07:00
# Keep newline, use carriage return for split
2012-05-13 08:22:42 +07:00
str.gsub!(/(\n+)/, '\1' + "\r")
2012-05-10 12:35:11 +07:00
data = str.split("\r")
data.each do |d|
2012-05-13 08:22:42 +07:00
result << parseline(d, state)
end
2012-05-18 22:38:31 +07:00
result = parseinline(result)
2012-05-13 08:22:42 +07:00
Nokogiri::HTML::DocumentFragment.parse(result).to_html
end
def parseinline(str)
2012-05-14 04:31:12 +07:00
str.gsub!(/\[\[(.+?)\|(.+?)\]\]/) do
"<a href=\"/wiki/show?title=#{CGI.escape(CGI.unescapeHTML($1.tr(" ", "_")))}\">#{$2}</a>"
end
str.gsub!(/\[\[(.+?)\]\]/) do
"<a href=\"/wiki/show?title=#{CGI.escape(CGI.unescapeHTML($1.tr(" ", "_")))}\">#{$1}</a>"
2012-05-14 04:31:12 +07:00
end
str.gsub!(/\{\{(.+?)\}\}/) do
"<a href=\"/post/index?tags=#{CGI.escape(CGI.unescapeHTML($1))}\">#{$1}</a>"
2012-05-14 04:31:12 +07:00
end
str.gsub! /\[b\](.+)\[\/b\]/, '<strong>\1</strong>'
str.gsub! /\[i\](.+)\[\/i\]/, '<em>\1</em>'
str.gsub! /(post #(\d+))/i, '<a href="/post/show/\2">\1</a>'
str.gsub! /(forum #(\d+))/i, '<a href="/forum/show/\2">\1</a>'
str.gsub! /(comment #(\d+))/i, '<a href="/comment/show/\2">\1</a>'
str.gsub! /(pool #(\d+))/i, '<a href="/pool/show/\2">\1</a>'
2012-05-13 09:30:00 +07:00
str.gsub! /\[spoilers?\]/, '<span href="#" class="spoiler" onclick="Comment.spoiler(this); return false;"><span class="spoilerwarning">spoiler</span></span><span class="spoilertext" style="display: none">'
2012-05-13 22:38:58 +07:00
str.gsub! /\[spoilers?=(.+?)\]/, '<span href="#" class="spoiler" onclick="Comment.spoiler(this); return false;"><span class="spoilerwarning">\1</span></span><span class="spoilertext" style="display: none">'
2012-05-13 09:30:00 +07:00
str.gsub! /\[\/spoilers?\]/, '</span>'
2012-05-14 04:31:12 +07:00
str.gsub! /\[quote\]/, '<blockquote><div>'
str.gsub! /\[\/quote\]/, '</div></blockquote>'
2012-05-16 05:38:28 +07:00
str = parseurl(str)
str.gsub! /\n/, '<br>'
2012-05-13 09:30:00 +07:00
str
2012-05-13 08:22:42 +07:00
end
def parseline(str, state)
2012-05-13 14:57:31 +07:00
if state.last =~ /\d/ or str =~ /^\*+\s+/
2012-05-13 08:22:42 +07:00
parselist str, state
elsif str =~ /^(h[1-6])\.\s*(.+)\n*/
2012-05-18 22:38:31 +07:00
str = "<#{$1}>#{$2}</#{$1}>"
2012-05-13 08:22:42 +07:00
else
2012-05-18 22:38:31 +07:00
str
2012-05-13 08:22:42 +07:00
end
end
2012-05-13 08:22:42 +07:00
def parselist(str, state)
html = ""
2012-05-13 15:17:17 +07:00
if not state.last =~ /\d/
2012-05-13 08:22:42 +07:00
state.push "1"
html << "<ul>"
else
n = str.split()[0].count("*")
if n < state.last.to_i
2012-05-16 01:55:30 +07:00
html << '</ul>' * (state.last.to_i - n)
2012-05-13 08:22:42 +07:00
state[-1] = n.to_s
elsif n > state.last.to_i
2012-05-16 01:55:30 +07:00
html << '<ul>'
2012-05-13 08:22:42 +07:00
state[-1] = (state.last.to_i + 1).to_s
end
end
2012-05-16 01:26:30 +07:00
if not str =~ /^\*+\s+/
2012-05-13 08:22:42 +07:00
state.pop
html << "</ul>"
2012-05-13 08:22:42 +07:00
return html + parseline(str, state)
end
2012-05-13 09:30:00 +07:00
html << str.gsub(/\*+\s+(.+)\n*/) do
2012-05-18 22:38:31 +07:00
"<li>#{$1}</li>"
2012-05-13 09:30:00 +07:00
end
2012-05-13 08:22:42 +07:00
end
2012-05-13 08:22:42 +07:00
def parseurl(str)
url = /(h?ttps?:\/\/\[?(:{0,2}[\w\-]+)((:{1,2}|\.)[\w\-]+)*\]?(:\d+)*(\/[^\s\n]*)*)/
str = str.gsub(/&lt;&lt;\s*([^\s]+?)\s*\|\s*(.+?)\s*&gt;&gt;/) do
link = $1
name = $2
if link =~ url
2012-05-16 05:38:28 +07:00
"<a href=\"#{link}\">#{name}</a>"
2012-05-16 00:32:02 +07:00
end
end
str = str.gsub(/(^|\s+)&quot;(.+?)&quot;:#{url}/, '\1<a href="\3">\2</a>')
.gsub(/&lt;&lt;\s*#{url}\s*&gt;&gt;/, '<a href="\1">\1</a>')
.gsub(/(^|[\s\(]+)#{url}/, '\1<a href="\2">\2</a>')
.gsub(/<a href="ttp/, '<a href="http')
2012-05-13 08:22:42 +07:00
end
2012-05-16 01:26:30 +07:00
module_function :parse, :parseline, :parseinline, :parselist, :parseurl
end