<commit_before>XML to HTML converter

TODO:
- create interface for iterating over matches
- then write TODOs for HTML stuff

Engineering Tasks:
    - Test::Base class
        - filters for creating ITS objects with specified rules and applying to given document
    - switch to XML::LibXML

To Do on current task:
    -

Later To Do:
    - make sure that Rule objects don't store the actual attribute hash used by the XML element
    - Create full storage of Rule XML contents (future proofing and allowing greater extensibility)
        - right now it just lists children tags and text

Testing:
    Besides testing each piece of functionality, we need a comprehensive end-to-end XML2HTML test suite for Renat and Serge
<commit_msg>Updated todo<commit_after>XML to HTML converter

TODO:
- create interface for iterating over matches
- then write TODOs for HTML stuff

Engineering Tasks:
    - factor out all XML processing code into its own class
        - trying to zero to manage 3rd party code
    - switch to XML::LibXML
        - much better designed and maintained than XML::XPath

To Do on current task:
    -

Later To Do:
    - make sure that Rule objects don't store the actual attribute hash used by the XML element
    - Create full storage of Rule XML contents (future proofing and allowing greater extensibility)
        - right now it just lists children tags and text

Testing:
    Besides testing each piece of functionality, we need a comprehensive end-to-end XML2HTML test suite for Renat and Serge

{'fraction_non_alphanumeric': 0.035211267605633804, 'fraction_numerical': 0.0019206145966709346, 'mean_word_length': 2.917293233082707, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6103613', 'n_tokens_mistral': 408, 'n_tokens_neox': 375, 'n_words': 215}