Codebase list dillo / debian/0.8.6-3 src / html.h
debian/0.8.6-3

Tree @debian/0.8.6-3 (Download .tar.gz)

html.h @debian/0.8.6-3raw · history · blame

#ifndef __HTML_H__
#define __HTML_H__

#include <gdk/gdk.h>
#include <gtk/gtkcontainer.h>

#include "browser.h"         /* for BrowserWindow */
#include "dw_widget.h"       /* for DwWidget */
#include "dw_image.h"        /* for DwImageMapList */

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/* First, the html linkblock. For now, this mostly has forms, although
   pointers to actual links will go here soon, if for no other reason
   than to implement history-sensitive link colors. Also, it seems
   likely that imagemaps will go here. */

typedef struct _DilloHtmlLB      DilloHtmlLB;

typedef struct _DilloHtml        DilloHtml;
typedef struct _DilloHtmlClass   DilloHtmlClass;
typedef struct _DilloHtmlState   DilloHtmlState;
typedef struct _DilloHtmlForm    DilloHtmlForm;
typedef struct _DilloHtmlOption  DilloHtmlOption;
typedef struct _DilloHtmlSelect  DilloHtmlSelect;
typedef struct _DilloHtmlInput   DilloHtmlInput;


struct _DilloHtmlLB {
   BrowserWindow *bw;
   DilloUrl *base_url;

   DilloHtmlForm *forms;
   gint num_forms;
   gint num_forms_max;

   DilloUrl **links;
   gint num_links;
   gint num_links_max;

   DwImageMapList maps;

   gint32 link_color;
   gint32 visited_color;

   gint num_page_bugs;
   GString *page_bugs;
};


typedef enum {
   DT_NONE,
   DT_HTML,
   DT_XHTML
} DilloHtmlDocumentType;

typedef enum {
   DILLO_HTML_PARSE_MODE_INIT,
   DILLO_HTML_PARSE_MODE_STASH,
   DILLO_HTML_PARSE_MODE_STASH_AND_BODY,
   DILLO_HTML_PARSE_MODE_VERBATIM,
   DILLO_HTML_PARSE_MODE_BODY,
   DILLO_HTML_PARSE_MODE_PRE
} DilloHtmlParseMode;

typedef enum {
   SEEK_ATTR_START,
   MATCH_ATTR_NAME,
   SEEK_TOKEN_START,
   SEEK_VALUE_START,
   SKIP_VALUE,
   GET_VALUE,
   FINISHED
} DilloHtmlTagParsingState;

typedef enum {
   HTML_LeftTrim      = 1 << 0,
   HTML_RightTrim     = 1 << 1,
   HTML_ParseEntities = 1 << 2
} DilloHtmlTagParsingFlags;

typedef enum {
   DILLO_HTML_TABLE_MODE_NONE,  /* no table at all */
   DILLO_HTML_TABLE_MODE_TOP,   /* outside of <tr> */
   DILLO_HTML_TABLE_MODE_TR,    /* inside of <tr>, outside of <td> */
   DILLO_HTML_TABLE_MODE_TD     /* inside of <td> */
} DilloHtmlTableMode;


typedef enum {
   IN_HTML        = 1 << 0,
   IN_HEAD        = 1 << 1,
   IN_BODY        = 1 << 2,
   IN_FORM        = 1 << 3,
   IN_SELECT      = 1 << 4,
   IN_TEXTAREA    = 1 << 5,
   IN_MAP         = 1 << 6,
   IN_PRE         = 1 << 7,
   IN_BUTTON      = 1 << 8
} DilloHtmlProcessingState;


struct _DilloHtmlState {
   char *tag_name;
   DwStyle *style, *table_cell_style;
   DilloHtmlParseMode parse_mode;
   DilloHtmlTableMode table_mode;
   gboolean cell_text_align_set;
   enum { HTML_LIST_NONE, HTML_LIST_UNORDERED, HTML_LIST_ORDERED } list_type;
   gint list_number;

   /* TagInfo index for the tag that's being processed */
   gint tag_idx;

   DwWidget *page, *table;

   /* This is used to align list items (especially in enumerated lists) */
   DwWidget *ref_list_item;

   /* This makes image processing faster than a function
      a_Dw_widget_get_background_color. */
   gint32 current_bg_color;

