Author: Kipp E.B. HIckman

## HTML

This documents describes the complete handling of HTML in magellan. The document covers the parsing process - how HTML is lexically analysized and then interprted. After the parsing process is discussed we give a detailed analysis of each HTML tag and the attributes that are supported, the values for the attributes and how the tag is treated by magellan.

## Parsing

HTML is tokenized by an HTML scanner. The scanner is fed unicode data to parse. Stream converters are used to translate from various encodings to unicode. The scanner separates the input stream into tokens which consist of:

- text
- tags
- entities
- script-entities
- comments
- conditional comments

The HTML parsing engine uses the HTML scanner for lexical anlaysis. The parsing engine operates by attacking the input stream in a set of well defined steps:

- The parser processes the head portion of the document first, without emitting any output. This is done to discover a few special features of html:

- The parser processes META tags looking for META TARGET
- The parser processes META tags looking for META tags which affect the character set. Nav4 handles the very first character set defining meta tag (all others are ignored) by reloading the document with the proper character conversion module inserted into the stream pipeline.

- After the head portion is processed the parser then proceeds to process the body of the document

### Tag Processing

Tags are processed by the parser by locating a "tag handler" for the tag. The HTML parser serves as the tag handler for all of the builtin tags documented below. Tag attribute handling is done during translation of tags into content. This mapping translates the tag attributes into content data and into style data. The translation to style data is documented below by indicating the mapping from tag attributes to their CSS1 (plus extensions) equivalents.

### Special Hacks

The following list describes hacks added to the magellan parsing engine to deal with navigator compatability. These are just the parser hacks, not the layout or presentation hacks. Most hacks are intriduced for HTML syntax error recovering. HTML doesn't specify much how to handle those error conditions. Netscape has made big effort to render pages with non-prefect HTML. For many reasons, new browsers need to keep compatible in thsi area.

- Entities can be used as escape in quoted string. For value string in name-value pair, see compatibility test quote001.html. Test line 70 shows that an entity quote at the begining means the value is NOT quoted. Test line 90 shows that if the value is started with a quote, then an entity quote does NOT terminate the value string.
- Wrapping tags are special tags such as title, textarea, server, script, style, and etc.. The comment in ns\lib\libparse\pa_parse.c says:
/*
* These tags are special in that, after opening one of them, all other tags are ignored until the matching
* closing tag.
*/
During the searching of an end tag, comments and quoted strings are observed. see compatibility test title01.html. 6.0 handles comments now, need to add quoted string.
- If a <tr> or <td> tag is seen outside any <table> scope, it is ignored. see compatibility test table110.htm.
- In case of table in table but not in cell, table tags before the last table tag are ignored. We found this problem in some Netscape public pages, see bug #85118. For example, <table> <table border> .....,or <table> <tr> <table border>..., the table will be displayed with border. compatibility test table201.html. There table and tr tags are buffered for this recovery. When a TD or CAPTION tag is open, the buffer is flushed out, because we cannot buffer contents of TD or CAPTION for performance and memory constrains. They are subdoc's and can be very big. If we see a <table> outside cell after previous table is flushed out, the new <table> tag is ignored. Nav4.0 can discard previous table in such case. tableall.html is the index for table test cases.
- Caption is not a commonly used feature. In Nav4.0, captions can be anywhere. For Captions outside cells, the first one takes effect. For captions inside cells, the last one takes effect, and they also close TD and TR. In 6.0, caption is limited to the standard position: after <table>. Captions in other places are ignored, their contents are treated as text. See test case table05a.html to table05o.html.
- For <table> <tr> <tr>, the first <tr> takes effect.
- The nav4 parser notices when it hits EOF and it's in the middle of scanning in a comment. When this happens, the parser goes back and looks for an improperly closed comment (e.g. a simple > instead of a -->). If it finds one, it reparses the input after closing out the comment.
- XXX Brendan also pointed out that there is something similar done for tags, but I don't recall what it is right now.
- When Nav4.0 sees the '<' sign, it searchs for '>', observing quoted values. If it cannot find one till EOF, the '<' sign is treated as text. In Xena 6.0, a limit is set for how far the '>' is searched. the default limit is 4096 char, and there is a API HTMLScanner.setMaxTagLength() to changed it. setting -1 means no limit, which is same as Nav4.0.

