summaryrefslogtreecommitdiff
path: root/lib/rdoc/text.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rdoc/text.rb')
-rw-r--r--lib/rdoc/text.rb130
1 files changed, 130 insertions, 0 deletions
diff --git a/lib/rdoc/text.rb b/lib/rdoc/text.rb
new file mode 100644
index 0000000000..5280aa0fd2
--- /dev/null
+++ b/lib/rdoc/text.rb
@@ -0,0 +1,130 @@
+##
+# Methods for manipulating comment text
+
+module RDoc::Text
+
+ ##
+ # Expands tab characters in +text+ to eight spaces
+
+ def expand_tabs text
+ expanded = []
+
+ text.each_line do |line|
+ line.gsub!(/^(.{8}*?)([^\t\r\n]{0,7})\t/) do
+ "#{$1}#{$2}#{' ' * (8 - $2.size)}"
+ end until line !~ /\t/
+
+ expanded << line
+ end
+
+ expanded.join
+ end
+
+ ##
+ # Flush +text+ left based on the shortest line
+
+ def flush_left text
+ indents = []
+
+ text.each_line do |line|
+ indents << (line =~ /[^\s]/ || 9999)
+ end
+
+ indent = indents.min
+
+ flush = []
+
+ text.each_line do |line|
+ line[/^ {0,#{indent}}/] = ''
+ flush << line
+ end
+
+ flush.join
+ end
+
+ ##
+ # Convert a string in markup format into HTML. Removes the first paragraph
+ # tags if +remove_para+ is true.
+ #
+ # Requires the including class to implement #formatter
+
+ def markup text
+ document = parse text
+
+ document.accept formatter
+ end
+
+ ##
+ # Strips hashes, expands tabs then flushes +text+ to the left
+
+ def normalize_comment text
+ return text if text.empty?
+
+ text = strip_hashes text
+ text = expand_tabs text
+ text = flush_left text
+ strip_newlines text
+ end
+
+ ##
+ # Normalizes +text+ then builds a RDoc::Markup::Document from it
+
+ def parse text
+ return text if RDoc::Markup::Document === text
+
+ text = normalize_comment text
+
+ return RDoc::Markup::Document.new if text =~ /\A\n*\z/
+
+ RDoc::Markup::Parser.parse text
+ rescue RDoc::Markup::Parser::Error => e
+ $stderr.puts <<-EOF
+While parsing markup, RDoc encountered a #{e.class}:
+
+#{e}
+\tfrom #{e.backtrace.join "\n\tfrom "}
+
+---8<---
+#{text}
+---8<---
+
+RDoc #{RDoc::VERSION}
+
+Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_RELEASE_DATE}
+
+Please file a bug report with the above information at:
+
+http://rubyforge.org/tracker/?atid=2472&group_id=627&func=browse
+
+ EOF
+ raise
+ end
+
+ ##
+ # Strips leading # characters from +text+
+
+ def strip_hashes text
+ return text if text =~ /^(?>\s*)[^\#]/
+ text.gsub(/^\s*(#+)/) { $1.tr '#',' ' }
+ end
+
+ ##
+ # Strips leading and trailing \n characters from +text+
+
+ def strip_newlines text
+ text.gsub(/\A\n*(.*?)\n*\z/m, '\1')
+ end
+
+ ##
+ # Strips /* */ style comments
+
+ def strip_stars text
+ text = text.gsub %r%Document-method:\s+[\w:.#]+%, ''
+ text.sub! %r%/\*+% do " " * $&.length end
+ text.sub! %r%\*+/% do " " * $&.length end
+ text.gsub! %r%^[ \t]*\*%m do " " * $&.length end
+ text
+ end
+
+end
+