You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:10:29 UTC

[sling-org-apache-sling-scripting-sightly-compiler] 09/31: SLING-6399 - Implement support for date and number formatting for HTL

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.scripting.sightly.compiler-1.0.10
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly-compiler.git

commit 3f0ea53adde02feaf097c098d79fddf5f4d65e2f
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Wed Dec 14 22:13:32 2016 +0000

    SLING-6399 - Implement support for date and number formatting for HTL
    
    * implemented support for the date and number formatting features from version 1.3
    of the HTL Language Specification
    * applied slightly modified patch submitted by Vlad Băilescu at https://github.com/apache/sling/pull/191
    (Closes #191)
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/sightly/compiler@1774351 13f79535-47bb-0310-9956-ffa450edef68
---
 .../sling/scripting/sightly/compiler/SightlyCompiler.java    |  2 +-
 .../sightly/compiler/expression/nodes/NumericConstant.java   |  7 +++----
 .../sling/scripting/sightly/impl/filter/FormatFilter.java    | 12 +++++++++++-
 .../sling/scripting/sightly/impl/filter/I18nFilter.java      |  6 +++++-
 .../sightly/impl/frontend/ExpressionWrapperTest.java         | 12 ++++++------
 5 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java b/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java
index 008c89a..ed5ef36 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java
@@ -103,8 +103,8 @@ public final class SightlyCompiler {
 
         // register filters
         final List<Filter> filters = new ArrayList<>(5);
-        filters.add(FormatFilter.getInstance());
         filters.add(I18nFilter.getInstance());
+        filters.add(FormatFilter.getInstance());
         filters.add(JoinFilter.getInstance());
         filters.add(URIManipulationFilter.getInstance());
         filters.add(XSSFilter.getInstance());
diff --git a/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java b/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java
index 22c852c..d03056c 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java
@@ -49,7 +49,7 @@ public final class NumericConstant implements Atom {
      * @param value the number representation
      */
     public NumericConstant(Number value) {
-        this.value = value.longValue();
+        this.value = value;
         this.text = value.toString();
     }
 
@@ -80,11 +80,10 @@ public final class NumericConstant implements Atom {
     }
 
     private Number parseNumber(String s) {
-        try {
-            return Long.parseLong(s);
-        } catch (NumberFormatException e) {
+        if (s.contains(".")) {
             return Double.parseDouble(s);
         }
+        return Long.parseLong(s);
     }
 
 }
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java b/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java
index bf7291a..52e00f0 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java
@@ -21,6 +21,7 @@ package org.apache.sling.scripting.sightly.impl.filter;
 import org.apache.sling.scripting.sightly.compiler.RuntimeFunction;
 import org.apache.sling.scripting.sightly.compiler.expression.Expression;
 import org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode;
+import org.apache.sling.scripting.sightly.compiler.expression.nodes.MapLiteral;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.RuntimeCall;
 
 /**
@@ -29,6 +30,9 @@ import org.apache.sling.scripting.sightly.compiler.expression.nodes.RuntimeCall;
 public class FormatFilter extends AbstractFilter {
 
     public static final String FORMAT_OPTION = "format";
+    public static final String TYPE_OPTION = "type";
+    public static final String FORMAT_LOCALE_OPTION = "formatLocale";
+    public static final String TIMEZONE_OPTION = "timezone";
 
     private static final class FormatFilterLoader {
         private static final FormatFilter INSTANCE = new FormatFilter();
@@ -53,7 +57,13 @@ public class FormatFilter extends AbstractFilter {
             return expression;
         }
         ExpressionNode translation =
-                new RuntimeCall(RuntimeFunction.FORMAT, expression.getRoot(), expression.removeOption(FORMAT_OPTION));
+                new RuntimeCall(RuntimeFunction.FORMAT, expression.getRoot(),
+                        new MapLiteral(getFilterOptions(expression,
+                                FORMAT_OPTION,
+                                TYPE_OPTION,
+                                I18nFilter.LOCALE_OPTION,
+                                FORMAT_LOCALE_OPTION,
+                                TIMEZONE_OPTION)));
         return expression.withNode(translation);
     }
 }
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java b/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java
index 3fe12d5..fdb07cd 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java
@@ -18,6 +18,8 @@
  ******************************************************************************/
 package org.apache.sling.scripting.sightly.impl.filter;
 
+import java.util.Map;
+
 import org.apache.sling.scripting.sightly.compiler.RuntimeFunction;
 import org.apache.sling.scripting.sightly.compiler.expression.Expression;
 import org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode;
@@ -55,9 +57,11 @@ public final class I18nFilter extends AbstractFilter {
                 == ExpressionContext.PLUGIN_DATA_SLY_TEMPLATE || expressionContext == ExpressionContext.PLUGIN_DATA_SLY_CALL) {
             return expression;
         }
+        Map <String, ExpressionNode> options = getFilterOptions(expression, HINT_OPTION, LOCALE_OPTION, BASENAME_OPTION);
         ExpressionNode translation = new RuntimeCall(RuntimeFunction.I18N, expression.getRoot(), new MapLiteral
-                (getFilterOptions(expression, HINT_OPTION, LOCALE_OPTION, BASENAME_OPTION)));
+                (options));
         expression.removeOption(I18N_OPTION);
+        expression.getOptions().put(FormatFilter.FORMAT_LOCALE_OPTION, options.get(LOCALE_OPTION));
         return expression.withNode(translation);
     }
 }