TODO:

Document the mapping of tag attributes into CSS1 style, including any new "css1" attributes

List of 6.0 features incompatible with 4.0

- Navigator 4.0 value string is truncated at 82 characters. XENA60 limit is MAX_STRING_LENGTH = 2000.

## Tags (Categorically sorted)

All line breaks are conditional. If the x coordinate is at the current left margin then a soft line break does nothing. Hard line breaks are ignored if the last tag did a hard line break.

divalign = left | right | center | justify
alignparam = abscenter | left | right | texttop | absbottom | baseline | center | bottom | top | middle | absmiddle
colorspec = named-color | #xyz | #xxyyzz | #xxxyyyzzz | #xxxxyyyyzzzz
clip = [auto | value-or-pct-xy](1..4) (pct of width for even coordinates; pct of height for odd coordinates)
value-or-pct = an integer with an optional %; ifthe percent is present any following characters are ignored!
coord-list = XXX
whitespace-strip = remove leading and trailing and any embedded whitespace that is not an actual space (e.g. newlines)

# Head objects:

TITLE

The TITLE tag is a container tag whose contents are not HTML. The contents are pure text and are processed by the parser until the closing tag is found. There are no attributes on the tag and any whitespace present in the tag is compressed down with leading and trailing whitespace eliminated. The first TITLE tag found by the parser is used as the document's title (subsequent tags are ignored).

BASE

Sets the base element in the head portion of the document. Defines the base URL for all? links in the document.
Attributes:

HREF=url [This is an absolute URL]
TARGET=string [must start with XP_ALPHA|XP_DIGIT|underscore otherwise nav4 ignores it]

META

Can define several header fields (content-encoding, author, etc.)
Attributes:

REL=SMALL_BOOKMARK_ICON|LARGE_BOOKMARK_ICON

SRC=string

HTTP-EQUIV="header: value"

CONTENT=string

HTTP-EQUIV values (from libnet/mkutils.c NET_ParseMimeHeader):

ACCEPT-RANGES
CONTENT-DISPOSITION
CONTENT-ENCODING
CONTENT-RANGE
CONTENT-TYPE [ defines character set only ]
CONNECTION
DATE
EXPIRES
EXT-CACHE
LOCATION
LAST-MODIFIED
LINK
PROXY-AUTHENTICATE
PROXY-CONNECTION
PRAGMA
RANGE
REFRESH
SET-COOKIE
SERVER
WWW-AUTHENTICATE
WWW-PROTECTION-TEMPLATE
WINDOW-TARGET

Style sheets and HTML w3c spec adds this:

CONTENT-STYLE-TYPE [ last one wins; overrides header from server if any ]

LINK

List related resources. Used by extensions mechanism to find tag handlers. /LINK == LINK!
Attributes:

REL=FONTDEF

SRC=url

REL=STYLESHEET [ If MEDIA param is defined it must ==nc screen ]

LANGUAGE=LiveScript|Mocha|JavaScript1.1|JavaScript1.2
TYPE="text/javascript" | "text/css"
HREF=url
ARCHIVE=url
CODEBASE=url
ID=string
SRC=url

Note: HREF takes precedence over SRC in nav4.

HEAD

