.TH HTML 3
.SH NAME
parsehtml,
printitems,
validitems,
freeitems,
freedocinfo,
dimenkind,
dimenspec,
targetid,
targetname,
fromStr,
toStr
\- HTML parser
.SH SYNOPSIS
.nf
.PP
.ft L
#include <u.h>
#include <libc.h>
#include <html.h>
.ft P
.PP
.ta \w'\fLToken* 'u
.B
Item*	parsehtml(uchar* data, int datalen, Rune* src, int mtype,
.B
	int chset, Docinfo** pdi)
.PP
.B
void	printitems(Item* items, char* msg)
.PP
.B
int	validitems(Item* items)
.PP
.B
void	freeitems(Item* items)
.PP
.B
void	freedocinfo(Docinfo* d)
.PP
.B
int	dimenkind(Dimen d)
.PP
.B
int	dimenspec(Dimen d)
.PP
.B
int	targetid(Rune* s)
.PP
.B
Rune*	targetname(int targid)
.PP
.B
uchar*	fromStr(Rune* buf, int n, int chset)
.PP
.B
Rune*	toStr(uchar* buf, int n, int chset)
.SH DESCRIPTION
.PP
This library implements a parser for HTML 4.0 documents.
The parsed HTML is converted into an intermediate representation that
describes how the formatted HTML should be laid out.
.PP
.I Parsehtml
parses an entire HTML document contained in the buffer
.I data
and having length
.IR datalen .
The URL of the document should be passed in as
.IR src .
.I Mtype
is the media type of the document, which should be either
.B TextHtml
or
.BR TextPlain .
The character set of the document is described in
.IR chset ,
which can be one of
.BR US_Ascii ,
.BR ISO_8859_1 ,
.B UTF_8
or
.BR Unicode .
The return value is a linked list of
.B Item
structures, described in detail below.
As a side effect, 
.BI * pdi
is set to point to a newly created
.B Docinfo
structure, containing information pertaining to the entire document.
.PP
The library expects two allocation routines to be provided by the
caller,
.B emalloc
and
.BR erealloc .
These routines are analogous to the standard malloc and realloc routines,
except that they should not return if the memory allocation fails.
In addition,
.B emalloc
is required to zero the memory.
.PP
For debugging purposes,
.I printitems
may be called to display the contents of an item list; individual items may
be printed using the
.B %I
print verb, installed on the first call to
.IR parsehtml .
.I validitems
traverses the item list, checking that all of the pointers are valid.
It returns
.B 1
is everything is ok, and
.B 0
if an error was found.
Normally, one would not call these routines directly.
Instead, one sets the global variable
.I dbgbuild
and the library calls them automatically.
One can also set
.IR warn ,
to cause the library to print a warning whenever it finds a problem with the
input document, and
.IR dbglex ,
to print debugging information in the lexer.
.PP
When an item list is finished with, it should be freed with
.IR freeitems .
Then,
.I freedocinfo
should be called on the pointer returned in
.BI * pdi\f1.
.PP
.I Dimenkind
and
.I dimenspec
are provided to interpret the
.B Dimen
type, as described in the section
.IR "Dimension Specifications" .
.PP
Frame target names are mapped to integer ids via a global, permanent mapping.
To find the value for a given name, call
.IR targetid ,
which allocates a new id if the name hasn't been seen before.
The name of a given, known id may be retrieved using
.IR targetname .
The library predefines
.BR FTtop ,
.BR FTself ,
.B FTparent
and
.BR FTblank .
.PP
The library handles all text as Unicode strings (type
.BR Rune* ).
Character set conversion is provided by
.I fromStr
and
.IR toStr .
.I FromStr
takes
.I n
Unicode characters from
.I buf
and converts them to the character set described by
.IR chset .
.I ToStr
takes
.I n
bytes from
.IR buf ,
interpretted as belonging to character set
.IR chset ,
and converts them to a Unicode string.
Both routines null-terminate the result, and use
.B emalloc
to allocate space for it.
.SS Items
The return value of
.I parsehtml
is a linked list of variant structures,
with the generic portion described by the following definition:
.PP
.EX
.ta 6n +\w'Genattr* 'u
typedef struct Item Item;
struct Item
{
	Item*	next;
	int	width;
	int	height;
	int	ascent;
	int	anchorid;
	int	state;
	Genattr*	genattr;
	int	tag;
};
.EE
.PP
The field
.B next
points to the successor in the linked list of items, while
.BR width ,
.BR height ,
and
.B ascent
are intended for use by the caller as part of the layout process.
.BR Anchorid ,
if non-zero, gives the integer id assigned by the parser to the anchor that
this item is in (see section
.IR Anchors ).
.B State
is a collection of flags and values described as follows:
.PP
.EX
.ta 6n +\w'IFindentshift = 'u
enum
{
	IFbrk =	0x80000000,
	IFbrksp =	0x40000000,
	IFnobrk =	0x20000000,
	IFcleft =	0x10000000,
	IFcright =	0x08000000,
	IFwrap =	0x04000000,
	IFhang =	0x02000000,
	IFrjust =	0x01000000,
	IFcjust =	0x00800000,
	IFsmap =	0x00400000,
	IFindentshift =	8,
	IFindentmask =	(255<<IFindentshift),
	IFhangmask =	255
};
.EE
.PP
.B IFbrk
is set if a break is to be forced before placing this item.
.B IFbrksp
is set if a 1 line space should be added to the break (in which case
.B IFbrk
is also set).
.B IFnobrk
is set if a break is not permitted before the item.
.B IFcleft
is set if left floats should be cleared (that is, if the list of pending left floats should be placed)
before this item is placed, and
.B IFcright
is set for right floats.
In both cases, IFbrk is also set.
.B IFwrap
is set if the line containing this item is allowed to wrap.
.B IFhang
is set if this item hangs into the left indent.
.B IFrjust
is set if the line containing this item should be right justified,
and
.B IFcjust
is set for center justified lines.
.B IFsmap
is used to indicate that an image is a server-side map.
The low 8 bits, represented by
.BR IFhangmask ,
indicate the current hang into left indent, in tenths of a tabstop.
The next 8 bits, represented by
.B IFindentmask
and
.BR IFindentshift ,
indicate the current indent in tab stops.
.PP
The field
.B genattr
is an optional pointer to an auxiliary structure, described in the section
.IR "Generic Attributes" .
.PP
Finally,
.B tag
describes which variant type this item has.
It can have one of the values
.BR Itexttag ,
.BR Iruletag ,
.BR Iimagetag ,
.BR Iformfieldtag ,
.BR Itabletag ,
.B Ifloattag
or
.BR Ispacertag .
For each of these values, there is an additional structure defined, which
includes Item as an unnamed initial substructure, and then defines additional
fields.
.PP
Items of type
.B Itexttag
represent a piece of text, using the following structure:
.PP
.EX
.ta 6n +\w'Rune* 'u
struct Itext
{
	Item;
	Rune*	s;
	int	fnt;
	int	fg;
	uchar	voff;
	uchar	ul;
};
.EE
.PP
Here
.B s
is a null-terminated Unicode string of the actual characters making up this text item,
.B fnt
is the font number (described in the section
.IR "Font Numbers" ),
and
.B fg
is the RGB encoded color for the text.
.B Voff
measures the vertical offset from the baseline; subtract
.B Voffbias
to get the actual value (negative values represent a displacement down the page).
The field
.B ul
is the underline style:
.B ULnone
if no underline,
.B ULunder
for conventional underline, and
.B ULmid
for strike-through.
.PP
Items of type
.B Iruletag
represent a horizontal rule, as follows:
.PP
.EX
.ta 6n +\w'Dimen 'u
struct Irule
{
	Item;
	uchar	align;
	uchar	noshade;
	int	size;
	Dimen	wspec;
};
.EE
.PP
Here
.B align
is the alignment specification (described in the corresponding section),
.B noshade
is set if the rule should not be shaded,
.B size
is the height of the rule (as set by the size attribute),
and
.B wspec
is the desired width (see section
.IR "Dimension Specifications" ).
.PP
Items of type
.B Iimagetag
describe embedded images, for which the following structure is defined:
.PP
.EX
.ta 6n +\w'Iimage* 'u
struct Iimage
{
	Item;
	Rune*	imsrc;
	int	imwidth;
	int	imheight;
	Rune*	altrep;
	Map*	map;
	int	ctlid;
	uchar	align;
	uchar	hspace;
	uchar	vspace;
	uchar	border;
	Iimage*	nextimage;
};
.EE
.PP
Here
.B imsrc
is the URL of the image source,
.B imwidth
and
.BR imheight ,
if non-zero, contain the specified width and height for the image,
and
.B altrep
is the text to use as an alternative to the image, if the image is not displayed.
.BR Map ,
if set, points to a structure describing an associated client-side image map.
.B Ctlid
is reserved for use by the application, for handling animated images.
.B Align
encodes the alignment specification of the image.
.B Hspace
contains the number of pixels to pad the image with on either side, and
.B Vspace
the padding above and below.
.B Border
is the width of the border to draw around the image.
.B Nextimage
points to the next image in the document (the head of this list is
.BR Docinfo.images ).
.PP
For items of type
.BR Iformfieldtag ,
the following structure is defined:
.PP
.EX
.ta 6n +\w'Formfield* 'u
struct Iformfield
{
	Item;
	Formfield*	formfield;
};
.EE
.PP
This adds a single field,
.BR formfield ,
which points to a structure describing a field in a form, described in section
.IR Forms .
.PP
For items of type
.BR Itabletag ,
the following structure is defined:
.PP
.EX
.ta 6n +\w'Table* 'u
struct Itable
{
	Item;
	Table*	table;
};
.EE
.PP
.B Table
points to a structure describing the table, described in the section
.IR Tables .
.PP
For items of type
.BR Ifloattag ,
the following structure is defined:
.PP
.EX
.ta 6n +\w'Ifloat* 'u
struct Ifloat
{
	Item;
	Item*	item;
	int	x;
	int	y;
	uchar	side;
	uchar	infloats;
	Ifloat*	nextfloat;
};
.EE
.PP
The
.B item
points to a single item (either a table or an image) that floats (the text of the
document flows around it), and
.B side
indicates the margin that this float sticks to; it is either
.B ALleft
or
.BR ALright .
.B X
and
.B y
are reserved for use by the caller; these are typically used for the coordinates
of the top of the float.
.B Infloats
is used by the caller to keep track of whether it has placed the float.
.B Nextfloat
is used by the caller to link together all of the floats that it has placed.
.PP
For items of type
.BR Ispacertag ,
the following structure is defined:
.PP
.EX
.ta 6n +\w'Item; 'u
struct Ispacer
{
	Item;
	int	spkind;
};
.EE
.PP
.B Spkind
encodes the kind of spacer, and may be one of
.B ISPnull
(zero height and width),
.B ISPvline
(takes on height and ascent of the current font),
.B ISPhspace
(has the width of a space in the current font) and
.B ISPgeneral
(for all other purposes, such as between markers and lists).
.SS Generic Attributes
.PP
The genattr field of an item, if non-nil, points to a structure that holds
the values of attributes not specific to any particular
item type, as they occur on a wide variety of underlying HTML tags.
The structure is as follows:
.PP
.EX
.ta 6n +\w'SEvent* 'u
typedef struct Genattr Genattr;
struct Genattr
{
	Rune*	id;
	Rune*	class;
	Rune*	style;
	Rune*	title;
	SEvent*	events;
};
.EE
.PP
Fields
.BR id ,
.BR class ,
.B style
and
.BR title ,
when non-nil, contain values of correspondingly named attributes of the HTML tag
associated with this item.
.B Events
is a linked list of events (with corresponding scripted actions) associated with the item:
.PP
.EX
.ta 6n +\w'SEvent* 'u
typedef struct SEvent SEvent;
struct SEvent
{
	SEvent*	next;
	int	type;
	Rune*	script;
};
.EE
.PP
Here,
.B next
points to the next event in the list,
.B type
is one of
.BR SEonblur ,
.BR SEonchange ,
.BR SEonclick ,
.BR SEondblclick ,
.BR SEonfocus ,
.BR SEonkeypress ,
.BR SEonkeyup ,
.BR SEonload ,
.BR SEonmousedown ,
.BR SEonmousemove ,
.BR SEonmouseout ,
.BR SEonmouseover ,
.BR SEonmouseup ,
.BR SEonreset ,
.BR SEonselect ,
.B SEonsubmit
or
.BR SEonunload ,
and
.B script
is the text of the associated script.
.SS Dimension Specifications
.PP
Some structures include a dimension specification, used where
a number can be followed by a
.B %
or a
.B *
to indicate
percentage of total or relative weight.
This is encoded using the following structure:
.PP
.EX
.ta 6n +\w'int 'u
typedef struct Dimen Dimen;
struct Dimen
{
	int	kindspec;
};
.EE
.PP
Separate kind and spec values are extracted using
.I dimenkind
and
.IR dimenspec .
.I Dimenkind
returns one of
.BR Dnone ,
.BR Dpixels ,
.B Dpercent
or
.BR Drelative .
.B Dnone
means that no dimension was specified.
In all other cases,
.I dimenspec
should be called to find the absolute number of pixels, the percentage of total,
or the relative weight.
.SS Background Specifications
.PP
It is possible to set the background of the entire document, and also
for some parts of the document (such as tables).
This is encoded as follows:
.PP
.EX
.ta 6n +\w'Rune* 'u
typedef struct Background Background;
struct Background
{
	Rune*	image;
	int	color;
};
.EE
.PP
.BR Image ,
if non-nil, is the URL of an image to use as the background.
If this is nil,
.B color
is used instead, as the RGB value for a solid fill color.
.SS Alignment Specifications
.PP
Certain items have alignment specifiers taken from the following
enumerated type:
.PP
.EX
.ta 6n
enum
{
	ALnone = 0, ALleft, ALcenter, ALright, ALjustify,
	ALchar, ALtop, ALmiddle, ALbottom, ALbaseline
};
.EE
.PP
These values correspond to the various alignment types named in the HTML 4.0
standard.
If an item has an alignment of
.B ALleft
or
.BR ALright ,
the library automatically encapsulates it inside a float item.
.PP
Tables, and the various rows, columns and cells within them, have a more
complex alignment specification, composed of separate vertical and
horizontal alignments:
.PP
.EX
.ta 6n +\w'uchar 'u
typedef struct Align Align;
struct Align
{
	uchar	halign;
	uchar	valign;
};
.EE
.PP
.B Halign
can be one of
.BR ALnone ,
.BR ALleft ,
.BR ALcenter ,
.BR ALright ,
.B ALjustify
or
.BR ALchar .
.B Valign
can be one of
.BR ALnone ,
.BR ALmiddle ,
.BR ALbottom ,
.BR ALtop
or
.BR ALbaseline .
.SS Font Numbers
.PP
Text items have an associated font number (the
.B fnt
field), which is encoded as
.BR style*NumSize+size .
Here,
.B style
is one of
.BR FntR ,
.BR FntI ,
.B FntB
or
.BR FntT ,
for roman, italic, bold and typewriter font styles, respectively, and size is
.BR Tiny ,
.BR Small ,
.BR Normal ,
.B Large
or
.BR Verylarge .
The total number of possible font numbers is
.BR NumFnt ,
and the default font number is
.B DefFnt
(which is roman style, normal size).
.SS Document Info
.PP
Global information about an HTML page is stored in the following structure:
.PP
.EX
.ta 6n +\w'DestAnchor* 'u
typedef struct Docinfo Docinfo;
struct Docinfo
{
	// stuff from HTTP headers, doc head, and body tag
	Rune*	src;
	Rune*	base;
	Rune*	doctitle;
	Background	background;
	Iimage*	backgrounditem;
	int	text;
	int	link;
	int	vlink;
	int	alink;
	int	target;
	int	chset;
	int	mediatype;
	int	scripttype;
	int	hasscripts;
	Rune*	refresh;
	Kidinfo*	kidinfo;
	int	frameid;

