Expressif 0.3.4

There is a newer version of this package available.
See the version list below for details.
dotnet add package Expressif --version 0.3.4                
NuGet\Install-Package Expressif -Version 0.3.4                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Expressif" Version="0.3.4" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Expressif --version 0.3.4                
#r "nuget: Expressif, 0.3.4"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Expressif as a Cake Addin
#addin nuget:?package=Expressif&version=0.3.4

// Install Expressif as a Cake Tool
#tool nuget:?package=Expressif&version=0.3.4                

Expressif

Expressif is the variable substitution syntax, initially designed for NBi.io.

Expressif allows you to define variables and transformation of these variables (functions), in plain text, which can then be interpreted by the engine. The syntax for the definition of the expression transforming the variable is similar to:

@myVariable | text-to-lower | text-to-pad-right(@myCount, *)

Logo

About | Quickstart | Installing | Functions and predicates

About

Social media: twitter badge

Releases: nuget licence badge

Dev. activity: GitHub last commit Still maintained GitHub commit activity

Continuous integration builds: Build status Tests

Status: stars badge Bugs badge Features badge Top language

Quickstart

Expression

Expressif provides a class named Expression to define a chain of functions applied to a value. The class is expecting the textual representation of the chained functions in its constructor.

var expression = new Expression("lower");
var result = expression.Evaluate("Nikola Tesla");
Assert.That(result, Is.EqualTo("nikola tesla"));

Some functions require parameters, you can specify them between the parenthesis following the function name. Note that literal textual values don't required quotes surronding them.

var expression = new Expression("remove-chars(a)");
var result = expression.Evaluate("Nikola Tesla");
Assert.That(result, Is.EqualTo("Nikol Tesl"));

You can chain the functions with the operator pipe (|). The functions are executed from left to right.

var expression = new Expression("lower | remove-chars(a)");
var result = expression.Evaluate("Nikola Tesla");
Assert.That(result, Is.EqualTo("nikol tesl"));

It's possible to use variables as function parameters. The name of the variables must always start by an arobas (@)

var context = new Context();
context.Variables.Add<char>("myChar", 'k');

var expression = new Expression("lower | remove-chars(@myChar)", context);
var result = expression.Evaluate("Nikola Tesla");
Assert.That(result, Is.EqualTo("niola tesla"));

In addition to the variables that must be scalar values (text, numeric, dateTime ...), you can also add a property-object to the context. A property-object must be a pure C# object, an IDictionnary, an IList, or a DataRow. You can access the properties of the property-object based on the property's name with the syntax [property-name].

var context = new Context();
context.CurrentObject.Set(new { CharToBeRemoved = 't' });

var expression = new Expression("lower | remove-chars([CharToBeRemoved])", context);
var result = expression.Evaluate("Nikola Tesla");
Assert.That(result, Is.EqualTo("nikola esla"));

or based on its position with the syntax #index (where index is positive number).

var context = new Context();
context.CurrentObject.Set(new List<char>() { 'e', 's' });

var expression = new Expression("lower | remove-chars(#1)", context);
var result = expression.Evaluate("Nikola Tesla");
Assert.That(result, Is.EqualTo("nikola tela"));

It's also possible to use the result of function as the value of a parameter for another function. To achieve this the function as a parameter must be surrounded by curly braces {...}.

var context = new Context();
context.Variables.Add<int>("myVar", 6);
context.CurrentObject.Set(new List<int>() { 15, 8, 3 });

var expression = new Expression("lower | skip-last-chars( {@myVar | subtract(#2) })", context);
var result = expression.Evaluate("Nikola Tesla");
Assert.That(result, Is.EqualTo("nikola te"));

Predication

Expressif provides a class named Predication to define a combination of predicates applied to an argument. The class is expecting the textual representation of the predicates in its constructor.

var predication = new Predication("lower-case");
var result = predication.Evaluate("Nikola Tesla");
Assert.That(result, Is.False);

Same than for expressions, some predicates require parameters, you can specify them between the parenthesis immediately following the predicate name. More specifically, some predicates require an interval as parameter. The parameter can be define with the help of square brackets or parenthesis.

