Html Generation
[Previous]  [Next] 
|
User Manual [Previous]  [Next] Html GenerationThe first example below illustrates the generation template capability of Umple. It is an html generation library. The second example is a program that uses the first example. Example// Umple library for generating html // Currently it supports h1, h2 ... as well as p, and table tags. // This will be extended to support more of html later // It serves as an illustration of Umple's generation templates strictness allow 75; // We are going to allow custom constructors // Class representing either a top level html node or a collection of subnodes class HtmlNode { String getContent() {return "";}; // should be abstract } // Simple text to be output between tags - these are leaves class HtmlTextNode { isA HtmlNode; String content; } // Non-leaf nodes in the html tree class HtmlRegularNode { isA HtmlNode; const String Xmltagstart = "<"; const String Xmltagend = ">"; // Arguments for the constructor String tag; // e.g. p, h1, a String arguments; // e.g. href 0..1 -> * HtmlNode subnodes; // whatever to emit between tags // The following template will render any html node rendering <<!<<=Xmltagstart>><<=getTag()>> <<=getArguments()>><<=Xmltagend>> <<# for(HtmlNode n : getSubnodes()) {#>><<=n.getContent()>> <<#}#>><<=Xmltagstart>>/<<=getTag()>><<=Xmltagend>>!>> emit getContent()(rendering); HtmlTable table() { HtmlTable t = new HtmlTable(); addSubnode(t); return t; } HtmlTextNode text(String s) { HtmlTextNode t = new HtmlTextNode(s); addSubnode(t); return(t); } HtmlRegularNode taggedText(String tag, String arguments, String s) { HtmlRegularNode r = new HtmlRegularNode(tag, arguments); HtmlTextNode t = new HtmlTextNode(s); r.addSubnode(t); addSubnode(r); return(r); } } class HtmlTable { isA HtmlRegularNode; HtmlTable() { super("table",""); } HtmlRow tr() { HtmlRow r = new HtmlRow(); addSubnode(r); return r; } } class HtmlRow { isA HtmlRegularNode; HtmlRow() { super("tr",""); } // Add a cell that contains text HtmlCell td(String s) { HtmlCell c = td(); c.text(s); return(c); } // Add a cell that can contain anything HtmlCell td() { HtmlCell c = new HtmlCell(); addSubnode(c); return c; } } class HtmlCell { isA HtmlRegularNode; HtmlCell() { super("td",""); } } class HtmlGen { lazy HtmlNode firstNode; // Subtrees for the header and body 0..1 -> * HtmlNode headerNodes; 0..1 -> * HtmlNode bodyNodes; after constructor { firstNode = new HtmlTextNode(filehead()); } filehead <<!<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">!>> emit filehead()(filehead); xmlns <<!xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"!>> emit xmlns()(xmlns); wholefile <<!<<=getFirstNode().getContent()>> <html <<=xmlns()>> > <head> <<#for(HtmlNode h: getHeaderNodes()) {#>> <<=h.getContent()>> <<#}#>> </head> <body> <<#for(HtmlNode h: getBodyNodes()) {#>> <<=h.getContent()>> <<#}#>> </body> </html> !>> emit wholefile()(wholefile); // Creates a new simple node; but does not add it anywhere HtmlRegularNode simpleNode(String tag, String content) { HtmlTextNode t = new HtmlTextNode(content); HtmlRegularNode r = new HtmlRegularNode(tag,""); r.addSubnode(t); return r; } // Add a top level node of any type that contains a string HtmlNode addNode(HtmlNode n) { addBodyNode(n); return n; } // Add a node of any type that contains a string HtmlRegularNode addSimpleNode(String tag, String text) { HtmlRegularNode t = simpleNode(tag,text); addBodyNode(t); return t; } // Adds a top level header at a certain level with plain text // Subsequent calls can be made to add additional elements // to the result HtmlRegularNode h(int level, String text) { return addSimpleNode("h"+level,text); } // Adds a top level p with plain text // Subsequent calls can add additional elements to the p // beyond just the text HtmlRegularNode p(String text) { return addSimpleNode("p",text); } // Adds a top level table HtmlTable table() { HtmlTable t = new HtmlTable(); addBodyNode(t); return t; } } Load the above code into UmpleOnline Another Example// Umple program demonstrating generation // of the html generation library for Umple use ../HtmlGeneration.ump; class TimesTable { public static void main(String[] argv) { int times = 10; // default HtmlGen h = new HtmlGen(); HtmlRegularNode p; if(argv.length > 0) { times=Integer.parseInt(argv[0]); } // Specify the table main header h.h(1, "Multiplication Table: "+times); // Generate an explanatory paragraph p = h.p("The following is a "); p.taggedText("i","","simple"); p.text(" multiplication table"); // Generate another paragraph with some subnodes // showing a slightly different use of the API p = new HtmlRegularNode("p",""); h.addNode(p); p.text("Nodes in "); p.taggedText("font", "color=\"red\"", "red"); p.text(" are powers of 3"); h.h(2, "The table"); // Create a table at the top level HtmlTable t=h.table(); // Add the top row of the table HtmlRow r; r=t.tr(); r.td("*"); for(int i=1; i<= times; i++) { r.td().taggedText("b","",""+i);; } // Add the interior rows of the table for(int i=1; i<= times; i++) { r=t.tr(); r.td().taggedText("b","",""+i); for(int j=1; j<= times; j++) { String output=""+i*j; if((i*j)%3==0) { HtmlCell c = r.td(); c.taggedText("font", "color=\"red\"",output); } else { r.td(output); } } } System.out.println(h.wholefile()); } } Load the above code into UmpleOnline |