1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420 |
- .TH HTML 2
- .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 /sys/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.
|