	// info needed to respond to user actions
	Anchor*	anchors;
	DestAnchor*	dests;
	Form*	forms;
	Table*	tables;
	Map*	maps;
	Iimage*	images;
};
.EE
.PP
.B Src
gives the URL of the original source of the document,
and
.B base
is the base URL.
.B Doctitle
is the document's title, as set by a
.B <title>
element.
.B Background
is as described in the section
.IR "Background Specifications" ,
and
.B backgrounditem
is set to be an image item for the document's background image (if given as a URL),
or else nil.
.B Text
gives the default foregound text color of the document,
.B link
the unvisited hyperlink color,
.B vlink
the visited hyperlink color, and
.B alink
the color for highlighting hyperlinks (all in 24-bit RGB format).
.B Target
is the default target frame id.
.B Chset
and
.B mediatype
are as for the
.I chset
and
.I mtype
parameters to
.IR parsehtml .
.B Scripttype
is the type of any scripts contained in the document, and is always
.BR TextJavascript .
.B Hasscripts
is set if the document contains any scripts.
Scripting is currently unsupported.
.B Refresh
is the contents of a
.B "<meta http-equiv=Refresh ...>"
tag, if any.
.B Kidinfo
is set if this document is a frameset (see section
.IR Frames ).
.B Frameid
is this document's frame id.
.PP
.B Anchors
is a list of hyperlinks contained in the document,
and
.B dests
is a list of hyperlink destinations within the page (see the following section for details).
.BR Forms ,
.B tables
and
.B maps
are lists of the various forms, tables and client-side maps contained
in the document, as described in subsequent sections.
.B Images
is a list of all the image items in the document.
.SS Anchors
.PP
The library builds two lists for all of the
.B <a>
elements (anchors) in a document.
Each anchor is assigned a unique anchor id within the document.
For anchors which are hyperlinks (the
.B href
attribute was supplied), the following structure is defined:
.PP
.EX
.ta 6n +\w'Anchor* 'u
typedef struct Anchor Anchor;
struct Anchor
{
	Anchor*	next;
	int	index;
	Rune*	name;
	Rune*	href;
	int	target;
};
.EE
.PP
.B Next
points to the next anchor in the list (the head of this list is
.BR Docinfo.anchors ).
.B Index
is the anchor id; each item within this hyperlink is tagged with this value
in its
.B anchorid
field.
.B Name
and
.B href
are the values of the correspondingly named attributes of the anchor
(in particular, href is the URL to go to).
.B Target
is the value of the target attribute (if provided) converted to a frame id.
.PP
Destinations within the document (anchors with the name attribute set)
are held in the
.B Docinfo.dests
list, using the following structure:
.PP
.EX
.ta 6n +\w'DestAnchor* 'u
typedef struct DestAnchor DestAnchor;
struct DestAnchor
{
	DestAnchor*	next;
	int	index;
	Rune*	name;
	Item*	item;
};
.EE
.PP
.B Next
is the next element of the list,
.B index
is the anchor id,
.B name
is the value of the name attribute, and
.B item
is points to the item within the parsed document that should be considered
to be the destination.
.SS Forms
.PP
Any forms within a document are kept in a list, headed by
.BR Docinfo.forms .
The elements of this list are as follows:
.PP
.EX
.ta 6n +\w'Formfield* 'u
typedef struct Form Form;
struct Form
{
	Form*	next;
	int	formid;
	Rune*	name;
	Rune*	action;
	int	target;
	int	method;
	int	nfields;
	Formfield*	fields;
};
.EE
.PP
.B Next
points to the next form in the list.
.B Formid
is a serial number for the form within the document.
.B Name
is the value of the form's name or id attribute.
.B Action
is the value of any action attribute.
.B Target
is the value of the target attribute (if any) converted to a frame target id.
.B Method
is one of
.B HGet
or
.BR HPost .
.B Nfields
is the number of fields in the form, and
.B fields
is a linked list of the actual fields.
.PP
The individual fields in a form are described by the following structure:
.PP
.EX
.ta 6n +\w'Formfield* 'u
typedef struct Formfield Formfield;
struct Formfield
{
	Formfield*	next;
	int	ftype;
	int	fieldid;
	Form*	form;
	Rune*	name;
	Rune*	value;
	int	size;
	int	maxlength;
	int	rows;
	int	cols;
	uchar	flags;
	Option*	options;
	Item*	image;
	int	ctlid;
	SEvent*	events;
};
.EE
.PP
Here,
.B next
points to the next field in the list.
.B Ftype
is the type of the field, which can be one of
.BR Ftext ,
.BR Fpassword ,
.BR Fcheckbox ,
.BR Fradio ,
.BR Fsubmit ,
.BR Fhidden ,
.BR Fimage ,
.BR Freset ,
.BR Ffile ,
.BR Fbutton ,
.B Fselect
or
.BR Ftextarea .
.B Fieldid
is a serial number for the field within the form.
.B Form
points back to the form containing this field.
.BR Name ,
.BR value ,
.BR size ,
.BR maxlength ,
.B rows
and
.B cols
each contain the values of corresponding attributes of the field, if present.
.B Flags
contains per-field flags, of which
.B FFchecked
and
.B FFmultiple
are defined.
.B Image
is only used for fields of type
.BR Fimage ;
it points to an image item containing the image to be displayed.
.B Ctlid
is reserved for use by the caller, typically to store a unique id
of an associated control used to implement the field.
.B Events
is the same as the corresponding field of the generic attributes
associated with the item containing this field.
.B Options
is only used by fields of type
.BR Fselect ;
it consists of a list of possible options that may be selected for that
field, using the following structure:
.PP
.EX
.ta 6n +\w'Option* 'u
typedef struct Option Option;
struct Option
{
	Option*	next;
	int	selected;
	Rune*	value;
	Rune*	display;
};
.EE
.PP
.B Next
points to the next element of the list.
.B Selected
is set if this option is to be displayed initially.
.B Value
is the value to send when the form is submitted if this option is selected.
.B Display
is the string to display on the screen for this option.
.SS Tables
.PP
The library builds a list of all the tables in the document,
headed by
.BR Docinfo.tables .
Each element of this list has the following format:
.PP
.EX
.ta 6n +\w'Tablecell*** 'u
typedef struct Table Table;
struct Table
{
	Table*	next;
	int	tableid;
	Tablerow*	rows;
	int	nrow;
	Tablecol*	cols;
	int	ncol;
	Tablecell*	cells;
	int	ncell;
	Tablecell***	grid;
	Align	align;
	Dimen	width;
	int	border;
	int	cellspacing;
	int	cellpadding;
	Background	background;
	Item*	caption;
	uchar	caption_place;
	Lay*	caption_lay;
	int	totw;
	int	toth;
	int	caph;
	int	availw;
	Token*	tabletok;
	uchar	flags;
};
.EE
.PP
.B Next
points to the next element in the list of tables.
.B Tableid
is a serial number for the table within the document.
.B Rows
is an array of row specifications (described below) and
.B nrow
is the number of elements in this array.
Similarly,
.B cols
is an array of column specifications, and
.B ncol
the size of this array.
.B Cells
is a list of all cells within the table (structure described below)
and
.B ncell
is the number of elements in this list.
Note that a cell may span multiple rows and/or columns, thus
.B ncell
may be smaller than
.BR nrow*ncol .
.B Grid
is a two-dimensional array of cells within the table; the cell
at row
.B i
and column
.B j
is
.BR Table.grid[i][j] .
A cell that spans multiple rows and/or columns will
be referenced by
.B grid
multiple times, however it will only occur once in
.BR cells .
.B Align
gives the alignment specification for the entire table,
and
.B width
gives the requested width as a dimension specification.
.BR Border ,
.B cellspacing
and
.B cellpadding
give the values of the corresponding attributes for the table,
and
.B background
gives the requested background for the table.
.B Caption
is a linked list of items to be displayed as the caption of the
table, either above or below depending on whether
.B caption_place
is
.B ALtop
or
.BR ALbottom .
Most of the remaining fields are reserved for use by the caller,
except
.BR tabletok ,
which is reserved for internal use.
The type
.B Lay
is not defined by the library; the caller can provide its
own definition.
.PP
The
.B Tablecol
structure is defined for use by the caller.
The library ensures that the correct number of these
is allocated, but leaves them blank.
The fields are as follows:
.PP
.EX
.ta 6n +\w'Point 'u
typedef struct Tablecol Tablecol;
struct Tablecol
{
	int	width;
	Align	align;
	Point		pos;
};
.EE
.PP
The rows in the table are specified as follows:
.PP
.EX
.ta 6n +\w'Background 'u
typedef struct Tablerow Tablerow;
struct Tablerow
{
	Tablerow*	next;
	Tablecell*	cells;
	int	height;
	int	ascent;
	Align	align;
	Background	background;
	Point	pos;
	uchar	flags;
};
.EE
.PP
.B Next
is only used during parsing; it should be ignored by the caller.
.B Cells
provides a list of all the cells in a row, linked through their
.B nextinrow
fields (see below).
.BR Height ,
.B ascent
and
.B pos
are reserved for use by the caller.
.B Align
is the alignment specification for the row, and
.B background
is the background to use, if specified.
.B Flags
is used by the parser; ignore this field.
.PP
The individual cells of the table are described as follows:
.PP
.EX
.ta 6n +\w'Background 'u
typedef struct Tablecell Tablecell;
struct Tablecell
{
	Tablecell*	next;
	Tablecell*	nextinrow;
	int	cellid;
	Item*	content;
	Lay*	lay;
	int	rowspan;
	int	colspan;
	Align	align;
	uchar	flags;
	Dimen	wspec;
	int	hspec;
	Background	background;
	int	minw;
	int	maxw;
	int	ascent;
	int	row;
	int	col;
	Point	pos;
};
.EE
.PP
.B Next
is used to link together the list of all cells within a table
.RB ( Table.cells ),
whereas
.B nextinrow
is used to link together all the cells within a single row
.RB ( Tablerow.cells ).
.B Cellid
provides a serial number for the cell within the table.
.B Content
is a linked list of the items to be laid out within the cell.
.B Lay
is reserved for the user to describe how these items have
been laid out.
.B Rowspan
and
.B colspan
are the number of rows and columns spanned by this cell,
respectively.
.B Align
is the alignment specification for the cell.
.B Flags
is some combination of
.BR TFparsing ,
.B TFnowrap
and
.B TFisth
or'd together.
Here
.B TFparsing
is used internally by the parser, and should be ignored.
.B TFnowrap
means that the contents of the cell should not be
wrapped if they don't fit the available width,
rather, the table should be expanded if need be
(this is set when the nowrap attribute is supplied).
.B TFisth
means that the cell was created by the
.B <th>
element (rather than the
.B <td>
element),
indicating that it is a header cell rather than a data cell.
.B Wspec
provides a suggested width as a dimension specification,
and
.B hspec
provides a suggested height in pixels.
.B Background
gives a background specification for the individual cell.
.BR Minw ,
.BR maxw ,
.B ascent
and
.B pos
are reserved for use by the caller during layout.
.B Row
and
.B col
give the indices of the row and column of the top left-hand
corner of the cell within the table grid.
.SS Client-side Maps
.PP
The library builds a list of client-side maps, headed by
.BR Docinfo.maps ,
and having the following structure:
.PP
.EX
.ta 6n +\w'Rune* 'u
typedef struct Map Map;
struct Map
{
	Map*	next;
	Rune*	name;
	Area*	areas;
};
.EE
.PP
.B Next
points to the next element in the list,
.B name
is the name of the map (use to bind it to an image), and
.B areas
is a list of the areas within the image that comprise the map,
using the following structure:
.PP
.EX
.ta 6n +\w'Dimen* 'u
typedef struct Area Area;
struct Area
{
	Area*	next;
	int	shape;
	Rune*	href;
	int	target;
	Dimen*	coords;
	int	ncoords;
};
.EE
.PP
.B Next
points to the next element in the map's list of areas.
.B Shape
describes the shape of the area, and is one of
.BR SHrect ,
.B SHcircle
or
.BR  SHpoly .
.B Href
is the URL associated with this area in its role as
a hypertext link, and
.B target
is the target frame it should be loaded in.
.B Coords
is an array of coordinates for the shape, and
.B ncoords
is the size of this array (number of elements).
.SS Frames
.PP
If the
.B Docinfo.kidinfo
field is set, the document is a frameset.
In this case, it is typical for
.I parsehtml
to return nil, as a document which is a frameset should have no actual
items that need to be laid out (such will appear only in subsidiary documents).
It is possible that items will be returned by a malformed document; the caller
should check for this and free any such items.
.PP
The
.B Kidinfo
structure itself reflects the fact that framesets can be nested within a document.
If is defined as follows:
.PP
.EX
.ta 6n +\w'Kidinfo* 'u
typedef struct Kidinfo Kidinfo;
struct Kidinfo
{
	Kidinfo*	next;
	int	isframeset;

