/* * html.h * * libhtml - HTML->X renderer * Copyright (c) 1995-1997, John Kilburg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __HTML_H__ #define __HTML_H__ 1 #include #include #include "common.h" #include "Chimera.h" #include "ChimeraRender.h" #include "ChimeraGUI.h" #include "ml.h" #include "css.h" /* proposed HTML3.2 tags and some internal tags */ typedef enum { /* internal tags */ TAG_DOCUMENT, /* implemented? */ TAG_BR, TAG_ADDRESS, TAG_DIV, TAG_CENTER, TAG_A, TAG_MAP, TAG_AREA, TAG_IMG, TAG_HR, TAG_P, TAG_PRE, TAG_XMP, TAG_LISTING, TAG_PLAINTEXT, TAG_BLOCKQUOTE, TAG_DL, TAG_DD, TAG_DT, TAG_OL, TAG_UL, TAG_DIR, TAG_MENU, TAG_LI, TAG_FORM, TAG_INPUT, TAG_SELECT, TAG_OPTION, TAG_TEXTAREA, TAG_TABLE, TAG_TR, TAG_TH, TAG_TD, TAG_TITLE, TAG_BASE, TAG_SCRIPT, TAG_H1, TAG_H2, TAG_H3, TAG_H4, TAG_H5, TAG_H6, TAG_TT, TAG_I, TAG_B, TAG_STRIKE, TAG_BIG, TAG_SMALL, TAG_SUB, TAG_SUP, TAG_EM, TAG_STRING, TAG_DFN, TAG_CODE, TAG_SAMP, TAG_KBD, TAG_VAR, TAG_CITE, TAG_STRONG, /* do not implement */ TAG_HTML, TAG_BODY, TAG_HEAD, /* weird stuff? */ TAG_IFRAME, TAG_FRAME, TAG_FRAMESET, TAG_NOFRAMES, /* unimplemented */ TAG_LINK, TAG_APPLET, TAG_META, TAG_STYLE, TAG_CAPTION, TAG_FONT, TAG_PARAM, TAG_ISINDEX } HTMLTagID; typedef struct HTMLBoxP *HTMLBox; typedef struct HTMLInfoP *HTMLInfo; typedef struct HTMLClassP *HTMLClass; typedef struct HTMLObjectP *HTMLObject; typedef struct HTMLEnvP *HTMLEnv; typedef struct HTMLFontP *HTMLFont; typedef struct HTMLFontListP *HTMLFontList; typedef struct HTMLAnchorP *HTMLAnchor; typedef struct HTMLTagP *HTMLTag; typedef struct HTMLMapP *HTMLMap; typedef struct HTMLAreaP *HTMLArea; typedef struct HTMLStateP *HTMLState; /* * Box callbacks */ typedef void (*HTMLSetupProc) _ArgProto((HTMLInfo, HTMLBox)); typedef void (*HTMLDestroyProc) _ArgProto((HTMLInfo, HTMLBox)); typedef void (*HTMLRenderProc) _ArgProto((HTMLInfo, HTMLBox, Region)); typedef void (*HTMLLayoutProc) _ArgProto((HTMLInfo, HTMLBox, HTMLBox)); typedef unsigned int (*HTMLWidthProc) _ArgProto((HTMLInfo, HTMLBox)); /* * Tag callbacks */ typedef bool (*HTMLTagClampProc) _ArgProto((HTMLInfo, HTMLEnv)); typedef void (*HTMLTagRenderProc) _ArgProto((HTMLInfo, HTMLEnv, MLElement)); typedef bool (*HTMLTagAcceptProc) _ArgProto((HTMLInfo, HTMLObject)); typedef enum { HTMLInsertEmpty, HTMLInsertReject, HTMLInsertOK } HTMLInsertStatus; typedef HTMLInsertStatus (*HTMLTagInsertProc) _ArgProto((HTMLInfo, HTMLEnv, MLElement)); typedef void (*HTMLTagDataProc) _ArgProto((HTMLInfo, HTMLEnv, MLElement)); typedef void (*HTMLTagAddBoxProc) _ArgProto((HTMLInfo, HTMLEnv, HTMLBox)); typedef unsigned int (*HTMLTagWidthProc) _ArgProto((HTMLInfo, HTMLEnv)); typedef enum { FLOW_LEFT_JUSTIFY, FLOW_CENTER_JUSTIFY, FLOW_RIGHT_JUSTIFY } HTMLFlowAlign; /* * Environment */ typedef enum { HTML_ENV, HTML_ELEMENT, HTML_TAG, HTML_BEGINTAG, HTML_ENDTAG } HTMLObjectType; struct HTMLObjectP { HTMLObjectType type; union { MLElement p; HTMLEnv env; } o; }; struct HTMLEnvP { /* Keep track of html structure */ HTMLEnv penv; /* parent environment */ HTMLTag tag; /* tag that defines environment */ GList olist; /* object list */ GList blist; /* boxed object list */ GList slist; /* static object list */ int pass; /* Keep track of HTML rendering */ bool visited; /* used by boxify functions */ MLElement anchor; /* anchor to use in environment */ HTMLFont fi; /* font to use in environment */ HTMLFlowAlign ff; /* alignment in flow box */ void *closure; /* environment specific data */ }; typedef enum { BOX_NONE = 0x00000000, /* no flags set */ BOX_SPACE = 0x00000001, /* horizontal space */ BOX_LINEBREAK = 0x00000002, /* line break, duh. */ BOX_FLOAT_LEFT = 0x00000008, /* float to the left edge */ BOX_FLOAT_RIGHT = 0x00000010, /* float to the right edge */ BOX_VCENTER = 0x00000020, /* vertically center in parent */ BOX_PUSHED_LEFT = 0x00000040, /* box pushed left by floater */ BOX_PUSHED_RIGHT = 0x00000080, /* box pushed right by floater */ BOX_SELECT = 0x00000100, /* anchor box selected */ BOX_TOPLEVEL = 0x00000200, /* toplevel box ? */ BOX_CLEAR_LEFT = 0x00000400, /* clear past left aligned */ BOX_CLEAR_RIGHT = 0x00000800 /* clear past right aligned */ } HTMLBoxFlags; #define HTMLTestB(a, b) (((a)->bflags & (b)) != 0) #define HTMLClearB(a, b) ((a)->bflags &= ~(b)) #define HTMLSetB(a, b) ((a)->bflags |= (b)) /* This is still too big */ struct HTMLBoxP { HTMLEnv env; /* */ int baseline; /* level of alignment */ int x, y; /* upper-left coordinates */ unsigned int width, height; /* external dimensions */ HTMLBoxFlags bflags; /* misc. worthless flags */ /* rendering functions */ HTMLRenderProc render; /* called when output needed */ HTMLDestroyProc destroy; /* called when destroyed */ HTMLSetupProc setup; /* called by parent box */ HTMLLayoutProc layout; /* child box layout */ HTMLWidthProc maxwidth; /* called to return maximum width */ void *closure; /* state for functions */ }; struct HTMLAnchorP { HTMLBox box; char *name; MLElement p; }; struct HTMLStateP { int x, y; }; struct HTMLClassP { MemPool mp; bool font_setup_done; Display *dpy; XFontStruct *defaultFont; HTMLFontList prop; HTMLFontList fixed; GList oldstates; GList fonts; GList contexts; CSSContext css; }; struct HTMLInfoP { /* X */ Widget widget; Display *dpy; Window win; GC gc; Pixel anchor_color; Pixel anchor_select_color; Pixel fg, bg; /* www lib */ ChimeraContext wc; ChimeraResources cres; ChimeraGUI wd; ChimeraSink wp; ChimeraTask wt; ChimeraRender wn; GList sinks; GList loads; /* HTML */ CSSContext css; bool reload; unsigned int maxwidth, maxheight; MemPool mp; MLState hs; HTMLClass lc; HTMLFont cfi; HTMLBox firstbox; HTMLState ps; HTMLEnv searchenv; HTMLObject searchobj; HTMLEnv topenv; /* document environment */ GList envstack; /* tag hierarchy */ GList selectors; /* CSS selector list */ GList oldselectors; /* old CSS selector list */ GList endstack; /* pending end tags */ GList alist; /* anchor box list */ ChimeraTimeOut sto; /* select timeout */ HTMLAnchor sa; /* selected anchor */ int delayed; char *url; /* original URL */ char *burl; /* base URL */ char *title; /* title text */ HTMLAnchor over; GList maps; bool cancel; bool formatted; /* inside PRE tags - djhjr */ bool noframeset; bool framesonly; GList framesets; /* list of frames */ /* configurable goodies */ int textLineSpace; bool printHTMLErrors; int tmargin, bmargin; /* top, bottom margins */ int rmargin, lmargin; /* right, left margins */ unsigned int inlineTimeOut; unsigned int selectTimeOut; /* select timeout time */ unsigned int tableCellInfinity; /* infinite width for table cell */ bool flowDebug; bool constraintDebug; bool printTags; /* print tag and data hierarchy */ }; typedef enum { ATTRIB_UNKNOWN, ATTRIB_LEFT, ATTRIB_RIGHT, ATTRIB_TOP, ATTRIB_BOTTOM, ATTRIB_CENTER, ATTRIB_MIDDLE, ATTRIB_ALL } HTMLAttribID; /* * inline.c */ typedef struct { MLElement p; void *closure; } HTMLInlineInfo; typedef struct HTMLInlineP *HTMLInline; HTMLInline HTMLCreateInline _ArgProto((HTMLInfo, HTMLEnv, char *, HTMLInlineInfo *, ChimeraRenderHooks *, void *)); HTMLBox HTMLInlineToBox _ArgProto((HTMLInline)); void HTMLInlineDestroy _ArgProto((HTMLInline)); /* * text.c */ HTMLBox HTMLCreateTextBox _ArgProto((HTMLInfo, HTMLEnv, char *, size_t)); char *HTMLGetEnvText _ArgProto((MemPool, HTMLEnv)); void HTMLStringSpacify _ArgProto((char *, size_t)); void HTMLAddLineBreak _ArgProto((HTMLInfo, HTMLEnv)); void HTMLAddBlankLine _ArgProto((HTMLInfo, HTMLEnv)); /* * layout.c */ HTMLBox HTMLCreateBox _ArgProto((HTMLInfo, HTMLEnv)); void HTMLLayoutBox _ArgProto((HTMLInfo, HTMLBox, HTMLBox)); void HTMLSetupBox _ArgProto((HTMLInfo, HTMLBox)); void HTMLRenderBox _ArgProto((HTMLInfo, Region, HTMLBox)); void HTMLDestroyBox _ArgProto((HTMLInfo, HTMLBox)); unsigned HTMLGetBoxWidth _ArgProto((HTMLInfo, HTMLBox)); /* * html.c */ HTMLAttribID HTMLAttributeToID _ArgProto((MLElement, char *)); HTMLTag HTMLGetTag _ArgProto((MLElement)); HTMLTag HTMLTagIDToTag _ArgProto((HTMLTagID)); bool HTMLHandleTag _ArgProto((HTMLInfo, HTMLTag, MLElement)); HTMLEnv HTMLFindEnv _ArgProto((HTMLInfo, HTMLTagID)); void HTMLDelayLayout _ArgProto((HTMLInfo)); void HTMLContinueLayout _ArgProto((HTMLInfo)); HTMLTagID HTMLTagToID _ArgProto((HTMLTag)); void HTMLHandler _ArgProto((void *, MLElement)); HTMLEnv HTMLPopEnv _ArgProto((HTMLInfo, HTMLTagID)); void HTMLStartEnv _ArgProto((HTMLInfo, HTMLTagID, MLElement)); void HTMLEndEnv _ArgProto((HTMLInfo, HTMLTagID)); unsigned int HTMLGetMaxWidth _ArgProto((HTMLInfo, HTMLEnv)); void HTMLEnvAddBox _ArgProto((HTMLInfo, HTMLEnv, HTMLBox)); void HTMLStart _ArgProto((HTMLInfo)); void HTMLFinish _ArgProto((HTMLInfo)); HTMLEnv HTMLGetIDEnv _ArgProto((HTMLEnv, HTMLTagID)); /* * font.c */ XFontStruct *HTMLGetFont _ArgProto((HTMLInfo, HTMLEnv)); void HTMLSetupFonts _ArgProto((HTMLInfo)); void HTMLFreeFonts _ArgProto((HTMLClass)); void HTMLAddFontSlant _ArgProto((HTMLFont)); void HTMLAddFontWeight _ArgProto((HTMLFont)); void HTMLAddFontScale _ArgProto((HTMLFont)); void HTMLSetFontScale _ArgProto((HTMLFont, int)); HTMLFont HTMLDupFont _ArgProto((HTMLInfo, HTMLFont)); void HTMLSetFontFixed _ArgProto((HTMLFont)); void HTMLSetFontProp _ArgProto((HTMLFont)); /* * load.c */ int HTMLLoadAnchor _ArgProto((HTMLInfo, HTMLAnchor, int, int, char *, bool)); void HTMLPrintAnchor _ArgProto((HTMLInfo, HTMLAnchor, int, int, bool)); char *HTMLMakeURL _ArgProto((HTMLInfo, MemPool, char *)); int HTMLLoadURL _ArgProto((HTMLInfo, char *, char *, char *)); void HTMLPrintURL _ArgProto((HTMLInfo, char *)); void HTMLFindName _ArgProto((HTMLInfo, char *)); void HTMLAddAnchor _ArgProto((HTMLInfo, HTMLBox, char *, MLElement)); /* * module.c */ void HTMLSetFinalPosition _ArgProto((HTMLInfo)); /* * flow.c */ HTMLBox HTMLCreateFlowBox _ArgProto((HTMLInfo, HTMLEnv, unsigned int)); void HTMLFinishFlowBox _ArgProto((HTMLInfo, HTMLBox)); /* * map.c */ char *HTMLFindMapURL _ArgProto((HTMLInfo, char *, int, int)); /* * * Tag/Env handlers * */ /* * form.c */ void HTMLFormBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLFormEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLInput _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLOptionEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLSelectBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLSelectEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLTextareaEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); /* * inline.c */ void HTMLImg _ArgProto((HTMLInfo, HTMLEnv, MLElement)); HTMLInsertStatus HTMLImgInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); /* * hr.c */ void HTMLHorizontalRule _ArgProto((HTMLInfo, HTMLEnv, MLElement)); /* * list.c */ HTMLInsertStatus HTMLLIInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLLIBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); HTMLInsertStatus HTMLDTInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLDTBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); HTMLInsertStatus HTMLDDInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLDDBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); bool HTMLListAccept _ArgProto((HTMLInfo, HTMLObject)); bool HTMLDLAccept _ArgProto((HTMLInfo, HTMLObject)); void HTMLULBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLListEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLOLBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLDLBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLListAddBox _ArgProto((HTMLInfo, HTMLEnv, HTMLBox)); void HTMLItemAddBox _ArgProto((HTMLInfo, HTMLEnv, HTMLBox)); unsigned int HTMLItemWidth _ArgProto((HTMLInfo, HTMLEnv)); void HTMLItemEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); /* * text.c */ void HTMLPreBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLPreEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLPlainBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLPlainEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLFillData _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLPreData _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLPlainData _ArgProto((HTMLInfo, HTMLEnv, MLElement)); /* * misc.c */ void HTMLHxBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLHxEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLParaBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLParaEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); HTMLInsertStatus HTMLParaInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLBreak _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLAddressBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLAddressEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLAnchorBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); HTMLInsertStatus HTMLAnchorInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLBQBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLBQEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLFontBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLDivBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLDivEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLCenterBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLCenterEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); /* * table.c */ bool HTMLTableAccept _ArgProto((HTMLInfo, HTMLObject)); void HTMLTableBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLTableEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); bool HTMLTRAccept _ArgProto((HTMLInfo, HTMLObject)); HTMLInsertStatus HTMLTRInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); bool HTMLTRClamp _ArgProto((HTMLInfo, HTMLEnv)); void HTMLTRBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLTREnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); HTMLInsertStatus HTMLTDInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); bool HTMLTDClamp _ArgProto((HTMLInfo, HTMLEnv)); void HTMLTDBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLTDEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); unsigned int HTMLTDWidth _ArgProto((HTMLInfo, HTMLEnv)); void HTMLTableAddBox _ArgProto((HTMLInfo, HTMLEnv, HTMLBox)); void HTMLTDAddBox _ArgProto((HTMLInfo, HTMLEnv, HTMLBox)); /* * head.c */ void HTMLBase _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLTitleEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLMeta _ArgProto((HTMLInfo, HTMLEnv, MLElement)); /* * map.c */ bool HTMLMapAccept _ArgProto((HTMLInfo, HTMLObject)); HTMLInsertStatus HTMLAreaInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLAreaBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLMapBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLMapEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); /* * frame.c */ void HTMLIFrame _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLFrame _ArgProto((HTMLInfo, HTMLEnv, MLElement)); HTMLInsertStatus HTMLFrameInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLFrameSetBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLFrameSetEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); bool HTMLFrameSetAccept _ArgProto((HTMLInfo, HTMLObject)); HTMLInsertStatus HTMLFrameSetInsert _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLNoFramesBegin _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLNoFramesEnd _ArgProto((HTMLInfo, HTMLEnv, MLElement)); void HTMLDestroyFrameSets _ArgProto((HTMLInfo)); void HTMLFrameLoad _ArgProto((HTMLInfo, ChimeraRequest *, char*)); #endif