/HEAD clears the "in_head" flag (but leaves the "in_body" flag alone.
Text in head clears in_head, and set in_body true, just as if the author forgot the /HEAD tag.
Attributes: none

HTML

Ignored.
Attributes: none

STYLE

Allowed anywhere in the document. Note that entities are not parsed in the style tag's content.
Attributes:

LANGUAGE=LiveScript|Mocha|JavaScript1.1|JavaScript1.2
TYPE="text/javascript" | "text/css"
HREF=url
ARCHIVE=url
CODEBASE=url
ID=string
SRC=url

FRAMESET

Frameset with rows=1 and cols=1 is ignored.
Attributes:

FRAMEBORDER= no | 0 (zero) [default is no_edges=false]
BORDER= int [clamped: >= 0 && <= 100]
BORDERCOLOR= color
ROWS= pct-list
COLS= pct-list

FRAME

Border width of zero disables edges.
Attributes:

FRAMEBORDER= no | 0 (zero) [default is framesets value]
BORDER= int [clamped; >= 0 && <= 100]
BORDERCOLOR= color
NORESIZE= true [default is false]
SCROLLING= yes | scroll | on | no | noscroll | off
SRC= url [clamped: prevent recursion by eliminating any anscestor references]
NAME= string
MARGINWIDTH= int (clamped: >= 1)
MARGINHEIGHT= int (clamped: >= 1)

NOFRAMES

Used when frames are disabled or for backrev browsers. Has no stylistic consequences.

#

Body objects:

BODY

The tag is only processed on open tags and it is always processed. See ns\lib\layout\laytags.c, searching for "case P_BODY". During tag processing the in_head flag is set to false and the in_body flag is set to true. An attribute is ignored if the document already has that attribute set. Attributes can be set by style sheets, or by previous BODY tags. see test head02.html.
Attributes:

MARGINWIDTH=int [clamped: >= 0 && < (windowWidth/2 - 1)]
MARGINHEIGHT=int [clamped: >= 0 && < (windowHeight/2 - 1)]
BACKGROUND=url
BGCOLOR=colorspec
TEXT=colorspec
LINK=colorspec
VLINK=colorspec
ALINK=colorspec
ONLOAD, ONUNLOAD, UNFOCUS, ONBLUR, ONHELP=script
ID=string

LAYER, ILAYER

Open layer/ilayer tag automaticly close out an open form if one is open. It does something to the soft linebreak state too.
Attributes:

LEFT=value-or-pct (pct of `right-left` margin)
PAGEX=x (if no LEFT)
TOP=value-or-pct
PAGEY=y (if no TOP)
CLIP=clip
WIDTH=value-or-pct (pct of `right-left` margin)
HEIGHT=value-or-pct
OVERFLOW=string
NAME=string
ID=string
ABOVE=string
BELOW=string
ZINDEX=int [any value]
VISIBILITY=string
BGCOLOR=colorspec
BACKGROUND=url

NOLAYER

Container for content which is used when layers are disabled or unsupported. The content has no style consequences (though it could if somebody stuck in some CSS1 style rules for it).

P

Closes the paragraph. If the attribute is present then an alignment gets pushed on the alignment stack. All values are supported by nav4.
Attributes:

ALIGN=divalign

ADDRESS

There are no attributes. ADDRESS closes out the open paragraph. The open tag does a conditional soft line break and then pushes a merge of the current style with italics enabled onto the style stack. The close always pop the style stack and also does a conditional soft line break.

PLAINTEXT, XMP

PLAINTEXT causes the remaining content to no longer be parsed. XMP causes the content to not parse entities or other tags. The XMP can be closed by it's own tag (on any boundary); PLAINTEXT is not closed (html3.2 allows it to be closed). Both tags change the style to a fixed font of a

LISTING

Closes the paragraph. Does a hard line break on open and close. Open pushes a fixed width font style of a particular font size on the style stack. The close tag pops the top of the style stack.
Attributes: none

PRE

Closes the paragraph. The open tag does a hard line break. A fixed font style (unless VARIABLE is present) is pushed on the style stack. The close tag pops the top of the style stack. It also does a hard line break.
Attributes:

WRAP
COLS=int [clamped: >= 0]
TABSTOP=int [clamped: >= 0; clamped value is replaced with default value]
VARIABLE

NOBR

This tag doesn't nest. Instead it just sets or clears a flag in the state machine. It has no effect on any other state.

CENTER

Closes the paragraph. Always does a conditional soft line break. The open tag pushes an alignment on the aligment stack. The close tag pops the top alignment off.
Attributes: none

DIV

Closes the paragraph. Always does a conditional soft line break. COLS defines the number of columns to layout in (like MULTICOL). The open tag pushes an alignment on the alignment stack (if COLS > 1 then it pretends to be a MULTICOL tag). The close tag pops an aligment from the alignment stack.
Attributes:

ALIGN=divalign
COLS=int [if cols > 1 then DIV acts like a MULTICOL tag else DIV is just a container]

GUTTER= int (clamped: >= 1)
WIDTH= value-or-pct [pct of right-left margin; clamped >= 1/0 (strange code)]

H1-H6

Closes the paragraph. The open tag does a hard line break and pushes a style item which enables bold and disables fixed and italic. The close tag always pops the top item from the style stack. It also does a hard line break. If the ALIGN attribute is present then the open tag pushes an alignment on the alignment stack. The close tag will look at the top of the alignment stack and if its a header of any kind (H1 through H6) then the alignment is popped. In either case the close tag also does a conditional soft line break (this happens before the hard line break).
Attributes:

ALIGN=divalign

A note regarding closing paragraphs: Any time a close paragraph is done (for any tag) if the top of the alignment stack has a tag named "P" then a conditional soft line break is done and the alignment is popped.

###

TABLE

Close the paragraph.
Attributes:

ALIGN=left|right|center|abscenter
BORDER=int [clamped: if null then -1, if < 1 then 1 ]
BORDERCOLOR=string [if not supplied then set to the text color ]
VSPACE=int [ clamped: >= 0 ]
HSPACE=int [ clamped: >= 0 ]
BGCOLOR=color
BACKGROUND=url
WIDTH=value-or-pct [ % of win.width minus margins; clamped: >= 0 ]
HEIGHT=value-or-pct [ % of win.height minus margins; clamped: >= 0 ]
CELLPADDING=int [clamped: >= 0; separate pads take precedence ]
TOPPADDING= int [clamped: >= 0 ]
BOTTOMPADDING= int [clamped: >= 0 ]
LEFTPADDING= int [clamped: >= 0 ]
RIGHTPADDING= int [clamped: >= 0 ]
CELLSPACING= int [clamped: >= 0 ]
COLS=int [clamped: >= 0]

The code supports more attributes in the Table attribute handler than it does in the code that gets the attributes from the tag! They are border_top, border_left, border_right, border_bottom, border_style (defaults to outset; allows for outset/dotted/none/dashed/solid/double/groove/ridge/inset).

TR

Open TR automatically closes an open table row (and an open table cell if one is open). It also automatically closes a CAPTION tag.
Attributes:

BGCOLOR=color
BACKGROUND=url
VALIGN=top|bottom|middle|center(==middle)|baseline; default is top
ALIGN=left|right|middle|center(==middle); default is left

TH, TD

If no table then the tag is ignored (open or close). If no row is currently opened or the current row is current done (because of a </TR> tag) then a new row is begun. Oddly enough the tag parameters for the row come from the TH/TD tag in this case. An open of either of these tags will automatically close the previous cell.
Attributes:

COLSPAN=int [clamped: >= 1 && <= 1000 ]
ROWSPAN=int [clamped: >= 1 && <= 10000 ]
NOWRAP [boolean: disables wrapping ]
BGCOLOR=color [default: inherit from the row; if not row then table; if not table then inherit from an outer table cell; this works because the style is flattened so the outer table cell will have a color]
BACKGROUND=url [same rules as bgcolor for inheritance; tile mode is inherited too and not settable by TH/TD attributes (have to use style sheets for that)]
VALIGN=top|bottom|middle|center(==middle)|baseline; default is top
ALIGN=left|right|middle|center(==middle); default is left
WIDTH=value-or-pct [ clamped: >= 0 ]
HEIGHT=value-or-pct [ clamped: >= 0 ]

CAPTION

An open caption tag will automatically close an open table row (and an open cell).
Attributes:

ALIGN=bottom

The code sets the vertical alignment to top w/o providing a mechanism for the user to set it (there is no VALIGN attribute).

MULTICOL

The open tag does a hard line break. The close tag checks to see if the state machine has an open multicol and if it does then it does a conditional soft line break and then continues to break until both margins are cleared of floating elements. It recomputes the margins based on the list indenting level (?). After the synthetic table is output the close tag does a hard line break.

This tag will treat the input as source for a table with one row and COLS columns. The data is laid out using the width divided by the number of columns. After the total height is known, the content is partitioned as evenly as possible between the columns in the table.
Attributes:

COLS=int [clamped: values less than 2 cause the tag to be ignored]
GUTTER=int [clamped: >= 1]
WIDTH=value-or-pct [pct of right-left margin; clamped: >= 1/0 (strange code)]

###

BLOCKQUOTE

Closes the paragraph. The open tag does a hard line break. A list with the empty-bullet style is pushed on the list stack (unless TYPE=cite/jwz then a styled list is pushed). The close tag pops any list and does a hard line break.
Attributes:

TYPE=cite | jwz

UL, OL, MENU, DIR

For top-level lists (lists not in lists) a hard break is done on the open tag, otherwise a conditional-soft-break is done. Tag always does a close paragrah. The close tag does a conditional soft line break when nested; when not nested the close tag does a hard line break (even if no list is open). The open tag pushes the list on the list stack. The close tag pops any list off the list stack.
Attributes:

TYPE= none | disc | circle | round | square | decimal | lower-roman | upper-roman | lower-alpha | upper-alpha | A | a | I | i [clamped: if none of the above is picked and OL then the bullet type is "number" otherwise the bullet type is "basic"]
START=int [clamped: >= 1]
COMPACT

DL

Closes the paragraph. For the open tag, if the list is nested then a conditional soft line break is done otherwise a hard line break is done. The open tag pushes a list on the list stack. The close tag pops any list from the list stack. Closing the list acts like other lists closes.
Attributes:

COMPACT

LI

Closes the paragraph. The open tag does a conditional soft line break. Close tags are ignored (except for closing the paragraph).
Attributes:

TYPE= A | a | I | i (if the containing list is an OL)
TYPE= round | circle | square (if the containing list is not OL and not DL)
VALUE=int [clamped: >= 1]

The magellan html parser allows the full set of list item styles from the OL/DL tag instead of just the limited set that nav4 allows.

DD

Closes the paragraph. Close tags are ignored (except for closing the paragraph). DD outside a DL just advances the X coordinate of layout by a small constant. DD inside a DL does a conditional soft line break and other margin crud.
Attributes: none.

DT

Closes the paragraph (open or close). Close tags are otherwise ignored. Does a conditional soft line break. Moves the X layout coordinate to the left margin.
Attributes: none

###

A

Open anchors push a style on the style stack if the anchor has an HREF. Close anchors pop as many styles off the top of the style stack that are anchor tags (anchor tags don't nest in other words). In addition, any styles on the stack that have the ANCHOR bit set have it cleared and fiddle with the foreground and background colors.
Attributes:

NAME=string
HREF=url

TARGET=target
SUPPRESS=true

STRIKE, S, TT, CODE, SAMPLE, KBD, B, STRONG, I, EM, VAR, CITE, BLINK, BIG, SMALL, U, INLINEINPUT, SPELL

The open tag pushes onto the style stack. The close tag always pops the top item from the style stack.
Attributes: none

SUP, SUB

The open tag pushes a font size descrease on the style stack. The close tag always pops the top of the style stack. The open and close tag impacts the baselineThe only difference between SUP and SUB is how they impact the baseline. Note that the baseline information is forgotten after a line break; therefore a close SUP/SUB on the next line will do strange things.
Attributes: none

SPAN

Ignored by the navigator.
Attributes: none

FONT

The open font tag with no attributes resets the font size to the base font size. The open tag always pushes a style stack entry. The close tag always pops the top item off the style stack.
Attributes:

SIZE=[+ int | - int | int ] [clamped: >=1 && <= 7]
POINT-SIZE=[+ int | - int | int ] [clamped: >= 1 && <= 1600]
FONT-WEIGHT=[+ int | - int | int ] [clamped: >= 100 && <= 900]
COLOR=colorspec
FACE=string

A note regarding the style stack: The pop of the stack checks to see if the top of the stack is an ANCHOR tag. If it is not an anchor then the top item is unconditionally popped. If the top of the style stack is an anchor tag then the code searches for either the bottom of the stack or the first style stack entry not created by an anchor tag. If the entry is followed by another entry then the entry is removed from the stack (an out-of-order pop in other words). In this case the anchor style stack entry is left untouched.

###

text, entities

These are basic content objects that get fed directly to the output. In navigator the text is processed by doing line-breaking (entities have been converted to text already by the parser). The line-breaking is controlled by the margin settings and the list depth, the floating elements, the style attributes (font size, etc.), the preformatted flag, the no-break flag and so on.

IMG, IMAGE

Close tag is ignored.
Attributes:

ISMAP
USEMAP=url
ALIGN=alignparam
SRC=url [ whitespace is stripped ]
LOWSRC=url
ALT=string
WIDTH=value-or-pct (pct of `right-left` width)
HEIGHT=value-or-pct (pct of window height)
BORDER=int [clamped: >= 0]
VSPACE=int [clamped: >= 0]
HSPACE=int [clamped: >= 0]
SUPPRESS=true | false (only in blocked image layout???)

HR

Closes the paragraph. If an open tag then does a conditional soft line break. The rule inherits alignment from the parent container unless there is no container (then it's centered) or if the tag defines it's own alignment. After the object is inserted into the layout stream a soft line break is inserted as well.
Attributes:

ALIGN=divalign (sort of; in laytags.c it's divalign; in layhrule.c it's left or right only)
SIZE=int (1 to 100 inclusive)
WIDTH=val-or-pct (pct of `right-left` width)
NOSHADE

BR

Does an unconditional soft break. If clear is set then it will also soft break until either the left or right or both margins are clear of floating elements. Note that /BR == BR!
Attributes:

CLEAR=left | right | all | both

WBR

Soft word break.
Attributes: none

EMBED

Close tag does nothing. Embed's operate inline just like images (they don't close the paragraph).
Attributes:

HIDDEN=no | false | off
ALIGN=alignparam
SRC=url
WIDTH=val-or-pct (pct of `right-left` width)
HEIGHT=val-of-pct; if val is < 1 (sometimes) the element gets HIDDEN automatically
BORDER=int (unsupported by navigator)
VSPACE=int [clamped: >= 0]
HSPACE=int [clamped: >= 0]

NOEBMED

Used when EMBED's are disabled. It is a container for regular content that has no stylistic consequences (no line breaking, no style stack effect, etc.).

APPLET

Applet tags don't nest (there is a notion of current_applet). The open tag automatically closes an open applet tag.
Attributes:

ALIGN=alignparam
CODE=string
CODEBASE=string
ARCHIVE=string
MAYSCRIPT
NAME=string [clamped: white space is stripped out]
WIDTH=value-or-pct [pct of right-left width; clamped: >= 1]
HEIGHT=value-or-pct [pct of window height; clamped >= 1]
BORDER=int [clamped: >= 0]
HSPACE=int [clamped: >= 0]
VSPACE=int [clamped: >= 0]

If no width is provided:

if a height was provided, use the height. Otherwise, use 90% of the window width if percentage widths are allowed, otherwise use a value of 600.

If no height is provided:

if a width was provided, use the width. Otherwise, use 50% of the window height if percentage widths are allowed, otherwise use a value of 400.

If the applet is hidden, then the widht/height get forced to zero.

PARAM

The param tag is supported when contained by the APPLET tag or the OBJECT tag. It has no stylistic consequences. The attribute values from the tag are passed to the containing APPLET or OBJECT. Note that /PARAM == PARAM.
Attributes:

NAME=string [clamped: white space is stripped out]
VALUE=string [clamped: white space is stripped out]

White space being stripped is done as follows: leading and trailing whitespace is removed. Any embedded whitespace is left alone except if it's a non-space whitespace in which case it is removed.

OBJECT

The open tag pushes an object onto the object stack. The close tag pops from the object stack. I don't understand how the data stuff works.
Attributes:

CLASSID=string (clsid:, java:, javaprogram:, javabean: are the supported prefixes; maybe it's a url if no prefix shown?)
TYPE=string (a mime type)
DATA=string (data: prefix mentions a url)

There are more attributes that depend on the type of object being embedded in the page. If the object is a java bean (?) then the applet parameters are supported:

CLASSID
HIDDEN
ALIGN
CLASSID (instead of CODE)
CODEBASE
ARCHIVE
MAYSCRIPT
ID (applets use NAME)
WIDTH
HEIGHT
BORDER
HSPACE
VSPACE

MAP

The open tag automatically closes an open map (maps don't nest). There is no stylistic consequence of the map nor does it provide any visible presentation in the normal layout case (an editor would do something different). The map can be declared anywhere in the document.
Attributes:

NAME=string [clamped: white space is stripped out]

AREA

Does nothing if there is no current map or the tag is a close tag.
Attributes:

SHAPE=default | rect | circle | poly | polygon
ALT=string [clamped: newlines are stripped]
COORDS=coord-list
HREF=url

TARGET=target (only if HREF is specified)

SUPPRESS

SERVER

A container for server-side javascript. Not evaluated by the client (parsed and ignored). Note: The navigator parser doesn't expand entities in a SERVER tag.

SPACER

Close tag is ignored. Open tag provides whitespace during layout: TYPE=line/vert/vertical causes a conditional soft line break and then adds SIZE to the Y layout coordinate. TYPE=word causes a conditional soft word break and then adds SIZE to the X layout coordinate. TYPE=block causes blockish layout stuff to happen.
Attributes:

TYPE=line | vert | vertical | block (default: word)

ALIGN=alignparam (these 3 params are only for TYPE=block)
WIDTH=value-or-pct
HEIGHT=value-or-pct

SIZE=int [clampled: >= 0]

###

SCRIPT

Note: The navigator parser doesn't expand entities in a SCRIPT tag.
Attributes:

LANGUAGE=LiveScript | Mocha | JavaScript1.1 | JavaScript1.2
TYPE="text/javascript" | "text/css"
HREF=url
ARCHIVE=url
CODEBASE=url
ID=string
SRC=url

NOSCRIPT

Used when scripting is off or by backrev browsers. It is a container that has no stylistic consequences.

###

FORM

Attributes:

ACTION=href
ENCODING=string
TARGET=string
METHOD=get | post

ISINDEX

This tag is a shortcut for creating a form element with a submit button and a single text field. If the PROMPT attribute is not present in the tag then the value used is "This is a searchable index. Enter search keywords:".

Attributes:

PROMPT=string
ACTION=href
ENCODING=string
TARGET=string
METHOD=get | post

INPUT

Attributes vary according to type:

TYPE= text | radio | checkbox | hidden | submit | reset | password | button | image | file | jot | readonly | object
NAME= string

TYPE=image

attributes are from the IMG tag (!)

TYPE= text | password | file

font style is forced to fixed
VALUE= string
SIZE= int (clamped; >= 1)
MAXLENGTH= int (not clamped!)

TYPE= submit | reset | button | hidden | readonly

VALUE=string; default if no value to the attribute varies according to the type:

submit -> "Submit Query"
reset -> "Reset"
others -> " " (2 spaces)
Note also that the value has newlines stripped from it

WIDTH=int (clamped >=0 && <= 1000) (only for submit, reset or button)
HEIGHT=int (clamped >=0 && <= 1000) (only for submit, reset or button)

TYPE=radio | checkbox

CHECKED (flag - if present then set to true)
VALUE= string (the default value is "on")

SELECT

Attributes:

MULTIPLE (boolean)
SIZE= int (clamped >= 1)
NAME= string
WIDTH= int (clampled >= 0 && <= 1000)
HEIGHT= int (clamped >= 0 && <= 1000; only examined for single entry lists (!multiple || size==1))

OPTION

Lives inside the SELECT tag (ignored otherwise).
Attributes:

VALUE=string
SELECTED boolean

TEXTAREA

Attributes:

NAME=string
ROWS=int (clamped; >= 1)
COLS=int (clamped; >= 1)
WRAP= off | hard | soft (default is off; any value which is not known turns into soft)

KEYGEN

Attributes:

NAME=string
CHALLENGE=string
PQG=string
KEYTYPE=string

###

BASEFONT

Sets the base font value which +/- size values in FONT tags are relative to.
Attributes:

SIZE=+ int | - int | int (just like FONT)

##

Unsupported

NSCP_CLOSE, NSCP_OPEN, NSCP_REBLOCK, MQUOTE, CELL, SUBDOC, CERTIFICATE, INLINEINPUTTHICK, INLINEINPUTDOTTED, COLORMAP, HYPE, SPELL, NSDT

These tags are unsupported because they are used internally by netscape and are never seen in real content. If somebody does use them between 4.0 and magellan, tough beans. We never documented them so they lose.