Changeset 8874 in josm for trunk/src/org


Ignore:
Timestamp:
2015-10-14T22:56:14+02:00 (4 years ago)
Author:
simon04
Message:

fix #10467 - MapCSS: allow comparisons in regexp key conditions

Location:
trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java

    r8846 r8874  
    88import java.util.Collection;
    99import java.util.EnumSet;
     10import java.util.Map;
    1011import java.util.Objects;
    1112import java.util.Set;
     
    5455        default: throw new AssertionError();
    5556        }
     57    }
     58
     59    public static Condition createRegexpKeyRegexpValueCondition(String k, String v, Op op) {
     60        return new RegexpKeyValueRegexpCondition(k, v, op);
    5661    }
    5762
     
    287292        }
    288293
     294        protected boolean matches(Environment env) {
     295            final String value = env.osm.get(k);
     296            return value != null && pattern.matcher(value).find();
     297        }
     298
    289299        @Override
    290300        public boolean applies(Environment env) {
    291             final String value = env.osm.get(k);
    292301            if (Op.REGEX.equals(op)) {
    293                 return value != null && pattern.matcher(value).find();
     302                return matches(env);
    294303            } else if (Op.NREGEX.equals(op)) {
    295                 return value == null || !pattern.matcher(value).find();
     304                return !matches(env);
    296305            } else {
    297306                throw new IllegalStateException();
    298307            }
     308        }
     309    }
     310
     311    public static class RegexpKeyValueRegexpCondition extends KeyValueRegexpCondition {
     312
     313        public final Pattern keyPattern;
     314
     315        public RegexpKeyValueRegexpCondition(String k, String v, Op op) {
     316            super(k, v, op, false);
     317            this.keyPattern = Pattern.compile(k);
     318        }
     319
     320        @Override
     321        protected boolean matches(Environment env) {
     322            for (Map.Entry<String,String> kv: env.osm.getKeys().entrySet()) {
     323                if (keyPattern.matcher(kv.getKey()).find() && pattern.matcher(kv.getValue()).find()) {
     324                    return true;
     325                }
     326            }
     327            return false;
    299328        }
    300329    }
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj

    r8822 r8874  
    755755    float f;
    756756    int i;
     757    Condition.KeyMatchType matchType = null;;
    757758    Condition.Op op;
    758759    boolean considerValAsKey = false;
    759760}
    760761{
    761     key=tag_key() s()
     762    (
     763        key = regex() s() { matchType = Condition.KeyMatchType.REGEX; }
     764    |
     765        key=tag_key() s()
     766    )
    762767    (
    763768        LOOKAHEAD(3)
     
    807812            f=float_() { val=Float.toString(f); }
    808813    )
    809     { return Condition.createKeyValueCondition(key, val, op, context, considerValAsKey); }
     814    { return Condition.KeyMatchType.REGEX == matchType
     815            ? Condition.createRegexpKeyRegexpValueCondition(key, val, op)
     816            : Condition.createKeyValueCondition(key, val, op, context, considerValAsKey); }
    810817}
    811818
Note: See TracChangeset for help on using the changeset viewer.