var predication = new Predication("within-interval([0;20[)");
var result = predication.Evaluate(15);
Assert.That(result, Is.True);

Other predicates require a culture as parameter. To specify a culture just use the textual representation of the culture composed of the two letter ISO code of the language then the two letters ISO code of the country separated by a dash i.e. fr-be for Belgian French, nl-be for Belgian Dutch or de-de for German.

var predication = new Predication("matches-date(fr-fr)");
var result = predication.Evaluate("28/12/1978");
Assert.That(result, Is.True);

Any predicate can be negated to return the opposite result. To negate a predicate just put the exclamation mark (!) in front of the predicate name.

var predication = new Predication("!starts-with(Nik)");
var result = predication.Evaluate("Nikola Tesla");
Assert.That(result, Is.False);

You can combine the predicates. Each predicate will accept the same argument and will be evaluated separatly. The results of the combination is dependening on the combinational operator used. To specify the name of the combinational operator use the pipe operator (|) immediately followed by the name of the operator. The following operators are valid |AND, |OR, |XOR.

Take into account that when possible, the operators are implementing a short-circuit. If the two predicates are combined with the operator |AND and the first is returning false, the second will not be evaluated. Following the same reasoning, if the two predicates are combined with the operator |OR and the first is returning true, the second will also be ignored.

var predication = new Predication("starts-with(Nik) |AND ends-with(sla)");
var result = predication.Evaluate("Nikola Tesla");
Assert.That(result, Is.True);

By default, the predicates are combined from left to right. If you've three predicates, the two firsts will be combined and then the result of this combination will be combined with the third predicate. To alter this order, you must group the predicates with the help of curly braces {...}. Each predicate inside a group is evaluated from left to right and then the result of the group is combined with another group or predicate also from left to right.

var predication = new Predication("{starts-with(Nik) |AND ends-with(sla)} |OR {starts-with(ola) |AND ends-with(Tes)}");
var result = predication.Evaluate("Nikola Tesla");
Assert.That(result, Is.True);

var withoutGroupsPredication = new Predication("starts-with(Nik) |AND ends-with(sla) |OR starts-with(ola) |AND ends-with(Tes)");
var secondResult = withoutGroupsPredication.Evaluate("Nikola Tesla");
Assert.That(result, Is.Not.EqualTo(secondResult));

Installing

Install in the usual .NET fashion:

Install-Package Expressif

Supported functions and predicates

Functions

Scope Name Aliases
IO creation-datetime file-to-creation-datetime
IO creation-datetime-utc file-to-creation-datetime-utc
IO directory path-to-directory
IO extension path-to-extension
IO filename path-to-filename
IO filename-without-extension path-to-filename-without-extension
IO root path-to-root
IO size file-to-size
IO update-datetime file-to-update-datetime
IO update-datetime-utc file-to-update-datetime-utc
Numeric absolute numeric-to-absolute
Numeric add numeric-to-add
Numeric ceiling numeric-to-ceiling
Numeric clip numeric-to-clip
Numeric decrement numeric-to-decrement
Numeric divide numeric-to-divide
Numeric floor numeric-to-floor
Numeric increment numeric-to-increment
Numeric integer numeric-to-integer
Numeric invert numeric-to-invert
Numeric multiply numeric-to-multiply
Numeric null-to-zero
Numeric round numeric-to-round
Numeric sign numeric-to-sign
Numeric subtract numeric-to-subtract
Special any-to-any
Special neutral Special-to-neutral
Special null-to-value
Special value-to-value
Temporal age dateTime-to-age
Temporal back dateTime-to-back, dateTime-to-subtract
Temporal ceiling-hour dateTime-to-ceiling-hour
Temporal ceiling-minute dateTime-to-ceiling-minute
Temporal clamp dateTime-to-clamp, dateTime-to-clip
Temporal datetime-to-date dateTime-to-datetime-to-date
Temporal first-of-month dateTime-to-first-of-month
Temporal first-of-year dateTime-to-first-of-year
Temporal floor-hour dateTime-to-floor-hour
Temporal floor-minute dateTime-to-floor-minute
Temporal forward dateTime-to-forward, dateTime-to-add
Temporal invalid-to-date
Temporal last-of-month dateTime-to-last-of-month
Temporal last-of-year dateTime-to-last-of-year
Temporal local-to-utc
Temporal next-day dateTime-to-next-day
Temporal next-month dateTime-to-next-month
Temporal next-year dateTime-to-next-year
Temporal null-to-date
Temporal previous-day dateTime-to-previous-day
Temporal previous-month dateTime-to-previous-month
Temporal previous-year dateTime-to-previous-year
Temporal set-time dateTime-to-set-time
Temporal utc-to-local
Text after-substring text-to-after-substring
Text before-substring text-to-before-substring
Text empty-to-null
Text first-chars text-to-first-chars
Text html-to-text
Text last-chars text-to-last-chars
Text length text-to-length
Text lower text-to-lower
Text mask-to-text
Text null-to-empty
Text pad-left text-to-pad-left
Text pad-right text-to-pad-right
Text prefix text-to-prefix
Text remove-chars text-to-remove-chars
Text skip-first-chars text-to-skip-first-chars
Text skip-last-chars text-to-skip-last-chars
Text suffix text-to-suffix
Text text-to-datetime
Text text-to-html
Text text-to-mask
Text token text-to-token
Text token-count text-to-token-count
Text trim text-to-trim
Text upper text-to-upper
Text whitespaces-to-empty blank-to-empty
Text whitespaces-to-null blank-to-null
Text without-diacritics text-to-without-diacritics
Text without-whitespaces text-to-without-whitespaces

