Changeset 6560 in josm for trunk/src


Ignore:
Timestamp:
2013-12-29T12:03:21+01:00 (10 years ago)
Author:
simon04
Message:

see #9485 - MapCSS: add support for set class_name instruction and .class_name condition (which is specified in the MapCSS specification)

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

Legend:

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

    r6554 r6560  
    2222    abstract public boolean applies(Environment e);
    2323
    24     public static Condition create(String k, String v, Op op, Context context, boolean considerValAsKey) {
     24    public static Condition createKeyValueCondition(String k, String v, Op op, Context context, boolean considerValAsKey) {
    2525        switch (context) {
    2626        case PRIMITIVE:
     
    4141    }
    4242
    43     public static Condition create(String k, boolean not, KeyMatchType matchType, Context context) {
     43    public static Condition createKeyCondition(String k, boolean not, KeyMatchType matchType, Context context) {
    4444        switch (context) {
    4545        case PRIMITIVE:
     
    5757    }
    5858
    59     public static Condition create(String id, boolean not, Context context) {
     59    public static Condition createPseudoClassCondition(String id, boolean not, Context context) {
    6060        return new PseudoClassCondition(id, not);
    6161    }
    6262
    63     public static Condition create(Expression e, Context context) {
     63    public static Condition createClassCondition(String id, boolean not, Context context) {
     64        return new ClassCondition(id, not);
     65    }
     66
     67    public static Condition createExpressionCondition(Expression e, Context context) {
    6468        return new ExpressionCondition(e);
    6569    }
     
    275279    }
    276280
     281    public static class ClassCondition extends Condition {
     282
     283        public final String id;
     284        public final boolean not;
     285
     286        public ClassCondition(String id, boolean not) {
     287            this.id = id;
     288            this.not = not;
     289        }
     290
     291        @Override
     292        public boolean applies(Environment env) {
     293            return not ^ env.mc.getCascade(env.layer).containsKey(id);
     294        }
     295
     296        @Override
     297        public String toString() {
     298            return (not ? "!" : "") + "." + id;
     299        }
     300    }
     301
    277302    public static class PseudoClassCondition extends Condition {
    278303
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java

    r6538 r6560  
    8484        Environment env;
    8585
     86        /**
     87         * Identity function for compatibility with MapCSS specification.
     88         * @param o any object
     89         * @return {@code o} unchanged
     90         */
    8691        public static Object eval(Object o) {
    8792            return o;
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj

    r6554 r6560  
    4242TOKEN:
    4343{
    44     < IDENT: ["a"-"z","A"-"Z","_"] ( ["a"-"z","A"-"Z","_","-","0"-"9"] )* >
     44    < SET: ("set" | "SET") >
     45|   < IDENT: ["a"-"z","A"-"Z","_"] ( ["a"-"z","A"-"Z","_","-","0"-"9"] )* >
    4546|   < UINT: ["1"-"9"] ( ["0"-"9"] )* >
    4647|   < UFLOAT: ( ["0"-"9"] )+ ( "." ( ["0"-"9"] )+ )? >
     
    7879|   < DOLLAR: "$" >
    7980|   < CARET: "^" >
     81|   < FULLSTOP: "." >
    8082|   < COMMENT_START: "/*" > : COMMENT
    8183|   < UNEXPECTED_CHAR : ~[] > // avoid TokenMgrErrors because they are hard to recover from
     
    271273    (
    272274        ( <GREATER> { parentSelector = false; } | <LESS> { parentSelector = true; } )
    273         ( ( c=condition(Context.LINK) | c=pseudoclass(Context.LINK) ) { conditions.add(c); } )*
     275        ( ( c=condition(Context.LINK) | c=class_or_pseudoclass(Context.LINK) ) { conditions.add(c); } )*
    274276        { selLink = new LinkSelector(conditions); }
    275277        w()
     
    290292    ( base=<IDENT> | base=<STAR> )
    291293    ( r=zoom() )?
    292     ( ( c=condition(Context.PRIMITIVE) | c=pseudoclass(Context.PRIMITIVE) ) { conditions.add(c); } )*
     294    ( ( c=condition(Context.PRIMITIVE) | c=class_or_pseudoclass(Context.PRIMITIVE) ) { conditions.add(c); } )*
    293295    ( sub=subpart() )?
    294296    { return new GeneralSelector(base.image, r, conditions, sub); }
     
    327329            c=simple_key_value_condition(context) s() <RSQUARE> { return c; }
    328330        |
    329             e=expression() <RSQUARE> { return Condition.create(e, context); }
     331            e=expression() <RSQUARE> { return Condition.createExpressionCondition(e, context); }
    330332    )
    331333}
     
    357359    ( LOOKAHEAD(2) <QUESTION> <EXCLAMATION> { matchType = Condition.KeyMatchType.FALSE; } )?
    358360    (              <QUESTION>               { matchType = Condition.KeyMatchType.TRUE;  } )?
    359     { return Condition.create(key, not, matchType, context); }
     361    { return Condition.createKeyCondition(key, not, matchType, context); }
    360362}
    361363
     
    418420            f=float_() { val=Float.toString(f); }
    419421    )
    420     { return Condition.create(key, val, op, context, considerValAsKey); }
    421 }
    422 
    423 Condition pseudoclass(Context context) :
     422    { return Condition.createKeyValueCondition(key, val, op, context, considerValAsKey); }
     423}
     424
     425Condition class_or_pseudoclass(Context context) :
    424426{
    425427    Token t;
    426428    boolean not = false;
     429    boolean pseudo;
    427430}
    428431{
    429432    ( <EXCLAMATION> { not = true; } )?
    430     <COLON>
     433    (
     434        <FULLSTOP> { pseudo = false; }
     435    |
     436        <COLON> { pseudo = true; }
     437    )
    431438    t=<IDENT>
    432     { return Condition.create(t.image, not, context); }
     439    { return pseudo
     440        ? Condition.createPseudoClassCondition(t.image, not, context)
     441        : Condition.createClassCondition(t.image, not, context); }
    433442}
    434443
     
    448457    Instruction i;
    449458    Token key;
    450     Object val;
     459    Object val = null;
    451460}
    452461{
    453462    <LBRACE> w()
    454463    (
     464        (
     465        <SET> w() key=<IDENT> w()
     466        ( <EQUAL> val=expression() )?
     467        { ins.add(new Instruction.AssignmentInstruction(key.image, val == null ? true : val)); }
     468        ( <RBRACE> { return ins; } | <SEMICOLON> w() )
     469        )
     470        |
    455471        key=<IDENT> w() <COLON> w()
    456472        (
Note: See TracChangeset for help on using the changeset viewer.