aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rdoc/markup/formatter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rdoc/markup/formatter.rb')
-rw-r--r--lib/rdoc/markup/formatter.rb75
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/rdoc/markup/formatter.rb b/lib/rdoc/markup/formatter.rb
index a5f639c28c..b668746c7a 100644
--- a/lib/rdoc/markup/formatter.rb
+++ b/lib/rdoc/markup/formatter.rb
@@ -18,6 +18,30 @@ class RDoc::Markup::Formatter
InlineTag = Struct.new(:bit, :on, :off)
##
+ # Converts a target url to one that is relative to a given path
+
+ def self.gen_relative_url path, target
+ from = File.dirname path
+ to, to_file = File.split target
+
+ from = from.split "/"
+ to = to.split "/"
+
+ from.delete '.'
+ to.delete '.'
+
+ while from.size > 0 and to.size > 0 and from[0] == to[0] do
+ from.shift
+ to.shift
+ end
+
+ from.fill ".."
+ from.concat to
+ from << to_file
+ File.join(*from)
+ end
+
+ ##
# Creates a new Formatter
def initialize options, markup = nil
@@ -35,6 +59,7 @@ class RDoc::Markup::Formatter
@tt_bit = @attributes.bitmap_for :TT
@hard_break = ''
+ @from_path = '.'
end
##
@@ -52,6 +77,26 @@ class RDoc::Markup::Formatter
end
##
+ # Adds a special for links of the form rdoc-...:
+
+ def add_special_RDOCLINK
+ @markup.add_special(/rdoc-[a-z]+:\S+/, :RDOCLINK)
+ end
+
+ ##
+ # Adds a special for links of the form {<text>}[<url>] and <word>[<url>]
+
+ def add_special_TIDYLINK
+ @markup.add_special(/(?:
+ \{.*?\} | # multi-word label
+ \b[^\s{}]+? # single-word label
+ )
+
+ \[\S+?\] # link target
+ /x, :TIDYLINK)
+ end
+
+ ##
# Add a new set of tags for an attribute. We allow separate start and end
# tags for flexibility
@@ -179,6 +224,36 @@ class RDoc::Markup::Formatter
end
##
+ # Extracts and a scheme, url and an anchor id from +url+ and returns them.
+
+ def parse_url url
+ case url
+ when /^rdoc-label:([^:]*)(?::(.*))?/ then
+ scheme = 'link'
+ path = "##{$1}"
+ id = " id=\"#{$2}\"" if $2
+ when /([A-Za-z]+):(.*)/ then
+ scheme = $1.downcase
+ path = $2
+ when /^#/ then
+ else
+ scheme = 'http'
+ path = url
+ url = "http://#{url}"
+ end
+
+ if scheme == 'link' then
+ url = if path[0, 1] == '#' then # is this meaningful?
+ path
+ else
+ self.class.gen_relative_url @from_path, path
+ end
+ end
+
+ [scheme, url, id]
+ end
+
+ ##
# Is +tag+ a tt tag?
def tt? tag