152 lines
3.9 KiB
Ruby
152 lines
3.9 KiB
Ruby
|
begin
|
||
|
require "rdoc/markup/simple_markup"
|
||
|
require 'rdoc/markup/simple_markup/to_html'
|
||
|
rescue LoadError
|
||
|
# use old version if available
|
||
|
require 'markup/simple_markup'
|
||
|
require 'markup/simple_markup/to_html'
|
||
|
end
|
||
|
|
||
|
module RDocSupport
|
||
|
|
||
|
# A simple +rdoc+ markup class which recognizes some additional
|
||
|
# formatting commands suitable for Wiki use.
|
||
|
class RDocMarkup < SM::SimpleMarkup
|
||
|
def initialize
|
||
|
super()
|
||
|
|
||
|
pre = '(?:\\s|^|\\\\)'
|
||
|
|
||
|
# links of the form
|
||
|
# [[<url> description with spaces]]
|
||
|
add_special(/((\\)?\[\[\S+?\s+.+?\]\])/,:TIDYLINK)
|
||
|
|
||
|
# and external references
|
||
|
add_special(/((\\)?(link:|anchor:|http:|mailto:|ftp:|img:|www\.)\S+\w\/?)/,
|
||
|
:HYPERLINK)
|
||
|
|
||
|
# <br/>
|
||
|
add_special(%r{(#{pre}<br/>)}, :BR)
|
||
|
|
||
|
# and <center> ... </center>
|
||
|
add_html("center", :CENTER)
|
||
|
end
|
||
|
|
||
|
def convert(text, handler)
|
||
|
super.sub(/^<p>\n/, '').sub(/<\/p>$/, '')
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Handle special hyperlinking requirments for RDoc formatted
|
||
|
# entries. Requires RDoc
|
||
|
|
||
|
class HyperLinkHtml < SM::ToHtml
|
||
|
|
||
|
# Initialize the HyperLinkHtml object.
|
||
|
# [path] location of the node
|
||
|
# [site] object representing the whole site (typically of class
|
||
|
# +Site+)
|
||
|
def initialize
|
||
|
super()
|
||
|
add_tag(:CENTER, "<center>", "</center>")
|
||
|
end
|
||
|
|
||
|
# handle <br/>
|
||
|
def handle_special_BR(special)
|
||
|
return "<br/>" if special.text[0,1] == '\\'
|
||
|
special.text
|
||
|
end
|
||
|
|
||
|
# We're invoked with a potential external hyperlink.
|
||
|
# [mailto:] just gets inserted.
|
||
|
# [http:] links are checked to see if they
|
||
|
# reference an image. If so, that image gets inserted
|
||
|
# using an <img> tag. Otherwise a conventional <a href>
|
||
|
# is used.
|
||
|
# [img:] insert a <tt><img></tt> tag
|
||
|
# [link:] used to insert arbitrary <tt><a></tt> references
|
||
|
# [anchor:] used to create an anchor
|
||
|
def handle_special_HYPERLINK(special)
|
||
|
text = special.text.strip
|
||
|
return text[1..-1] if text[0,1] == '\\'
|
||
|
url = special.text.strip
|
||
|
if url =~ /([A-Za-z]+):(.*)/
|
||
|
type = $1
|
||
|
path = $2
|
||
|
else
|
||
|
type = "http"
|
||
|
path = url
|
||
|
url = "http://#{url}"
|
||
|
end
|
||
|
|
||
|
case type
|
||
|
when "http"
|
||
|
if url =~ /\.(gif|png|jpg|jpeg|bmp)$/
|
||
|
"<img src=\"#{url}\"/>"
|
||
|
else
|
||
|
"<a href=\"#{url}\">#{url.sub(%r{^\w+:/*}, '')}</a>"
|
||
|
end
|
||
|
when "img"
|
||
|
"<img src=\"#{path}\"/>"
|
||
|
when "link"
|
||
|
"<a href=\"#{path}\">#{path}</a>"
|
||
|
when "anchor"
|
||
|
"<a name=\"#{path}\"></a>"
|
||
|
else
|
||
|
"<a href=\"#{url}\">#{url.sub(%r{^\w+:/*}, '')}</a>"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Here's a hyperlink where the label is different to the URL
|
||
|
# [[url label that may contain spaces]]
|
||
|
#
|
||
|
|
||
|
def handle_special_TIDYLINK(special)
|
||
|
text = special.text.strip
|
||
|
return text[1..-1] if text[0,1] == '\\'
|
||
|
unless text =~ /\[\[(\S+?)\s+(.+?)\]\]/
|
||
|
return text
|
||
|
end
|
||
|
url = $1
|
||
|
label = $2
|
||
|
label = RDocFormatter.new(label).to_html
|
||
|
label = label.split.select{|x| x =~ /\S/}.
|
||
|
map{|x| x.chomp}.join(' ')
|
||
|
|
||
|
case url
|
||
|
when /link:(\S+)/
|
||
|
return %{<a href="#{$1}">#{label}</a>}
|
||
|
when /img:(\S+)/
|
||
|
return %{<img src="http://#{$1}" alt="#{label}" />}
|
||
|
when /rubytalk:(\S+)/
|
||
|
return %{<a href="http://ruby-talk.org/blade/#{$1}">#{label}</a>}
|
||
|
when /rubygarden:(\S+)/
|
||
|
return %{<a href="http://www.rubygarden.org/ruby?#{$1}">#{label}</a>}
|
||
|
when /c2:(\S+)/
|
||
|
return %{<a href="http://c2.com/cgi/wiki?#{$1}">#{label}</a>}
|
||
|
when /isbn:(\S+)/
|
||
|
return %{<a href="http://search.barnesandnoble.com/bookSearch/} +
|
||
|
%{isbnInquiry.asp?isbn=#{$1}">#{label}</a>}
|
||
|
end
|
||
|
|
||
|
unless url =~ /\w+?:/
|
||
|
url = "http://#{url}"
|
||
|
end
|
||
|
|
||
|
"<a href=\"#{url}\">#{label}</a>"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class RDocFormatter
|
||
|
def initialize(text)
|
||
|
@text = text
|
||
|
end
|
||
|
|
||
|
def to_html
|
||
|
markup = RDocMarkup.new
|
||
|
h = HyperLinkHtml.new
|
||
|
markup.convert(@text, h)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|