#include #include "htmld.h" NAMESPACE_UPP String ToHtmlD(const char *s) { if(*s == '`') return String(++s); String result; while(*s) { if(*s == 31) result.Cat(" "); else if(*s == '<') result.Cat("<"); else if(*s == '>') result.Cat(">"); else if(*s == '&') result.Cat("&"); else if(*s == '\"') result.Cat("""); else if((byte)*s < ' ') result.Cat(NFormat("&#%d;", (byte)*s)); else result.Cat(*s); s++; } return result; } /* HtmlsD& HtmlsD::Qtf(const char *qtf) { HtmlDocOut html; html.Qtf(qtf); Cat(html.Get()); return *this; } */ HtmlsD& HtmlsD::Text(const char *s) { Cat(ToHtmlD(s)); return *this; } HtmlsD& HtmlsD::Quote(const char *s) { Cat('\"' + ToHtmlD(s) + '\"'); return *this; } HtmlsD& HtmlsD::Color(class Color color) { Quote(ColorToHtml(color)); return *this; } HtmlsD& HtmlsD::Percent(double d) { return Quote(UPP::Format("%g%%", d)); } HtmlsD& HtmlsD::Color(const char *nm, class Color c) { if(!UPP::IsNull(c)) Attr(nm); Cat('='); return Color(c); } HtmlsD& HtmlsD::Percent(const char *nm, double d) { Attr(nm); Cat('='); return Percent(d); } HtmlsD& HtmlsD::Attr(const char *a) { Cat(' '); Cat(a); return *this; } HtmlsD& HtmlsD::Attr(const char *a, const char *s) { Attr(a); Cat('='); return Quote(s); } HtmlsD& HtmlsD::Attr(const char *a, String s) { return Attr(a, ~s); } HtmlsD& HtmlsD::Attr(const char *a, int i) { return Attr(a, UPP::Format("%d", i)); } HtmlsD& HtmlsD::Attr(const char *a, double d) { return Attr(a, UPP::Format("%g", d)); } HtmlsD& HtmlsD::Attr(const char *a, Date d) { return Attr(a, UPP::Format(d)); } HtmlsD& HtmlsD::Attr(const char *a, Value v) { return Attr(a, StdFormat(v)); } HtmlsD& HtmlsD::Attp(const char *a, double v) { return v >= 0 ? Attr(a, v) : Percent(a, -v); } HtmlsD& HtmlsD::Atth(const char *a, const char *h) { Attr(a); Cat('='); Cat('\"'); Cat(h); Cat('\"'); return *this; } HtmlsD& HtmlsD::Tag(const char *tag) { Cat('<'); Cat(tag); return *this; } HtmlsD& HtmlsD::Gat() { Cat('>'); return *this; } HtmlsD& HtmlsD::Nbsp() { Cat(" "); return *this; } HtmlsD& HtmlsD::Br() { Cat("
", 4); return *this; } HtmlsD& HtmlsD::Hr() { Cat("
", 4); return *this; } HtmlsD& HtmlsD::Lf() { Cat('\n'); return *this; } HtmlsD& HtmlsD::Cat(const HtmlTagD& tag) { Cat(tag.GetTag()); Cat(tag.GetEndTag()); return *this; } HtmlTagD& HtmlTagD::Type(const char *s) { return Attr("TYPE", s); } HtmlTagD& HtmlTagD::Name(const char *s) { return Attr("NAME", s); } HtmlTagD& HtmlTagD::Name(String id) { return Attr("NAME", ~id); } HtmlTagD& HtmlTagD::Data(const char *v) { return Attr("VALUE", v); } HtmlTagD& HtmlTagD::Data(String v) { return Attr("VALUE", v); } HtmlTagD& HtmlTagD::Data(double v) { return Attr("VALUE", v); } HtmlTagD& HtmlTagD::Data(Value v) { return Attr("VALUE", v); } HtmlTagD& HtmlTagD::ReadOnly() { return Attr("READONLY"); } HtmlTagD& HtmlTagD::Multiple() { return Attr("MULTIPLE"); } HtmlTagD& HtmlTagD::Selected() { return Attr("SELECTED"); } HtmlTagD& HtmlTagD::Align(Alignment align) { switch(align) { case ALIGN_CENTER: return Attr("ALIGN", "CENTER"); case ALIGN_RIGHT: return Attr("ALIGN", "RIGHT"); default: return Attr("ALIGN", "LEFT"); } } HtmlTagD& HtmlTagD::Left() { return Align(ALIGN_LEFT); } HtmlTagD& HtmlTagD::Right() { return Align(ALIGN_RIGHT); } HtmlTagD& HtmlTagD::Center() { return Align(ALIGN_CENTER); } HtmlTagD& HtmlTagD::VAlign(Alignment align) { switch(align) { case ALIGN_CENTER: return Attr("VALIGN", "MIDDLE"); case ALIGN_BOTTOM: return Attr("VALIGN", "BOTTOM"); default: return Attr("VALIGN", "TOP"); } } HtmlTagD& HtmlTagD::Top() { return VAlign(ALIGN_TOP); } HtmlTagD& HtmlTagD::VCenter() { return VAlign(ALIGN_CENTER); } HtmlTagD& HtmlTagD::Bottom() { return VAlign(ALIGN_BOTTOM); } HtmlTagD& HtmlTagD::HotKey(char c) { return c ? Attr("ACCESSKEY", String(c, 1)) : *this; } HtmlTagD& HtmlTagD::Size(int c) { return Attr("SIZE", c); } HtmlTagD& HtmlTagD::Size(int cx, int cy) { return Attr("SIZE", Format("%d, %d", cx, cy)); } HtmlTagD& HtmlTagD::Color(class Color color) { return Color("COLOR", color); } HtmlTagD& HtmlTagD::BorderColor(class Color col) { return Color("BORDERCOLOR", col); } HtmlTagD& HtmlTagD::BgColor(class Color color) { return Color("BGCOLOR", color); } HtmlTagD& HtmlTagD::Face(const char *s) { return Attr("FACE", s); } HtmlTagD& HtmlTagD::Border(int i) { return Attr("BORDER", i); } HtmlTagD& HtmlTagD::CellSpacing(int i) { return Attr("CELLSPACING", i); } HtmlTagD& HtmlTagD::CellPadding(int i) { return Attr("CELLPADDING", i); } HtmlTagD& HtmlTagD::Width(double w) { return Attp("WIDTH", w); } HtmlTagD& HtmlTagD::Height(double h) { return Attp("HEIGHT", h); } HtmlTagD& HtmlTagD::RowSpan(int i) { return Attr("ROWSPAN", i); } HtmlTagD& HtmlTagD::ColSpan(int i) { return Attr("COLSPAN", i); } HtmlTagD& HtmlTagD::Class(const char *s) { return Attr("CLASS", s); } HtmlTagD& HtmlTagD::DataFld(const char *s) { return Attr("DATAFLD", s); } HtmlTagD& HtmlTagD::DataSrc(const char *s) { return Attr("DATASRC", s); } HtmlTagD& HtmlTagD::Href(const char *s) { return Atth("HREF", s); } HtmlTagD& HtmlTagD::HtmlId(const char *s) { return Attr("ID", s); } HtmlTagD& HtmlTagD::Lang(const char *s) { return Attr("LANG", s); } HtmlTagD& HtmlTagD::Language(const char *s) { return Attr("LANGUAGE", s); } HtmlTagD& HtmlTagD::JavaScript() { return Language("JAVASCRIPT"); } HtmlTagD& HtmlTagD::VbScript() { return Language("VBSCRIPT"); } HtmlTagD& HtmlTagD::Methods(const char *s) { return Attr("METHODS", s); } HtmlTagD& HtmlTagD::Rel(const char *s) { return Attr("REL", s); } HtmlTagD& HtmlTagD::Rev(const char *s) { return Attr("REV", s); } HtmlTagD& HtmlTagD::Style(const char *s) { return Attr("STYLE", s); } HtmlTagD& HtmlTagD::TabIndex(int i) { return Attr("TABINDEX", i); } HtmlTagD& HtmlTagD::Target(const char *s) { return Attr("TARGET", s); } HtmlTagD& HtmlTagD::TargetBlank() { return Target("_blank"); } HtmlTagD& HtmlTagD::TargetParent() { return Target("_parent"); } HtmlTagD& HtmlTagD::TargetSelf() { return Target("_self"); } HtmlTagD& HtmlTagD::TargetTop() { return Target("_top"); } HtmlTagD& HtmlTagD::Title(const char *s) { return Attr("TITLE", s); } HtmlTagD& HtmlTagD::Urn(const char *s) { return Attr("URN", s); } HtmlTagD& HtmlTagD::Alt(const char *s) { return Attr("ALT", s); } HtmlTagD& HtmlTagD::Coords(const char *s) { return Attr("COORDS", s); } HtmlTagD& HtmlTagD::NoHref() { return Attr("NOHREF"); } HtmlTagD& HtmlTagD::Shape(const char *s) { return Attr("SHAPE", s); } HtmlTagD& HtmlTagD::ShapeCirc() { return Shape("CIRC"); } HtmlTagD& HtmlTagD::ShapePoly() { return Shape("POLY"); } HtmlTagD& HtmlTagD::ShapeRect() { return Shape("RECT"); } HtmlTagD& HtmlTagD::Balance(double v) { return Attr("BALANCE", v); } HtmlTagD& HtmlTagD::Loop(int i) { return Attr("LOOP", i); } HtmlTagD& HtmlTagD::Volume(double v) { return Attr("VOLUME", v); } HtmlTagD& HtmlTagD::Src(const char *s) { return Attr("SRC", s); } HtmlTagD& HtmlTagD::Alink(class Color c) { return Color("ALINK", c); } HtmlTagD& HtmlTagD::Vlink(class Color c) { return Color("VLINK", c); } HtmlTagD& HtmlTagD::Link(class Color c) { return Color("LINK", c); } HtmlTagD& HtmlTagD::Background(const char *s) { return Attr("BACKGROUND", s); } HtmlTagD& HtmlTagD::OnClick(const char *s) { return Atth("onClick", s); } HtmlsD HtmlTagD::GetTag() const { return IsNull(tag) ? ~tag : ~tag + ">"; } HtmlsD HtmlTagD::GetEndTag() const { return end; } void HtmlTagD::Combine(const HtmlTagD& tag2) { if(tag2.IsEmpty()) return; if(!IsNull(tag)) { tag = tag + ">" + tag2.tag; end = tag2.end + end; } else { tag = tag2.tag; end = tag2.end; } } HtmlsD HtmlTagD::ApplyTo(String s) const { HtmlsD h; h.Cat(GetTag()); h.Cat(s); h.Cat(GetEndTag()); return h; } HtmlsD HtmlTagD::ApplyTo(const char *s) const { HtmlsD h; h.Cat(GetTag()); h.Cat(s); h.Cat(GetEndTag()); return h; } HtmlTagD& HtmlTagD::SingleTag(const char *s) { tag = "<"; tag.Cat(s); return *this; } HtmlTagD& HtmlTagD::PairTag(const char *s) { SingleTag(s); end = "'); end.Cat('\n'); return *this; } HtmlTagD::HtmlTagD(const char *tag) { PairTag(tag); } HtmlTagD HtmlSingleTagD(const char *tag) { return HtmlTagD().SingleTag(tag); } HtmlTagD HtmlInputD(const char *type, const char *name) { HtmlTagD tag = HtmlSingleTagD("INPUT").Type(type); if(name && *name) tag.Name(name); return tag; } HtmlTagD HtmlEditD(String name) { return HtmlInputD("TEXT", name); } HtmlTagD HtmlEditD(String name, int size, int maxlength, const char *defaultValue, bool password) { HtmlTagD tag = HtmlInputD(password ? "PASSWORD" : "TEXT", name) .Size(size).Attr("MAXLENGTH", maxlength); if(defaultValue && *defaultValue) tag.Data(defaultValue); return tag; } HtmlTagD HtmlHiddenD(String name, Value val) { return HtmlInputD("HIDDEN").Name(name).Data(val); } HtmlTagD HtmlHiddenD(const char *name, Value val) { return HtmlInputD("HIDDEN").Name(name).Data(val); } HtmlTagD HtmlHiddenD(Value val) { return HtmlHiddenD("STATE", val); } HtmlTagD HtmlSubmitD(const char *s) { return HtmlInputD("SUBMIT").Data(s); } HtmlTagD HtmlSelectD(String name) { return HtmlTagD("SELECT").Name(name); } HtmlsD HtmlOptionD(Value val, const char *text, bool selected) { HtmlTagD option("OPTION"); option.Data(val); if(selected) option.Selected(); return option / text; } HtmlTagD HtmlTableD() { return HtmlTagD("TABLE"); } HtmlTagD HtmlRowD() { return HtmlTagD("TR"); } HtmlTagD HtmlCellD() { return HtmlTagD("TD"); } /* HtmlTagD HtmlFont(Font font) { HtmlTagD tag; if(font.IsBold()) tag /= HtmlTagD("B"); if(font.IsItalic()) tag /= HtmlTagD("I"); if(font.IsUnderline()) tag /= HtmlTagD("U"); if(font.IsStrikeout()) tag /= HtmlTagD("S"); HtmlTagD fnt("FONT"); fnt.Face(FontFaceToHtml(font)); fnt.Size(FontSizeToHtml(font)); return tag / fnt; } */ HtmlTagD HtmlLinkD(const char *link) { return HtmlTagD("A").Href(link); } HtmlsD HtmlBlockD(HtmlsD html, double width, double left, double top, double right, double bottom, Alignment align) { HtmlsD h; if(top) h = HtmlRowD() / HtmlCellD().Height(top) / ""; if(left || right || align != ALIGN_LEFT) h << HtmlRowD() / ( HtmlCellD().Width(left) + HtmlCellD().Align(align).Width(width) / html + HtmlCellD().Width(right) ); if(bottom) h << HtmlRowD() / HtmlCellD().Height(bottom) / ""; return !IsNull(h) ? HtmlTableD().Border(0).Width(-100).CellSpacing(0).CellPadding(0) / h : html; } HtmlTagD HtmlHeaderD(const char *title, String css, const char *other) { String h = "HTML>\r\n" "\t\n" "\t\n" "\t\n" "" + String(title) + "\r\n" ; if(!IsNull(css)) h << "\r\n"; if(other) h << other; h << "\n" + t2.Tag(); t.End() = t2.End() + "\n" + t1.End(); return t; } } HtmlsD operator % (const HtmlTagD& tag, const char *s) { HtmlsD h; h.Cat(tag.GetTag()); h.Lf(); h.Cat(s); h.Lf(); h.Cat(tag.GetEndTag()); // h.Lf(); return h; } HtmlTagD HtmlFontColorD(Color c) { return !IsNull(c) ? HtmlTagD("FONT").Color(c) : HtmlTagD(); } HtmlTagD HtmlFontSizeD(int s) { return HtmlTagD("FONT").Attr("SIZE", s); } HtmlTagD HtmlLinkD(const char *link, const char *target) { HtmlTagD tag("A"); tag.Href(link); if(target && *target) tag.Target(target); return tag; } HtmlTagD HtmlImgD(String src, String alt) { return HtmlSingleTagD("IMG").Src(src).Alt(alt); } HtmlsD HtmlTextAreaD(String name, Size size, const char *defaultValue) { return HtmlTagD("TEXTAREA").Name(name).Attr("ROWS", size.cy).Attr("COLS", size.cx) .Attr("WRAP", "virtual") / ToHtmlD(defaultValue ? defaultValue : ""); } HtmlTagD HtmlButtonD(String name, const char *text) { return HtmlInputD("SUBMIT", name).Data(text); } HtmlTagD HtmlWarnD(Color color) { return HtmlItalicD() / HtmlFontColorD(color); } HtmlTagD HtmlPackedTableD() { return HtmlTableD().Border(0).CellSpacing(0).CellPadding(0); } HtmlTagD HtmlFormD(String action, bool multipart, String method) { HtmlTagD tag = HtmlTagD("FORM").Attr("ACTION", action).Attr("METHOD", method); if(multipart) tag.Attr("ENCTYPE", "multipart/form-data"); return tag; } HtmlsD HtmlUploadD(String name) { return HtmlInputD("FILE", name); } HtmlsD HtmlCheckD(String name, bool on) { HtmlTagD tag = HtmlInputD("CHECKBOX", name).Data("1"); if(on) tag.Attr("CHECKED"); return tag; } HtmlTagD HtmlTCellD() { return HtmlCellD().Top(); } HtmlTagD HtmlRowCellD() { return HtmlRowD() % HtmlCellD(); } HtmlTagD HtmlRowTCellD() { return HtmlRowD() % HtmlTCellD(); } HtmlsD HtmlMenuD(bool active, const char *text, const char *url, int wd) { HtmlTagD table = HtmlTableD().CellSpacing(0).Border(2) .BorderColor(Black).BgColor(active ? Yellow : WhiteGray); if(wd) table.Width(wd); return table % HtmlRowD() % HtmlCellD().Center() / HtmlLinkD(url) / HtmlFontColorD(Black) / (active ? HtmlBoldD() / text : HtmlsD(text)); } HtmlTagD HtmlDialogD(int width) { return HtmlTableD().Width(width).CellSpacing(0).CellPadding(1).Border(1).BgColor(WhiteGray) % HtmlRowD() % HtmlCellD() % HtmlTableD().Width(-100).CellSpacing(4).CellPadding(0).Border(0).BgColor(WhiteGray); } HtmlsD HtmlHeadD(String title, const char *charset) { HtmlsD head; head << HtmlTagD("TITLE") / title << "\n" << HtmlSingleTagD("META") .Attr("HTTP-EQUIV", "Content-Type") .Attr("CONTENT", String("text/html; charset=") + charset); return HtmlTagD("HEAD") % ~head + "\n\n"; } HtmlsD HtmlPageD(String title, const HtmlsD& body, Color bgcolor, const char *charset) { return HtmlTagD("HTML") % ~(HtmlHeadD(title, charset) + HtmlTagD("BODY").BgColor(bgcolor) % ~body); } HtmlsD HtmlTitlePageD(String title, const HtmlsD& body, Color bgcolor, const char *charset) { return HtmlPageD(title, HtmlTagD("H1") / title + "\n\n" + body, bgcolor); } HtmlTagD HtmlLineD() { return HtmlRowD() / HtmlCellD(); } HtmlTagD HtmlParaD() { return HtmlTagD("p"); } HtmlTagD HtmlCourierD(int size) { return HtmlTagD("span") .Attr("style", Sprintf("font-size: %dpt; font-family: monospace;", size)); } HtmlTagD HtmlArialD(int size) { return HtmlTagD("span") .Attr("style", Sprintf("font-size: %dpt; font-family: sans-serif;", size)); } HtmlTagD HtmlRomanD(int size) { return HtmlTagD("span") .Attr("style", Sprintf("font-size: %dpt; font-family: serif;", size)); } HtmlTagD HtmlCourierD() { return HtmlTagD("span").Attr("style", "font-family: monospace;"); } HtmlTagD HtmlArialD() { return HtmlTagD("span").Attr("style", "font-family: sans-serif;"); } HtmlTagD HtmlRomanD() { return HtmlTagD("span").Attr("style", "font-family: serif;"); } HtmlTagD HtmlFntSizeD(int size) { return HtmlTagD("span").Attr("style", Sprintf("font-size: %dpt", size)); } END_UPP_NAMESPACE