#ifndef HTML_BUILDER_H
#define HTML_BUILDER_H
#include "core/string/ustring.h"
#include "core/object/reference.h"
class Request;
class HTMLBuilder;
class WebServerRequest;
class HTMLTag {
public:
bool simple;
String result;
HTMLTag *str(const String &str);
HTMLTag *style(const String &val);
HTMLTag *href(const String &val);
HTMLTag *cls(const String &val);
HTMLTag *clsse(const String &val); //se -> skip empty
HTMLTag *id(const String &val);
HTMLTag *name(const String &val);
HTMLTag *content(const String &val);
HTMLTag *value(const String &val);
HTMLTag *accept(const String &val);
HTMLTag *src(const String &val);
HTMLTag *alt(const String &val);
HTMLTag *inputmode(const String &val);
HTMLTag *list(const String &val);
HTMLTag *rows(const String &val);
HTMLTag *cols(const String &val);
HTMLTag *enctype(const String &val);
HTMLTag *enctype_multipart_form_data();
HTMLTag *autocomplete(const String &val);
HTMLTag *autocomplete_off();
HTMLTag *autocomplete_on();
HTMLTag *autocomplete_name();
HTMLTag *autocomplete_name_honorific_prefix();
HTMLTag *autocomplete_name_given_name();
HTMLTag *autocomplete_name_additional_name();
HTMLTag *autocomplete_name_family_name();
HTMLTag *autocomplete_name_honorific_suffix();
HTMLTag *autocomplete_name_nickname();
HTMLTag *autocomplete_email();
HTMLTag *autocomplete_username();
HTMLTag *autocomplete_new_password();
HTMLTag *autocomplete_current_password();
HTMLTag *autocomplete_one_time_code();
HTMLTag *autocomplete_organization_title();
HTMLTag *autocomplete_organization();
HTMLTag *autocomplete_street_address();
HTMLTag *autocomplete_address_line1();
HTMLTag *autocomplete_address_line2();
HTMLTag *autocomplete_address_line3();
HTMLTag *autocomplete_address_level_1();
HTMLTag *autocomplete_address_level_2();
HTMLTag *autocomplete_address_level_3();
HTMLTag *autocomplete_address_level_4();
HTMLTag *autocomplete_country();
HTMLTag *autocomplete_country_name();
HTMLTag *autocomplete_postal_code();
HTMLTag *autocomplete_cc_name();
HTMLTag *autocomplete_cc_given_name();
HTMLTag *autocomplete_cc_additional_name();
HTMLTag *autocomplete_cc_family_name();
HTMLTag *autocomplete_cc_number();
HTMLTag *autocomplete_cc_exp();
HTMLTag *autocomplete_cc_exp_month();
HTMLTag *autocomplete_cc_exp_year();
HTMLTag *autocomplete_cc_csc();
HTMLTag *autocomplete_cc_type();
HTMLTag *autocomplete_transaction_currency();
HTMLTag *autocomplete_transaction_amount();
HTMLTag *autocomplete_language();
HTMLTag *autocomplete_bday();
HTMLTag *autocomplete_bday_day();
HTMLTag *autocomplete_bday_month();
HTMLTag *autocomplete_bday_year();
HTMLTag *autocomplete_sex();
HTMLTag *autocomplete_tel();
HTMLTag *autocomplete_tel_country_code();
HTMLTag *autocomplete_tel_national();
HTMLTag *autocomplete_tel_area_code();
HTMLTag *autocomplete_tel_local();
HTMLTag *autocomplete_tel_extension();
HTMLTag *autocomplete_impp();
HTMLTag *autocomplete_url();
HTMLTag *autocomplete_photo();
HTMLTag *onclick(const String &val);
HTMLTag *checked(const bool val = true);
HTMLTag *selected(const bool val = true);
HTMLTag *autofocus(const bool val = true);
HTMLTag *disabled(const bool val = true);
HTMLTag *multiple(const bool val = true);
HTMLTag *required(const bool val = true);
HTMLTag *spellcheck(const bool val);
HTMLTag *max(const String &val);
HTMLTag *min(const String &val);
HTMLTag *step(const String &val);
HTMLTag *step_any();
HTMLTag *minlength(const int val);
HTMLTag *minlength(const String &val);
HTMLTag *maxlength(const int val);
HTMLTag *maxlength(const String &val);
HTMLTag *size(const int val);
HTMLTag *size(const String &val);
HTMLTag *width(const int val);
HTMLTag *width(const String &val);
HTMLTag *height(const int val);
HTMLTag *height(const String &val);
HTMLTag *pattern(const String &val);
HTMLTag *method(const String &val);
HTMLTag *method_get();
HTMLTag *method_post();
HTMLTag *action(const String &val);
HTMLTag *type(const String &val);
HTMLTag *placeholder(const String &val);
HTMLTag *fora(const String &val); // for attrib -> for is reserved keyword
HTMLTag *rel(const String &val);
HTMLTag *rel_stylesheet();
HTMLTag *rel_alternate();
HTMLTag *rel_author();
HTMLTag *rel_bookmark();
HTMLTag *rel_external();
HTMLTag *rel_help();
HTMLTag *rel_license();
HTMLTag *rel_next();
HTMLTag *rel_nofollow();
HTMLTag *rel_noopener();
HTMLTag *rel_noreferrer();
HTMLTag *rel_prev();
HTMLTag *rel_search();
HTMLTag *rel_tag();
HTMLTag *charset(const String &val);
HTMLTag *charset_utf_8();
HTMLTag *itbutton();
HTMLTag *itcheckbox();
HTMLTag *itcolor();
HTMLTag *itdate();
HTMLTag *itdatetime_local();
HTMLTag *itemail();
HTMLTag *itfile();
HTMLTag *ithidden();
HTMLTag *itimage();
HTMLTag *itmonth();
HTMLTag *itnumber();
HTMLTag *itpassword();
HTMLTag *itradio();
HTMLTag *itrange();
HTMLTag *itreset();
HTMLTag *itsearch();
HTMLTag *itsubmit();
HTMLTag *ittel();
HTMLTag *ittext();
HTMLTag *ittime();
HTMLTag *iturl();
HTMLTag *itweek();
HTMLTag *inputmode_none();
HTMLTag *inputmode_text();
HTMLTag *inputmode_decimal();
HTMLTag *inputmode_numeric();
HTMLTag *inputmode_tel();
HTMLTag *inputmode_search();
HTMLTag *inputmode_email();
HTMLTag *inputmode_url();
HTMLTag *attrib(const String &attr, const String &val);
HTMLTag *start(const String &p_new_tag, const bool p_simple = false);
HTMLTag *reset();
HTMLTag *close();
HTMLBuilder *f();
bool has_data();
HTMLTag();
HTMLBuilder *owner;
};
class HTMLBuilder {
public:
String result;
HTMLBuilder *comment(const String &val);
HTMLTag *doctype();
HTMLBuilder *doctype(const String &val);
HTMLTag *a();
HTMLTag *abbr();
HTMLTag *acronym(); // Not supported in HTML5.
HTMLTag *address();
HTMLTag *applet(); // Not supported in HTML5.
HTMLTag *area();
HTMLTag *article();
HTMLTag *aside();
HTMLTag *audio();
HTMLTag *b();
HTMLTag *basefont(); // Not supported in HTML5.
HTMLTag *bdi();
HTMLTag *bdo();
HTMLTag *big(); // Not supported in HTML5.
HTMLTag *blockquote();
HTMLTag *body();
HTMLTag *br();
HTMLTag *button();
HTMLTag *canvas();
HTMLTag *caption();
HTMLTag *center(); // Not supported in HTML5.
HTMLTag *cite();
HTMLTag *code();
HTMLTag *col();
HTMLTag *colgroup();
HTMLTag *data();
HTMLTag *datalist();
HTMLTag *dd();
HTMLTag *del();
HTMLTag *details();
HTMLTag *dfn();
HTMLTag *dialog();
HTMLTag *dir(); // Not supported in HTML5.
HTMLTag *div();
HTMLTag *dl();
HTMLTag *dt();
HTMLTag *em();
HTMLTag *embed();
HTMLTag *fieldset();
HTMLTag *figcaption();
HTMLTag *figure();
HTMLTag *font(); // Not supported in HTML5.
HTMLTag *footer();
HTMLTag *form();
HTMLTag *frame(); // Not supported in HTML5.
HTMLTag *frameset(); // Not supported in HTML5.
HTMLTag *h1();
HTMLTag *h2();
HTMLTag *h3();
HTMLTag *h4();
HTMLTag *h5();
HTMLTag *h6();
HTMLTag *head();
HTMLTag *header();
HTMLTag *hr();
HTMLTag *html();
HTMLTag *i();
HTMLTag *iframe();
HTMLTag *img();
HTMLTag *input();
HTMLTag *ins();
HTMLTag *kbd();
HTMLTag *label();
HTMLTag *legend();
HTMLTag *li();
HTMLTag *link();
HTMLTag *main();
HTMLTag *map();
HTMLTag *mark();
HTMLTag *meta();
HTMLTag *meter();
HTMLTag *nav();
HTMLTag *noframes(); // Not supported in HTML5.
HTMLTag *noscript();
HTMLTag *objectt(); //