X-Git-Url: http://git.megacz.com/?p=org.ibex.xt.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fxt%2FTemplate.java;fp=src%2Forg%2Fibex%2Fxt%2FTemplate.java;h=e94136423da30a92fe0e587142a066270741b715;hp=000670f88a906bc545c34eb1d9ac383663472892;hb=e8f5044051de70a1cdad65df9c5ed6bff3cd1a08;hpb=3f3b2560f1b42d5417b8622ae66648ec042b1159 diff --git a/src/org/ibex/xt/Template.java b/src/org/ibex/xt/Template.java index 000670f..e941364 100644 --- a/src/org/ibex/xt/Template.java +++ b/src/org/ibex/xt/Template.java @@ -88,7 +88,8 @@ public class Template extends Node.Stream.Filter implements Node.Stream.Functor public boolean __read(final Node n) { if (!upstreamRead(n)) return false; if (n.cdata != null) return true; - final String uri = n.uri; + String uri = n.uri; + if (uri == null) uri = "http://www.w3.org/1999/xhtml"; // FIXME FIXME FIXME!!!! final String name = n.name; if (uri.indexOf(':') == -1) throw new RuntimeException("uri does not contain a colon: " + uri + " (tag name " + name + ")"); @@ -98,11 +99,15 @@ public class Template extends Node.Stream.Filter implements Node.Stream.Functor } else if (method.equals("webinf")) { return graft(newTemplate(servletscope, copyNodeToScope(transform(n, scope), new Scope(servletscope)), servletscope.getRealPath("/") + "/WEB-INF/" + rest + name), n).upstreamRead(n); + } else if (uri.equals("http://xt.ibex.org/form")) { + return graft(new InputTag(n.name), n).upstreamRead(n); } else if (uri.equals("http://xt.ibex.org/")) { //#switch(name) + case "form": return graft(new FormTag(n.attr("class")), n).upstreamRead(n); + case "input": return graft(new InputTag(n.attr("field")), n).upstreamRead(n); case "if": transform(n, scope); - return graft((Node.Stream.Functor)("true".equals(n.attr("if")) ? new DropTag() : new DropAll()), n).upstreamRead(n); + return graft((Node.Stream.Functor)("true".equals(n.attr("if"))?new DropTag():new DropAll()), n).upstreamRead(n); case "js": return graft(new JsTag(scope), n).upstreamRead(n); case "foreach": return graft(new ForEach(n, scope), n).upstreamRead(n); case "children": @@ -158,6 +163,42 @@ public class Template extends Node.Stream.Filter implements Node.Stream.Functor } } + private class InputTag implements Node.Stream.Functor { + final String fieldName; + public InputTag(String fieldName) { this.fieldName = fieldName; } + public Node.Stream wrap(Node.Stream kids) { + try { + return new Node.Stream.FromXML(new StringReader(servletscope.currentForm.emit(fieldName))); + } catch (Exception e) { Log.warn(this, e); return null; } + } + } + + private class FormTag implements Node.Stream.Functor { + final String classname; + public FormTag(String classname) { this.classname = classname; } + public Node.Stream wrap(final Node.Stream kids) { + try { + servletscope.currentForm = (Form)Class.forName(classname).newInstance(); + Log.warn("emit", servletscope.currentForm.emit()); + return new Node.Stream() { + boolean done = false; + public boolean _read(Node n) { + if (done) return kids._read(n); + done = true; + n.clear(); + n.name = "form"; + n.uri = "http://www.w3.org/1999/xhtml"; + n.numattrs = 1; + n.attrs = new String[] { "action", "/servlet/"+classname }; + return true; + } + }; + } catch (Exception e) { + Log.warn(this, e); + return null; + } + } } + private class DropTag implements Node.Stream.Functor { public Node.Stream wrap(Node.Stream kids) { return kids;