Browse Source

ADDED before/after string functions.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/15831
master
Jeff Young 2 weeks ago
parent
commit
5876bc83bf
  1. 28
      common/text_eval/text_eval_parser.cpp
  2. 6
      qa/tests/common/text_eval/README.md
  3. 6
      qa/tests/common/text_eval/test_text_eval_parser.cpp

28
common/text_eval/text_eval_parser.cpp

@ -521,6 +521,34 @@ auto EVAL_VISITOR::evaluateFunction( const FUNC_DATA& aFunc ) const -> Result<Va
return MakeValue<Value>( result );
}
else if( name == "beforefirst" && argc == 2 )
{
wxString result = VALUE_UTILS::ToString( argValues[0] );
result = result.BeforeFirst( VALUE_UTILS::ToString( argValues[1] )[0] );
return MakeValue<Value>( result.ToStdString() );
}
else if( name == "beforelast" && argc == 2 )
{
wxString result = VALUE_UTILS::ToString( argValues[0] );
result = result.BeforeLast( VALUE_UTILS::ToString( argValues[1] )[0] );
return MakeValue<Value>( result.ToStdString() );
}
else if( name == "afterfirst" && argc == 2 )
{
wxString result = VALUE_UTILS::ToString( argValues[0] );
result = result.AfterFirst( VALUE_UTILS::ToString( argValues[1] )[0] );
return MakeValue<Value>( result.ToStdString() );
}
else if( name == "afterlast" && argc == 2 )
{
wxString result = VALUE_UTILS::ToString( argValues[0] );
result = result.AfterLast( VALUE_UTILS::ToString( argValues[1] )[0] );
return MakeValue<Value>( result.ToStdString() );
}
// Conditional functions (handle mixed types)
if( name == "if" && argc == 3 )

6
qa/tests/common/text_eval/README.md

@ -11,7 +11,7 @@ High-level integration tests using the `EXPRESSION_EVALUATOR` wrapper class.
- **Variable Substitution**: Testing variable storage and retrieval in expressions
- **String Operations**: String concatenation, mixed string/number operations
- **Mathematical Functions**: `abs`, `sqrt`, `pow`, `floor`, `ceil`, `round`, `min`, `max`, `sum`, `avg`
- **String Functions**: `upper`, `lower`, `concat`
- **String Functions**: `upper`, `lower`, `concat`, `beforefirst`, `beforelast`, `afterfirst`, `afterlast`
- **Formatting Functions**: `format`, `fixed`, `currency`
- **Date/Time Functions**: `today`, `now`, `dateformat`, `weekdayname`
- **Conditional Functions**: `if` statements with boolean logic
@ -69,6 +69,10 @@ Integration tests simulating real-world KiCad usage scenarios:
- `upper(str)` - Convert to uppercase
- `lower(str)` - Convert to lowercase
- `concat(...)` - Concatenate multiple values
- `beforefirst(str, c)` - Substring
- `beforelast(str, c)` - Substring
- `afterfirst(str, c)` - Substring
- `afterlast(str, c)` - Substring
- `format(num, [decimals])` - Format number with specified precision
- `fixed(num, [decimals])` - Fixed decimal formatting
- `currency(amount, [symbol])` - Currency formatting

6
qa/tests/common/text_eval/test_text_eval_parser.cpp

@ -288,6 +288,12 @@ BOOST_AUTO_TEST_CASE( StringFunctions )
// String concatenation function
{ "@{concat(\"Hello\", \" \", \"World\")}", "Hello World", false },
{ "@{concat(\"Count: \", 42, \" items\")}", "Count: 42 items", false },
{ "@{beforefirst(\"hello.world.txt\", \".\")}", "hello", false },
{ "@{beforelast(\"hello.world.txt\", \".\")}", "hello.world", false },
{ "@{afterfirst(\"hello.world.txt\", \".\")}", "world.txt", false },
{ "@{afterlast(\"hello.world.txt\", \".\")}", "txt", false },
{ "@{beforefirst(${text}, \" \")}", "hello", false },
};
for( const auto& testCase : cases )

Loading…
Cancel
Save