2008-01-13 22:34:05 -05:00
|
|
|
require 'rdoc/markup'
|
|
|
|
|
|
|
|
##
|
|
|
|
# Handle common directives that can occur in a block of text:
|
|
|
|
#
|
|
|
|
# : include : filename
|
|
|
|
|
|
|
|
class RDoc::Markup::PreProcess
|
|
|
|
|
2010-04-01 03:45:16 -04:00
|
|
|
##
|
|
|
|
# Creates a new pre-processor for +input_file_name+ that will look for
|
|
|
|
# included files in +include_path+
|
|
|
|
|
2008-01-13 22:34:05 -05:00
|
|
|
def initialize(input_file_name, include_path)
|
|
|
|
@input_file_name = input_file_name
|
|
|
|
@include_path = include_path
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Look for common options in a chunk of text. Options that we don't handle
|
2008-07-17 20:46:16 -04:00
|
|
|
# are yielded to the caller.
|
2008-01-13 22:34:05 -05:00
|
|
|
|
|
|
|
def handle(text)
|
2008-07-17 20:46:16 -04:00
|
|
|
text.gsub!(/^([ \t]*#?[ \t]*):(\w+):([ \t]*)(.+)?\n/) do
|
|
|
|
next $& if $3.empty? and $4 and $4[0, 1] == ':'
|
|
|
|
|
2008-01-13 22:34:05 -05:00
|
|
|
prefix = $1
|
|
|
|
directive = $2.downcase
|
2008-07-17 20:46:16 -04:00
|
|
|
param = $4
|
2008-01-13 22:34:05 -05:00
|
|
|
|
|
|
|
case directive
|
2008-07-17 20:46:16 -04:00
|
|
|
when 'include' then
|
2008-01-13 22:34:05 -05:00
|
|
|
filename = param.split[0]
|
2008-07-17 20:46:16 -04:00
|
|
|
include_file filename, prefix
|
2008-01-13 22:34:05 -05:00
|
|
|
|
|
|
|
else
|
2008-07-17 20:46:16 -04:00
|
|
|
result = yield directive, param
|
|
|
|
result = "#{prefix}:#{directive}: #{param}\n" unless result
|
|
|
|
result
|
2008-01-13 22:34:05 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Include a file, indenting it correctly.
|
|
|
|
|
|
|
|
def include_file(name, indent)
|
|
|
|
if full_name = find_include_file(name) then
|
2010-04-10 08:28:13 -04:00
|
|
|
content = File.binread full_name
|
2010-04-22 22:32:20 -04:00
|
|
|
# HACK determine content type and force encoding
|
2010-04-10 02:36:13 -04:00
|
|
|
content = content.sub(/\A# .*coding[=:].*$/, '').lstrip
|
2010-04-01 03:45:16 -04:00
|
|
|
|
2008-01-13 22:34:05 -05:00
|
|
|
# strip leading '#'s, but only if all lines start with them
|
2010-04-01 03:45:16 -04:00
|
|
|
if content =~ /^[^#]/ then
|
2008-01-13 22:34:05 -05:00
|
|
|
content.gsub(/^/, indent)
|
|
|
|
else
|
|
|
|
content.gsub(/^#?/, indent)
|
|
|
|
end
|
|
|
|
else
|
2010-04-10 02:36:13 -04:00
|
|
|
warn "Couldn't find file to include '#{name}' from #{@input_file_name}"
|
2008-01-13 22:34:05 -05:00
|
|
|
''
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Look for the given file in the directory containing the current file,
|
|
|
|
# and then in each of the directories specified in the RDOC_INCLUDE path
|
|
|
|
|
|
|
|
def find_include_file(name)
|
2010-04-10 02:36:13 -04:00
|
|
|
to_search = [File.dirname(@input_file_name)].concat @include_path
|
2008-01-13 22:34:05 -05:00
|
|
|
to_search.each do |dir|
|
|
|
|
full_name = File.join(dir, name)
|
|
|
|
stat = File.stat(full_name) rescue next
|
|
|
|
return full_name if stat.readable?
|
|
|
|
end
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|