diff --git a/lib/docx/newline_replacer.rb b/lib/docx/newline_replacer.rb index e3f451e..1aa45e5 100644 --- a/lib/docx/newline_replacer.rb +++ b/lib/docx/newline_replacer.rb @@ -19,34 +19,39 @@ def walk(node) def replace_text_node_or_continue_walking(node, child) if child.node_type == :text - replace_text_node(node, child) + if (node.node_type == :element && node.expanded_name == 'w:t') && child.to_s.include?("\n") + replace_text_node(node, child) + end else walk(child) end end def replace_text_node(parent, node) + grand_parent = parent.parent list_of_new_nodes(node).reverse.each do |new_node| - parent.insert_after(node, new_node) + grand_parent.insert_after(parent, new_node) end - node.remove + parent.remove end def line_break_node - br = REXML::Element.new('w:br') + REXML::Element.new('w:br') end def list_of_new_nodes(node) node.to_s.split("\n") .map{|str| str_to_text_node(str)} - .flat_map{ |txt| [txt, line_break_node] }[0..-2] + .flat_map{ |txt_node| [txt_node, line_break_node] }[0..-2] end def str_to_text_node(str) respect_whitespace = true parent = nil raw_text = true - REXML::Text.new(str, respect_whitespace, parent, raw_text) + t = REXML::Element.new('w:t') + text = REXML::Text.new(str, respect_whitespace, parent, raw_text) + t.add_text text end end end diff --git a/spec/functional/newline_conversion_spec.rb b/spec/functional/newline_conversion_spec.rb index 0b25b7f..c47c6ce 100644 --- a/spec/functional/newline_conversion_spec.rb +++ b/spec/functional/newline_conversion_spec.rb @@ -17,7 +17,7 @@ let(:options){ {convert_newlines: true} } it "can convert newlines with docx equivalents" do body.should_not include("||quotes||") - body.should include("Be excellent to eachother ~Bill and TedTyping is not the bottlneckDo something awesome.") + body.should include("Be excellent to eachother ~Bill and TedTyping is not the bottlneckDo something awesome.") end it "does not double escape special characters" do @@ -37,7 +37,7 @@ context "default" do let(:options){ {} } it "converts newlines" do - body.should include("Bill and TedTyping") + body.should include("Bill and TedTyping") end end end diff --git a/spec/lib/docx/newline_replacer_spec.rb b/spec/lib/docx/newline_replacer_spec.rb index e043e8c..dcfa31f 100644 --- a/spec/lib/docx/newline_replacer_spec.rb +++ b/spec/lib/docx/newline_replacer_spec.rb @@ -1,13 +1,19 @@ require 'spec_helper' +require 'spec_helper' describe Docx::NewlineReplacer do - let(:xml_str){ "Leslie\nKnope" } + let(:xml_str){ "Leslie\nKnope\n " } let(:xml_doc){ REXML::Document.new(xml_str) } let(:replacer){ Docx::NewlineReplacer.new(xml_doc) } - it "it replaces \\n with " do + it "it replaces \\n with in text nodes" do + replacer.replace + xml_doc.to_s.should include("LeslieKnope") + end + + it "it does not replace \\n with in not text nodes" do replacer.replace - xml_doc.to_s.should include("LeslieKnope") + xml_doc.to_s.should include("\n ") end context "multiple newlines" do @@ -16,8 +22,7 @@ it "replaces all newlines in a single node" do replacer.replace str = xml_doc.to_s - str.should include("LeslieKnope") - str.should include("BenWyatt") + str.should include("LeslieKnopelovesBenWyatt") end end end