xref: /plan9/sys/include/html.h (revision 684b447ecdf07ea000d8deca0fbcf5ac24894c7f)
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