@Override public void decorate(Node from, Node to) { Node title = from.get("html/head/title"); if (title != null) title.parent().children().remove(title); Node layoutTitle = to.find("g:layoutTitle"); String defaultTitle = layoutTitle.attr("default"); if (defaultTitle == null) defaultTitle = ""; replace(layoutTitle, title != null ? title : new Node("title").addText(defaultTitle)); }
public boolean checkTagLib(final Node n, RenderableList l, String dir, String offset, Set<String> imports) { if (n.name().equals("g:render")) { String model = n.attr("model"); if (model == null) model = "${[:]}"; String template = n.attr("template"); int i = template.lastIndexOf("/"); String path = ""; String collection = n.attr("collection"); if (collection != null) { Node fakeEach = new Node("g:each") .attr("in", n.attributes().remove("collection")) .add(n); String var = n.attributes().remove("var"); if (var == null) var = "it"; n.attr("model", "[" + var + ": it]"); return checkTagLib(fakeEach, l, dir, offset, imports); } else { if (TagLib.hasTag(n.name())) { Tag t = TagLib.createTag(n.name()); if (t != null) { t.setImports(imports);
protected String text(boolean recursive) { if (children == null || children.isEmpty()) { return null; } if (children.size() == 1) { if (recursive) return children.get(0).text(recursive); else return children.get(0).textOwn(); } StringBuilder sb = new StringBuilder(); text(recursive, sb); return sb.toString(); }
@Test public void gsp_1() throws IOException { String s = "<div><g:textField name=\"${it.key}\" placeholder=\"${[].collect({it})}\"/></div>"; Node root = new GspParser().parse(s); Node div = root.children().get(0); Assert.assertEquals("div", div.name()); Assert.assertEquals(1, div.children().size()); Node textField = div.children().get(0); Assert.assertEquals("g:textField", textField.name()); Assert.assertEquals(0, textField.children().size()); Assert.assertEquals(2, textField.attributes().size()); Assert.assertEquals("${it.key}", textField.attr("name")); Assert.assertEquals("${[].collect({it})}", textField.attr("placeholder")); }
@Test public void html_doctype() throws IOException { String s = "<!DOCTYPE html>"; Node doc = new HtmlParser().parse(s); Assert.assertEquals(1, doc.children().size()); Assert.assertEquals("!DOCTYPE", doc.get(0).name()); Assert.assertEquals(1, doc.get(0).attributes().size()); Assert.assertEquals(true, doc.get(0).attributes().containsKey("html")); Assert.assertEquals(null, doc.get(0).attributes().get("html")); }
@Test public void gsp_comment_4() throws IOException { String s = "<div>\n" + " before\n" + " %{--<p>text</p>--}%\n" + " after\n" + "</div>"; Node root = new GspParser().parse(s); Node div = root.children().get(0); Assert.assertEquals("div", div.name()); Assert.assertEquals(3, div.children().size()); Assert.assertEquals("before", div.get(0).text()); Assert.assertEquals("%{--<p>text</p>--}%", div.get(1).text()); Assert.assertEquals("after", div.get(2).text()); }
public void prepare(Node n, RenderableList l, String dir, String offset, boolean addNewLine, Set<String> imports) { if (n.isComment() && n instanceof GspParser.GspComment) return; if (n.name() == null) { l.append(offset); prepare(n.textOwn(), l, imports); if (addNewLine) l.append("\n"); l.append("<").append(n.name()); for (Map.Entry<String, String> attr : n.attributes().entrySet()) { l.append(" "); if (!n.isEmpty()) { l.append(">"); if (addNewLine) l.append("\n"); for (Node child : n.children()) { prepare(child, l, dir, offset + OFFSET, addNewLine, imports); l.append("</").append(n.name()).append(">"); } else if (n.name().equalsIgnoreCase("div")) l.append("></").append(n.name()).append(">"); else if (n.name().equalsIgnoreCase("!DOCTYPE")) l.append(">"); else
Assert.assertEquals("I say: '${hello}'", new XmlParser().parse(s).textOwn()); Assert.assertEquals("xml", new XmlParser().parse(s).name()); s = "<xml/>"; Assert.assertEquals("xml", new XmlParser().parse(s).name()); Assert.assertEquals(true, new XmlParser().parse(s).hasAttr("attr")); s = "<xml attr ><xml>"; Assert.assertEquals(true, new XmlParser().parse(s).hasAttr("attr")); s = "<xml attr />"; Assert.assertEquals(true, new XmlParser().parse(s).hasAttr("attr")); s = "<xml attr/>"; Assert.assertEquals(true, new XmlParser().parse(s).hasAttr("attr")); s = "<xml attr attr2/>"; Assert.assertEquals(true, new XmlParser().parse(s).hasAttr("attr")); Assert.assertEquals("qwerty", new XmlParser().parse(s).attr("attr")); s = "<xml attr=\"qwerty\" attr2/>"; Assert.assertEquals("qwerty", new XmlParser().parse(s).attr("attr")); s = "<xml attr2 attr=\"qwerty\"/>"; Assert.assertEquals("qwerty", new XmlParser().parse(s).attr("attr")); Assert.assertEquals(1, new XmlParser().parse(s).size()); s = "<xml><child/></xml>"; Assert.assertEquals(1, new XmlParser().parse(s).size()); s = "<xml><child attr=\"qwerty\"/></xml>"; Assert.assertEquals(1, new XmlParser().parse(s).size()); Assert.assertEquals("qwerty", new XmlParser().parse(s).first().attr("attr"));
@Test public void xml_comment_1() throws IOException { String s = "<div><!-- <comment> --></div>"; Node div = new XmlParser().parse(s); Assert.assertEquals(0, div.attributes().size()); Assert.assertEquals(1, div.children().size()); Assert.assertEquals(true, div.children().get(0).isComment()); Assert.assertEquals("<!--<comment>-->", div.children().get(0).ownText()); }
@Test public void gsp_page2() throws IOException { String s = "<%@ page contentType=\"text/html;charset=UTF-8\" %>\n" + "<!DOCTYPE html>\n" + "<html>\n" + "<head>\n" + " <title>title</title>\n" + "</head>" + "</html>"; Node doc = new GspParser().parse(s); Assert.assertEquals(3, doc.children().size()); Assert.assertEquals("%@", doc.get(0).name()); Assert.assertEquals("!DOCTYPE", doc.get(1).name()); Assert.assertEquals("html", doc.get(2).name()); } }
@Test public void gsp_comment_1() throws IOException { String s = "" + "<div>\n" + " %{--<p>$test</p>--}%\n" + "</div>\n"; Node root = new GspParser().parse(s); Node div = root.children().get(0); Assert.assertEquals("div", div.name()); Assert.assertEquals(1, div.children().size()); Assert.assertEquals(0, div.attributes().size()); Assert.assertEquals("%{--<p>$test</p>--}%", div.children().get(0).textOwn()); }
protected RenderableList prepareView(String view, String offset) { String template = resourceTools.getResourceAsString(view); if (template == null) throw new IllegalArgumentException("view '" + view + "' not found"); String dir = view.substring(0, view.lastIndexOf("/") + 1); RenderableList l = new RenderableList(); Node html = new GspParser().parse(template); Set<String> imports = new HashSet<>(); readImports(html, imports); Node layoutTag = html.get("html/head/meta[@name=layout]"); if (layoutTag != null) { layoutTag.parent().children().remove(layoutTag); String layoutContent = resourceTools.getResourceAsString("views/layouts/" + layoutTag.attr("content") + ".gsp"); if (layoutContent == null) throw new IllegalArgumentException("Layout '" + layoutTag.attr("content") + "' not found"); Node layout = new GspParser().parse(layoutContent); readImports(layout, imports); for (Decorator decorator : DependencyFactory.get(DecoratorLib.class).list()) { decorator.decorate(html, layout); } html = layout; } prepare(html.children(), l, dir, offset, imports); return l; }
public Node get(int i) { return children().get(i); }
@Test public void gsp_comment_2() throws IOException { String s = "" + "<div %{--foo=\"${bar}\"--}%>\n" + " \n" + "</div>\n"; Node root = new GspParser().parse(s); Node div = root.children().get(0); Assert.assertEquals("div", div.name()); Assert.assertEquals(0, div.children().size()); Assert.assertEquals(0, div.attributes().size()); }
@Test public void html_2() throws IOException { String s = "<div width=100px></div>"; Node root = new HtmlParser().parse(s); Node div = root.children().get(0); Assert.assertEquals(1, div.attributes().size()); Assert.assertEquals(0, div.children().size()); Assert.assertEquals("100px", div.attr("width")); s = "<div width=100px height=50px></div>"; root = new HtmlParser().parse(s); div = root.children().get(0); Assert.assertEquals(2, div.attributes().size()); Assert.assertEquals(0, div.children().size()); Assert.assertEquals("100px", div.attr("width")); Assert.assertEquals("50px", div.attr("height")); }
"</div>"; Node div = new XmlParser().parse(s); Assert.assertEquals(0, div.attributes().size()); Assert.assertEquals(3, div.children().size()); Assert.assertEquals(1, div.getLineNumber()); b = div.children().get(0); Assert.assertEquals(1, b.children().size()); Assert.assertEquals(2, b.getLineNumber()); Assert.assertEquals(3, b.children().get(0).getLineNumber()); b = div.children().get(1); Assert.assertEquals(1, b.children().size()); Assert.assertEquals(5, b.getLineNumber()); Assert.assertEquals(8, b.children().get(0).getLineNumber()); b = div.children().get(2); Assert.assertEquals(true, b.isComment()); Assert.assertEquals(10, b.getLineNumber());
public Node parse(Node xml, String s) { s = s.trim(); int i; T context = createContext(); xml.name("document"); Node child = new Node(); while ((i = context.parse(s.toCharArray(), child) + 1) < s.length()) { if (child.name == null && child.children.size() == 1) child = child.children.get(0); xml.add(child); child = new Node(); context = createContext(); context.i = i; } if (child.name == null && child.children.size() == 1) child = child.children.get(0); xml.add(child); return xml; }
@Test public void gsp_4() throws IOException { String s = "<div><script>\n" + " var a\n" + " for(var i=0; i<10;i++) {\n" + " a+=i;" + " }\n" + "</script></div>"; Node root = new GspParser().parse(s); Node div = root.children().get(0); Assert.assertEquals(1, div.children().size()); Node script = div.children.get(0); Assert.assertEquals("var a\n" + " for(var i=0; i<10;i++) {\n" + " a+=i;" + " }\n", script.text()); }