X-Git-Url: http://nitlanguage.org diff --git a/lib/html.nit b/lib/html.nit index cbc093e..4fc8530 100644 --- a/lib/html.nit +++ b/lib/html.nit @@ -27,6 +27,7 @@ module html # HTMLPage use fluent interface so you can chain calls as: # add("div").attr("id", "mydiv").text("My Div") class HTMLPage + super Streamable # Define head content fun head do end @@ -37,8 +38,7 @@ class HTMLPage private var current: HTMLTag = root private var stack = new List[HTMLTag] - # Render the page as a html string - fun render: String do + redef fun write_to(stream) do root.children.clear open("head") head @@ -46,7 +46,8 @@ class HTMLPage open("body") body close("body") - return "{root.html}" + stream.write "" + root.write_to(stream) end # Add a html tag to the current element @@ -81,19 +82,23 @@ class HTMLPage end current = stack.pop end - - # Save html page in the specified file - fun save(file: String) do - var out = new OFStream.open(file) - out.write(self.render) - out.close - end end class HTMLTag + super Streamable + # HTML tagname: 'div' for
var tag: String - init(tag: String) do self.tag = tag + init(tag: String) do + self.tag = tag + self.is_void = (once ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]).has(tag) + end + + # Is the HTML element a void element? + # + # assert (new HTMLTag("img")).is_void == true + # assert (new HTMLTag("p")).is_void == false + var is_void: Bool init with_attrs(tag: String, attrs: Map[String, String]) do self.tag = tag @@ -104,37 +109,48 @@ class HTMLTag var attrs: Map[String, String] = new HashMap[String, String] # Get the attributed value of 'prop' or null if 'prop' is undifened + # var img = new HTMLTag("img") + # img.attr("src", "./image.png").attr("alt", "image") + # assert img.get_attr("src") == "./image.png" fun get_attr(key: String): nullable String do if not attrs.has_key(key) then return null return attrs[key] end # Set a 'value' for 'key' - # var img = new HTMLTag("img") - # img.attr("src", "./image.png").attr("alt", "image") + # var img = new HTMLTag("img") + # img.attr("src", "./image.png").attr("alt", "image") + # assert img.write_to_string == """""" fun attr(key: String, value: String): HTMLTag do attrs[key] = value return self end # Add a CSS class to the HTML tag - # var img = new HTMLTag("img") - # img.add_class("logo").add_class("fullpage") + # var img = new HTMLTag("img") + # img.add_class("logo").add_class("fullpage") + # assert img.write_to_string == """""" fun add_class(klass: String): HTMLTag do classes.add(klass) return self end - private var classes: Set[String] = new HashSet[String] + + # CSS classes + var classes: Set[String] = new HashSet[String] # Add multiple CSS classes + # var img = new HTMLTag("img") + # img.add_classes(["logo", "fullpage"]) + # assert img.write_to_string == """""" fun add_classes(classes: Collection[String]): HTMLTag do self.classes.add_all(classes) return self end # Set a CSS 'value' for 'prop' - # var img = new HTMLTag("img") - # img.css("border", "2px solid black").css("position", "absolute") + # var img = new HTMLTag("img") + # img.css("border", "2px solid black").css("position", "absolute") + # assert img.write_to_string == """""" fun css(prop: String, value: String): HTMLTag do css_props[prop] = value return self @@ -142,15 +158,61 @@ class HTMLTag private var css_props: Map[String, String] = new HashMap[String, String] # Get CSS value for 'prop' + # var img = new HTMLTag("img") + # img.css("border", "2px solid black").css("position", "absolute") + # assert img.get_css("border") == "2px solid black" + # assert img.get_css("color") == null fun get_css(prop: String): nullable String do if not css_props.has_key(prop) then return null return css_props[prop] end + # Replace `self` by `parent`. + # + # var elem = new HTMLTag("li") + # elem.add_outer(new HTMLTag("ul")) + # assert elem.write_to_string == "Hello World!
" + # assert p.write_to_string == "Hello World!
" # Text is escaped see: `standard::String::html_escape` fun text(txt: String): HTMLTag do @@ -172,7 +234,7 @@ class HTMLTag # p.append("Hello") # p.add(new HTMLTag("br")) # p.append("World!") - # assert p.html == "Hello
World!
Hello
World!
Hello
Hello