Ignore:
Timestamp:
2011-10-29T09:01:30+02:00 (9 years ago)
Author:
jttt
Message:

Extend name templates with context switch - possibility to use tags of referenced primitive when constructing primitive name

Location:
trunk/src/org/openstreetmap/josm/tools/template_engine
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/template_engine/ParseError.java

    r4282 r4546  
    2121    }
    2222
    23     public ParseError(org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
    24         super(tr("Error while parsing search expression"), e);
     23    public ParseError(int position, org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
     24        super(tr("Error while parsing search expression on position {0}", position), e);
     25        unexpectedToken = null;
     26    }
     27
     28    public ParseError(String message) {
     29        super(message);
    2530        unexpectedToken = null;
    2631    }
     
    2934        return unexpectedToken;
    3035    }
     36
     37    public static ParseError unexpectedChar(char expected, char found, int position) {
     38        return new ParseError(tr("Unexpected char on {0}. Expected {1} found {2}", position, expected, found));
     39    }
    3140}
  • trunk/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java

    r4282 r4546  
    22package org.openstreetmap.josm.tools.template_engine;
    33
     4
     5import static org.openstreetmap.josm.tools.I18n.tr;
    46
    57import java.util.ArrayList;
     
    911
    1012import org.openstreetmap.josm.actions.search.SearchCompiler;
     13import org.openstreetmap.josm.actions.search.SearchCompiler.Match;
    1114import org.openstreetmap.josm.tools.template_engine.Tokenizer.Token;
    1215import org.openstreetmap.josm.tools.template_engine.Tokenizer.TokenType;
     
    4245            if (token.getType() == TokenType.CONDITION_START) {
    4346                templateEntry = parseCondition();
     47            } else if (token.getType() == TokenType.CONTEXT_SWITCH_START) {
     48                templateEntry = parseContextSwitch();
    4449            } else if (token.getType() == TokenType.VARIABLE_START) {
    4550                templateEntry = parseVariable();
     
    6368    }
    6469
    65     private void skipWhitespace() {
     70    private void skipWhitespace() throws ParseError {
    6671        Token token = tokenizer.lookAhead();
    6772        if (token.getType() == TokenType.TEXT && token.getText().trim().isEmpty()) {
     
    7681
    7782            TemplateEntry condition;
    78             String searchExpression = tokenizer.skip('\'');
     83            Token searchExpression = tokenizer.skip('\'');
    7984            check(TokenType.APOSTROPHE);
    8085            condition = parseExpression(CONDITION_WITH_APOSTROPHES_END_TOKENS);
    8186            check(TokenType.APOSTROPHE);
    82             if (searchExpression.trim().isEmpty()) {
     87            if (searchExpression.getText().trim().isEmpty()) {
    8388                result.getEntries().add(condition);
    8489            } else {
    8590                try {
    86                     result.getEntries().add(new SearchExpressionCondition(SearchCompiler.compile(searchExpression, false, false), condition));
     91                    result.getEntries().add(new SearchExpressionCondition(SearchCompiler.compile(searchExpression.getText(), false, false), condition));
    8792                } catch (org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
    88                     throw new ParseError(e);
     93                    throw new ParseError(searchExpression.getPosition(), e);
    8994                }
    9095            }
     
    101106    }
    102107
     108    private TemplateEntry parseContextSwitch() throws ParseError {
     109
     110        check(TokenType.CONTEXT_SWITCH_START);
     111        Token searchExpression = tokenizer.skip('\'');
     112        check(TokenType.APOSTROPHE);
     113        TemplateEntry template = parseExpression(CONDITION_WITH_APOSTROPHES_END_TOKENS);
     114        check(TokenType.APOSTROPHE);
     115        ContextSwitchTemplate result;
     116        if (searchExpression.getText().trim().isEmpty())
     117            throw new ParseError(tr("Expected search expression"));
     118        else {
     119            try {
     120                Match match = SearchCompiler.compile(searchExpression.getText(), false, false);
     121                result = new ContextSwitchTemplate(match, template, searchExpression.getPosition());
     122            } catch (org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
     123                throw new ParseError(searchExpression.getPosition(), e);
     124            }
     125        }
     126        skipWhitespace();
     127        check(TokenType.END);
     128        return result;
     129    }
     130
    103131}
  • trunk/src/org/openstreetmap/josm/tools/template_engine/Tokenizer.java

    r4282 r4546  
    4040    }
    4141
    42     public enum TokenType { CONDITION_START, VARIABLE_START, END, PIPE, APOSTROPHE, TEXT, EOF }
     42    public enum TokenType { CONDITION_START, VARIABLE_START, CONTEXT_SWITCH_START, END, PIPE, APOSTROPHE, TEXT, EOF }
    4343
    4444    private final List<Character> specialCharaters = Arrays.asList(new Character[] {'$', '?', '{', '}', '|', '\''});
     
    6464    }
    6565
    66     public Token nextToken() {
     66    public Token nextToken() throws ParseError {
    6767        if (currentToken != null) {
    6868            Token result = currentToken;
     
    7979            getChar();
    8080            return new Token(TokenType.VARIABLE_START, position);
    81 
    8281        case '?':
    8382            getChar();
     
    8685                return new Token(TokenType.CONDITION_START, position);
    8786            } else
    88                 throw new AssertionError();
     87                throw ParseError.unexpectedChar('{', (char)c, position);
     88        case '!':
     89            getChar();
     90            if (c == '{') {
     91                getChar();
     92                return new Token(TokenType.CONTEXT_SWITCH_START, position);
     93            } else
     94                throw ParseError.unexpectedChar('{', (char)c, position);
    8995        case '}':
    9096            getChar();
     
    111117    }
    112118
    113     public Token lookAhead() {
     119    public Token lookAhead() throws ParseError {
    114120        if (currentToken == null) {
    115121            currentToken = nextToken();
     
    118124    }
    119125
    120     public String skip(char lastChar) {
     126    public Token skip(char lastChar) {
    121127        currentToken = null;
     128        int position = index;
    122129        StringBuilder result = new StringBuilder();
    123130        while (c != lastChar && c != -1) {
     
    128135            getChar();
    129136        }
    130         return result.toString();
     137        return new Token(TokenType.TEXT, position, result.toString());
    131138    }
    132139
Note: See TracChangeset for help on using the changeset viewer.