@Nullable private static Prism4j.Token findToken(@NonNull Prism4j.Grammar grammar, @NonNull String[] parts, int index) { final String part = parts[index]; final boolean last = index == parts.length - 1; for (Prism4j.Token token : grammar.tokens()) { if (part.equals(token.name())) { if (last) { return token; } else { final Prism4j.Grammar inside = findFirstInsideGrammar(token); if (inside != null) { return findToken(inside, parts, index + 1); } else { break; } } } } return null; }
public static void insertBeforeToken( @NonNull Prism4j.Grammar grammar, @NonNull String path, Prism4j.Token... tokens ) { if (tokens == null || tokens.length == 0) { return; } final String[] parts = path.split("/"); insertBeforeToken(grammar, parts, 0, tokens); }
insertTokensAt(i, grammarTokens, tokens); } else { final Prism4j.Grammar inside = findFirstInsideGrammar(token); if (inside != null) { insertBeforeToken(inside, parts, index + 1, tokens);
@NonNull public static Prism4j.Grammar extend( @NonNull Prism4j.Grammar grammar, @NonNull String name, Prism4j.Token... tokens) { // we clone the whole grammar, but override top-most tokens that are passed here final int size = tokens != null ? tokens.length : 0; if (size == 0) { return new GrammarImpl(name, clone(grammar).tokens()); } final Map<String, Prism4j.Token> overrides = new HashMap<>(size); for (Prism4j.Token token : tokens) { overrides.put(token.name(), token); } final List<Prism4j.Token> origins = grammar.tokens(); final List<Prism4j.Token> out = new ArrayList<>(origins.size()); Prism4j.Token override; for (Prism4j.Token origin : origins) { override = overrides.get(origin.name()); if (override != null) { out.add(override); } else { out.add(clone(origin)); } } return new GrammarImpl(name, out); }
/** * Helper method to find a token inside grammar. Supports lookup in `inside` grammars. For * example given the path: {@code first-token/then-another/and-more } this method will do: * <ul> * <li>Look for `first-token` at root level of supplied grammar</li> * <li>If it\'s found search for first pattern with `inside` grammar</li> * <li>If it\'s found search for `then-another` token in this inside grammar</li> * <li>etc</li> * </ul> * Simple path {@code simple-root-level } is also supported * * @param grammar {@link ru.noties.prism4j.Prism4j.Grammar} * @param path argument to find a {@link ru.noties.prism4j.Prism4j.Token} * @return a found {@link ru.noties.prism4j.Prism4j.Token} or null */ @Nullable public static Prism4j.Token findToken(@NonNull Prism4j.Grammar grammar, @NonNull String path) { final String[] parts = path.split("/"); return findToken(grammar, parts, 0); }
out.add(override); } else { out.add(clone(origin));