Predicates

Scope Name Aliases
Boolean false boolean-is-false
Boolean false-or-null boolean-is-false-or-null
Boolean identical-to boolean-is-identical-to
Boolean true boolean-is-true
Boolean true-or-null boolean-is-true-or-null
Numeric equal-to numeric-is-equal-to
Numeric even numeric-is-even
Numeric greater-than numeric-is-greater-than
Numeric greater-than-or-equal numeric-is-greater-than-or-equal
Numeric integer numeric-is-integer
Numeric less-than numeric-is-less-than
Numeric less-than-or-equal numeric-is-less-than-or-equal
Numeric modulo numeric-is-modulo
Numeric negative numeric-is-negative
Numeric negative-or-zero numeric-is-negative-or-zero
Numeric odd numeric-is-odd
Numeric one numeric-is-one
Numeric positive numeric-is-positive
Numeric positive-or-zero numeric-is-positive-or-zero
Numeric within-interval numeric-is-within-interval
Numeric zero numeric-is-zero
Numeric zero-or-null numeric-is-zero-or-null
Special null is-null
Temporal after dateTime-is-after
Temporal after-or-same-instant dateTime-is-after-or-same-instant
Temporal before dateTime-is-before
Temporal before-or-same-instant dateTime-is-before-or-same-instant
Temporal contained-in dateTime-is-contained-in
Temporal on-the-day dateTime-is-on-the-day
Temporal on-the-hour dateTime-is-on-the-hour
Temporal on-the-minute dateTime-is-on-the-minute
Temporal same-instant dateTime-is-same-instant
Text any-of text-is-any-of
Text contains text-contains
Text empty text-is-empty
Text empty-or-null text-is-empty-or-null
Text ends-with text-ends-with
Text equivalent-to text-is-equivalent-to
Text lower-case text-is-lower-case
Text matches-date text-matches-date
Text matches-datetime text-matches-datetime
Text matches-numeric text-matches-numeric
Text matches-regex text-matches-regex
Text matches-time text-matches-time
Text sorted-after text-is-sorted-after
Text sorted-after-or-equivalent-to text-is-sorted-after-or-equivalent-to
Text sorted-before text-is-sorted-before
Text sorted-before-or-equivalent-to text-is-sorted-before-or-equivalent-to
Text starts-with text-starts-with
Text upper-case text-is-upper-case
Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.9.10 66 11/16/2024
1.9.9 145 9/14/2024
1.9.7 104 9/9/2024
1.9.6 98 9/8/2024
1.9.5 98 9/2/2024
1.9.4 107 8/26/2024
1.9.3 118 8/26/2024
1.9.2 124 8/24/2024
1.9.1 123 8/22/2024
1.9.0 79 7/29/2024
1.8.12 75 7/29/2024
1.8.11 81 7/29/2024
1.8.10 100 5/25/2024
1.8.9 104 5/14/2024
1.8.8 122 3/18/2024
1.8.7 107 3/18/2024
1.8.6 127 3/16/2024
1.8.5 118 2/27/2024
1.8.4 122 2/22/2024
1.8.3 105 2/17/2024
1.8.2 128 2/4/2024
1.8.1 110 1/30/2024
1.8.0 140 1/13/2024
1.7.0 111 1/13/2024
1.6.2 119 1/11/2024
1.6.1 105 1/11/2024
1.6.0 140 1/7/2024
1.5.0 128 1/7/2024
1.4.8 125 1/6/2024
1.4.7 124 1/6/2024
1.4.5 137 1/6/2024
1.4.4 127 1/6/2024
1.4.3 145 1/1/2024
1.4.2 117 12/31/2023
1.4.1 132 12/30/2023
1.4.0 122 12/30/2023
1.3.0 121 12/29/2023
1.2.0 117 12/29/2023
1.1.2 128 12/28/2023
1.1.1 119 12/28/2023
1.1.0 124 12/27/2023
1.0.0 129 12/22/2023
0.8.0 113 12/22/2023
0.7.0 101 12/22/2023
0.6.0 128 12/22/2023
0.5.0 131 12/22/2023
0.4.0 132 12/21/2023
0.3.48 127 12/21/2023
0.3.47 173 12/5/2023
0.3.46 147 12/5/2023
0.3.45 117 12/5/2023
0.3.44 130 12/5/2023
0.3.43 149 12/3/2023
0.3.39 141 12/3/2023
0.3.36 157 11/9/2023
0.3.35 140 11/6/2023
0.3.34 153 9/2/2023
0.3.33 155 8/17/2023
0.3.32 188 8/14/2023
0.3.31 184 8/9/2023
0.3.30 167 8/9/2023
0.3.29 181 8/8/2023
0.3.28 193 7/1/2023
0.3.27 163 6/14/2023
0.3.25 210 3/7/2023
0.3.24 257 3/5/2023
0.3.23 229 3/5/2023
0.3.22 237 3/5/2023
0.3.21 238 3/5/2023
0.3.20 239 3/5/2023
0.3.18 311 1/3/2023
0.3.17 307 1/3/2023
0.3.15 307 12/31/2022
0.3.14 302 12/31/2022
0.3.13 302 12/30/2022
0.3.11 331 12/29/2022
0.3.9 294 12/29/2022
0.3.8 294 12/29/2022
0.3.7 322 12/29/2022
0.3.6 309 12/28/2022
0.3.5 305 12/28/2022
0.3.4 317 12/28/2022
0.3.3 307 12/28/2022
0.3.2 298 12/26/2022
0.3.1 316 12/26/2022
0.3.0 312 12/26/2022
0.2.26 310 12/24/2022
0.2.25 318 12/23/2022
0.2.24 318 12/22/2022
0.2.23 299 12/22/2022
0.2.22 316 12/21/2022
0.2.21 326 12/21/2022
0.2.20 343 12/19/2022
0.2.18 334 12/18/2022
0.2.15 324 12/18/2022
0.2.14 312 12/18/2022
0.2.13 308 12/18/2022
0.2.12 323 12/18/2022
0.2.9 318 12/11/2022
0.2.8 308 12/11/2022
0.2.7 300 12/10/2022
0.2.6 311 12/10/2022
0.2.5 309 12/10/2022
0.2.4 327 12/6/2022
0.2.3 309 12/6/2022
0.2.2 349 11/26/2022
0.2.1 352 11/22/2022
0.2.0 341 11/21/2022
0.1.17 358 11/17/2022
0.1.16 353 11/15/2022
0.1.15 391 11/13/2022
0.1.13 374 11/12/2022
0.1.11 342 11/12/2022
0.1.10 344 11/12/2022
0.1.7 360 11/12/2022
0.1.6 360 11/12/2022