diff --git a/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java b/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java
index 85ca544..a9b0588 100644
--- a/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java
+++ b/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java
@@ -74,7 +74,7 @@ public class ExpressionWrapperTest {
         interpolation.addExpression(new Expression(new StringConstant("hello"), options));
         ExpressionWrapper wrapper = new ExpressionWrapper(filters);
         Expression result = wrapper.transform(interpolation, MarkupContext.TEXT, ExpressionContext.TEXT);
-        List<ExpressionNode> xssArguments = runEmptyOptionsAndXSSAssertions(result);
+        List<ExpressionNode> xssArguments = runOptionsAndXSSAssertions(result, 1);
         RuntimeCall i18n = (RuntimeCall) xssArguments.get(0);
         assertEquals("Expected to I18n runtime function call.", RuntimeFunction.I18N, i18n.getFunctionName());
     }
@@ -90,7 +90,7 @@ public class ExpressionWrapperTest {
         interpolation.addExpression(new Expression(new StringConstant("Hello {0} {1}"), options));
         ExpressionWrapper wrapper = new ExpressionWrapper(filters);
         Expression result = wrapper.transform(interpolation, MarkupContext.TEXT, ExpressionContext.TEXT);
-        List<ExpressionNode> xssArguments = runEmptyOptionsAndXSSAssertions(result);
+        List<ExpressionNode> xssArguments = runOptionsAndXSSAssertions(result, 0);
         RuntimeCall format = (RuntimeCall) xssArguments.get(0);
         assertEquals(RuntimeFunction.FORMAT, format.getFunctionName());
     }
@@ -106,7 +106,7 @@ public class ExpressionWrapperTest {
         interpolation.addExpression(new Expression(new ArrayLiteral(array), options));
         ExpressionWrapper wrapper = new ExpressionWrapper(filters);
         Expression result = wrapper.transform(interpolation, MarkupContext.TEXT, ExpressionContext.TEXT);
-        List<ExpressionNode> xssArguments = runEmptyOptionsAndXSSAssertions(result);
+        List<ExpressionNode> xssArguments = runOptionsAndXSSAssertions(result, 0);
         RuntimeCall join = (RuntimeCall) xssArguments.get(0);
         assertEquals(RuntimeFunction.JOIN, join.getFunctionName());
     }
@@ -142,13 +142,13 @@ public class ExpressionWrapperTest {
                         options));
         ExpressionWrapper wrapper = new ExpressionWrapper(filters);
         Expression result = wrapper.transform(interpolation, MarkupContext.TEXT, ExpressionContext.TEXT);
-        List<ExpressionNode> xssArguments = runEmptyOptionsAndXSSAssertions(result);
+        List<ExpressionNode> xssArguments = runOptionsAndXSSAssertions(result, 0);
         RuntimeCall join = (RuntimeCall) xssArguments.get(0);
         assertEquals(RuntimeFunction.URI_MANIPULATION, join.getFunctionName());
     }
 
-    private List<ExpressionNode> runEmptyOptionsAndXSSAssertions(Expression result) {
-        assertTrue("Expected empty options map for expression after processing.", result.getOptions().isEmpty());
+    private List<ExpressionNode> runOptionsAndXSSAssertions(Expression result, int expectedOptions) {
+        assertEquals("Options map size for expression after processing is different from expected.", expectedOptions, result.getOptions().size());
         RuntimeCall xss = (RuntimeCall) result.getRoot();
         assertEquals("Expected XSS escaping applied to expression.", RuntimeFunction.XSS, xss.getFunctionName());
         return xss.getArguments();

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.