Skip to content

Indent and CDATA blocks #17

Open
Open
@etdsoft

Description

@etdsoft

If you use:

xml_builder = Builder::XmlMarkup.new(indent: 2)
xml_builder.card do |card_builder|
  #...
  card_builder.description do
    card_builder.cdata!(description)
  end
end

And then somewhere along the line add CDATA blocks to your tree, you end up with indented CDATA blocks:

    <card>
      ...
      <description>
        <![CDATA[Welcome to....
]]>
      </description>
    </card>
    </

The problem is that upon parsing the indentation (new line and leading whitespace) becomes part of the text() for the <description> node:

irb> xml.at_xpath('card/description').text
=> "\n        Welcome to

This is because XmlMarkup#cdata! calls #_special which in turns calls _indent.

I suspect indent should be skipped on CDATA sections:
https://bugs.openjdk.java.net/browse/JDK-8223291
nashwaan/xml-js#14

In fact Nokogiri does skip indent for CDATA-only nodes:

irb> doc = Nokogiri::XML("<foo><bar><![CDATA[lorem ipsum]]></foo>")
=> #<Nokogiri::XML::Document:0xe09c name="document" children=[#<Nokogiri::XML::Element:0xe088 name="foo" children=[#<Nokogiri::XML::Element:0xe074 name="bar" children=[#<Noko...
irb> puts doc
<?xml version="1.0"?>
<foo>
  <bar><![CDATA[lorem ipsum]]></bar>
</foo>

Is this a bug or a feature? 🤔

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions