Revision history for XML-PP

0.08	Mon Apr 27 19:55:33 EDT 2026

	- Fixed parse() returning a non-empty hashref instead of {} for inputs
          that contain only whitespace, only an XML declaration, or only comments;
          the empty-string guard now re-checks after preprocessing strips those
          constructs rather than only checking the raw input
        - Fixed _parse_node attribute-value regex not matching newlines inside
          quoted attribute values; added /s flag so .*? crosses line boundaries
        - Fixed _parse_node only capturing text content before the first child
          element; mixed content with text between sibling elements (e.g.
          <p>Hello<br/>World</p>) was silently lost; the text-capture step is now
          inside the child-parsing loop so it runs between every pair of siblings
        - Fixed collapse_structure producing { "" => {} } with an uninitialised-
          value warning when the input node has no name key; the entry guard now
          checks defined $node->{name} before proceeding
        - Fixed _parse_node silently ignoring missing and mismatched closing tags
          even in strict mode; the closing-tag substitution result is now checked
          and routes through _handle_error, so strict mode dies and warn_on_error
          mode warns as expected
        - Fixed unreachable self-closing tag guard in _parse_node: the check ran
          before $self_close was set, so it could never fire; moved to after the
          attr_string strip block that actually sets the flag
        - Fixed inverted condition in self-closing tag guard: previously errored
          when no closing tag was present (the valid case); now correctly errors
          when a redundant closing tag follows a self-closing tag
        - Improved error message for malformed self-closing tags to state
          explicitly that a redundant closing tag was found
        - Fixed greedy regex in parse(): s/<\?xml.+\?>//  changed to
          s/<\?xml.*?\?>//  to avoid over-consuming if multiple ?> sequences
          appear on the XML declaration line
        - Removed no-op pos($attr_string) = 0 in _parse_node: pos() is always
          undef at the start of a fresh //g match on a new variable
        - Added comment to closing-tag namespace strip in _parse_node documenting
          that prefix mismatch between open and close tags is not verified, which
          is intentional given the lightweight scope of this module

0.07	Fri Dec 26 21:32:41 EST 2025
	Use Return::Set to verify correct output type
	Ignore comments in the XML
	Added bin/xmlpp-cli, a command-line program to parse XML files
	Improved attribute parsing
	Accept single-quoted attributes
	Normalize whitespace between attributes
	Added a testing dashboard

0.06	Thu May 22 13:44:50 EDT 2025
	Use positional parameters when parsing children

0.05	Thu May  8 12:23:15 EDT 2025
	Simplify new()
	Needs Params::Get >= 0.04
	Fixed circular dependancy

0.04	Sat Apr 26 19:41:12 EDT 2025
	Use Params::Get

0.03	Sat Apr 26 15:11:21 EDT 2025
	Handle the XML header
	Added the logger option to new()

0.02	Sat Apr 26 14:28:09 EDT 2025
	More helpful error messages
	Added META information to the repo
	Added collapse_structure()

0.01	Sat Apr 26 07:46:49 EDT 2025
	First draft
