From 36cd9e11fe5c4bb88f9362cb981bb2279a95d52e Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 24 Sep 2023 15:58:57 +0200 Subject: [PATCH] Support localize entries that have a name that cannot be represented as an identifier --- .../Sequence/SequenceLocalizeFileReference.cpp | 5 ++++- .../Dumping/Localize/StringFileDumper.cpp | 16 +++++++++++++++- .../Dumping/Localize/StringFileDumper.h | 1 + src/Utils/Utils/StringUtils.h | 4 ++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/ObjLoading/Parsing/LocalizeFile/Sequence/SequenceLocalizeFileReference.cpp b/src/ObjLoading/Parsing/LocalizeFile/Sequence/SequenceLocalizeFileReference.cpp index cb20ab81..93f8c185 100644 --- a/src/ObjLoading/Parsing/LocalizeFile/Sequence/SequenceLocalizeFileReference.cpp +++ b/src/ObjLoading/Parsing/LocalizeFile/Sequence/SequenceLocalizeFileReference.cpp @@ -8,7 +8,10 @@ SequenceLocalizeFileReference::SequenceLocalizeFileReference() AddMatchers({ create.Keyword("REFERENCE"), - create.Identifier().Capture(CAPTURE_REFERENCE_NAME), + create.Or({ + create.Identifier(), + create.String() + }).Capture(CAPTURE_REFERENCE_NAME), create.Type(SimpleParserValueType::NEW_LINE) }); } diff --git a/src/ObjWriting/Dumping/Localize/StringFileDumper.cpp b/src/ObjWriting/Dumping/Localize/StringFileDumper.cpp index b54b8a6b..ba0ae100 100644 --- a/src/ObjWriting/Dumping/Localize/StringFileDumper.cpp +++ b/src/ObjWriting/Dumping/Localize/StringFileDumper.cpp @@ -38,13 +38,27 @@ void StringFileDumper::WriteHeader() m_wrote_header = true; } +void StringFileDumper::WriteReference(const std::string& reference) const +{ + if (reference.find_first_not_of(utils::LETTERS_AL_NUM_UNDERSCORE) != std::string::npos) + { + m_stream << "REFERENCE \""; + + utils::EscapeStringForQuotationMarks(m_stream, reference); + + m_stream << "\"\n"; + } + else + m_stream << "REFERENCE " << reference << "\n"; +} + void StringFileDumper::WriteLocalizeEntry(const std::string& reference, const std::string& value) { if (!m_wrote_header) WriteHeader(); m_stream << "\n"; - m_stream << "REFERENCE " << reference << "\n"; + WriteReference(reference); const auto valueSpacing = std::string(15 - m_language_caps.length(), ' '); m_stream << "LANG_" << m_language_caps << valueSpacing << "\""; diff --git a/src/ObjWriting/Dumping/Localize/StringFileDumper.h b/src/ObjWriting/Dumping/Localize/StringFileDumper.h index 5a9c9a86..a78464c4 100644 --- a/src/ObjWriting/Dumping/Localize/StringFileDumper.h +++ b/src/ObjWriting/Dumping/Localize/StringFileDumper.h @@ -14,6 +14,7 @@ class StringFileDumper : AbstractTextDumper bool m_wrote_header; void WriteHeader(); + void WriteReference(const std::string& reference) const; public: StringFileDumper(Zone* zone, std::ostream& stream); diff --git a/src/Utils/Utils/StringUtils.h b/src/Utils/Utils/StringUtils.h index c74f141d..860f8dbb 100644 --- a/src/Utils/Utils/StringUtils.h +++ b/src/Utils/Utils/StringUtils.h @@ -3,6 +3,10 @@ namespace utils { +#define M_LETTERS_AL_NUM "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + static constexpr const char* LETTERS_AL_NUM = M_LETTERS_AL_NUM; + static constexpr const char* LETTERS_AL_NUM_UNDERSCORE = M_LETTERS_AL_NUM "_"; + std::string EscapeStringForQuotationMarks(const std::string_view& str); void EscapeStringForQuotationMarks(std::ostream& stream, const std::string_view& str); std::string UnescapeStringFromQuotationMarks(const std::string_view& str);