protected int getEnd(final Source source, int pos) { final ParseText parseText=source.getParseText(); boolean insideQuotes=false; do { final char c=parseText.charAt(pos); if (c=='"') { insideQuotes=!insideQuotes; } else if (c=='>' && !insideQuotes) { return pos+1; } } while ((++pos)<source.getEnd()); return -1; } }
protected int getEnd(final Source source, int pos) { final ParseText parseText=source.getParseText(); boolean insideQuotes=false; boolean insideSquareBrackets=false; do { final char c=parseText.charAt(pos); if (insideQuotes) { if (c=='"') insideQuotes=false; } else { switch (c) { case '>': if (!insideSquareBrackets) return pos+1; break; case '"': insideQuotes=true; break; case '[': insideSquareBrackets=true; break; case ']': insideSquareBrackets=false; break; } } } while ((++pos)<source.getEnd()); return -1; } }
public List<TemplateNode> parse(Reader reader, String className) throws IOException { source = new Source(reader); use(source, "std", "org.teavm.flavour.components.standard"); use(source, "event", "org.teavm.flavour.components.events"); use(source, "attr", "org.teavm.flavour.components.attributes"); use(source, "html", "org.teavm.flavour.components.html"); pushVar("this", new GenericClass(className)); position = source.getBegin(); List<TemplateNode> nodes = new ArrayList<>(); parseSegment(source.getEnd(), nodes, elem -> true); popVar("this"); source = null; return nodes; }
public List<TemplateNode> parse(Reader reader, String className) throws IOException { source = new Source(reader); use(source, "std", "org.teavm.flavour.components.standard"); use(source, "event", "org.teavm.flavour.components.events"); use(source, "attr", "org.teavm.flavour.components.attributes"); use(source, "html", "org.teavm.flavour.components.html"); pushVar("this", new GenericClass(className)); position = source.getBegin(); List<TemplateNode> nodes = new ArrayList<>(); parseSegment(source.getEnd(), nodes, elem -> true); popVar("this"); source = null; return nodes; }
@Override public String filter(String source, Map<String, Object> properties) { Source sourceHtml = new Source(source); sourceHtml.setLogger(null); sourceHtml.fullSequentialParse(); OutputDocument outputDocument = new OutputDocument(sourceHtml); List<Tag> tags = sourceHtml.getAllTags(); int pos = 0; for (Tag tag : tags) { boolean correctAndAllowedTag = processTag(tag, outputDocument); if (!correctAndAllowedTag) { String elementName = tag.getName().toLowerCase(); if (removedTags.contains(elementName) || allowedTags.contains(elementName)) { outputDocument.remove(tag); } else { outputDocument.replace(tag, StringEscapeUtils.escapeHtml(tag.toString())); } } reencodeTextSegment(sourceHtml, outputDocument, pos, tag.getBegin()); pos = tag.getEnd(); } reencodeTextSegment(sourceHtml, outputDocument, pos, sourceHtml.getEnd()); return correctNewLineSigns(outputDocument.toString(), properties); }