lib/RichTextElement.rb in taskjuggler-0.0.4 vs lib/RichTextElement.rb in taskjuggler-0.0.5
- old
+ new
@@ -11,13 +11,27 @@
#
require 'UTF8String'
require 'TjException'
require 'XMLElement'
+require 'TextFormatter'
class TaskJuggler
+ class RichTextImage
+
+ attr_reader :fileName
+ attr_accessor :altText, :verticalAlign
+
+ def initialize(fileName)
+ @fileName = fileName
+ @altText = nil
+ @verticalAlign = nil
+ end
+
+ end
+
# The RichTextElement class models the nodes of the intermediate
# representation that the RichTextParser generates. Each node can reference an
# Array of other RichTextElement nodes, building a tree that represents the
# syntactical structure of the parsed RichText. Each node has a certain
# category that identifies the content of the node.
@@ -37,12 +51,12 @@
if arg
if arg.is_a?(Array)
@children = arg
else
unless arg.is_a?(RichTextElement) || arg.is_a?(String)
- raise TjException.new,
- "Element must be of type RichTextElement instead of #{arg.class}"
+ raise "Element must be of type RichTextElement instead of " +
+ "#{arg.class}"
end
@children = [ arg ]
end
else
@children = []
@@ -126,48 +140,63 @@
pre = ''
post = ''
case @category
when :richtext
when :title1
- pre = "#{@data[0]} "
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.titleIndent,
+ sTitle(1), children_to_s,
+ @richText.lineWidth) + "\n"
when :title2
- pre = "#{@data[0]}.#{@data[1]} "
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.titleIndent,
+ sTitle(2), children_to_s,
+ @richText.lineWidth) + "\n"
when :title3
- pre = "#{@data[0]}.#{@data[1]}.#{@data[2]} "
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.titleIndent,
+ sTitle(3), children_to_s,
+ @richText.lineWidth) + "\n"
when :hline
- return "#{'-' * (@richText.lineWidth - 4)}\n"
+ return "#{' ' * @richText.indent}" +
+ "#{'-' * (@richText.lineWidth - @richText.indent)}\n"
when :paragraph
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.parIndent,
+ '', children_to_s, @richText.lineWidth) + "\n"
when :pre
- post = "\n"
+ return TextFormatter.new(@richText.lineWidth,
+ @richText.indent + @richText.preIndent).
+ indent(children_to_s) + "\n"
when :bulletlist1
when :bulletitem1
- pre = '* '
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.listIndent,
+ '* ', children_to_s,
+ @richText.lineWidth) + "\n"
when :bulletlist2
when :bulletitem2
- pre = ' * '
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.listIndent * 2,
+ '* ', children_to_s,
+ @richText.lineWidth) + "\n"
when :bulletlist3
when :bulletitem3
- pre = ' * '
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.listIndent * 3,
+ '* ', children_to_s,
+ @richText.lineWidth) + "\n"
when :numberlist1
when :numberitem1
- pre = "#{@data[0]}. "
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.listIndent,
+ "#{@data[0]}. ", children_to_s,
+ @richText.lineWidth) + "\n"
when :numberlist2
when :numberitem2
- pre = "#{@data[0]}.#{@data[1]} "
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.listIndent,
+ "#{@data[0]}.#{@data[1]} ", children_to_s,
+ @richText.lineWidth) + "\n"
when :numberlist3
when :numberitem3
- pre = "#{@data[0]}.#{@data[1]}.#{@data[2]} "
- post = "\n\n"
+ return textBlockFormat(@richText.indent + @richText.listIndent,
+ "#{@data[0]}.#{@data[1]}.#{@data[2]} ",
+ children_to_s, @richText.lineWidth) + "\n"
+ when :img
+ pre = @data.altText if @data.altText
when :ref
when :href
when :blockfunc
when :inlinefunc
noChilds = true
@@ -246,10 +275,12 @@
pre = '<ol>'
post = '</ol>'
when :numberitem3
pre = "<li>#{@data[0]}.#{@data[1]}.#{@data[2]} "
post = "</li>\n"
+ when :img
+ pre = "<img file=\"#{@data.fileName}\"/>"
when :ref
pre = "<ref data=\"#{@data}\">"
post = '</ref>'
when :href
pre = "<a href=\"#{@data}\" #{@richText.linkTarget ?
@@ -315,17 +346,20 @@
htmlTitle(2)
when :title3
htmlTitle(3)
when :hline
noChilds = true
- XMLElement.new('hr', attrs)
+ XMLElement.new('hr', attrs, true)
when :paragraph
XMLElement.new('p', attrs)
when :pre
noChilds = true
- pre = XMLElement.new('pre')
+ attrs['codesection'] = '1'
+ div = XMLElement.new('div', attrs)
+ div << (pre = XMLElement.new('pre', attrs))
pre << XMLText.new(@children[0])
+ div
when :bulletlist1
XMLElement.new('ul')
when :bulletitem1
XMLElement.new('li')
when :bulletlist2
@@ -346,10 +380,17 @@
XMLElement.new('li')
when :numberlist3
XMLElement.new('ol')
when :numberitem3
XMLElement.new('li')
+ when :img
+ el = XMLElement.new('img', 'src' => @data.fileName)
+ el['alt'] = @data.altText if @data.altText
+ if @data.verticalAlign
+ el['style'] = "vertical-align:#{@data.verticalAlign}; "
+ end
+ el
when :ref
XMLElement.new('a', 'href' => "#{@data}.html")
when :href
a = XMLElement.new('a', 'href' => @data.to_s)
a['target'] = @richText.linkTarget if @richText.linkTarget
@@ -417,10 +458,22 @@
out.chomp('_')
end
private
+ def sTitle(level)
+ s = ''
+ if @richText.sectionNumbers
+ 1.upto(level) do |i|
+ s += '.' unless s.empty?
+ s += "#{@data[i - 1]}"
+ end
+ s += ') '
+ end
+ s
+ end
+
def htmlTitle(level)
attrs = { 'id' => convertToID(children_to_s) }
attrs['class'] = @richText.cssClass if @richText.cssClass
el = XMLElement.new("h#{level}", attrs)
if @richText.sectionNumbers
@@ -431,9 +484,18 @@
end
s += ' '
el << XMLText.new(s)
end
el
+ end
+
+ def textBlockFormat(indent, label, str, width)
+ labLen = label.length
+ TextFormatter.new(width, indent + labLen, indent).format(label + str)
+ end
+
+ def textBlockIndent(indent, str, width)
+ TextFormatter.new(width, indent).indent(str)
end
end
end