henesyinit from p9fd787fda5 years agoHistory
617 lines · 14.8 KB · C
RawDownload
#pragma lib "libhtml.a"#pragma src "/sys/src/libhtml" // UTILSextern uchar*	fromStr(Rune* buf, int n, int chset);extern Rune*	toStr(uchar* buf, int n, int chset); // Common LEX and BUILD enums // Media typesenum{	ApplMsword,	ApplOctets,	ApplPdf,	ApplPostscript,	ApplRtf,	ApplFramemaker,	ApplMsexcel,	ApplMspowerpoint,	UnknownType,	Audio32kadpcm,	AudioBasic,	ImageCgm,	ImageG3fax,	ImageGif,	ImageIef,	ImageJpeg,	ImagePng,	ImageTiff,	ImageXBit,	ImageXBit2,	ImageXBitmulti,	ImageXXBitmap,	ModelVrml,	MultiDigest,	MultiMixed,	TextCss,	TextEnriched,	TextHtml,	TextJavascript,	TextPlain,	TextRichtext,	TextSgml,	TextTabSeparatedValues,	TextXml,	VideoMpeg,	VideoQuicktime,	NMEDIATYPES}; // HTTP methodsenum{	HGet,	HPost}; // Charsetsenum{	UnknownCharset,	US_Ascii,	ISO_8859_1,	UTF_8,	Unicode,	NCHARSETS}; // Frame Target IDsenum {	FTtop,	FTself,	FTparent,	FTblank}; // LEXtypedef struct Token Token;typedef struct Attr Attr; // BUILD typedef struct Item Item;typedef struct Itext Itext;typedef struct Irule Irule;typedef struct Iimage Iimage;typedef struct Iformfield Iformfield;typedef struct Itable Itable;typedef struct Ifloat Ifloat;typedef struct Ispacer Ispacer;typedef struct Genattr Genattr;typedef struct SEvent SEvent;typedef struct Formfield Formfield;typedef struct Option Option;typedef struct Form Form;typedef struct Table Table;typedef struct Tablecol Tablecol;typedef struct Tablerow Tablerow;typedef struct Tablecell Tablecell;typedef struct Align Align;typedef struct Dimen Dimen;typedef struct Anchor Anchor;typedef struct DestAnchor DestAnchor;typedef struct Map Map;typedef struct Area Area;typedef struct Background Background;typedef struct Kidinfo Kidinfo;typedef struct Docinfo Docinfo;typedef struct Stack Stack;typedef struct Pstate Pstate;typedef struct ItemSource ItemSource;typedef struct Lay Lay;	// defined in Layout module // Alignment typesenum {	ALnone = 0, ALleft, ALcenter, ALright, ALjustify,	ALchar, ALtop, ALmiddle, ALbottom, ALbaseline}; struct Align{	uchar	halign;	// one of ALnone, ALleft, etc.	uchar	valign;	// one of ALnone, ALtop, etc.}; // A Dimen holds a dimension specification, especially for those// cases when a number can be followed by a % or a * to indicate// percentage of total or relative weight.// Dnone means no dimension was specified // To fit in a word, use top bits to identify kind, rest for valueenum {	Dnone =		0,	Dpixels =		(1<<29),	Dpercent =	(2<<29),	Drelative =	(3<<29),	Dkindmask =	(3<<29),	Dspecmask =	(~Dkindmask)}; struct Dimen{	int	kindspec;		// kind | spec}; // Background is either an image or a color.// If both are set, the image has precedence.struct Background{	Rune*	image;	// url	int		color;};  // There are about a half dozen Item variants.// The all look like this at the start (using Plan 9 C's// anonymous structure member mechanism),// and then the tag field dictates what extra fields there are.struct Item{	Item*	next;		// successor in list of items	int		width;	// width in pixels (0 for floating items)	int		height;	// height in pixels	int		ascent;	// ascent (from top to baseline) in pixels	int		anchorid;	// if nonzero, which anchor we're in	int		state;	// flags and values (see below)	Genattr*	genattr;	// generic attributes and events	int		tag;		// variant discriminator: Itexttag, etc.}; // Item variant tagsenum {	Itexttag,	Iruletag,	Iimagetag,	Iformfieldtag,	Itabletag,	Ifloattag,	Ispacertag}; struct Itext{	Item;				// (with tag ==Itexttag)	Rune*	s;			// the characters	int		fnt;			// style*NumSize+size (see font stuff, below)	int		fg;			// Pixel (color) for text	uchar	voff;			// Voffbias+vertical offset from baseline, in pixels (+ve == down)	uchar	ul;			// ULnone, ULunder, or ULmid}; struct Irule{	Item;				// (with tag ==Iruletag)	uchar	align;		// alignment spec	uchar	noshade;		// if true, don't shade	int		size;			// size attr (rule height)	Dimen	wspec;		// width spec};  struct Iimage{	Item;				// (with tag ==Iimagetag)	Rune*	imsrc;		// image src url	int		imwidth;		// spec width (actual, if no spec)	int		imheight;		// spec height (actual, if no spec)	Rune*	altrep;		// alternate representation, in absence of image	Map*	map;			// if non-nil, client side map	int		ctlid;			// if animated	uchar	align;		// vertical alignment	uchar	hspace;		// in pixels; buffer space on each side	uchar	vspace;		// in pixels; buffer space on top and bottom	uchar	border;		// in pixels: border width to draw around image	Iimage*	nextimage;	// next in list of document's images};  struct Iformfield{	Item;				// (with tag ==Iformfieldtag)	Formfield*	formfield;};  struct Itable{	Item;				// (with tag ==Itabletag)	Table*	table;};  struct Ifloat{	Item;				// (with tag ==Ifloattag)	Item*	item;			// table or image item that floats	int		x;			// x coord of top (from right, if ALright)	int		y;			// y coord of top	uchar	side;			// margin it floats to: ALleft or ALright	uchar	infloats;		// true if this has been added to a lay.floats	Ifloat*	nextfloat;		// in list of floats};  struct Ispacer{	Item;				// (with tag ==Ispacertag)	int		spkind;		// ISPnull, etc.}; // Item state flags and value fieldsenum {	IFbrk =			0x80000000,	// forced break before this item	IFbrksp =			0x40000000,	// add 1 line space to break (IFbrk set too)	IFnobrk =			0x20000000,	// break not allowed before this item	IFcleft =			0x10000000,	// clear left floats (IFbrk set too)	IFcright =			0x08000000,	// clear right floats (IFbrk set too)	IFwrap =			0x04000000,	// in a wrapping (non-pre) line	IFhang =			0x02000000,	// in a hanging (into left indent) item	IFrjust =			0x01000000,	// right justify current line	IFcjust =			0x00800000,	// center justify current line	IFsmap =			0x00400000,	// image is server-side map	IFindentshift =		8,	IFindentmask =		(255<<IFindentshift),	// current indent, in tab stops	IFhangmask =		255			// current hang into left indent, in 1/10th tabstops}; // Bias added to Itext's voff fieldenum { Voffbias = 128 }; // Spacer kindsenum {	ISPnull,			// 0 height and width	ISPvline,			// height and ascent of current font	ISPhspace,		// width of space in current font	ISPgeneral		// other purposes (e.g., between markers and list)}; // Generic attributes and events (not many elements will have any of these set)struct Genattr{	Rune*	id;	Rune*	class;	Rune*	style;	Rune*	title;	SEvent*	events;}; struct SEvent{	SEvent*	next;		// in list of events	int		type;		// SEonblur, etc.	Rune*	script;}; enum {	SEonblur, SEonchange, SEonclick, SEondblclick,	SEonfocus, SEonkeypress, SEonkeyup, SEonload,	SEonmousedown, SEonmousemove, SEonmouseout,	SEonmouseover, SEonmouseup, SEonreset, SEonselect,	SEonsubmit, SEonunload,	Numscriptev}; // Form field typesenum {	Ftext,	Fpassword,	Fcheckbox,	Fradio,	Fsubmit,	Fhidden,	Fimage,	Freset,	Ffile,	Fbutton,	Fselect,	Ftextarea}; // Information about a field in a formstruct Formfield{	Formfield*	next;		// in list of fields for a form	int			ftype;	// Ftext, Fpassword, etc.	int			fieldid;	// serial no. of field within its form	Form*		form;	// containing form	Rune*		name;	// name attr	Rune*		value;	// value attr	int			size;		// size attr	int			maxlength;	// maxlength attr	int			rows;	// rows attr	int			cols;		// cols attr	uchar		flags;	// FFchecked, etc.	Option*		options;	// for Fselect fields	Item*		image;	// image item, for Fimage fields	int			ctlid;		// identifies control for this field in layout	SEvent*		events;	// same as genattr->events of containing item}; enum {	FFchecked =	(1<<7),	FFmultiple =	(1<<6)}; // Option holds info about an option in a "select" form fieldstruct Option{	Option*	next;			// next in list of options for a field	int		selected;		// true if selected initially	Rune*	value;		// value attr	Rune*	display;		// display string}; // Form holds info about a formstruct Form{	Form*		next;		// in list of forms for document	int			formid;	// serial no. of form within its doc	Rune*		name;	// name or id attr (netscape uses name, HTML 4.0 uses id)	Rune*		action;	// action attr	int			target;	// target attr as targetid	int			method;	// HGet or HPost	int			nfields;	// number of fields	Formfield*	fields;	// field's forms, in input order}; // Flags used in various table structuresenum {	TFparsing =	(1<<7),	TFnowrap =	(1<<6),	TFisth =		(1<<5)};  // Information about a tablestruct Table{	Table*		next;			// next in list of document's tables	int			tableid;		// serial no. of table within its doc	Tablerow*	rows;		// array of row specs (list during parsing)	int			nrow;		// total number of rows	Tablecol*		cols;			// array of column specs	int			ncol;			// total number of columns	Tablecell*		cells;			// list of unique cells	int			ncell;		// total number of cells	Tablecell***	grid;			// 2-D array of cells	Align		align;		// alignment spec for whole table	Dimen		width;		// width spec for whole table	int			border;		// border attr	int			cellspacing;	// cellspacing attr	int			cellpadding;	// cellpadding attr	Background	background;	// table background	Item*		caption;		// linked list of Items, giving caption	uchar		caption_place;	// ALtop or ALbottom	Lay*			caption_lay;	// layout of caption	int			totw;			// total width	int			toth;			// total height	int			caph;		// caption height	int			availw;		// used for previous 3 sizes	Token*		tabletok;		// token that started the table	uchar		flags;		// Lchanged, perhaps};  struct Tablecol{	int		width;	Align	align;	Point		pos;};  struct Tablerow{	Tablerow*	next;			// Next in list of rows, during parsing	Tablecell*		cells;			// Cells in row, linked through nextinrow	int			height;	int			ascent;	Align		align;	Background	background;	Point			pos;	uchar		flags;		// 0 or TFparsing};  // A Tablecell is one cell of a table.// It may span multiple rows and multiple columns.// Cells are linked on two lists: the list for all the cells of// a document (the next pointers), and the list of all the// cells that start in a given row (the nextinrow pointers)struct Tablecell{	Tablecell*		next;			// next in list of table's cells	Tablecell*		nextinrow;	// next in list of row's cells	int			cellid;		// serial no. of cell within table	Item*		content;		// contents before layout	Lay*			lay;			// layout of cell	int			rowspan;		// number of rows spanned by this cell	int			colspan;		// number of cols spanned by this cell	Align		align;		// alignment spec	uchar		flags;		// TFparsing, TFnowrap, TFisth	Dimen		wspec;		// suggested width	int			hspec;		// suggested height	Background	background;	// cell background	int			minw;		// minimum possible width	int			maxw;		// maximum width	int			ascent;		// cell's ascent	int			row;			// row of upper left corner	int			col;			// col of upper left corner	Point			pos;			// nw corner of cell contents, in cell}; // Anchor is for info about hyperlinks that go somewherestruct Anchor{	Anchor*		next;		// next in list of document's anchors	int			index;	// serial no. of anchor within its doc	Rune*		name;	// name attr	Rune*		href;		// href attr	int			target;	// target attr as targetid};  // DestAnchor is for info about hyperlinks that are destinationsstruct DestAnchor{	DestAnchor*	next;		// next in list of document's destanchors	int			index;	// serial no. of anchor within its doc	Rune*		name;	// name attr	Item*		item;		// the destination};  // Maps (client side)struct Map{	Map*	next;			// next in list of document's maps	Rune*	name;		// map name	Area*	areas;		// list of map areas};  struct Area{	Area*		next;		// next in list of a map's areas	int			shape;	// SHrect, etc.	Rune*		href;		// associated hypertext link	int			target;	// associated target frame	Dimen*		coords;	// array of coords for shape	int			ncoords;	// size of coords array}; // Area shapesenum {	SHrect, SHcircle, SHpoly}; // Fonts are represented by integers: style*NumSize + size

Lines 1–500 of 617.