diff --git a/common/plugins/altium/altium_parser_utils.cpp b/common/plugins/altium/altium_parser_utils.cpp index 3739fba190..ba93715625 100644 --- a/common/plugins/altium/altium_parser_utils.cpp +++ b/common/plugins/altium/altium_parser_utils.cpp @@ -54,26 +54,43 @@ wxString AltiumSpecialStringsToKiCadVariables( const wxString& size_t start = 1; size_t delemiter = 0; + size_t escaping_start = 0; do { delemiter = aString.find( "+", start ); + escaping_start = aString.find( "'", start ); - wxString specialString = aString.substr( start, delemiter - start ).Trim( true ); - - if( !specialString.IsEmpty() ) + if( escaping_start < delemiter ) { - auto variableOverride = aOverride.find( specialString ); - if( variableOverride == aOverride.end() ) + size_t text_start = escaping_start + 1; + size_t escaping_end = aString.find( "'", text_start ); + if( escaping_end == wxString::npos ) { - result += wxString::Format( wxT( "${%s}" ), specialString ); + escaping_end = aString.size(); } - else - { - result += variableOverride->second; - } - } - start = delemiter + 1; + result += aString.substr( text_start, escaping_end - text_start ); + + start = escaping_end + 1; + } + else + { + wxString specialString = aString.substr( start, delemiter - start ).Trim( true ); + + if( !specialString.IsEmpty() ) + { + auto variableOverride = aOverride.find( specialString ); + if( variableOverride == aOverride.end() ) + { + result += wxString::Format( wxT( "${%s}" ), specialString ); + } + else + { + result += variableOverride->second; + } + } + start = delemiter + 1; + } } while( delemiter != wxString::npos ); return result; diff --git a/qa/common/plugins/altium/test_altium_parser_utils.cpp b/qa/common/plugins/altium/test_altium_parser_utils.cpp index d18eb88f78..968bcede8b 100644 --- a/qa/common/plugins/altium/test_altium_parser_utils.cpp +++ b/qa/common/plugins/altium/test_altium_parser_utils.cpp @@ -65,8 +65,17 @@ static const std::vector special_string_to_kicad_prope { "A\tB", "A\tB", {} }, { "This is a long text with spaces", "This is a long text with spaces", {} }, // Text format (underscore,...), TODO: add + // TODO: variable replacement is in fact case insensitive // Escaping, TODO: add + { "+", "+", {} }, + { "'", "'", {} }, + { "'A'", "'A'", {} }, + { "A+B", "A+B", {} }, { "A=B", "A=B", {} }, + { "$", "$", {} }, + { "{", "{", {} }, + { "}", "}", {} }, + { "${A}", "${A}", {} }, // TODO: correct substitution // Simple special strings { "=A", "${A}", {} }, { "=A", "C", { { "A", "C" } } }, @@ -77,6 +86,22 @@ static const std::vector special_string_to_kicad_prope { "=A+B", "${A}${B}", {} }, { "=A+B", "C${B}", { { "A", "C" } } }, { "=A+B", "CD", { { "A", "C" }, { "B", "D" } } }, + // Special strings with text + { "='A'", "A", {} }, + { "='This is a long text with spaces'", "This is a long text with spaces", {} }, + { "='='", "=", {} }, + { "='+'", "+", {} }, + { "='$'", "$", {} }, + { "='{'", "{", {} }, + { "='}'", "}", {} }, + { "='${A}'", "${A}", {} }, // TODO: correct substitution + { "='A'+'B'", "AB", {} }, + { "='A'+' '", "A ", {} }, + { "=' '+'B'", " B", {} }, + { "='A'+B", "A${B}", {} }, + { "=A+'B'", "${A}B", {} }, + { "=A+' '+B", "${A} ${B}", {} }, + { "='A'+B+'C'+D", "A${B}C${D}", {} }, // Some special cases we do not know yet how to handle correctly. But we should not crash ;) { "=+", "", {} }, { "=++", "", {} }, @@ -90,6 +115,10 @@ static const std::vector special_string_to_kicad_prope { "= ", "", {} }, { "= A", "${ A}", {} }, { "=A ", "${A}", {} }, + { "='A'B", "A", {} }, + { "=A'B'", "B", {} }, + { "=A'B", "B", {} }, + { "=A+ 'B'", "${A}B", {} }, };