[PATCH] Datacage: Add function dc:find-all(needle, haystack)

Wald Commits scm-commit at wald.intevation.org
Fri Oct 18 18:15:38 CEST 2013


# HG changeset patch
# User Sascha L. Teichmann <teichmann at intevation.de>
# Date 1382112933 -7200
# Node ID 420eb5a5fde41e1a42fe7957a633f4ae59770581
# Parent  b7e82468299a2a5fdba001dbcf8bec7122eec566
Datacage: Add function dc:find-all(needle, haystack).

Finds all matches for needle in haystack and results them als a list of strings.
Example:

dc:find-all("\d{4}", "1919 1291 1299 3029")

  returns

("1919", "1291, "1299", "3029")

diff -r b7e82468299a -r 420eb5a5fde4 artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/templating/FunctionResolver.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/templating/FunctionResolver.java	Fri Oct 18 15:44:01 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/templating/FunctionResolver.java	Fri Oct 18 18:15:33 2013 +0200
@@ -9,6 +9,7 @@
 package org.dive4elements.river.artifacts.datacage.templating;
 
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -16,6 +17,8 @@
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -170,6 +173,18 @@
                     : Collections.<String>emptySet();
             }
         });
+
+        addFunction("find-all", 2, new XPathFunction() {
+            @Override
+            public Object evaluate(List args) throws XPathFunctionException {
+                Object needle    = args.get(0);
+                Object haystack  = args.get(1);
+                return haystack instanceof String
+                    && needle   instanceof String
+                    ? findAll((String)needle, (String)haystack)
+                    : Collections.<String>emptyList();
+            }
+        });
     }
 
     /**
@@ -410,5 +425,17 @@
         }
         return Collections.<String>emptySet();
     }
+
+    public Collection<String> findAll(String needle, String haystack) {
+
+        ArrayList<String> result = new ArrayList<String>();
+
+        Pattern pattern = Pattern.compile(needle);
+        Matcher matcher = pattern.matcher(haystack);
+        while (matcher.find()) {
+            result.add(matcher.group());
+        }
+        return result;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :


More information about the Dive4elements-commits mailing list