	// fields for "frame"
	Rune*	src;
	Rune*	name;
	int	marginw;
	int	marginh;
	int	framebd;
	int	flags;

	// fields for "frameset"
	Dimen*	rows;
	int	nrows;
	Dimen*	cols;
	int	ncols;
	Kidinfo*	kidinfos;
	Kidinfo*	nextframeset;
};
.EE
.PP
.B Next
is only used if this structure is part of a containing frameset; it points to the next
element in the list of children of that frameset.
.B Isframeset
is set when this structure represents a frameset; if clear, it is an individual frame.
.PP
Some fields are used only for framesets.
.B Rows
is an array of dimension specifications for rows in the frameset, and
.B nrows
is the length of this array.
.B Cols
is the corresponding array for columns, of length
.BR ncols .
.B Kidinfos
points to a list of components contained within this frameset, each
of which may be a frameset or a frame.
.B Nextframeset
is only used during parsing, and should be ignored.
.PP
The remaining fields are used if the structure describes a frame, not a frameset.
.B Src
provides the URL for the document that should be initially loaded into this frame.
Note that this may be a relative URL, in which case it should be interpretted
using the containing document's URL as the base.
.B Name
gives the name of the frame, typically supplied via a name attribute in the HTML.
If no name was given, the library allocates one.
.BR Marginw ,
.B marginh
and
.B framebd
are the values of the marginwidth, marginheight and frameborder attributes, respectively.
.B Flags
can contain some combination of the following:
.B FRnoresize
(the frame had the noresize attribute set, and the user should not be allowed to resize it),
.B FRnoscroll
(the frame should not have any scroll bars),
.B FRhscroll
(the frame should have a horizontal scroll bar),
.B FRvscroll
(the frame should have a vertical scroll bar),
.B FRhscrollauto
(the frame should be automatically given a horizontal scroll bar if its contents
would not otherwise fit), and
.B FRvscrollauto
(the frame gets a vertical scrollbar only if required).
.SH SOURCE
.B \*9/src/libhtml
.SH SEE ALSO
.IR fmt (1)
.PP
W3C World Wide Web Consortium,
``HTML 4.01 Specification''.
.SH BUGS
The entire HTML document must be loaded into memory before
any of it can be parsed.
