2015-12-16 00:07:31 -05:00
|
|
|
# frozen_string_literal: false
|
2010-04-01 03:45:16 -04:00
|
|
|
##
|
|
|
|
# Handle common RDoc::Markup tasks for various CodeObjects
|
2012-11-26 23:28:14 -05:00
|
|
|
#
|
|
|
|
# This module is loaded by generators. It allows RDoc's CodeObject tree to
|
|
|
|
# avoid loading generator code to improve startup time for +ri+.
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
module RDoc::Generator::Markup
|
|
|
|
|
|
|
|
##
|
|
|
|
# Generates a relative URL from this object's path to +target_path+
|
|
|
|
|
|
|
|
def aref_to(target_path)
|
|
|
|
RDoc::Markup::ToHtml.gen_relative_url path, target_path
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Generates a relative URL from +from_path+ to this object's path
|
|
|
|
|
|
|
|
def as_href(from_path)
|
|
|
|
RDoc::Markup::ToHtml.gen_relative_url from_path, path
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Handy wrapper for marking up this object's comment
|
|
|
|
|
|
|
|
def description
|
|
|
|
markup @comment
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Creates an RDoc::Markup::ToHtmlCrossref formatter
|
|
|
|
|
|
|
|
def formatter
|
|
|
|
return @formatter if defined? @formatter
|
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
options = @store.rdoc.options
|
2010-04-01 03:45:16 -04:00
|
|
|
this = RDoc::Context === self ? self : @parent
|
2011-06-16 00:59:24 -04:00
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
@formatter = RDoc::Markup::ToHtmlCrossref.new options, this.path, this
|
|
|
|
@formatter.code_object = self
|
|
|
|
@formatter
|
2010-04-01 03:45:16 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Build a webcvs URL starting for the given +url+ with +full_path+ appended
|
|
|
|
# as the destination path. If +url+ contains '%s' +full_path+ will be
|
2012-11-26 23:28:14 -05:00
|
|
|
# will replace the %s using sprintf on the +url+.
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
def cvs_url(url, full_path)
|
|
|
|
if /%s/ =~ url then
|
|
|
|
sprintf url, full_path
|
|
|
|
else
|
|
|
|
url + full_path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
class RDoc::CodeObject
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
include RDoc::Generator::Markup
|
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
class RDoc::MethodAttr
|
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
@add_line_numbers = false
|
|
|
|
|
|
|
|
class << self
|
|
|
|
##
|
|
|
|
# Allows controlling whether <tt>#markup_code</tt> adds line numbers to
|
|
|
|
# the source code.
|
|
|
|
|
|
|
|
attr_accessor :add_line_numbers
|
|
|
|
end
|
|
|
|
|
2010-04-01 03:45:16 -04:00
|
|
|
##
|
|
|
|
# Prepend +src+ with line numbers. Relies on the first line of a source
|
|
|
|
# code listing having:
|
|
|
|
#
|
2010-12-19 22:22:49 -05:00
|
|
|
# # File xxxxx, line dddd
|
|
|
|
#
|
2012-11-26 23:28:14 -05:00
|
|
|
# If it has this comment then line numbers are added to +src+ and the <tt>,
|
|
|
|
# line dddd</tt> portion of the comment is removed.
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
def add_line_numbers(src)
|
2010-12-19 22:22:49 -05:00
|
|
|
return unless src.sub!(/\A(.*)(, line (\d+))/, '\1')
|
|
|
|
first = $3.to_i - 1
|
|
|
|
last = first + src.count("\n")
|
|
|
|
size = last.to_s.length
|
|
|
|
|
|
|
|
line = first
|
|
|
|
src.gsub!(/^/) do
|
|
|
|
res = if line == first then
|
|
|
|
" " * (size + 1)
|
|
|
|
else
|
|
|
|
"<span class=\"line-num\">%2$*1$d</span> " % [size, line]
|
|
|
|
end
|
|
|
|
|
|
|
|
line += 1
|
|
|
|
res
|
2010-04-01 03:45:16 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
2010-12-19 22:22:49 -05:00
|
|
|
# Turns the method's token stream into HTML.
|
|
|
|
#
|
|
|
|
# Prepends line numbers if +add_line_numbers+ is true.
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
def markup_code
|
|
|
|
return '' unless @token_stream
|
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
src = RDoc::TokenStream.to_html @token_stream
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2010-12-19 22:22:49 -05:00
|
|
|
# dedent the source
|
|
|
|
indent = src.length
|
|
|
|
lines = src.lines.to_a
|
|
|
|
lines.shift if src =~ /\A.*#\ *File/i # remove '# File' comment
|
|
|
|
lines.each do |line|
|
|
|
|
if line =~ /^ *(?=\S)/
|
|
|
|
n = $&.length
|
|
|
|
indent = n if n < indent
|
|
|
|
break if n == 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
src.gsub!(/^#{' ' * indent}/, '') if indent > 0
|
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
add_line_numbers(src) if RDoc::MethodAttr.add_line_numbers
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
src
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
class RDoc::ClassModule
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
##
|
|
|
|
# Handy wrapper for marking up this class or module's comment
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2012-11-26 23:28:14 -05:00
|
|
|
def description
|
|
|
|
markup @comment_location
|
|
|
|
end
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
class RDoc::Context::Section
|
|
|
|
|
|
|
|
include RDoc::Generator::Markup
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
class RDoc::TopLevel
|
|
|
|
|
|
|
|
##
|
|
|
|
# Returns a URL for this source file on some web repository. Use the -W
|
|
|
|
# command line option to set.
|
|
|
|
|
|
|
|
def cvs_url
|
2012-11-26 23:28:14 -05:00
|
|
|
url = @store.rdoc.options.webcvs
|
2010-04-01 03:45:16 -04:00
|
|
|
|
|
|
|
if /%s/ =~ url then
|
2012-11-27 03:54:03 -05:00
|
|
|
url % @relative_name
|
2010-04-01 03:45:16 -04:00
|
|
|
else
|
2012-11-27 03:54:03 -05:00
|
|
|
url + @relative_name
|
2010-04-01 03:45:16 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|