   /* This is used for list items etc; if it is set to TRUE, breaks
      have to be "handed over" (see Html_add_indented and
      Html_eventually_pop_dw). */
   gboolean hand_over_break;
};

typedef enum {
   DILLO_HTML_METHOD_UNKNOWN,
   DILLO_HTML_METHOD_GET,
   DILLO_HTML_METHOD_POST
} DilloHtmlMethod;

typedef enum {
   DILLO_HTML_ENC_URLENCODING
} DilloHtmlEnc;

struct _DilloHtmlForm {
   DilloHtmlMethod method;
   DilloUrl *action;
   DilloHtmlEnc enc;

   DilloHtmlInput *inputs;
   gint num_inputs;
   gint num_inputs_max;
   gint num_entry_fields;
   gint num_submit_buttons;
};

struct _DilloHtmlOption {
   GtkWidget *menuitem;
   char *value;
   gboolean init_val;
};

struct _DilloHtmlSelect {
   GtkWidget *menu;
   gint size;

   DilloHtmlOption *options;
   gint num_options;
   gint num_options_max;
};

typedef enum {
   DILLO_HTML_INPUT_TEXT,
   DILLO_HTML_INPUT_PASSWORD,
   DILLO_HTML_INPUT_CHECKBOX,
   DILLO_HTML_INPUT_RADIO,
   DILLO_HTML_INPUT_IMAGE,
   DILLO_HTML_INPUT_FILE,
   DILLO_HTML_INPUT_BUTTON,
   DILLO_HTML_INPUT_HIDDEN,
   DILLO_HTML_INPUT_SUBMIT,
   DILLO_HTML_INPUT_RESET,
   DILLO_HTML_INPUT_BUTTON_SUBMIT,
   DILLO_HTML_INPUT_BUTTON_RESET,
   DILLO_HTML_INPUT_SELECT,
   DILLO_HTML_INPUT_SEL_LIST,
   DILLO_HTML_INPUT_TEXTAREA,
   DILLO_HTML_INPUT_INDEX
} DilloHtmlInputType;

struct _DilloHtmlInput {
   DilloHtmlInputType type;
   void *widget;      /* May be a GtkWidget or a DwWidget. */
   char *name;
   char *init_str;    /* note: some overloading - for buttons, init_str
                         is simply the value of the button; for text
                         entries, it is the initial value */
   DilloHtmlSelect *select;
   gboolean init_val; /* only meaningful for buttons */
};

struct _DilloHtml {
   DwWidget *dw;          /* this is duplicated in the stack (page) */

   DilloHtmlLB *linkblock;
   gchar *Start_Buf;
   size_t Start_Ofs;
   size_t CurrTagOfs;
   size_t OldTagOfs, OldTagLine;

   DilloHtmlDocumentType DocType; /* as given by DOCTYPE tag */
   float DocTypeVersion;          /* HTML or XHTML version number */

   DilloHtmlState *stack;
   gint stack_top;        /* Index to the top of the stack [0 based] */
   gint stack_max;

   DilloHtmlProcessingState InFlags; /* tracks which tags we are in */

   GString *Stash;
   gboolean StashSpace;

   gchar *SPCBuf;           /* Buffer for white space */

   gint pre_column;         /* current column, used in PRE tags with tabs */
   gboolean PreFirstChar;   /* used to skip the first CR or CRLF in PRE tags */
   gboolean PrevWasCR;      /* Flag to help parsing of "\r\n" in PRE tags */
   gboolean PrevWasOpenTag; /* Flag to help deferred parsing of white space */
   gboolean SPCPending;     /* Flag to help deferred parsing of white space */
   gboolean InVisitedLink;  /* used to 'contrast_visited_colors' */
   gboolean ReqTagClose;    /* Flag to help handling bad-formed HTML */
   gboolean CloseOneTag;    /* Flag to help Html_tag_cleanup_at_close() */
   gboolean TagSoup;        /* Flag to enable the parser's cleanup functions */
   gchar *NameVal;          /* used for validation of "NAME" and "ID" in <A> */

   /* element counters: used for validation purposes */
   guchar Num_HTML, Num_HEAD, Num_BODY, Num_TITLE;

   GString *attr_data;

   BrowserWindow *bw;
};

#ifdef __cplusplus
}
#endif /* __cplusplus */


#endif /* __HTML_H__ */