use of uk.me.parabola.mkgmap.scan.Token in project mkgmap by openstreetmap.
the class RuleFileReader method readIf.
private boolean readIf(TokenScanner scanner, ExpressionReader expressionReader) {
// Take the 'if' token
Token tok = scanner.nextToken();
scanner.skipSpace();
// If 'if'' is being used as a keyword then it is followed by a '('.
Token next = scanner.peekToken();
if (next.getType() == TokType.SYMBOL && next.isValue("(")) {
Op origExpr = expressionReader.readConditions();
scanner.validateNext("then");
// add rule expr { set <ifVar> = true }
String ifVar = getNextIfVar();
ArrayList<Action> actions = new ArrayList<>(1);
actions.add(new AddTagAction(ifVar, "true", true));
ActionList actionList = new ActionList(actions, Collections.singleton(ifVar + "=true"));
saveRule(scanner, origExpr, actionList, null);
// create expression (<ifVar> = true)
EqualsOp safeExpr = new EqualsOp();
safeExpr.setFirst(new GetTagFunction(ifVar));
safeExpr.setSecond(new ValueOp("true"));
Op[] ifExpressions = { origExpr, safeExpr };
ifStack.addLast(ifExpressions);
return true;
} else {
// Wrong syntax for if statement, so push back token to allow a possible expression to be read
scanner.pushToken(tok);
}
return false;
}
use of uk.me.parabola.mkgmap.scan.Token in project mkgmap by openstreetmap.
the class ActionReader method readActions.
public ActionList readActions() {
List<Action> actions = new ArrayList<>();
Set<String> changeableTags = new HashSet<>();
scanner.skipSpace();
if (!scanner.checkToken("{"))
return new ActionList(actions, changeableTags);
scanner.nextToken();
while (inAction()) {
Token tok = scanner.nextToken();
if (tok.isValue(";"))
continue;
if (tok.isValue("'") || tok.isValue("\""))
throw new SyntaxException(scanner, "quoted word found where command expected");
String cmd = tok.getValue();
if ("set".equals(cmd)) {
actions.add(readTagValue(true, changeableTags));
} else if ("add".equals(cmd)) {
actions.add(readTagValue(false, changeableTags));
} else if ("setaccess".equals(cmd)) {
actions.add(readAccessValue(true, changeableTags));
} else if ("addaccess".equals(cmd)) {
actions.add(readAccessValue(false, changeableTags));
} else if ("apply".equals(cmd)) {
actions.add(readAllCmd(false));
} else if ("apply_once".equals(cmd)) {
actions.add(readAllCmd(true));
} else if ("name".equals(cmd)) {
actions.add(readValueBuilder(new NameAction()));
changeableTags.add("mkgmap:label:1");
} else if ("addlabel".equals(cmd)) {
actions.add(readValueBuilder(new AddLabelAction()));
for (int labelNo = 1; labelNo <= 4; labelNo++) changeableTags.add("mkgmap:label:" + labelNo);
} else if ("delete".equals(cmd)) {
String tag = scanner.nextWord();
actions.add(new DeleteAction(tag));
} else if ("deletealltags".equals(cmd)) {
actions.add(new DeleteAllTagsAction());
} else if ("rename".equals(cmd)) {
String from = scanner.nextWord();
String to = scanner.nextWord();
Action act = new RenameAction(from, to);
actions.add(act);
// The 'to' tag may come into existence and you may attempt
// to match on it, therefore we have to save it.
changeableTags.add(to);
// the from tag must not be dropped from the input
usedTags.add(from);
} else if ("echo".equals(cmd)) {
String str = scanner.nextWord();
actions.add(new EchoAction(str));
} else if ("echotags".equals(cmd)) {
String str = scanner.nextWord();
actions.add(new EchoTagsAction(str));
} else {
throw new SyntaxException(scanner, "Unrecognised command '" + cmd + '\'');
}
scanner.skipSpace();
}
if (scanner.checkToken("}"))
scanner.nextToken();
scanner.skipSpace();
return new ActionList(actions, changeableTags);
}
use of uk.me.parabola.mkgmap.scan.Token in project mkgmap by openstreetmap.
the class SrtTextReader method expandState.
/**
* Within an 'expand' command. The whole command is read before return, they can not span
* lines.
*
* @param tok The first token after the keyword.
*/
private void expandState(TokenScanner scanner, Token tok) {
String val = tok.getValue();
Code code = new Code(scanner, val).read();
String s = scanner.nextValue();
if (!s.equals("to"))
throw new SyntaxException(scanner, "Expected the word 'to' in expand command");
int secondary = 0;
int tertiary = 0;
int num = 0;
while (!scanner.isEndOfFile()) {
Token t = scanner.nextRawToken();
if (t.isEol())
break;
if (t.isWhiteSpace())
continue;
Code r = new Code(scanner, t.getValue()).read();
CodePosition cp = new CodePosition();
int b = r.getBval();
int primary = sort.getPrimary(b);
cp.setPrimary((char) primary);
// character so adjust the ordering at other strengths. May need further tweaks.
if (EXPERIMENTAL) {
secondary = sort.getSecondary(b);
tertiary = sort.getTertiary(b);
if (num++ == 0) {
Integer max = maxSec.get(primary);
secondary += max == null ? 0 : max;
if (charFlags(code) == 1) {
max = maxTert.get(primary);
tertiary += max == null ? 0 : max;
}
} else {
secondary = 1;
}
cp.setSecondary((byte) (secondary));
cp.setTertiary((byte) (tertiary));
} else {
num++;
secondary = sort.getSecondary(b) & 0xff;
cp.setSecondary((byte) (secondary + 7));
tertiary = sort.getTertiary(b) & 0xff;
cp.setTertiary((byte) (tertiary + 2));
}
expansions.add(cp);
}
int flags = charFlags(code) | (num - 1) << 4;
sort.add(code.getBval(), expansions.size() - num + 1, 0, 0, flags);
state = IN_INITIAL;
}
use of uk.me.parabola.mkgmap.scan.Token in project mkgmap by openstreetmap.
the class CommonSection method readColourInfo.
/**
* Read the colour lines from the XPM format image.
*/
protected ColourInfo readColourInfo(TokenScanner scanner, String header) {
ColourInfo colourInfo = new ColourInfo();
parseXpmHeader(scanner, colourInfo, header);
for (int i = 0; i < colourInfo.getNumberOfColours(); i++) {
scanner.validateNext("\"");
int cpp = colourInfo.getCharsPerPixel();
Token token = scanner.nextRawToken();
String colourTag = token.getValue();
while (colourTag.length() < cpp) colourTag += scanner.nextRawToken().getValue();
colourTag = colourTag.substring(0, cpp);
scanner.validateNext("c");
String colour = scanner.nextValue();
if (colour.charAt(0) == '#') {
colour = scanner.nextValue();
colourInfo.addColour(colourTag, new Rgb(colour));
} else if (colour.equalsIgnoreCase("none")) {
colourInfo.addTransparent(colourTag);
} else {
throw new SyntaxException(scanner, "Unrecognised colour: " + colour);
}
scanner.validateNext("\"");
readExtraColourInfo(scanner, colourInfo);
}
return colourInfo;
}
Aggregations