From f180eac23a19dc1fa573924a823b3ae5a3a25844 Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sun, 3 Feb 2019 18:00:14 +0100 Subject: [PATCH] add function range #47 --- src/com/inet/lib/less/FunctionExpression.java | 42 ++++++++++++++++++- .../less/samples/less_org_doc/list/range.css | 16 +++++++ .../less/samples/less_org_doc/list/range.less | 20 +++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 test/com/inet/lib/less/samples/less_org_doc/list/range.css create mode 100644 test/com/inet/lib/less/samples/less_org_doc/list/range.less diff --git a/src/com/inet/lib/less/FunctionExpression.java b/src/com/inet/lib/less/FunctionExpression.java index abeacf4a..0304948a 100644 --- a/src/com/inet/lib/less/FunctionExpression.java +++ b/src/com/inet/lib/less/FunctionExpression.java @@ -294,6 +294,9 @@ public void appendTo( CssFormatter formatter ) { return; } break; + case "range": + range( formatter ).appendTo( formatter ); + return; } if( type == UNKNOWN ) { eval( formatter ); @@ -451,6 +454,9 @@ private void eval( CssFormatter formatter ) { case "extract": extract( formatter ); return; + case "range": + type = LIST; + return; case "alpha": type = NUMBER; switch( get( 0 ).getDataType( formatter ) ) { @@ -1028,9 +1034,11 @@ private double getDouble( int idx, double defaultValue, CssFormatter formatter ) */ @Override public Operation listValue( CssFormatter formatter ) { - switch( super.toString().toLowerCase() ) { + switch( super.toString() ) { case "extract": return extract( formatter ).listValue( formatter ); + case "range": + return range( formatter ); } return super.listValue( formatter ); } @@ -1084,4 +1092,36 @@ private Expression extract( CssFormatter formatter ) { return ex; } + + /** + * Function range. Generate a list spanning a range of values + * + * @param formatter + * current CSS output + * @return The operation representing a list of values + */ + private Operation range( CssFormatter formatter ) { + type = LIST; + double start = get( 0 ).doubleValue( formatter ); + double end; + if( parameters.size() >= 2 ) { + end = get( 1 ).doubleValue( formatter ); + } else { + end = start; + start = 1; + } + double step; + if( parameters.size() >= 3 ) { + step = get( 2 ).doubleValue( formatter ); + } else { + step = 1; + } + String unit = get( 0 ).unit( formatter ); + Operation op = new Operation( this, ' ' ); + while( start <= end ) { + op.addOperand( new ValueExpression( this, start + unit ) ); + start += step; + } + return op; + } } diff --git a/test/com/inet/lib/less/samples/less_org_doc/list/range.css b/test/com/inet/lib/less/samples/less_org_doc/list/range.css new file mode 100644 index 00000000..9a7a14c0 --- /dev/null +++ b/test/com/inet/lib/less/samples/less_org_doc/list/range.css @@ -0,0 +1,16 @@ +simple { + value: 1 2 3 4; + length: 4; +} +full { + value: 10px 20px 30px; + length: 3; +} +empty { + value: ; + length: 0; +} +floating { + value: 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3 3.2; + length: 10; +} diff --git a/test/com/inet/lib/less/samples/less_org_doc/list/range.less b/test/com/inet/lib/less/samples/less_org_doc/list/range.less new file mode 100644 index 00000000..35b4e2e3 --- /dev/null +++ b/test/com/inet/lib/less/samples/less_org_doc/list/range.less @@ -0,0 +1,20 @@ +simple { + @list: range(4); + value: @list; + length: length( @list ); +} +full { + @list: range(10px, 30px, 10); + value: @list; + length: length( @list ); +} +empty { + @list: range(10, 5); + value: @list; + length: length( @list ); +} +floating { + @list: range(1.4, 3.4, 0.2); + value: @list; + length: length( @list ); +} \ No newline at end of file