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