diff --git a/.editorconfig b/.editorconfig index e36bb3d9..efb6a75f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,9 +10,6 @@ trim_trailing_whitespace = true charset = utf-8 max_line_length = 120 -[*.{md,markdown}] -trim_trailing_whitespace = false - [*.{gitattributes,yaml,yml,vcxproj,vcxproj.filters,sln,rc,clang-format,toml,py,cmake}] indent_style = space diff --git a/CHANGELOG.md b/CHANGELOG.md index 87aa1119..c9009539 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,7 @@ template: --> -## Unreleased +## v3.4.0 #### Fixes @@ -37,7 +37,7 @@ template: #### Additions -- improved support for using enums with `value_or()` +- added support for using enums with `value_or()` #### Changes: diff --git a/CMakeLists.txt b/CMakeLists.txt index 1179d375..bfef0322 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.14) project( tomlplusplus - VERSION 3.3.0 + VERSION 3.4.0 DESCRIPTION "Header-only TOML config file parser and serializer for C++17" HOMEPAGE_URL "https://marzer.github.io/tomlplusplus/" LANGUAGES CXX diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f8b241f3..552880bd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,7 +68,7 @@ cd build-debug && ninja && ninja test \ ## Testing with the [toml-test] suite -As an optional extra you may wish to test against the 'official' test TOML test suite, [BurntSushi/toml-test]. See the +As an optional extra you may wish to test against the official test TOML test suite, [toml-test]. See the instructions at [toml-test/README](./toml-test/README.md). Note that the toml++ tests already consume tests from the offical suite via a C++ code-generation script so you are not expected to take this extra step as part of contributing to the library. @@ -77,5 +77,4 @@ to the library. [test adapter for catch2]: https://marketplace.visualstudio.com/items?itemName=JohnnyHendriks.ext01 [reporting issues]: https://github.com/marzer/tomlplusplus/issues [catch2]: https://github.com/catchorg/Catch2 -[toml-test]: https://github.com/BurntSushi/toml-test -[burntsushi/toml-test]: https://github.com/BurntSushi/toml-test +[toml-test]: https://github.com/toml-lang/toml-test diff --git a/README.md b/README.md index 53a6c665..be589c30 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ You'll find some more code examples in the `examples` directory, and plenty more ### Conan -Add `tomlplusplus/3.3.0` to your conanfile. +Add `tomlplusplus/3.4.0` to your conanfile. ### DDS @@ -121,7 +121,7 @@ Add `tomlpp` to your `package.json5`, e.g.: ```plaintext depends: [ - 'tomlpp^3.3.0', + 'tomlpp^3.4.0', ] ``` @@ -166,7 +166,7 @@ include(FetchContent) FetchContent_Declare( tomlplusplus GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git - GIT_TAG v3.3.0 + GIT_TAG v3.4.0 ) FetchContent_MakeAvailable(tomlplusplus) ``` diff --git a/docs/pages/main_page.md b/docs/pages/main_page.md index bb1a100e..49249cf2 100644 --- a/docs/pages/main_page.md +++ b/docs/pages/main_page.md @@ -6,17 +6,17 @@ @section mainpage-features Features -- Header-only (optional!) -- Supports the latest [TOML](https://toml.io/) release ([v1.0.0](https://toml.io/en/v1.0.0)), plus - optional support for some unreleased TOML features -- Passes all tests in the [toml-test](https://github.com/BurntSushi/toml-test) suite -- Supports serializing to JSON and YAML -- Proper UTF-8 handling (incl. BOM) -- C++17 (plus some C++20 features where available, e.g. experimental support for char8_t strings) -- Doesn't require RTTI -- Works with or without exceptions -- Tested on Clang (8+), GCC (8+) and MSVC (VS2019) -- Tested on x64, x86 and ARM +- Header-only (optional!) +- Supports the latest [TOML](https://toml.io/) release ([v1.0.0](https://toml.io/en/v1.0.0)), plus + optional support for some unreleased TOML features +- Passes all tests in the [toml-test](https://github.com/BurntSushi/toml-test) suite +- Supports serializing to JSON and YAML +- Proper UTF-8 handling (incl. BOM) +- C++17 (plus some C++20 features where available, e.g. experimental support for char8_t strings) +- Doesn't require RTTI +- Works with or without exceptions +- Tested on Clang (8+), GCC (8+) and MSVC (VS2019) +- Tested on x64, x86 and ARM @@ -38,29 +38,31 @@ Call toml::parse_file() and work with the toml::table you get back, or handle an #include #include -int main(int argc, char** argv) +int main(int argc, char\*\* argv) { - toml::table tbl; - try - { - tbl = toml::parse_file(argv[1]); - std::cout << tbl << "\n"; - } - catch (const toml::parse_error& err) - { - std::cerr << "Parsing failed:\n" << err << "\n"; - return 1; - } - - return 0; +toml::table tbl; +try +{ +tbl = toml::parse_file(argv[1]); +std::cout << tbl << "\n"; +} +catch (const toml::parse_error& err) +{ +std::cerr << "Parsing failed:\n" << err << "\n"; +return 1; +} + + return 0; + } @endcpp @see -- toml::parse_file() -- toml::table -- toml::parse_error + +- toml::parse_file() +- toml::table +- toml::parse_error @@ -78,35 +80,37 @@ using namespace std::string_view_literals; int main() { - static constexpr std::string_view some_toml = R"( - [library] - name = "toml++" - authors = ["Mark Gillard "] - cpp = 17 - )"sv; - - try - { - // parse directly from a string view: - { - toml::table tbl = toml::parse(some_toml); - std::cout << tbl << "\n"; - } - - // parse from a string stream: - { - std::stringstream ss{ std::string{ some_toml } }; - toml::table tbl = toml::parse(ss); - std::cout << tbl << "\n"; - } - } - catch (const toml::parse_error& err) - { - std::cerr << "Parsing failed:\n" << err << "\n"; - return 1; - } - - return 0; +static constexpr std::string_view some_toml = R"( +[library] +name = "toml++" +authors = ["Mark Gillard "] +cpp = 17 +)"sv; + + try + { + +// parse directly from a string view: +{ +toml::table tbl = toml::parse(some_toml); +std::cout << tbl << "\n"; +} + +// parse from a string stream: +{ +std::stringstream ss{ std::string{ some_toml } }; +toml::table tbl = toml::parse(ss); +std::cout << tbl << "\n"; +} +} +catch (const toml::parse_error& err) +{ +std::cerr << "Parsing failed:\n" << err << "\n"; +return 1; +} + + return 0; + } @endcpp @@ -123,9 +127,10 @@ name = 'toml++' @endout @see -- toml::parse_file() -- toml::table -- toml::parse_error + +- toml::parse_file() +- toml::table +- toml::parse_error @@ -143,15 +148,16 @@ the parsing functions return a toml::parse_result instead of a toml::table: int main() { - toml::parse_result result = toml::parse_file("configuration.toml"); - if (!result) - { - std::cerr << "Parsing failed:\n" << result.error() << "\n"; - return 1; - } - - do_stuff_with_your_config(std::move(result).table()); // 'steal' the table from the result - return 0; +toml::parse_result result = toml::parse_file("configuration.toml"); +if (!result) +{ +std::cerr << "Parsing failed:\n" << result.error() << "\n"; +return 1; +} + + do_stuff_with_your_config(std::move(result).table()); // 'steal' the table from the result + return 0; + } @endcpp @@ -162,7 +168,7 @@ int main() The examples above use an overloaded `operator<<` with ostreams to print basic error messages, and look like this: @out Error while parsing key: expected bare key starting character or string delimiter, saw '?' - (error occurred at line 2, column 5) +(error occurred at line 2, column 5) @endout The library doesn't natively support error colouring in TTY environments, but instead provides the requisite information @@ -173,22 +179,23 @@ and description() members: toml::table tbl; try { - tbl = toml::parse_file("configuration.toml"); +tbl = toml::parse_file("configuration.toml"); } catch (const toml::parse_error& err) { - std::cerr - << "Error parsing file '" << *err.source().path - << "':\n" << err.description() - << "\n (" << err.source().begin << ")\n"; - return 1; +std::cerr +<< "Error parsing file '" << \*err.source().path +<< "':\n" << err.description() +<< "\n (" << err.source().begin << ")\n"; +return 1; } @endcpp @see -- toml::parse_error -- toml::source_region -- toml::source_position + +- toml::parse_error +- toml::source_region +- toml::source_position @@ -207,68 +214,69 @@ using namespace std::string_view_literals; int main() { - static constexpr auto source = R"( - str = "hello world" - - numbers = [ 1, 2, 3, "four", 5.0 ] - vegetables = [ "tomato", "onion", "mushroom", "lettuce" ] - minerals = [ "quartz", "iron", "copper", "diamond" ] - - [animals] - cats = [ "tiger", "lion", "puma" ] - birds = [ "macaw", "pigeon", "canary" ] - fish = [ "salmon", "trout", "carp" ] - - )"sv; - toml::table tbl = toml::parse(source); - - // different ways of directly querying data - std::optional str1 = tbl["str"].value(); - std::optional str2 = tbl["str"].value(); - std::string_view str3 = tbl["str"].value_or(""sv); - std::string& str4 = tbl["str"].ref(); // ~~dangerous~~ - - std::cout << *str1 << "\n"; - std::cout << *str2 << "\n"; - std::cout << str3 << "\n"; - std::cout << str4 << "\n"; - - // get a toml::node_view of the element 'numbers' using operator[] - auto numbers = tbl["numbers"]; - std::cout << "table has 'numbers': " << !!numbers << "\n"; - std::cout << "numbers is an: " << numbers.type() << "\n"; - std::cout << "numbers: " << numbers << "\n"; - - // get the underlying array object to do some more advanced stuff - if (toml::array* arr = numbers.as_array()) - { - // visitation with for_each() helps deal with heterogeneous data - arr->for_each([](auto&& el) - { - if constexpr (toml::is_number) - (*el)++; - else if constexpr (toml::is_string) - el = "five"sv; - }); - - // arrays are very similar to std::vector - arr->push_back(7); - arr->emplace_back(8, 9); - std::cout << "numbers: " << numbers << "\n"; - } - - // node-views can be chained to quickly query deeper - std::cout << "cats: " << tbl["animals"]["cats"] << "\n"; - std::cout << "fish[1]: " << tbl["animals"]["fish"][1] << "\n"; - - // can also be retrieved via absolute path - std::cout << "cats: " << tbl.at_path("animals.cats") << "\n"; - std::cout << "fish[1]: " << tbl.at_path("animals.fish[1]") << "\n"; - - // ...even if the element doesn't exist - std::cout << "dinosaurs: " << tbl["animals"]["dinosaurs"] << "\n"; //no dinosaurs :( - - return 0; +static constexpr auto source = R"( +str = "hello world" + +numbers = [ 1, 2, 3, "four", 5.0 ] +vegetables = [ "tomato", "onion", "mushroom", "lettuce" ] +minerals = [ "quartz", "iron", "copper", "diamond" ] + +[animals] +cats = [ "tiger", "lion", "puma" ] +birds = [ "macaw", "pigeon", "canary" ] +fish = [ "salmon", "trout", "carp" ] + + )"sv; + toml::table tbl = toml::parse(source); + + // different ways of directly querying data + std::optional str1 = tbl["str"].value(); + std::optional str2 = tbl["str"].value(); + std::string_view str3 = tbl["str"].value_or(""sv); + std::string& str4 = tbl["str"].ref(); // ~~dangerous~~ + + std::cout << *str1 << "\n"; + std::cout << *str2 << "\n"; + std::cout << str3 << "\n"; + std::cout << str4 << "\n"; + + // get a toml::node_view of the element 'numbers' using operator[] + auto numbers = tbl["numbers"]; + std::cout << "table has 'numbers': " << !!numbers << "\n"; + std::cout << "numbers is an: " << numbers.type() << "\n"; + std::cout << "numbers: " << numbers << "\n"; + + // get the underlying array object to do some more advanced stuff + if (toml::array* arr = numbers.as_array()) + { + // visitation with for_each() helps deal with heterogeneous data + arr->for_each([](auto&& el) + { + if constexpr (toml::is_number) + (*el)++; + else if constexpr (toml::is_string) + el = "five"sv; + }); + +// arrays are very similar to std::vector +arr->push_back(7); +arr->emplace_back(8, 9); +std::cout << "numbers: " << numbers << "\n"; +} + + // node-views can be chained to quickly query deeper + std::cout << "cats: " << tbl["animals"]["cats"] << "\n"; + std::cout << "fish[1]: " << tbl["animals"]["fish"][1] << "\n"; + + // can also be retrieved via absolute path + std::cout << "cats: " << tbl.at_path("animals.cats") << "\n"; + std::cout << "fish[1]: " << tbl.at_path("animals.fish[1]") << "\n"; + + // ...even if the element doesn't exist + std::cout << "dinosaurs: " << tbl["animals"]["dinosaurs"] << "\n"; //no dinosaurs :( + + return 0; + } @endcpp @@ -287,11 +295,12 @@ dinosaurs: @endout @see -- toml::node -- toml::node_view -- toml::value -- toml::array -- toml::table + +- toml::node +- toml::node_view +- toml::value +- toml::array +- toml::table @@ -309,37 +318,39 @@ but via a toml::json_formatter and toml::yaml_formatter. int main() { - auto tbl = toml::table{ - { "lib", "toml++" }, - { "cpp", toml::array{ 17, 20, "and beyond" } }, - { "toml", toml::array{ "1.0.0", "and beyond" } }, - { "repo", "https://github.com/marzer/tomlplusplus/" }, - { "author", toml::table{ - { "name", "Mark Gillard" }, - { "github", "https://github.com/marzer" }, - { "twitter", "https://twitter.com/marzer8789" } - } - }, - }; - - // serializing as TOML - std::cout << "###### TOML ######" << "\n\n"; - std::cout << tbl << "\n\n"; - - // serializing as JSON using toml::json_formatter: - std::cout << "###### JSON ######" << "\n\n"; - std::cout << toml::json_formatter{ tbl } << "\n\n"; - - // serializing as YAML using toml::yaml_formatter: - std::cout << "###### YAML ######" << "\n\n"; - std::cout << toml::yaml_formatter{ tbl } << "\n\n"; - - return 0; +auto tbl = toml::table{ +{ "lib", "toml++" }, +{ "cpp", toml::array{ 17, 20, "and beyond" } }, +{ "toml", toml::array{ "1.0.0", "and beyond" } }, +{ "repo", "https://github.com/marzer/tomlplusplus/" }, +{ "author", toml::table{ +{ "name", "Mark Gillard" }, +{ "github", "https://github.com/marzer" }, +{ "twitter", "https://twitter.com/marzer8789" } +} +}, +}; + + // serializing as TOML + std::cout << "###### TOML ######" << "\n\n"; + std::cout << tbl << "\n\n"; + + // serializing as JSON using toml::json_formatter: + std::cout << "###### JSON ######" << "\n\n"; + std::cout << toml::json_formatter{ tbl } << "\n\n"; + + // serializing as YAML using toml::yaml_formatter: + std::cout << "###### YAML ######" << "\n\n"; + std::cout << toml::yaml_formatter{ tbl } << "\n\n"; + + return 0; + } @endcpp @out -###### TOML ###### + +###### TOML cpp = [ 17, 20, 'and beyond' ] lib = 'toml++' @@ -351,48 +362,50 @@ github = 'https://github.com/marzer' name = 'Mark Gillard' twitter = 'https://twitter.com/marzer8789' -###### JSON ###### +###### JSON { - "author" : { - "github" : "https://github.com/marzer", - "name" : "Mark Gillard", - "twitter" : "https://twitter.com/marzer8789" - }, - "cpp" : [ - 17, - 20, - "and beyond" - ], - "lib" : "toml++", - "repo" : "https://github.com/marzer/tomlplusplus/", - "toml" : [ - "1.0.0", - "and beyond" - ] +"author" : { +"github" : "https://github.com/marzer", +"name" : "Mark Gillard", +"twitter" : "https://twitter.com/marzer8789" +}, +"cpp" : [ +17, +20, +"and beyond" +], +"lib" : "toml++", +"repo" : "https://github.com/marzer/tomlplusplus/", +"toml" : [ +"1.0.0", +"and beyond" +] } -###### YAML ###### +###### YAML author: - github: 'https://github.com/marzer' - name: 'Mark Gillard' - twitter: 'https://twitter.com/marzer8789' +github: 'https://github.com/marzer' +name: 'Mark Gillard' +twitter: 'https://twitter.com/marzer8789' cpp: - - 17 - - 20 - - 'and beyond' -lib: 'toml++' -repo: 'https://github.com/marzer/tomlplusplus/' -toml: - - '1.0.0' - - 'and beyond' -@endout + +- 17 +- 20 +- 'and beyond' + lib: 'toml++' + repo: 'https://github.com/marzer/tomlplusplus/' + toml: +- '1.0.0' +- 'and beyond' + @endout @see -- toml::toml_formatter -- toml::json_formatter -- toml::yaml_formatter + +- toml::toml_formatter +- toml::json_formatter +- toml::yaml_formatter @@ -420,7 +433,7 @@ do it manually before including toml++ in some global header that's used everywh // some_code_file.cpp #define TOML_IMPLEMENTATION -#include "global_header_that_includes_toml++.h" +#include "global_header_that_includes_toml++.hpp" @endcpp Bonus Step: Disable any library features you don't need @@ -454,12 +467,11 @@ and [emoji sundae] Regular. The API is the same for both. 2. Add `tomlplusplus/include` to your include paths 3. `#include ` - @subsection mainpage-adding-lib-conan Conan -Add `tomlplusplus/3.3.0` to your conanfile. +Add `tomlplusplus/3.4.0` to your conanfile. @@ -467,7 +479,7 @@ Add `tomlplusplus/3.3.0` to your conanfile. Add `tomlpp` to your `package.json5`, e.g.: @json depends: [ - 'tomlpp^3.3.0', +'tomlpp^3.4.0', ] @endjson @@ -498,7 +510,7 @@ You can also add it as a subproject directly. @json { - "marzer/tomlplusplus": { } +"marzer/tomlplusplus": { } } @endjson @@ -510,7 +522,6 @@ You can also add it as a subproject directly. vcpkg install tomlplusplus @endshell - @subsection mainpage-adding-lib-cmake-fetch-content CMake FetchContent @@ -518,9 +529,9 @@ vcpkg install tomlplusplus @cmake include(FetchContent) FetchContent_Declare( - tomlplusplus - GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git - GIT_TAG v3.3.0 +tomlplusplus +GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git +GIT_TAG v3.4.0 ) FetchContent_MakeAvailable(tomlplusplus) @endcmake @@ -552,12 +563,12 @@ TOML libraries available for python, and thus one of the fastest options availab @out Parsing data.toml 5000 times: - pytomlpp: 0.694 s - rtoml: 0.871 s ( 1.25x) - tomli: 2.625 s ( 3.78x) - toml: 5.642 s ( 8.12x) - qtoml: 7.760 s (11.17x) - tomlkit: 32.708 s (47.09x) +pytomlpp: 0.694 s +rtoml: 0.871 s ( 1.25x) +tomli: 2.625 s ( 3.78x) +toml: 5.642 s ( 8.12x) +qtoml: 7.760 s (11.17x) +tomlkit: 32.708 s (47.09x) @endout Install it using `pip`: @@ -606,6 +617,7 @@ it is embedded in the preamble at the top of the header. For bug reports and feature requests please use the \github{marzer/tomlplusplus/issues, Github Issues} system. For anything else you're welcome to reach out via other means. In order of likely response speed: -- Twitter: [marzer8789](https://twitter.com/marzer8789) -- Gitter: [marzer/tomlplusplus](https://gitter.im/marzer/tomlplusplus) ("Discord for repos") -- Email: [mark.gillard@outlook.com.au](mailto:mark.gillard@outlook.com.au) + +- Twitter: [marzer8789](https://twitter.com/marzer8789) +- Gitter: [marzer/tomlplusplus](https://gitter.im/marzer/tomlplusplus) ("Discord for repos") +- Email: [mark.gillard@outlook.com.au](mailto:mark.gillard@outlook.com.au) diff --git a/include/toml++/impl/version.hpp b/include/toml++/impl/version.hpp index d03d9b96..626691fe 100644 --- a/include/toml++/impl/version.hpp +++ b/include/toml++/impl/version.hpp @@ -5,7 +5,7 @@ #pragma once #define TOML_LIB_MAJOR 3 -#define TOML_LIB_MINOR 3 +#define TOML_LIB_MINOR 4 #define TOML_LIB_PATCH 0 #define TOML_LANG_MAJOR 1 diff --git a/meson.build b/meson.build index 79749dfe..46e46c6b 100644 --- a/meson.build +++ b/meson.build @@ -7,7 +7,7 @@ project( 'tomlplusplus', 'cpp', license: 'MIT', - version: '3.3.0', + version: '3.4.0', meson_version: '>=0.61.0', default_options: [ # https://mesonbuild.com/Builtin-options.html diff --git a/toml-test/README.md b/toml-test/README.md index 5814a569..92887690 100644 --- a/toml-test/README.md +++ b/toml-test/README.md @@ -47,6 +47,6 @@ ninja && toml-test ./toml-test/tt_decoder && toml-test ./toml-test/tt_encoder -- > ℹ️ Pass `-Duse_vendored_libs=false` to meson if you wish to use the system-installed version > of nlohmann/json rather than the vendored one. -[toml-test]: https://github.com/BurntSushi/toml-test -[contributing]: ../CONTRIBUTING.md +[toml-test]: https://github.com/toml-lang/toml-test +[contributing]: ./../CONTRIBUTING.md [meson]: https://mesonbuild.com/ diff --git a/toml.hpp b/toml.hpp index 5fd7886d..0599bf5e 100644 --- a/toml.hpp +++ b/toml.hpp @@ -1,6 +1,6 @@ //---------------------------------------------------------------------------------------------------------------------- // -// toml++ v3.3.0 +// toml++ v3.4.0 // https://github.com/marzer/tomlplusplus // SPDX-License-Identifier: MIT // @@ -1152,7 +1152,7 @@ TOML_ENABLE_WARNINGS; //******** impl/version.hpp ****************************************************************************************** #define TOML_LIB_MAJOR 3 -#define TOML_LIB_MINOR 3 +#define TOML_LIB_MINOR 4 #define TOML_LIB_PATCH 0 #define TOML_LANG_MAJOR 1 diff --git a/tools/version.py b/tools/version.py index 018e5218..1d611d66 100644 --- a/tools/version.py +++ b/tools/version.py @@ -31,7 +31,7 @@ def write_text_file(path, text): args.add_argument(r'version', type=str) args = args.parse_args() - version = re.fullmatch(r'\s*([0-9]+)\s*[.,;]\s*([0-9]+)\s*[.,;]\s*([0-9]+)\s*', args.version) + version = re.fullmatch(r'\s*[vV]?\s*([0-9]+)\s*[.,;]+\s*([0-9]+)\s*[.,;]+\s*([0-9]+)\s*', args.version) if not version: print(rf"Couldn't parse version triplet from '{args.version}'", file=sys.stderr) sys.exit(1) @@ -51,15 +51,15 @@ def write_text_file(path, text): text = re.sub(r'''(\s|^)VERSION\s+[0-9](?:[.][0-9]){2}''', rf"\1VERSION {version_str}", text, count=1, flags=re.I) write_text_file(path, text) - path = root / r'include/toml++/impl/version.h' - text = read_text_file(path) - text = re.sub(r'''(\s*#\s*define\s+TOML_LIB_MAJOR)\s+[0-9]+''', rf"\1 {version[0]}", text) - text = re.sub(r'''(\s*#\s*define\s+TOML_LIB_MINOR)\s+[0-9]+''', rf"\1 {version[1]}", text) - text = re.sub(r'''(\s*#\s*define\s+TOML_LIB_PATCH)\s+[0-9]+''', rf"\1 {version[2]}", text) - write_text_file(path, text) + for path in (root / r'include/toml++/impl/version.hpp', root / r'toml.hpp'): + text = read_text_file(path) + text = re.sub(r'''(\s*#\s*define\s+TOML_LIB_MAJOR)\s+[0-9]+''', rf"\1 {version[0]}", text) + text = re.sub(r'''(\s*#\s*define\s+TOML_LIB_MINOR)\s+[0-9]+''', rf"\1 {version[1]}", text) + text = re.sub(r'''(\s*#\s*define\s+TOML_LIB_PATCH)\s+[0-9]+''', rf"\1 {version[2]}", text) + write_text_file(path, text) noop_sub = r'#$%^nbsp^%$#' - for file in (r'README.md', r'docs/pages/main_page.dox'): + for file in (r'README.md', r'docs/pages/main_page.md'): path = root / file text = read_text_file(path) text = re.sub(r'''(toml(?:plusplus|\+\+|pp)\s*[/:^]\s*)[0-9](?:[.][0-9]){2}''', rf"\1{noop_sub}{version_str}", text, flags=re.I)