19a747e4fSDavid du Colombier #pragma lib "libhtml.a" 29a747e4fSDavid du Colombier #pragma src "/sys/src/libhtml" 39a747e4fSDavid du Colombier 4dc4ee190SDavid du Colombier /* UTILS */ 59a747e4fSDavid du Colombier extern uchar* fromStr(Rune* buf, int n, int chset); 69a747e4fSDavid du Colombier extern Rune* toStr(uchar* buf, int n, int chset); 79a747e4fSDavid du Colombier 8dc4ee190SDavid du Colombier /* Common LEX and BUILD enums */ 99a747e4fSDavid du Colombier 10dc4ee190SDavid du Colombier /* Media types */ 119a747e4fSDavid du Colombier enum 129a747e4fSDavid du Colombier { 139a747e4fSDavid du Colombier ApplMsword, 149a747e4fSDavid du Colombier ApplOctets, 159a747e4fSDavid du Colombier ApplPdf, 169a747e4fSDavid du Colombier ApplPostscript, 179a747e4fSDavid du Colombier ApplRtf, 189a747e4fSDavid du Colombier ApplFramemaker, 199a747e4fSDavid du Colombier ApplMsexcel, 209a747e4fSDavid du Colombier ApplMspowerpoint, 219a747e4fSDavid du Colombier UnknownType, 229a747e4fSDavid du Colombier Audio32kadpcm, 239a747e4fSDavid du Colombier AudioBasic, 249a747e4fSDavid du Colombier ImageCgm, 259a747e4fSDavid du Colombier ImageG3fax, 269a747e4fSDavid du Colombier ImageGif, 279a747e4fSDavid du Colombier ImageIef, 289a747e4fSDavid du Colombier ImageJpeg, 299a747e4fSDavid du Colombier ImagePng, 309a747e4fSDavid du Colombier ImageTiff, 319a747e4fSDavid du Colombier ImageXBit, 329a747e4fSDavid du Colombier ImageXBit2, 339a747e4fSDavid du Colombier ImageXBitmulti, 349a747e4fSDavid du Colombier ImageXXBitmap, 359a747e4fSDavid du Colombier ModelVrml, 369a747e4fSDavid du Colombier MultiDigest, 379a747e4fSDavid du Colombier MultiMixed, 389a747e4fSDavid du Colombier TextCss, 399a747e4fSDavid du Colombier TextEnriched, 409a747e4fSDavid du Colombier TextHtml, 419a747e4fSDavid du Colombier TextJavascript, 429a747e4fSDavid du Colombier TextPlain, 439a747e4fSDavid du Colombier TextRichtext, 449a747e4fSDavid du Colombier TextSgml, 459a747e4fSDavid du Colombier TextTabSeparatedValues, 469a747e4fSDavid du Colombier TextXml, 479a747e4fSDavid du Colombier VideoMpeg, 489a747e4fSDavid du Colombier VideoQuicktime, 499a747e4fSDavid du Colombier NMEDIATYPES 509a747e4fSDavid du Colombier }; 519a747e4fSDavid du Colombier 52dc4ee190SDavid du Colombier /* HTTP methods */ 539a747e4fSDavid du Colombier enum 549a747e4fSDavid du Colombier { 559a747e4fSDavid du Colombier HGet, 569a747e4fSDavid du Colombier HPost 579a747e4fSDavid du Colombier }; 589a747e4fSDavid du Colombier 59dc4ee190SDavid du Colombier /* Charsets */ 609a747e4fSDavid du Colombier enum 619a747e4fSDavid du Colombier { 629a747e4fSDavid du Colombier UnknownCharset, 639a747e4fSDavid du Colombier US_Ascii, 649a747e4fSDavid du Colombier ISO_8859_1, 659a747e4fSDavid du Colombier UTF_8, 669a747e4fSDavid du Colombier Unicode, 679a747e4fSDavid du Colombier NCHARSETS 689a747e4fSDavid du Colombier }; 699a747e4fSDavid du Colombier 70dc4ee190SDavid du Colombier /* Frame Target IDs */ 719a747e4fSDavid du Colombier enum { 729a747e4fSDavid du Colombier FTtop, 739a747e4fSDavid du Colombier FTself, 749a747e4fSDavid du Colombier FTparent, 759a747e4fSDavid du Colombier FTblank 769a747e4fSDavid du Colombier }; 779a747e4fSDavid du Colombier 78dc4ee190SDavid du Colombier /* LEX */ 799a747e4fSDavid du Colombier typedef struct Token Token; 809a747e4fSDavid du Colombier typedef struct Attr Attr; 819a747e4fSDavid du Colombier 8212fd1c83SDavid du Colombier #pragma incomplete Token 8312fd1c83SDavid du Colombier 84dc4ee190SDavid du Colombier /* BUILD */ 859a747e4fSDavid du Colombier 869a747e4fSDavid du Colombier typedef struct Item Item; 879a747e4fSDavid du Colombier typedef struct Itext Itext; 889a747e4fSDavid du Colombier typedef struct Irule Irule; 899a747e4fSDavid du Colombier typedef struct Iimage Iimage; 909a747e4fSDavid du Colombier typedef struct Iformfield Iformfield; 919a747e4fSDavid du Colombier typedef struct Itable Itable; 929a747e4fSDavid du Colombier typedef struct Ifloat Ifloat; 939a747e4fSDavid du Colombier typedef struct Ispacer Ispacer; 949a747e4fSDavid du Colombier typedef struct Genattr Genattr; 959a747e4fSDavid du Colombier typedef struct SEvent SEvent; 969a747e4fSDavid du Colombier typedef struct Formfield Formfield; 979a747e4fSDavid du Colombier typedef struct Option Option; 989a747e4fSDavid du Colombier typedef struct Form Form; 999a747e4fSDavid du Colombier typedef struct Table Table; 1009a747e4fSDavid du Colombier typedef struct Tablecol Tablecol; 1019a747e4fSDavid du Colombier typedef struct Tablerow Tablerow; 1029a747e4fSDavid du Colombier typedef struct Tablecell Tablecell; 1039a747e4fSDavid du Colombier typedef struct Align Align; 1049a747e4fSDavid du Colombier typedef struct Dimen Dimen; 1059a747e4fSDavid du Colombier typedef struct Anchor Anchor; 1069a747e4fSDavid du Colombier typedef struct DestAnchor DestAnchor; 1079a747e4fSDavid du Colombier typedef struct Map Map; 1089a747e4fSDavid du Colombier typedef struct Area Area; 1099a747e4fSDavid du Colombier typedef struct Background Background; 1109a747e4fSDavid du Colombier typedef struct Kidinfo Kidinfo; 1119a747e4fSDavid du Colombier typedef struct Docinfo Docinfo; 1129a747e4fSDavid du Colombier typedef struct Stack Stack; 1139a747e4fSDavid du Colombier typedef struct Pstate Pstate; 1149a747e4fSDavid du Colombier typedef struct ItemSource ItemSource; 115dc4ee190SDavid du Colombier typedef struct Lay Lay; /* defined in Layout module */ 1169a747e4fSDavid du Colombier 11712fd1c83SDavid du Colombier #pragma incomplete Lay 11812fd1c83SDavid du Colombier 11912fd1c83SDavid du Colombier 120dc4ee190SDavid du Colombier /* Alignment types */ 1219a747e4fSDavid du Colombier enum { 1229a747e4fSDavid du Colombier ALnone = 0, ALleft, ALcenter, ALright, ALjustify, 123dc4ee190SDavid du Colombier ALchar, ALtop, ALmiddle, ALbottom, ALbaseline, 1249a747e4fSDavid du Colombier }; 1259a747e4fSDavid du Colombier 1269a747e4fSDavid du Colombier struct Align 1279a747e4fSDavid du Colombier { 128dc4ee190SDavid du Colombier uchar halign; /* one of ALnone, ALleft, etc. */ 129dc4ee190SDavid du Colombier uchar valign; /* one of ALnone, ALtop, etc. */ 1309a747e4fSDavid du Colombier }; 1319a747e4fSDavid du Colombier 132dc4ee190SDavid du Colombier /* 133dc4ee190SDavid du Colombier * A Dimen holds a dimension specification, especially for those 134dc4ee190SDavid du Colombier * cases when a number can be followed by a % or a * to indicate 135dc4ee190SDavid du Colombier * percentage of total or relative weight. 136dc4ee190SDavid du Colombier * Dnone means no dimension was specified 137dc4ee190SDavid du Colombier */ 1389a747e4fSDavid du Colombier 139dc4ee190SDavid du Colombier /* To fit in a word, use top bits to identify kind, rest for value */ 1409a747e4fSDavid du Colombier enum { 1419a747e4fSDavid du Colombier Dnone = 0, 1429a747e4fSDavid du Colombier Dpixels = (1<<29), 1439a747e4fSDavid du Colombier Dpercent = (2<<29), 1449a747e4fSDavid du Colombier Drelative = (3<<29), 1459a747e4fSDavid du Colombier Dkindmask = (3<<29), 1469a747e4fSDavid du Colombier Dspecmask = (~Dkindmask) 1479a747e4fSDavid du Colombier }; 1489a747e4fSDavid du Colombier 1499a747e4fSDavid du Colombier struct Dimen 1509a747e4fSDavid du Colombier { 151dc4ee190SDavid du Colombier int kindspec; /* kind | spec */ 1529a747e4fSDavid du Colombier }; 1539a747e4fSDavid du Colombier 154dc4ee190SDavid du Colombier /* 155dc4ee190SDavid du Colombier * Background is either an image or a color. 156dc4ee190SDavid du Colombier * If both are set, the image has precedence. 157dc4ee190SDavid du Colombier */ 1589a747e4fSDavid du Colombier struct Background 1599a747e4fSDavid du Colombier { 160dc4ee190SDavid du Colombier Rune* image; /* url */ 1619a747e4fSDavid du Colombier int color; 1629a747e4fSDavid du Colombier }; 1639a747e4fSDavid du Colombier 1649a747e4fSDavid du Colombier 165dc4ee190SDavid du Colombier /* 166dc4ee190SDavid du Colombier * There are about a half dozen Item variants. 167dc4ee190SDavid du Colombier * The all look like this at the start (using Plan 9 C's 168dc4ee190SDavid du Colombier * anonymous structure member mechanism), 169dc4ee190SDavid du Colombier * and then the tag field dictates what extra fields there are. 170dc4ee190SDavid du Colombier */ 1719a747e4fSDavid du Colombier struct Item 1729a747e4fSDavid du Colombier { 173dc4ee190SDavid du Colombier Item* next; /* successor in list of items */ 174dc4ee190SDavid du Colombier int width; /* width in pixels (0 for floating items) */ 175dc4ee190SDavid du Colombier int height; /* height in pixels */ 176dc4ee190SDavid du Colombier int ascent; /* ascent (from top to baseline) in pixels */ 177dc4ee190SDavid du Colombier int anchorid; /* if nonzero, which anchor we're in */ 178dc4ee190SDavid du Colombier int state; /* flags and values (see below) */ 179dc4ee190SDavid du Colombier Genattr*genattr; /* generic attributes and events */ 180dc4ee190SDavid du Colombier int tag; /* variant discriminator: Itexttag, etc. */ 1819a747e4fSDavid du Colombier }; 1829a747e4fSDavid du Colombier 183dc4ee190SDavid du Colombier /* Item variant tags */ 1849a747e4fSDavid du Colombier enum { 1859a747e4fSDavid du Colombier Itexttag, 1869a747e4fSDavid du Colombier Iruletag, 1879a747e4fSDavid du Colombier Iimagetag, 1889a747e4fSDavid du Colombier Iformfieldtag, 1899a747e4fSDavid du Colombier Itabletag, 1909a747e4fSDavid du Colombier Ifloattag, 1919a747e4fSDavid du Colombier Ispacertag 1929a747e4fSDavid du Colombier }; 1939a747e4fSDavid du Colombier 1949a747e4fSDavid du Colombier struct Itext 1959a747e4fSDavid du Colombier { 196dc4ee190SDavid du Colombier Item; /* (with tag ==Itexttag) */ 197dc4ee190SDavid du Colombier Rune* s; /* the characters */ 198dc4ee190SDavid du Colombier int fnt; /* style*NumSize+size (see font stuff, below) */ 199dc4ee190SDavid du Colombier int fg; /* Pixel (color) for text */ 200dc4ee190SDavid du Colombier uchar voff; /* Voffbias+vertical offset from baseline, in pixels (+ve == down) */ 201dc4ee190SDavid du Colombier uchar ul; /* ULnone, ULunder, or ULmid */ 2029a747e4fSDavid du Colombier }; 2039a747e4fSDavid du Colombier 2049a747e4fSDavid du Colombier struct Irule 2059a747e4fSDavid du Colombier { 206dc4ee190SDavid du Colombier Item; /* (with tag ==Iruletag) */ 207dc4ee190SDavid du Colombier uchar align; /* alignment spec */ 208dc4ee190SDavid du Colombier uchar noshade; /* if true, don't shade */ 209dc4ee190SDavid du Colombier int size; /* size attr (rule height) */ 210*684b447eSDavid du Colombier int color; /* color attr */ 211dc4ee190SDavid du Colombier Dimen wspec; /* width spec */ 2129a747e4fSDavid du Colombier }; 2139a747e4fSDavid du Colombier 2149a747e4fSDavid du Colombier 2159a747e4fSDavid du Colombier struct Iimage 2169a747e4fSDavid du Colombier { 217dc4ee190SDavid du Colombier Item; /* (with tag ==Iimagetag) */ 218dc4ee190SDavid du Colombier Rune* imsrc; /* image src url */ 219dc4ee190SDavid du Colombier int imwidth; /* spec width (actual, if no spec) */ 220dc4ee190SDavid du Colombier int imheight; /* spec height (actual, if no spec) */ 221dc4ee190SDavid du Colombier Rune* altrep; /* alternate representation, in absence of image */ 222dc4ee190SDavid du Colombier Map* map; /* if non-nil, client side map */ 223dc4ee190SDavid du Colombier int ctlid; /* if animated */ 224dc4ee190SDavid du Colombier uchar align; /* vertical alignment */ 225dc4ee190SDavid du Colombier uchar hspace; /* in pixels; buffer space on each side */ 226dc4ee190SDavid du Colombier uchar vspace; /* in pixels; buffer space on top and bottom */ 227dc4ee190SDavid du Colombier uchar border; /* in pixels: border width to draw around image */ 228dc4ee190SDavid du Colombier Iimage* nextimage; /* next in list of document's images */ 229375daca8SDavid du Colombier void* aux; 2309a747e4fSDavid du Colombier }; 2319a747e4fSDavid du Colombier 2329a747e4fSDavid du Colombier 2339a747e4fSDavid du Colombier struct Iformfield 2349a747e4fSDavid du Colombier { 235dc4ee190SDavid du Colombier Item; /* (with tag ==Iformfieldtag) */ 2369a747e4fSDavid du Colombier Formfield*formfield; 2379dfc0cb2SDavid du Colombier void* aux; 2389a747e4fSDavid du Colombier }; 2399a747e4fSDavid du Colombier 2409a747e4fSDavid du Colombier 2419a747e4fSDavid du Colombier struct Itable 2429a747e4fSDavid du Colombier { 243dc4ee190SDavid du Colombier Item; /* (with tag ==Itabletag) */ 2449a747e4fSDavid du Colombier Table* table; 2459a747e4fSDavid du Colombier }; 2469a747e4fSDavid du Colombier 2479a747e4fSDavid du Colombier 2489a747e4fSDavid du Colombier struct Ifloat 2499a747e4fSDavid du Colombier { 250dc4ee190SDavid du Colombier Item; /* (with tag ==Ifloattag) */ 251dc4ee190SDavid du Colombier Item* item; /* table or image item that floats */ 252dc4ee190SDavid du Colombier int x; /* x coord of top (from right, if ALright) */ 253dc4ee190SDavid du Colombier int y; /* y coord of top */ 254dc4ee190SDavid du Colombier uchar side; /* margin it floats to: ALleft or ALright */ 255dc4ee190SDavid du Colombier uchar infloats; /* true if this has been added to a lay.floats */ 256dc4ee190SDavid du Colombier Ifloat* nextfloat; /* in list of floats */ 2579a747e4fSDavid du Colombier }; 2589a747e4fSDavid du Colombier 2599a747e4fSDavid du Colombier 2609a747e4fSDavid du Colombier struct Ispacer 2619a747e4fSDavid du Colombier { 262dc4ee190SDavid du Colombier Item; /* (with tag ==Ispacertag) */ 263dc4ee190SDavid du Colombier int spkind; /* ISPnull, etc. */ 2649a747e4fSDavid du Colombier }; 2659a747e4fSDavid du Colombier 266dc4ee190SDavid du Colombier /* Item state flags and value fields */ 2679a747e4fSDavid du Colombier enum { 268dc4ee190SDavid du Colombier IFbrk = 0x80000000, /* forced break before this item */ 269dc4ee190SDavid du Colombier IFbrksp = 0x40000000, /* add 1 line space to break (IFbrk set too) */ 270dc4ee190SDavid du Colombier IFnobrk = 0x20000000, /* break not allowed before this item */ 271dc4ee190SDavid du Colombier IFcleft = 0x10000000, /* clear left floats (IFbrk set too) */ 272dc4ee190SDavid du Colombier IFcright= 0x08000000, /* clear right floats (IFbrk set too) */ 273dc4ee190SDavid du Colombier IFwrap = 0x04000000, /* in a wrapping (non-pre) line */ 274dc4ee190SDavid du Colombier IFhang = 0x02000000, /* in a hanging (into left indent) item */ 275dc4ee190SDavid du Colombier IFrjust = 0x01000000, /* right justify current line */ 276dc4ee190SDavid du Colombier IFcjust = 0x00800000, /* center justify current line */ 277dc4ee190SDavid du Colombier IFsmap = 0x00400000, /* image is server-side map */ 2789a747e4fSDavid du Colombier IFindentshift = 8, 279dc4ee190SDavid du Colombier IFindentmask = (255<<IFindentshift), /* current indent, in tab stops */ 280dc4ee190SDavid du Colombier IFhangmask = 255 /* current hang into left indent, in 1/10th tabstops */ 2819a747e4fSDavid du Colombier }; 2829a747e4fSDavid du Colombier 283dc4ee190SDavid du Colombier /* Bias added to Itext's voff field */ 2849a747e4fSDavid du Colombier enum { Voffbias = 128 }; 2859a747e4fSDavid du Colombier 286dc4ee190SDavid du Colombier /* Spacer kinds */ 2879a747e4fSDavid du Colombier enum { 288dc4ee190SDavid du Colombier ISPnull, /* 0 height and width */ 289dc4ee190SDavid du Colombier ISPvline, /* height and ascent of current font */ 290dc4ee190SDavid du Colombier ISPhspace, /* width of space in current font */ 291dc4ee190SDavid du Colombier ISPgeneral /* other purposes (e.g., between markers and list) */ 2929a747e4fSDavid du Colombier }; 2939a747e4fSDavid du Colombier 294dc4ee190SDavid du Colombier /* Generic attributes and events (not many elements will have any of these set) */ 2959a747e4fSDavid du Colombier struct Genattr 2969a747e4fSDavid du Colombier { 2979a747e4fSDavid du Colombier Rune* id; 2989a747e4fSDavid du Colombier Rune* class; 2999a747e4fSDavid du Colombier Rune* style; 3009a747e4fSDavid du Colombier Rune* title; 3019a747e4fSDavid du Colombier SEvent* events; 3029a747e4fSDavid du Colombier }; 3039a747e4fSDavid du Colombier 3049a747e4fSDavid du Colombier struct SEvent 3059a747e4fSDavid du Colombier { 306dc4ee190SDavid du Colombier SEvent* next; /* in list of events */ 307dc4ee190SDavid du Colombier int type; /* SEonblur, etc. */ 3089a747e4fSDavid du Colombier Rune* script; 3099a747e4fSDavid du Colombier }; 3109a747e4fSDavid du Colombier 3119a747e4fSDavid du Colombier enum { 3129a747e4fSDavid du Colombier SEonblur, SEonchange, SEonclick, SEondblclick, 3139a747e4fSDavid du Colombier SEonfocus, SEonkeypress, SEonkeyup, SEonload, 3149a747e4fSDavid du Colombier SEonmousedown, SEonmousemove, SEonmouseout, 3159a747e4fSDavid du Colombier SEonmouseover, SEonmouseup, SEonreset, SEonselect, 3169a747e4fSDavid du Colombier SEonsubmit, SEonunload, 3179a747e4fSDavid du Colombier Numscriptev 3189a747e4fSDavid du Colombier }; 3199a747e4fSDavid du Colombier 320dc4ee190SDavid du Colombier /* Form field types */ 3219a747e4fSDavid du Colombier enum { 3229a747e4fSDavid du Colombier Ftext, 3239a747e4fSDavid du Colombier Fpassword, 3249a747e4fSDavid du Colombier Fcheckbox, 3259a747e4fSDavid du Colombier Fradio, 3269a747e4fSDavid du Colombier Fsubmit, 3279a747e4fSDavid du Colombier Fhidden, 3289a747e4fSDavid du Colombier Fimage, 3299a747e4fSDavid du Colombier Freset, 3309a747e4fSDavid du Colombier Ffile, 3319a747e4fSDavid du Colombier Fbutton, 3329a747e4fSDavid du Colombier Fselect, 3339a747e4fSDavid du Colombier Ftextarea 3349a747e4fSDavid du Colombier }; 3359a747e4fSDavid du Colombier 336dc4ee190SDavid du Colombier /* Information about a field in a form */ 3379a747e4fSDavid du Colombier struct Formfield 3389a747e4fSDavid du Colombier { 339dc4ee190SDavid du Colombier Formfield*next; /* in list of fields for a form */ 340dc4ee190SDavid du Colombier int ftype; /* Ftext, Fpassword, etc. */ 341dc4ee190SDavid du Colombier int fieldid; /* serial no. of field within its form */ 342dc4ee190SDavid du Colombier Form* form; /* containing form */ 343dc4ee190SDavid du Colombier Rune* name; /* name attr */ 344dc4ee190SDavid du Colombier Rune* value; /* value attr */ 345dc4ee190SDavid du Colombier int size; /* size attr */ 346dc4ee190SDavid du Colombier int maxlength; /* maxlength attr */ 347dc4ee190SDavid du Colombier int rows; /* rows attr */ 348dc4ee190SDavid du Colombier int cols; /* cols attr */ 349dc4ee190SDavid du Colombier uchar flags; /* FFchecked, etc. */ 350dc4ee190SDavid du Colombier Option* options; /* for Fselect fields */ 351dc4ee190SDavid du Colombier Item* image; /* image item, for Fimage fields */ 352dc4ee190SDavid du Colombier int ctlid; /* identifies control for this field in layout */ 353dc4ee190SDavid du Colombier SEvent* events; /* same as genattr->events of containing item */ 3549a747e4fSDavid du Colombier }; 3559a747e4fSDavid du Colombier 3569a747e4fSDavid du Colombier enum { 3579a747e4fSDavid du Colombier FFchecked = (1<<7), 3589a747e4fSDavid du Colombier FFmultiple = (1<<6) 3599a747e4fSDavid du Colombier }; 3609a747e4fSDavid du Colombier 361dc4ee190SDavid du Colombier /* Option holds info about an option in a "select" form field */ 3629a747e4fSDavid du Colombier struct Option 3639a747e4fSDavid du Colombier { 364dc4ee190SDavid du Colombier Option* next; /* next in list of options for a field */ 365dc4ee190SDavid du Colombier int selected; /* true if selected initially */ 366dc4ee190SDavid du Colombier Rune* value; /* value attr */ 367dc4ee190SDavid du Colombier Rune* display; /* display string */ 3689a747e4fSDavid du Colombier }; 3699a747e4fSDavid du Colombier 370dc4ee190SDavid du Colombier /* Form holds info about a form */ 3719a747e4fSDavid du Colombier struct Form 3729a747e4fSDavid du Colombier { 373dc4ee190SDavid du Colombier Form* next; /* in list of forms for document */ 374dc4ee190SDavid du Colombier int formid; /* serial no. of form within its doc */ 375dc4ee190SDavid du Colombier Rune* name; /* name or id attr (netscape uses name, HTML 4.0 uses id) */ 376dc4ee190SDavid du Colombier Rune* action; /* action attr */ 377dc4ee190SDavid du Colombier int target; /* target attr as targetid */ 378dc4ee190SDavid du Colombier int method; /* HGet or HPost */ 379dc4ee190SDavid du Colombier int nfields; /* number of fields */ 380dc4ee190SDavid du Colombier Formfield*fields; /* field's forms, in input order */ 3819a747e4fSDavid du Colombier }; 3829a747e4fSDavid du Colombier 383dc4ee190SDavid du Colombier /* Flags used in various table structures */ 3849a747e4fSDavid du Colombier enum { 3859a747e4fSDavid du Colombier TFparsing = (1<<7), 3869a747e4fSDavid du Colombier TFnowrap = (1<<6), 3879a747e4fSDavid du Colombier TFisth = (1<<5) 3889a747e4fSDavid du Colombier }; 3899a747e4fSDavid du Colombier 3909a747e4fSDavid du Colombier 391dc4ee190SDavid du Colombier /* Information about a table */ 3929a747e4fSDavid du Colombier struct Table 3939a747e4fSDavid du Colombier { 394dc4ee190SDavid du Colombier Table* next; /* next in list of document's tables */ 395dc4ee190SDavid du Colombier int tableid; /* serial no. of table within its doc */ 396dc4ee190SDavid du Colombier Tablerow*rows; /* array of row specs (list during parsing) */ 397dc4ee190SDavid du Colombier int nrow; /* total number of rows */ 398dc4ee190SDavid du Colombier Tablecol*cols; /* array of column specs */ 399dc4ee190SDavid du Colombier int ncol; /* total number of columns */ 400dc4ee190SDavid du Colombier Tablecell*cells; /* list of unique cells */ 401dc4ee190SDavid du Colombier int ncell; /* total number of cells */ 402dc4ee190SDavid du Colombier Tablecell***grid; /* 2-D array of cells */ 403dc4ee190SDavid du Colombier Align align; /* alignment spec for whole table */ 404dc4ee190SDavid du Colombier Dimen width; /* width spec for whole table */ 405dc4ee190SDavid du Colombier int border; /* border attr */ 406dc4ee190SDavid du Colombier int cellspacing; /* cellspacing attr */ 407dc4ee190SDavid du Colombier int cellpadding; /* cellpadding attr */ 408dc4ee190SDavid du Colombier Background background; /* table background */ 409dc4ee190SDavid du Colombier Item* caption; /* linked list of Items, giving caption */ 410dc4ee190SDavid du Colombier uchar caption_place; /* ALtop or ALbottom */ 411dc4ee190SDavid du Colombier Lay* caption_lay; /* layout of caption */ 412dc4ee190SDavid du Colombier int totw; /* total width */ 413dc4ee190SDavid du Colombier int toth; /* total height */ 414dc4ee190SDavid du Colombier int caph; /* caption height */ 415dc4ee190SDavid du Colombier int availw; /* used for previous 3 sizes */ 416dc4ee190SDavid du Colombier Token* tabletok; /* token that started the table */ 417dc4ee190SDavid du Colombier uchar flags; /* Lchanged, perhaps */ 4189a747e4fSDavid du Colombier }; 4199a747e4fSDavid du Colombier 4209a747e4fSDavid du Colombier 4219a747e4fSDavid du Colombier struct Tablecol 4229a747e4fSDavid du Colombier { 4239a747e4fSDavid du Colombier int width; 4249a747e4fSDavid du Colombier Align align; 4259a747e4fSDavid du Colombier Point pos; 4269a747e4fSDavid du Colombier }; 4279a747e4fSDavid du Colombier 4289a747e4fSDavid du Colombier 4299a747e4fSDavid du Colombier struct Tablerow 4309a747e4fSDavid du Colombier { 431dc4ee190SDavid du Colombier Tablerow*next; /* Next in list of rows, during parsing */ 432dc4ee190SDavid du Colombier Tablecell*cells; /* Cells in row, linked through nextinrow */ 4339a747e4fSDavid du Colombier int height; 4349a747e4fSDavid du Colombier int ascent; 4359a747e4fSDavid du Colombier Align align; 4369a747e4fSDavid du Colombier Background background; 4379a747e4fSDavid du Colombier Point pos; 438dc4ee190SDavid du Colombier uchar flags; /* 0 or TFparsing */ 4399a747e4fSDavid du Colombier }; 4409a747e4fSDavid du Colombier 441dc4ee190SDavid du Colombier /* 442dc4ee190SDavid du Colombier * A Tablecell is one cell of a table. 443dc4ee190SDavid du Colombier * It may span multiple rows and multiple columns. 444dc4ee190SDavid du Colombier * Cells are linked on two lists: the list for all the cells of 445dc4ee190SDavid du Colombier * a document (the next pointers), and the list of all the 446dc4ee190SDavid du Colombier * cells that start in a given row (the nextinrow pointers) 447dc4ee190SDavid du Colombier */ 4489a747e4fSDavid du Colombier struct Tablecell 4499a747e4fSDavid du Colombier { 450dc4ee190SDavid du Colombier Tablecell*next; /* next in list of table's cells */ 451dc4ee190SDavid du Colombier Tablecell*nextinrow; /* next in list of row's cells */ 452dc4ee190SDavid du Colombier int cellid; /* serial no. of cell within table */ 453dc4ee190SDavid du Colombier Item* content; /* contents before layout */ 454dc4ee190SDavid du Colombier Lay* lay; /* layout of cell */ 455dc4ee190SDavid du Colombier int rowspan; /* number of rows spanned by this cell */ 456dc4ee190SDavid du Colombier int colspan; /* number of cols spanned by this cell */ 457dc4ee190SDavid du Colombier Align align; /* alignment spec */ 458dc4ee190SDavid du Colombier uchar flags; /* TFparsing, TFnowrap, TFisth */ 459dc4ee190SDavid du Colombier Dimen wspec; /* suggested width */ 460dc4ee190SDavid du Colombier int hspec; /* suggested height */ 461dc4ee190SDavid du Colombier Background background; /* cell background */ 462dc4ee190SDavid du Colombier int minw; /* minimum possible width */ 463dc4ee190SDavid du Colombier int maxw; /* maximum width */ 464dc4ee190SDavid du Colombier int ascent; /* cell's ascent */ 465dc4ee190SDavid du Colombier int row; /* row of upper left corner */ 466dc4ee190SDavid du Colombier int col; /* col of upper left corner */ 467dc4ee190SDavid du Colombier Point pos; /* nw corner of cell contents, in cell */ 4689a747e4fSDavid du Colombier }; 4699a747e4fSDavid du Colombier 470dc4ee190SDavid du Colombier /* Anchor is for info about hyperlinks that go somewhere */ 4719a747e4fSDavid du Colombier struct Anchor 4729a747e4fSDavid du Colombier { 473dc4ee190SDavid du Colombier Anchor* next; /* next in list of document's anchors */ 474dc4ee190SDavid du Colombier int index; /* serial no. of anchor within its doc */ 475dc4ee190SDavid du Colombier Rune* name; /* name attr */ 476dc4ee190SDavid du Colombier Rune* href; /* href attr */ 477dc4ee190SDavid du Colombier int target; /* target attr as targetid */ 4789a747e4fSDavid du Colombier }; 4799a747e4fSDavid du Colombier 4809a747e4fSDavid du Colombier 481dc4ee190SDavid du Colombier /* DestAnchor is for info about hyperlinks that are destinations */ 4829a747e4fSDavid du Colombier struct DestAnchor 4839a747e4fSDavid du Colombier { 484dc4ee190SDavid du Colombier DestAnchor*next; /* next in list of document's destanchors */ 485dc4ee190SDavid du Colombier int index; /* serial no. of anchor within its doc */ 486dc4ee190SDavid du Colombier Rune* name; /* name attr */ 487dc4ee190SDavid du Colombier Item* item; /* the destination */ 4889a747e4fSDavid du Colombier }; 4899a747e4fSDavid du Colombier 4909a747e4fSDavid du Colombier 491dc4ee190SDavid du Colombier /* Maps (client side) */ 4929a747e4fSDavid du Colombier struct Map 4939a747e4fSDavid du Colombier { 494dc4ee190SDavid du Colombier Map* next; /* next in list of document's maps */ 495dc4ee190SDavid du Colombier Rune* name; /* map name */ 496dc4ee190SDavid du Colombier Area* areas; /* list of map areas */ 4979a747e4fSDavid du Colombier }; 4989a747e4fSDavid du Colombier 4999a747e4fSDavid du Colombier 5009a747e4fSDavid du Colombier struct Area 5019a747e4fSDavid du Colombier { 502dc4ee190SDavid du Colombier Area* next; /* next in list of a map's areas */ 503dc4ee190SDavid du Colombier int shape; /* SHrect, etc. */ 504dc4ee190SDavid du Colombier Rune* href; /* associated hypertext link */ 505dc4ee190SDavid du Colombier int target; /* associated target frame */ 506dc4ee190SDavid du Colombier Dimen* coords; /* array of coords for shape */ 507dc4ee190SDavid du Colombier int ncoords; /* size of coords array */ 5089a747e4fSDavid du Colombier }; 5099a747e4fSDavid du Colombier 510dc4ee190SDavid du Colombier /* Area shapes */ 5119a747e4fSDavid du Colombier enum { 5129a747e4fSDavid du Colombier SHrect, SHcircle, SHpoly 5139a747e4fSDavid du Colombier }; 5149a747e4fSDavid du Colombier 515dc4ee190SDavid du Colombier /* Fonts are represented by integers: style*NumSize + size */ 5169a747e4fSDavid du Colombier 517dc4ee190SDavid du Colombier /* Font styles */ 5189a747e4fSDavid du Colombier enum { 519dc4ee190SDavid du Colombier FntR, /* roman */ 520dc4ee190SDavid du Colombier FntI, /* italic */ 521dc4ee190SDavid du Colombier FntB, /* bold */ 522dc4ee190SDavid du Colombier FntT, /* typewriter */ 5239a747e4fSDavid du Colombier NumStyle 5249a747e4fSDavid du Colombier }; 5259a747e4fSDavid du Colombier 526dc4ee190SDavid du Colombier /* Font sizes */ 5279a747e4fSDavid du Colombier enum { 5289a747e4fSDavid du Colombier Tiny, 5299a747e4fSDavid du Colombier Small, 5309a747e4fSDavid du Colombier Normal, 5319a747e4fSDavid du Colombier Large, 5329a747e4fSDavid du Colombier Verylarge, 5339a747e4fSDavid du Colombier NumSize 5349a747e4fSDavid du Colombier }; 5359a747e4fSDavid du Colombier 5369a747e4fSDavid du Colombier enum { 537dc4ee190SDavid du Colombier NumFnt = NumStyle*NumSize, 538dc4ee190SDavid du Colombier DefFnt = FntR*NumSize+Normal, 5399a747e4fSDavid du Colombier }; 5409a747e4fSDavid du Colombier 541dc4ee190SDavid du Colombier /* Lines are needed through some text items, for underlining or strikethrough */ 5429a747e4fSDavid du Colombier enum { 5439a747e4fSDavid du Colombier ULnone, ULunder, ULmid 5449a747e4fSDavid du Colombier }; 5459a747e4fSDavid du Colombier 546dc4ee190SDavid du Colombier /* Kidinfo flags */ 5479a747e4fSDavid du Colombier enum { 5489a747e4fSDavid du Colombier FRnoresize = (1<<0), 5499a747e4fSDavid du Colombier FRnoscroll = (1<<1), 5509a747e4fSDavid du Colombier FRhscroll = (1<<2), 5519a747e4fSDavid du Colombier FRvscroll = (1<<3), 5529a747e4fSDavid du Colombier FRhscrollauto = (1<<4), 5539a747e4fSDavid du Colombier FRvscrollauto = (1<<5) 5549a747e4fSDavid du Colombier }; 5559a747e4fSDavid du Colombier 556dc4ee190SDavid du Colombier /* Information about child frame or frameset */ 5579a747e4fSDavid du Colombier struct Kidinfo 5589a747e4fSDavid du Colombier { 559dc4ee190SDavid du Colombier Kidinfo*next; /* in list of kidinfos for a frameset */ 5609a747e4fSDavid du Colombier int isframeset; 5619a747e4fSDavid du Colombier 562dc4ee190SDavid du Colombier /* fields for "frame" */ 563dc4ee190SDavid du Colombier Rune* src; /* only nil if a "dummy" frame or this is frameset */ 564dc4ee190SDavid du Colombier Rune* name; /* always non-empty if this isn't frameset */ 5659a747e4fSDavid du Colombier int marginw; 5669a747e4fSDavid du Colombier int marginh; 5679a747e4fSDavid du Colombier int framebd; 5689a747e4fSDavid du Colombier int flags; 5699a747e4fSDavid du Colombier 570dc4ee190SDavid du Colombier /* fields for "frameset" */ 571dc4ee190SDavid du Colombier Dimen* rows; /* array of row dimensions */ 572dc4ee190SDavid du Colombier int nrows; /* length of rows */ 573dc4ee190SDavid du Colombier Dimen* cols; /* array of col dimensions */ 574dc4ee190SDavid du Colombier int ncols; /* length of cols */ 5759a747e4fSDavid du Colombier Kidinfo*kidinfos; 576dc4ee190SDavid du Colombier Kidinfo*nextframeset; /* parsing stack */ 5779a747e4fSDavid du Colombier }; 5789a747e4fSDavid du Colombier 5799a747e4fSDavid du Colombier 580dc4ee190SDavid du Colombier /* Document info (global information about HTML page) */ 5819a747e4fSDavid du Colombier struct Docinfo 5829a747e4fSDavid du Colombier { 583dc4ee190SDavid du Colombier /* stuff from HTTP headers, doc head, and body tag */ 584dc4ee190SDavid du Colombier Rune* src; /* original source of doc */ 585dc4ee190SDavid du Colombier Rune* base; /* base URL of doc */ 586dc4ee190SDavid du Colombier Rune* doctitle; /* from <title> element */ 587dc4ee190SDavid du Colombier Background background; /* background specification */ 588dc4ee190SDavid du Colombier Iimage* backgrounditem; /* Image Item for doc background image, or nil */ 589dc4ee190SDavid du Colombier int text; /* doc foreground (text) color */ 590dc4ee190SDavid du Colombier int link; /* unvisited hyperlink color */ 591dc4ee190SDavid du Colombier int vlink; /* visited hyperlink color */ 592dc4ee190SDavid du Colombier int alink; /* highlighting hyperlink color */ 593dc4ee190SDavid du Colombier int target; /* target frame default */ 594dc4ee190SDavid du Colombier int chset; /* ISO_8859, etc. */ 595dc4ee190SDavid du Colombier int mediatype; /* TextHtml, etc. */ 596dc4ee190SDavid du Colombier int scripttype; /* TextJavascript, etc. */ 597dc4ee190SDavid du Colombier int hasscripts; /* true if scripts used */ 598dc4ee190SDavid du Colombier Rune* refresh; /* content of <http-equiv=Refresh ...> */ 599dc4ee190SDavid du Colombier Kidinfo*kidinfo; /* if a frameset */ 600dc4ee190SDavid du Colombier int frameid; /* id of document frame */ 6019a747e4fSDavid du Colombier 602dc4ee190SDavid du Colombier /* info needed to respond to user actions */ 603dc4ee190SDavid du Colombier Anchor* anchors; /* list of href anchors */ 604dc4ee190SDavid du Colombier DestAnchor*dests; /* list of destination anchors */ 605dc4ee190SDavid du Colombier Form* forms; /* list of forms */ 606dc4ee190SDavid du Colombier Table* tables; /* list of tables */ 607dc4ee190SDavid du Colombier Map* maps; /* list of maps */ 608dc4ee190SDavid du Colombier Iimage* images; /* list of image items (through nextimage links) */ 6099a747e4fSDavid du Colombier }; 6109a747e4fSDavid du Colombier 6119a747e4fSDavid du Colombier extern int dimenkind(Dimen d); 6129a747e4fSDavid du Colombier extern int dimenspec(Dimen d); 6139a747e4fSDavid du Colombier extern void freedocinfo(Docinfo* d); 6149a747e4fSDavid du Colombier extern void freeitems(Item* ithead); 6159a747e4fSDavid du Colombier extern Item* parsehtml(uchar* data, int datalen, Rune* src, int mtype, int chset, Docinfo** pdi); 6169a747e4fSDavid du Colombier extern void printitems(Item* items, char* msg); 6179a747e4fSDavid du Colombier extern int targetid(Rune* s); 6189a747e4fSDavid du Colombier extern Rune* targetname(int targid); 6199a747e4fSDavid du Colombier extern int validitems(Item* i); 6209a747e4fSDavid du Colombier 6219a747e4fSDavid du Colombier #pragma varargck type "I" Item* 6229a747e4fSDavid du Colombier 623dc4ee190SDavid du Colombier /* Control print output */ 6249a747e4fSDavid du Colombier extern int warn; 6259a747e4fSDavid du Colombier extern int dbglex; 6269a747e4fSDavid du Colombier extern int dbgbuild; 6279a747e4fSDavid du Colombier 628dc4ee190SDavid du Colombier /* 629dc4ee190SDavid du Colombier * To be provided by caller 630dc4ee190SDavid du Colombier * emalloc and erealloc should not return if can't get memory. 631dc4ee190SDavid du Colombier * emalloc should zero its memory. 632dc4ee190SDavid du Colombier */ 6339a747e4fSDavid du Colombier extern void* emalloc(ulong); 6349a747e4fSDavid du Colombier extern void* erealloc(void* p, ulong size); 635