Skip to content

Commit

Permalink
[FEATURE] ascii function for expressions
Browse files Browse the repository at this point in the history
Returns the unicode code associated with the first character of a string
  • Loading branch information
JanCaha committed Apr 19, 2020
1 parent 9a6b0f5 commit d6829fe
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 0 deletions.
7 changes: 7 additions & 0 deletions resources/function_help/json/ascii
@@ -0,0 +1,7 @@
{
"name": "ascii",
"type": "function",
"description": "Returns the unicode code associated with the first character of a string.",
"arguments": [ {"arg":"string","description":"the string to convert to unicode code"}],
"examples": [ { "expression":"ascii('Q')", "returns":"81"} ]
}
14 changes: 14 additions & 0 deletions src/core/expression/qgsexpressionfunction.cpp
Expand Up @@ -1187,6 +1187,19 @@ static QVariant fcnChar( const QVariantList &values, const QgsExpressionContext
return QVariant( QString( character ) );
}

static QVariant fcnAscii( const QVariantList &values, const QgsExpressionContext *, QgsExpression *parent, const QgsExpressionNodeFunction * )
{
QString value = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );

if ( value.isEmpty() )
{
return QVariant();
}

int res = value.at( 0 ).unicode();
return QVariant( res );
}

static QVariant fcnWordwrap( const QVariantList &values, const QgsExpressionContext *, QgsExpression *parent, const QgsExpressionNodeFunction * )
{
if ( values.length() == 2 || values.length() == 3 )
Expand Down Expand Up @@ -5579,6 +5592,7 @@ const QList<QgsExpressionFunction *> &QgsExpression::Functions()
<< new QgsStaticExpressionFunction( QStringLiteral( "hamming_distance" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string1" ) ) << QgsExpressionFunction::Parameter( QStringLiteral( "string2" ) ), fcnHamming, QStringLiteral( "Fuzzy Matching" ) )
<< new QgsStaticExpressionFunction( QStringLiteral( "soundex" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string" ) ), fcnSoundex, QStringLiteral( "Fuzzy Matching" ) )
<< new QgsStaticExpressionFunction( QStringLiteral( "char" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "code" ) ), fcnChar, QStringLiteral( "String" ) )
<< new QgsStaticExpressionFunction( QStringLiteral( "ascii" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string" ) ), fcnAscii, QStringLiteral( "String" ) )
<< new QgsStaticExpressionFunction( QStringLiteral( "wordwrap" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "text" ) ) << QgsExpressionFunction::Parameter( QStringLiteral( "length" ) ) << QgsExpressionFunction::Parameter( QStringLiteral( "delimiter" ), true, "" ), fcnWordwrap, QStringLiteral( "String" ) )
<< new QgsStaticExpressionFunction( QStringLiteral( "length" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "text" ), true, "" ), fcnLength, QStringList() << QStringLiteral( "String" ) << QStringLiteral( "GeometryGroup" ) )
<< new QgsStaticExpressionFunction( QStringLiteral( "replace" ), -1, fcnReplace, QStringLiteral( "String" ) )
Expand Down
3 changes: 3 additions & 0 deletions tests/src/core/testqgsexpression.cpp
Expand Up @@ -1231,6 +1231,9 @@ class TestQgsExpression: public QObject
QTest::newRow( "trim" ) << "trim(' Test String ')" << false << QVariant( "Test String" );
QTest::newRow( "trim empty string" ) << "trim('')" << false << QVariant( "" );
QTest::newRow( "char" ) << "char(81)" << false << QVariant( "Q" );
QTest::newRow( "ascii single letter" ) << "ascii('Q')" << false << QVariant( 81 );
QTest::newRow( "ascii word" ) << "ascii('QGIS')" << false << QVariant( 81 );
QTest::newRow( "ascii empty" ) << "ascii('')" << false << QVariant();
QTest::newRow( "wordwrap" ) << "wordwrap('university of qgis',13)" << false << QVariant( "university of\nqgis" );
QTest::newRow( "wordwrap with custom delimiter" ) << "wordwrap('university of qgis',13,' ')" << false << QVariant( "university of\nqgis" );
QTest::newRow( "wordwrap with negative length" ) << "wordwrap('university of qgis',-3)" << false << QVariant( "university\nof qgis" );
Expand Down

0 comments on commit d6829fe

Please sign in to comment.