Revision history for MsOffice-Word-Surgeon 2.11 11.06.2025 - fix bug : text runs containing only '0' should not be ignored 2.10 30.04.2025 - new() and save_as() can take a filehandle as docx argument 2.09 21.12.2024 - plain_text() should decode XML entities 2.08 28.09.2024 - unification of licensing terms 2.07 28.06.2024 - additional test for replace() with xml_before - unlink_fields : better algorithm for ASK fields 2.06 03.06.2024 - refactoring for fields and bookmark boundaries - new methods replace_fields() and reveal_fields() - internals : Carp::Clan replaced by Carp::Object 2.05 02.03.2024 - fix missing XML decode/encode operations on &<> 2.04 13.02.2024 - new method reveal_bookmarks() 2.03 10.05.2023 - fix bug introduced in 2.02: ->document->contents($new_content) must erase the 'was_cleaned_up' flag 2.02 08.05.2023 - ->replace(..., keep_xml_as_is => ) is deprecated; use (cleanup_XML => ...) instead - new option 'no_caps' for automatic upcase of runs with the 'caps' property 2.01 25.01.2023 - index images by either title or description field in alternative text (because recent versions of MsWord no longer have a 'title' field) - avoid making assumptions about attribute order in XML nodes 2.0 01.05.2022 - major refactoring - support for multiple package parts (main document, headers and footers) - support for replacing or adding an image - renamed "change" ==> "revision" 1.08 21.03.2022 - additional noise reduction : soft hyphens 1.07 27.10.2021 - new method suppress_bookmarks() - fix bug : runs containing '0' should not be treated as empty - unlink_fields() must suppress the content of ASK fields - to_uppercase() must not change HTML entities like & 1.06 16.01.2021 - fix bug in ->plain_text() : translation of soft line breaks into newlines did not work 1.05 13.12.2020 - new behaviour for the replace() method : by default it automatically cleans up the XML and automatically overwrites $surgeon->contents - additional noise reduction : remove the _goBack bookmark added automatically by MsWord 1.04 10.11.2020 - the synopsis was incorrect in its example of the replace() method 1.03 13.10.2020 - better parameter checking for new(); cleaner handling of revision ids; readability of source code improved 1.02 12.10.2020 - fix bug in ->replace(): tabs or other contents outside of was lost during replacement 1.01 03.07.2020 - fix bug in "unlink_fields" : field boundaries ("begin" / "separate" / "end" ) may contain child nodes 1.0 24.11.2019 - First public release