Annotation of Amaya/amaya/XHTMLbuilder.c, revision 1.64

1.1       cvs         1: /*
                      2:  *
1.64    ! vatton      3:  *  (c) COPYRIGHT MIT and INRIA, 1996-2002
1.1       cvs         4:  *  Please first read the full copyright statement in file COPYRIGHT.
                      5:  *
                      6:  */
                      7: 
                      8: /*
1.30      cvs         9:  * XHTMLbuilder.c
1.23      cvs        10:  * Builds the corresponding abstract tree for a Thot document of type HTML.
1.1       cvs        11:  *
1.20      cvs        12:  * Authors: L. Carcone
                     13:  *          V. Quint 
1.1       cvs        14:  */
                     15: 
                     16: #define THOT_EXPORT extern
                     17: #include "amaya.h"
                     18: #include "css.h"
1.2       cvs        19: #include "parser.h"
                     20: #include "HTML.h"
1.30      cvs        21: #include "fetchHTMLname.h"
1.2       cvs        22: 
1.13      cvs        23: #include "css_f.h"
                     24: #include "fetchXMLname_f.h"
1.30      cvs        25: #include "fetchHTMLname_f.h"
1.22      cvs        26: #include "html2thot_f.h"
1.1       cvs        27: #include "HTMLactions_f.h"
                     28: #include "HTMLedit_f.h"
1.22      cvs        29: #include "HTMLform_f.h"
1.1       cvs        30: #include "HTMLimage_f.h"
                     31: #include "HTMLtable_f.h"
                     32: #include "HTMLimage_f.h"
                     33: #include "UIcss_f.h"
1.13      cvs        34: #include "styleparser_f.h"
1.2       cvs        35: #include "XHTMLbuilder_f.h"
1.13      cvs        36: #include "Xml2thot_f.h"
1.1       cvs        37: 
                     38: /* maximum length of a Thot structure schema name */
                     39: #define MAX_SS_NAME_LENGTH 32
                     40: 
1.30      cvs        41: #define MaxMsgLength 200
                     42: 
1.47      cvs        43: /* Elements that cannot contain text as immediate children.
                     44:    When some text is present in the HTML file it must be 
                     45:    surrounded by a Pseudo_paragraph element */
                     46: static int          NoTextChild[] =
                     47: {
                     48:    HTML_EL_Document, HTML_EL_HTML, HTML_EL_HEAD, HTML_EL_BODY,
                     49:    HTML_EL_Definition_List, HTML_EL_Block_Quote, HTML_EL_Directory,
                     50:    HTML_EL_Form, HTML_EL_Menu, HTML_EL_FIELDSET,
                     51:    HTML_EL_Numbered_List, HTML_EL_Option_Menu,
                     52:    HTML_EL_Unnumbered_List, HTML_EL_Definition, HTML_EL_List_Item,
                     53:    HTML_EL_MAP, HTML_EL_map, HTML_EL_Applet,
                     54:    HTML_EL_Object, HTML_EL_IFRAME, HTML_EL_NOFRAMES,
                     55:    HTML_EL_Division, HTML_EL_Center, HTML_EL_NOSCRIPT,
                     56:    HTML_EL_Data_cell, HTML_EL_Heading_cell,
                     57:    0};
                     58: 
1.14      cvs        59: /* Mapping table of HTML attribute values */
                     60: AttrValueMapping XhtmlAttrValueMappingTable[] =
1.1       cvs        61: {
1.59      quint      62:    {HTML_ATTR_dir, "ltr", HTML_ATTR_dir_VAL_ltr_},
                     63:    {HTML_ATTR_dir, "rtl", HTML_ATTR_dir_VAL_rtl_},
1.1       cvs        64: 
1.36      cvs        65:    {HTML_ATTR_TextAlign, "left", HTML_ATTR_TextAlign_VAL_left_},
                     66:    {HTML_ATTR_TextAlign, "center", HTML_ATTR_TextAlign_VAL_center_},
                     67:    {HTML_ATTR_TextAlign, "right", HTML_ATTR_TextAlign_VAL_right_},
                     68:    {HTML_ATTR_TextAlign, "justify", HTML_ATTR_TextAlign_VAL_justify_},
                     69: 
                     70:    {HTML_ATTR_Align, "left", HTML_ATTR_Align_VAL_left_},
                     71:    {HTML_ATTR_Align, "center", HTML_ATTR_Align_VAL_center_},
                     72:    {HTML_ATTR_Align, "right", HTML_ATTR_Align_VAL_right_},
                     73: 
                     74:    {HTML_ATTR_LAlign, "top", HTML_ATTR_LAlign_VAL_Top_},
                     75:    {HTML_ATTR_LAlign, "bottom", HTML_ATTR_LAlign_VAL_Bottom_},
                     76:    {HTML_ATTR_LAlign, "left", HTML_ATTR_LAlign_VAL_Left_},
                     77:    {HTML_ATTR_LAlign, "right", HTML_ATTR_LAlign_VAL_Right_},
                     78: 
                     79:    {HTML_ATTR_Clear, "left", HTML_ATTR_Clear_VAL_Left_},
                     80:    {HTML_ATTR_Clear, "right", HTML_ATTR_Clear_VAL_Right_},
                     81:    {HTML_ATTR_Clear, "all", HTML_ATTR_Clear_VAL_All_},
                     82:    {HTML_ATTR_Clear, "none", HTML_ATTR_Clear_VAL_None_},
                     83: 
                     84:    {HTML_ATTR_NumberStyle, "1", HTML_ATTR_NumberStyle_VAL_Arabic_},
                     85:    {HTML_ATTR_NumberStyle, "a", HTML_ATTR_NumberStyle_VAL_LowerAlpha},
                     86:    {HTML_ATTR_NumberStyle, "A", HTML_ATTR_NumberStyle_VAL_UpperAlpha},
                     87:    {HTML_ATTR_NumberStyle, "i", HTML_ATTR_NumberStyle_VAL_LowerRoman},
                     88:    {HTML_ATTR_NumberStyle, "I", HTML_ATTR_NumberStyle_VAL_UpperRoman},
                     89: 
                     90:    {HTML_ATTR_BulletStyle, "disc", HTML_ATTR_BulletStyle_VAL_disc},
                     91:    {HTML_ATTR_BulletStyle, "square", HTML_ATTR_BulletStyle_VAL_square},
                     92:    {HTML_ATTR_BulletStyle, "circle", HTML_ATTR_BulletStyle_VAL_circle},
                     93: 
                     94:    {HTML_ATTR_ItemStyle, "1", HTML_ATTR_ItemStyle_VAL_Arabic_},
                     95:    {HTML_ATTR_ItemStyle, "a", HTML_ATTR_ItemStyle_VAL_LowerAlpha},
                     96:    {HTML_ATTR_ItemStyle, "A", HTML_ATTR_ItemStyle_VAL_UpperAlpha},
                     97:    {HTML_ATTR_ItemStyle, "i", HTML_ATTR_ItemStyle_VAL_LowerRoman},
                     98:    {HTML_ATTR_ItemStyle, "I", HTML_ATTR_ItemStyle_VAL_UpperRoman},
                     99:    {HTML_ATTR_ItemStyle, "disc", HTML_ATTR_ItemStyle_VAL_disc},
                    100:    {HTML_ATTR_ItemStyle, "square", HTML_ATTR_ItemStyle_VAL_square},
                    101:    {HTML_ATTR_ItemStyle, "circle", HTML_ATTR_ItemStyle_VAL_circle},
                    102: 
                    103:    {HTML_ATTR_Button_type, "button", HTML_ATTR_Button_type_VAL_button},
                    104:    {HTML_ATTR_Button_type, "submit", HTML_ATTR_Button_type_VAL_submit},
                    105:    {HTML_ATTR_Button_type, "reset", HTML_ATTR_Button_type_VAL_reset},
                    106: 
                    107:    {HTML_ATTR_frame, "void", HTML_ATTR_frame_VAL_void},
                    108:    {HTML_ATTR_frame, "above", HTML_ATTR_frame_VAL_above},
                    109:    {HTML_ATTR_frame, "below", HTML_ATTR_frame_VAL_below},
                    110:    {HTML_ATTR_frame, "hsides", HTML_ATTR_frame_VAL_hsides},
                    111:    {HTML_ATTR_frame, "lhs", HTML_ATTR_frame_VAL_lhs},
                    112:    {HTML_ATTR_frame, "rhs", HTML_ATTR_frame_VAL_rhs},
                    113:    {HTML_ATTR_frame, "vsides", HTML_ATTR_frame_VAL_vsides},
                    114:    {HTML_ATTR_frame, "box", HTML_ATTR_frame_VAL_box},
                    115:    {HTML_ATTR_frame, "border", HTML_ATTR_frame_VAL_border},
                    116: 
                    117:    {HTML_ATTR_frameborder, "0", HTML_ATTR_frameborder_VAL_Border0},
                    118:    {HTML_ATTR_frameborder, "1", HTML_ATTR_frameborder_VAL_Border1},
                    119: 
                    120:    {HTML_ATTR_scrolling, "yes", HTML_ATTR_scrolling_VAL_Yes_},
                    121:    {HTML_ATTR_scrolling, "no", HTML_ATTR_scrolling_VAL_No_},
                    122:    {HTML_ATTR_scrolling, "auto", HTML_ATTR_scrolling_VAL_auto_},
                    123: 
                    124:    {HTML_ATTR_rules_, "none", HTML_ATTR_rules__VAL_none_},
                    125:    {HTML_ATTR_rules_, "groups", HTML_ATTR_rules__VAL_groups},
                    126:    {HTML_ATTR_rules_, "rows", HTML_ATTR_rules__VAL_rows},
                    127:    {HTML_ATTR_rules_, "cols", HTML_ATTR_rules__VAL_cols},
                    128:    {HTML_ATTR_rules_, "all", HTML_ATTR_rules__VAL_all},
                    129: 
                    130:    {HTML_ATTR_Cell_align, "left", HTML_ATTR_Cell_align_VAL_Cell_left},
                    131:    {HTML_ATTR_Cell_align, "center", HTML_ATTR_Cell_align_VAL_Cell_center},
                    132:    {HTML_ATTR_Cell_align, "right", HTML_ATTR_Cell_align_VAL_Cell_right},
                    133:    {HTML_ATTR_Cell_align, "justify", HTML_ATTR_Cell_align_VAL_Cell_justify},
                    134:    {HTML_ATTR_Cell_align, "char", HTML_ATTR_Cell_align_VAL_Cell_char},
                    135: 
                    136:    {HTML_ATTR_Alignment, "top", HTML_ATTR_Alignment_VAL_Top_},
                    137:    {HTML_ATTR_Alignment, "middle", HTML_ATTR_Alignment_VAL_Middle_},
                    138:    {HTML_ATTR_Alignment, "bottom", HTML_ATTR_Alignment_VAL_Bottom_},
                    139:    {HTML_ATTR_Alignment, "left", HTML_ATTR_Alignment_VAL_Left_},
                    140:    {HTML_ATTR_Alignment, "right", HTML_ATTR_Alignment_VAL_Right_},
                    141: 
                    142:    {HTML_ATTR_METHOD, "get", HTML_ATTR_METHOD_VAL_Get_},
                    143:    {HTML_ATTR_METHOD, "post", HTML_ATTR_METHOD_VAL_Post_},
                    144: 
                    145:    {HTML_ATTR_Position, "top", HTML_ATTR_Position_VAL_Position_top},
                    146:    {HTML_ATTR_Position, "bottom", HTML_ATTR_Position_VAL_Position_bottom},
                    147:    {HTML_ATTR_Position, "left", HTML_ATTR_Position_VAL_Position_left},
                    148:    {HTML_ATTR_Position, "right", HTML_ATTR_Position_VAL_Position_right},
                    149: 
                    150:    {HTML_ATTR_Row_valign, "top", HTML_ATTR_Row_valign_VAL_Row_top},
                    151:    {HTML_ATTR_Row_valign, "middle", HTML_ATTR_Row_valign_VAL_Row_middle},
                    152:    {HTML_ATTR_Row_valign, "bottom", HTML_ATTR_Row_valign_VAL_Row_bottom},
                    153:    {HTML_ATTR_Row_valign, "baseline", HTML_ATTR_Row_valign_VAL_Row_baseline},
                    154: 
                    155:    {HTML_ATTR_Cell_valign, "top", HTML_ATTR_Cell_valign_VAL_Cell_top},
                    156:    {HTML_ATTR_Cell_valign, "middle", HTML_ATTR_Cell_valign_VAL_Cell_middle},
                    157:    {HTML_ATTR_Cell_valign, "bottom", HTML_ATTR_Cell_valign_VAL_Cell_bottom},
                    158:    {HTML_ATTR_Cell_valign, "baseline", HTML_ATTR_Cell_valign_VAL_Cell_baseline},
                    159: 
                    160:    {HTML_ATTR_shape, "rect", HTML_ATTR_shape_VAL_rectangle},
                    161:    {HTML_ATTR_shape, "circle", HTML_ATTR_shape_VAL_circle},
                    162:    {HTML_ATTR_shape, "poly", HTML_ATTR_shape_VAL_polygon},
                    163: 
                    164:    {HTML_ATTR_valuetype, "data", HTML_ATTR_valuetype_VAL_data_},
                    165:    {HTML_ATTR_valuetype, "ref", HTML_ATTR_valuetype_VAL_ref},
                    166:    {HTML_ATTR_valuetype, "object", HTML_ATTR_valuetype_VAL_object_},
1.1       cvs       167: 
1.57      cvs       168:    {HTML_ATTR_EmbedHidden, "yes", HTML_ATTR_EmbedHidden_VAL_Yes_},
                    169:    {HTML_ATTR_EmbedHidden, "no", HTML_ATTR_EmbedHidden_VAL_No_},
                    170: 
1.1       cvs       171: /* HTML attribute TYPE generates a Thot element */
1.36      cvs       172:    {DummyAttribute, "button", HTML_EL_Button_Input},
                    173:    {DummyAttribute, "checkbox", HTML_EL_Checkbox_Input},
                    174:    {DummyAttribute, "file", HTML_EL_File_Input},
                    175:    {DummyAttribute, "hidden", HTML_EL_Hidden_Input},
                    176:    {DummyAttribute, "image", HTML_EL_PICTURE_UNIT},
                    177:    {DummyAttribute, "password", HTML_EL_Password_Input},
                    178:    {DummyAttribute, "radio", HTML_EL_Radio_Input},
                    179:    {DummyAttribute, "reset", HTML_EL_Reset_Input},
                    180:    {DummyAttribute, "submit", HTML_EL_Submit_Input},
                    181:    {DummyAttribute, "text", HTML_EL_Text_Input},
1.1       cvs       182: 
                    183: /* The following declarations allow the parser to accept boolean attributes */
                    184: /* written "checked=CHECKED"), for instance */
1.36      cvs       185:    {HTML_ATTR_ISMAP, "ismap", HTML_ATTR_ISMAP_VAL_Yes_},
                    186:    {HTML_ATTR_nohref, "nohref", HTML_ATTR_nohref_VAL_Yes_},
                    187:    {HTML_ATTR_COMPACT, "compact", HTML_ATTR_COMPACT_VAL_Yes_},
                    188:    {HTML_ATTR_Multiple, "multiple", HTML_ATTR_Multiple_VAL_Yes_},
                    189:    {HTML_ATTR_Selected, "selected", HTML_ATTR_Selected_VAL_Yes_},
                    190:    {HTML_ATTR_Checked, "checked", HTML_ATTR_Checked_VAL_Yes_},
                    191:    {HTML_ATTR_No_wrap, "nowrap", HTML_ATTR_No_wrap_VAL_no_wrap},
                    192:    {HTML_ATTR_NoShade, "noshade", HTML_ATTR_NoShade_VAL_NoShade_},
1.62      quint     193:    {HTML_ATTR_declare, "declare", HTML_ATTR_declare_VAL_declare_},
1.36      cvs       194:    {HTML_ATTR_defer, "defer", HTML_ATTR_defer_VAL_Yes_},
                    195:    {HTML_ATTR_disabled, "disabled", HTML_ATTR_disabled_VAL_Yes_},
                    196:    {HTML_ATTR_readonly, "readonly", HTML_ATTR_readonly_VAL_Yes_},
                    197:    {HTML_ATTR_no_resize, "noresize", HTML_ATTR_no_resize_VAL_Yes_},
1.21      cvs       198: 
                    199:    /* XML attribute xml:space */
1.36      cvs       200:    {HTML_ATTR_xml_space, "default", HTML_ATTR_xml_space_VAL_xml_space_default},
                    201:    {HTML_ATTR_xml_space, "preserve", HTML_ATTR_xml_space_VAL_xml_space_preserve},
1.21      cvs       202: 
1.36      cvs       203:    {0, "", 0}                  /* Last entry. Mandatory */
1.1       cvs       204: };
1.6       cvs       205: 
1.28      cvs       206: /* Define a pointer to let parser functions access the HTML entity table */
                    207: extern XmlEntity *pXhtmlEntityTable;
1.6       cvs       208: 
1.30      cvs       209: /* maximum size of error messages */
                    210: #define MaxMsgLength 200
                    211: 
1.6       cvs       212: /*----------------------------------------------------------------------
1.15      cvs       213:   ParseCharset:
1.6       cvs       214:   Parses the element HTTP-EQUIV and looks for the charset value.
                    215:   ----------------------------------------------------------------------*/
1.30      cvs       216: void             ParseCharset (Element el, Document doc) 
                    217: 
1.6       cvs       218: {
1.15      cvs       219:    AttributeType attrType;
                    220:    Attribute     attr;
                    221:    SSchema       docSSchema;
                    222:    CHARSET       charset;
1.39      cvs       223:    char         *text, *text2, *ptrText, *str;
                    224:    char          charsetname[MAX_LENGTH];
1.15      cvs       225:    int           length;
1.6       cvs       226:    int           pos, index = 0;
                    227: 
1.15      cvs       228:    charset = TtaGetDocumentCharset (doc);
                    229:    if (charset != UNDEFINED_CHARSET)
                    230:      /* the charset was already defined by the http header */
                    231:      return;
1.6       cvs       232: 
                    233:    docSSchema = TtaGetDocumentSSchema (doc);
                    234:    attrType.AttrSSchema = docSSchema;
                    235:    attrType.AttrTypeNum = HTML_ATTR_http_equiv;
                    236:    attr = TtaGetAttribute (el, attrType);
                    237:    if (attr != NULL)
                    238:      {
                    239:        /* There is a HTTP-EQUIV attribute */
                    240:        length = TtaGetTextAttributeLength (attr);
                    241:        if (length > 0)
                    242:         {
1.37      cvs       243:           text = TtaGetMemory (length + 1);
1.6       cvs       244:           TtaGiveTextAttributeValue (attr, text, &length);
1.37      cvs       245:           if (!strcasecmp (text, "content-type"))
1.6       cvs       246:             {
                    247:               attrType.AttrTypeNum = HTML_ATTR_meta_content;
                    248:               attr = TtaGetAttribute (el, attrType);
                    249:               if (attr != NULL)
                    250:                 {
                    251:                   length = TtaGetTextAttributeLength (attr);
                    252:                   if (length > 0)
                    253:                     {
1.37      cvs       254:                       text2 = TtaGetMemory (length + 1);
1.6       cvs       255:                       TtaGiveTextAttributeValue (attr, text2, &length);
                    256:                       ptrText = text2;
                    257:                       while (*ptrText)
                    258:                         {
1.53      vatton    259:                           *ptrText = tolower (*ptrText);
1.6       cvs       260:                           ptrText++;
                    261:                         }
                    262:                       
1.37      cvs       263:                       str = strstr (text2, "charset=");
1.6       cvs       264:                       if (str)
                    265:                         {
                    266:                           pos = str - text2 + 8;
1.37      cvs       267:                           while (text2[pos] != SPACE &&
                    268:                                  text2[pos] != TAB && text2[pos] != EOS)
1.6       cvs       269:                             charsetname[index++] = text2[pos++];
1.37      cvs       270:                           charsetname[index] = EOS;
1.15      cvs       271:                           charset = TtaGetCharset (charsetname);
                    272:                           if (charset != UNDEFINED_CHARSET)
                    273:                             TtaSetDocumentCharset (doc, charset);
1.6       cvs       274:                         }
                    275:                       TtaFreeMemory (text2);
                    276:                     }       
                    277:                 } 
                    278:             }
                    279:           TtaFreeMemory (text);
                    280:         }
                    281:      }
                    282: }
                    283: 
1.23      cvs       284: /*----------------------------------------------------------------------
1.47      cvs       285:    XhtmlCannotContainText 
                    286:    Return TRUE if element el is a block element.
                    287:   ----------------------------------------------------------------------*/
                    288: ThotBool      XhtmlCannotContainText (ElementType elType)
                    289: 
                    290: {
                    291:    int        i;
                    292:    ThotBool   ret;
                    293: 
                    294:    if (strcmp (TtaGetSSchemaName (elType.ElSSchema), "HTML"))
                    295:       /* not an HTML element */
                    296:       ret = TRUE;
                    297:    else
                    298:      {
                    299:        ret = FALSE;
                    300:        i = 0;
                    301:        while (NoTextChild[i] > 0 && NoTextChild[i] != elType.ElTypeNum)
                    302:            i++;
                    303:        if (NoTextChild[i] == elType.ElTypeNum)
                    304:            ret = TRUE;
                    305:      }
                    306:    return ret;
1.23      cvs       307: }
                    308: 
1.6       cvs       309: /*----------------------------------------------------------------------
                    310:   XhtmlElementComplete
1.20      cvs       311:   Complete Xhtml elements.
1.6       cvs       312:   Check its attributes and its contents.
                    313:   ----------------------------------------------------------------------*/
1.51      cvs       314: void       XhtmlElementComplete (Element el, Document doc, int *error)
1.30      cvs       315: 
                    316: {
                    317:    ElementType    elType, newElType, childType;
                    318:    Element        constElem, child, desc, leaf, prev, next, last,
1.62      quint     319:                  elFrames, lastFrame, lastChild, parent, picture, content;
1.30      cvs       320:    Attribute      attr;
                    321:    AttributeType  attrType;
                    322:    Language       lang;
1.41      cvs       323:    char           *text;
1.39      cvs       324:    char           lastChar[2];
                    325:    char           *name1;
1.30      cvs       326:    int            length;
                    327:    SSchema        docSSchema;
1.62      quint     328:    ThotBool       isImage;
                    329:    PresentationValue    pval;
                    330:    PresentationContext  ctxt;
1.6       cvs       331: 
                    332:    *error = 0;
                    333:    docSSchema = TtaGetDocumentSSchema (doc);
                    334: 
                    335:    elType = TtaGetElementType (el);
                    336:    /* is this a block-level element in a character-level element? */
1.56      cvs       337:    if (!IsXMLElementInline (elType, doc) &&
1.24      cvs       338:        elType.ElTypeNum != HTML_EL_Comment_ &&
                    339:        elType.ElTypeNum != HTML_EL_XMLPI)
1.6       cvs       340:        BlockInCharLevelElem (el);
                    341: 
                    342:    newElType.ElSSchema = elType.ElSSchema;
                    343:    switch (elType.ElTypeNum)
                    344:      {
1.62      quint     345:      case HTML_EL_Object:      /* it's an object */
                    346:        isImage = FALSE;
                    347:        /* is there a type attribute on the object element? */
                    348:        attrType.AttrSSchema = elType.ElSSchema;
                    349:        attrType.AttrTypeNum = HTML_ATTR_Object_type;
1.6       cvs       350:        attr = TtaGetAttribute (el, attrType);
1.62      quint     351:        if (attr)
                    352:         /* there is a type attribute. Get its value to see if the object
                    353:            represents an image */
1.6       cvs       354:         {
                    355:           length = TtaGetTextAttributeLength (attr);
                    356:           if (length > 0)
                    357:             {
1.37      cvs       358:               name1 = TtaGetMemory (length + 1);
1.6       cvs       359:               TtaGiveTextAttributeValue (attr, name1, &length);
1.62      quint     360:               if (!strcmp (name1, "application/mathml+xml") ||
                    361:                   !strcmp (name1, "application/postscript") ||
                    362:                   !strcmp (name1, "image/x-bitmap") ||
                    363:                   !strcmp (name1, "image/x-xpixmap") ||
                    364:                   !strcmp (name1, "image/gif") ||
                    365:                   !strcmp (name1, "image/jpeg") ||
                    366:                   !strcmp (name1, "image/png") ||
                    367:                   !strcmp (name1, "image/svg"))
                    368:                 isImage = TRUE;
                    369:               TtaFreeMemory (name1);
                    370:             }
                    371:         }
                    372:        
                    373:        picture = NULL;     /* no PICTURE element yet */
                    374:        child = TtaGetFirstChild (el);
                    375:        if (isImage)
                    376:         /* the object represents an image. We need a PICTURE element as
                    377:            child of the object to hold the image */
                    378:         {
                    379:           if (child)
                    380:             {
                    381:               elType = TtaGetElementType (child);
                    382:               if (elType.ElTypeNum == HTML_EL_PICTURE_UNIT)
                    383:                 /* there is already a PICTURE element */
                    384:                 picture = child;
                    385:             }
                    386:           /* if the object element has no PICTURE element as first child
                    387:              create one */
                    388:           if (!picture)
                    389:             {
                    390:               elType.ElTypeNum = HTML_EL_PICTURE_UNIT;
                    391:               picture = TtaNewTree (doc, elType, "");
                    392:               if (child)
                    393:                 TtaInsertSibling (picture, child, TRUE, doc);
                    394:               else
                    395:                 TtaInsertFirstChild (&picture, el, doc);
                    396:               child = picture;
                    397:             }
                    398:           /* copy attribute data of the object into the SRC attribute of
                    399:              the PICTURE element */
                    400:           attrType.AttrSSchema = elType.ElSSchema;
                    401:           attrType.AttrTypeNum = HTML_ATTR_data;
                    402:           attr = TtaGetAttribute (el, attrType);
                    403:           if (attr)
                    404:             /* the object has a data attribute */
                    405:             {
                    406:               length = TtaGetTextAttributeLength (attr);
                    407:               if (length > 0)
1.6       cvs       408:                 {
1.62      quint     409:                   name1 = TtaGetMemory (length + 1);
                    410:                   TtaGiveTextAttributeValue (attr, name1, &length);
                    411:                   attrType.AttrTypeNum = HTML_ATTR_SRC;
                    412:                   attr = TtaGetAttribute (picture, attrType);
                    413:                   if (attr == NULL)
                    414:                     {
                    415:                       attr = TtaNewAttribute (attrType);
                    416:                       TtaAttachAttribute (picture, attr, doc);
                    417:                     }
                    418:                   TtaSetAttributeText (attr, name1, picture, doc);
                    419:                   TtaFreeMemory (name1);
1.6       cvs       420:                 }
                    421:             }
                    422:         }
                    423:        /* is the Object_Content element already created ? */
1.62      quint     424:        if (child)
                    425:         /* the object element has at least 1 child element */
                    426:         {
                    427:           content = NULL;
                    428:           desc = child;
1.6       cvs       429:           elType = TtaGetElementType (desc);
1.62      quint     430:           if (elType.ElTypeNum != HTML_EL_Object_Content)
                    431:             {
                    432:               TtaNextSibling(&desc);
                    433:               if (desc)
                    434:                 elType = TtaGetElementType (desc);
                    435:             }
                    436:           /* is it the Object_Content element ? */
                    437:           if (elType.ElTypeNum == HTML_EL_Object_Content)
                    438:             content = desc;
                    439:           else
1.6       cvs       440:             {
1.62      quint     441:               /* create an Object_Content element */
                    442:               elType.ElTypeNum = HTML_EL_Object_Content;
                    443:               content = TtaNewElement (doc, elType);
                    444:               if (picture)
                    445:                 TtaInsertSibling (content, picture, FALSE, doc);
                    446:               else
                    447:                 TtaInsertSibling (content, child, TRUE, doc);
                    448:               /* move previous existing children into Object_Content */
1.6       cvs       449:               child = TtaGetLastChild(el);
1.62      quint     450:               while (child != content)
                    451:                 {
                    452:                   TtaRemoveTree (child, doc);
                    453:                   TtaInsertFirstChild (&child, content, doc);
                    454:                   child = TtaGetLastChild(el);
                    455:                 }
                    456:             }
                    457:           if (picture && content)
                    458:             /* there is a picture element. The Object_Content must not be
                    459:                displayed in the main view */
                    460:             {
                    461:               ctxt = TtaGetSpecificStyleContext (doc);
                    462:               /* the presentation rule to be set is not a CSS rule */
                    463:               ctxt->cssSpecificity = 0;
                    464:               ctxt->destroy = FALSE;
                    465:               pval.typed_data.unit = STYLE_UNIT_PX;
                    466:               pval.typed_data.value = 0;
                    467:               pval.typed_data.real = FALSE;
                    468:               TtaSetStylePresentation (PRVisibility, content, NULL, ctxt, pval);
1.6       cvs       469:             }
                    470:         }
                    471:        break;
1.62      quint     472: 
1.6       cvs       473:      case HTML_EL_Unnumbered_List:
                    474:      case HTML_EL_Numbered_List:
                    475:      case HTML_EL_Menu:
                    476:      case HTML_EL_Directory:
                    477:        /* It's a List element. It should only have List_Item children.
                    478:          If it has List element chidren, move these List elements
                    479:          within their previous List_Item sibling.  This is to fix
                    480:          a bug in document generated by Mozilla. */
                    481:        prev = NULL;
                    482:        next = NULL;
                    483:        child = TtaGetFirstChild (el);
                    484:        while (child != NULL)
                    485:         {
                    486:           next = child;
                    487:           TtaNextSibling (&next);
                    488:           elType = TtaGetElementType (child);
                    489:           if (elType.ElTypeNum == HTML_EL_Unnumbered_List ||
                    490:               elType.ElTypeNum == HTML_EL_Numbered_List ||
                    491:               elType.ElTypeNum == HTML_EL_Menu ||
                    492:               elType.ElTypeNum == HTML_EL_Directory)
                    493:             /* this list element is a child of another list element */
                    494:             if (prev)
                    495:               {
                    496:                 elType = TtaGetElementType (prev);
                    497:                 if (elType.ElTypeNum == HTML_EL_List_Item)
                    498:                   {
                    499:                     /* get the last child of the previous List_Item */
                    500:                     desc = TtaGetFirstChild (prev);
                    501:                     last = NULL;
                    502:                     while (desc)
                    503:                       {
                    504:                         last = desc;
                    505:                         TtaNextSibling (&desc);
                    506:                       }
                    507:                     /* move the list element after the last child of the
                    508:                        previous List_Item */
                    509:                     TtaRemoveTree (child, doc);
                    510:                     if (last)
                    511:                       TtaInsertSibling (child, last, FALSE, doc);
                    512:                     else
                    513:                       TtaInsertFirstChild (&child, prev, doc);
                    514:                     child = prev;
                    515:                   }
                    516:               }
                    517:           prev = child;
                    518:           child = next;
                    519:         }
                    520:        break;
                    521:        
                    522:      case HTML_EL_FRAMESET:
                    523:        /* The FRAMESET element is now complete.  Gather all its FRAMESET
                    524:          and FRAME children and wrap them up in a Frames element */
                    525:        elFrames = NULL; lastFrame = NULL;
                    526:        lastChild = NULL;
                    527:        child = TtaGetFirstChild (el);
                    528:        while (child != NULL)
                    529:         {
                    530:           next = child;
                    531:           TtaNextSibling (&next);
                    532:           elType = TtaGetElementType (child);
                    533:           if (elType.ElTypeNum == HTML_EL_FRAMESET ||
                    534:               elType.ElTypeNum == HTML_EL_FRAME ||
                    535:               elType.ElTypeNum == HTML_EL_Comment_)
                    536:             {
                    537:               /* create the Frames element if it does not exist */
                    538:               if (elFrames == NULL)
                    539:                 {
                    540:                   newElType.ElSSchema = docSSchema;
                    541:                   newElType.ElTypeNum = HTML_EL_Frames;
                    542:                   elFrames = TtaNewElement (doc, newElType);
1.63      cvs       543:                   if (DocumentMeta[doc]->xmlformat)
                    544:                     XmlSetElemLineNumber (elFrames);
                    545:                   else
                    546:                     SetHtmlElemLineNumber (elFrames);
1.6       cvs       547:                   TtaInsertSibling (elFrames, child, TRUE, doc);
                    548:                 }
                    549:               /* move the element as the last child of the Frames element */
                    550:               TtaRemoveTree (child, doc);
                    551:               if (lastFrame == NULL)
                    552:                 TtaInsertFirstChild (&child, elFrames, doc);
                    553:               else
                    554:                 TtaInsertSibling (child, lastFrame, FALSE, doc);
                    555:               lastFrame = child;
                    556:             }
                    557:           child = next;
                    558:         }
                    559:        break;
                    560:        
                    561:      case HTML_EL_Input:       /* it's an INPUT without any TYPE attribute */
                    562:        /* Create a child of type Text_Input */
                    563:        elType.ElTypeNum = HTML_EL_Text_Input;
                    564:        child = TtaNewTree (doc, elType, "");
1.63      cvs       565:        if (DocumentMeta[doc]->xmlformat)
                    566:         XmlSetElemLineNumber (child);
                    567:        else
                    568:         SetHtmlElemLineNumber (child);
1.6       cvs       569:        TtaInsertFirstChild (&child, el, doc);
                    570:        /* now, process it like a Text_Input element */
                    571: 
                    572:      case HTML_EL_Text_Input:
                    573:      case HTML_EL_Password_Input:
                    574:      case HTML_EL_File_Input:
                    575:        /* get element Inserted_Text */
                    576:        child = TtaGetFirstChild (el);
                    577:        if (child != NULL)
                    578:         {
                    579:           attrType.AttrSSchema = docSSchema;
                    580:           attrType.AttrTypeNum = HTML_ATTR_Value_;
                    581:           attr = TtaGetAttribute (el, attrType);
                    582:           if (attr != NULL)
                    583:             {
                    584:               /* copy the value of attribute "value" into the first text
                    585:                  leaf of element */
                    586:               length = TtaGetTextAttributeLength (attr);
                    587:               if (length > 0)
                    588:                 {
                    589:                   /* get the text leaf */
                    590:                   leaf = TtaGetFirstChild (child);
                    591:                   if (leaf != NULL)
                    592:                     {
                    593:                       childType = TtaGetElementType (leaf);
                    594:                       if (childType.ElTypeNum == HTML_EL_TEXT_UNIT)
                    595:                         {
                    596:                           /* copy attribute value into the text leaf */
1.37      cvs       597:                           text = TtaGetMemory (length + 1);
1.6       cvs       598:                           TtaGiveTextAttributeValue (attr, text, &length);
                    599:                           TtaSetTextContent (leaf, text, 
                    600:                                              TtaGetDefaultLanguage (), doc);
                    601:                           TtaFreeMemory (text);
                    602:                         }
                    603:                     }
                    604:                 }
                    605:             }
                    606:         }
                    607:        break;
                    608:        
                    609:      case HTML_EL_META:
1.15      cvs       610:        ParseCharset (el, doc);
1.6       cvs       611:        break;
                    612: 
                    613:      case HTML_EL_STYLE_:      /* it's a STYLE element */
1.60      vatton    614:      case HTML_EL_SCRIPT_:     /* it's a SCRIPT element */
1.6       cvs       615:      case HTML_EL_Preformatted:        /* it's a PRE */
                    616:        /* if the last line of the Preformatted is empty, remove it */
                    617:        leaf = XmlLastLeafInElement (el);
                    618:        if (leaf != NULL)
                    619:         {
                    620:           elType = TtaGetElementType (leaf);
                    621:           if (elType.ElTypeNum == HTML_EL_TEXT_UNIT)
                    622:             /* the last leaf is a TEXT element */
                    623:             {
                    624:               length = TtaGetTextLength (leaf);
                    625:               if (length > 0)
                    626:                 {
                    627:                   TtaGiveSubString (leaf, lastChar, length, 1);
                    628:                   if (lastChar[0] == EOL)
                    629:                     /* last character is new line, delete it */
                    630:                     {
                    631:                       if (length == 1)
                    632:                         /* empty TEXT element */
                    633:                         TtaDeleteTree (leaf, doc);
                    634:                       else
                    635:                         /* remove the last character */
                    636:                         TtaDeleteTextContent (leaf, length, 1, doc);
                    637:                     }
                    638:                 }
                    639:             }
                    640:         }
1.63      cvs       641:        if (DocumentMeta[doc]->xmlformat)
                    642:         {
                    643:           if (IsXmlParsingCSS ())
                    644:             {
                    645:               text = GetStyleContents (el);
                    646:               if (text)
                    647:                 {
                    648:                   ReadCSSRules (doc, NULL, text,
                    649:                                 TtaGetElementLineNumber (el), FALSE);
                    650:                   TtaFreeMemory (text);
                    651:                 }
                    652:               SetXmlParsingCSS (FALSE);
                    653:             }
                    654:         }
                    655:        else
1.6       cvs       656:         {
1.63      cvs       657:           if (IsHtmlParsingCSS ())
1.6       cvs       658:             {
1.63      cvs       659:               text = GetStyleContents (el);
                    660:               if (text)
                    661:                 {
                    662:                   ReadCSSRules (doc, NULL, text,
                    663:                                 TtaGetElementLineNumber (el), FALSE);
                    664:                   TtaFreeMemory (text);
                    665:                 }
                    666:               SetHtmlParsingCSS (FALSE);
1.6       cvs       667:             }
                    668:         }
                    669:        /* and continue as if it were a Preformatted or a Script */
                    670:        break;
                    671:        
                    672:      case HTML_EL_Text_Area:   /* it's a Text_Area */
                    673:        SetParsingTextArea (FALSE);
                    674:        child = TtaGetFirstChild (el);
                    675:        if (child == NULL)
                    676:         /* it's an empty Text_Area */
                    677:         /* insert a Inserted_Text element in the element */
                    678:         {
                    679:           newElType.ElTypeNum = HTML_EL_Inserted_Text;
                    680:           child = TtaNewTree (doc, newElType, "");
                    681:           TtaInsertFirstChild (&child, el, doc);
                    682:         }
                    683:        else
                    684:         {
                    685:           /* save the text into Default_Value attribute */
                    686:           attrType.AttrSSchema = docSSchema;
                    687:           attrType.AttrTypeNum = HTML_ATTR_Default_Value;
                    688:           if (TtaGetAttribute (el, attrType) == NULL)
                    689:             /* attribute Default_Value is missing */
                    690:             {
                    691:               attr = TtaNewAttribute (attrType);
                    692:               TtaAttachAttribute (el, attr, doc);
                    693:               desc = TtaGetFirstChild (child);
                    694:               length = TtaGetTextLength (desc) + 1;
1.37      cvs       695:               text = TtaGetMemory (length);
1.6       cvs       696:               TtaGiveTextContent (desc, text, &length, &lang);
                    697:               TtaSetAttributeText (attr, text, el, doc);
                    698:               TtaFreeMemory (text);
                    699:             }
                    700:         }
                    701:        /* insert a Frame element */
                    702:        newElType.ElTypeNum = HTML_EL_Frame;
                    703:        constElem = TtaNewTree (doc, newElType, "");
                    704:        TtaInsertSibling (constElem, child, FALSE, doc);
                    705:        break;
                    706:        
                    707:      case HTML_EL_Radio_Input:
                    708:      case HTML_EL_Checkbox_Input:
                    709:        /* put an attribute Checked if it is missing */
                    710:        attrType.AttrSSchema = docSSchema;
                    711:        attrType.AttrTypeNum = HTML_ATTR_Checked;
                    712:        if (TtaGetAttribute (el, attrType) == NULL)
                    713:         /* attribute Checked is missing */
                    714:         {
                    715:           attr = TtaNewAttribute (attrType);
                    716:           TtaAttachAttribute (el, attr, doc);
                    717:           TtaSetAttributeValue (attr, HTML_ATTR_Checked_VAL_No_, el, doc);
                    718:         }
                    719:        break;
                    720:        
                    721:      case HTML_EL_Option_Menu:
                    722:        /* Check that at least one option has a SELECTED attribute */
                    723:        OnlyOneOptionSelected (el, doc, TRUE);
                    724:        break;
                    725: 
                    726:      case HTML_EL_PICTURE_UNIT:
                    727:        break;
                    728:        
                    729:      case HTML_EL_LINK:
                    730:        CheckCSSLink (el, doc, docSSchema);
                    731:        break;
                    732:        
                    733:      case HTML_EL_Data_cell:
                    734:      case HTML_EL_Heading_cell:
                    735:        /* insert a pseudo paragraph into empty cells */
                    736:        child = TtaGetFirstChild (el);
                    737:        if (child == NULL)
                    738:         {
                    739:           elType.ElTypeNum = HTML_EL_Pseudo_paragraph;
                    740:           child = TtaNewTree (doc, elType, "");
                    741:           if (child != NULL)
                    742:               TtaInsertFirstChild (&child, el, doc);
                    743:         }
                    744:        
                    745:        /* detect whether we're parsing a whole table or just a cell */
1.63      cvs       746:        if (DocumentMeta[doc]->xmlformat)
                    747:         {
                    748:           if (IsWithinXmlTable ())
                    749:             NewCell (el, doc, FALSE);
                    750:         }
                    751:        else
                    752:         {
                    753:           if (IsWithinHtmlTable ())
                    754:             NewCell (el, doc, FALSE);
                    755:         }
1.6       cvs       756:        break;
                    757:        
                    758:      case HTML_EL_Table:
                    759:        CheckTable (el, doc);
                    760:        SubWithinTable ();
                    761:        break;
                    762:        
                    763:      case HTML_EL_TITLE:
                    764:        /* show the TITLE in the main window */
                    765:        UpdateTitle (el, doc);
                    766:        break;
1.41      cvs       767: 
                    768:      case HTML_EL_rbc:
                    769:        /* an rbc element has been read. Its parent should be a complex_ruby.
                    770:          Change the type of the parent, as simple_ruby are created by
                    771:          default */
                    772:        parent = TtaGetParent (el);
                    773:        if (parent)
                    774:         {
                    775:           newElType = TtaGetElementType (parent);
                    776:           if (newElType.ElSSchema == elType.ElSSchema &&
                    777:               newElType.ElTypeNum == HTML_EL_simple_ruby)
                    778:              ChangeElementType (parent, HTML_EL_complex_ruby);
                    779:         }
                    780:        break;
                    781: 
                    782:      case HTML_EL_rtc1:
                    783:        /* an rtc element has been parsed. If it has already a rtc1 sibling,
                    784:          change its type to rtc2 */
                    785:        prev = el;
                    786:        do
                    787:         {
                    788:           TtaPreviousSibling(&prev);
                    789:           if (prev)
                    790:             {
                    791:               newElType = TtaGetElementType (prev);
                    792:               if (newElType.ElSSchema == elType.ElSSchema &&
                    793:                   newElType.ElTypeNum == HTML_EL_rtc1)
                    794:                 {
                    795:                   ChangeElementType (el, HTML_EL_rtc2);
                    796:                   prev = NULL;
                    797:                 }
                    798:             }
                    799:         }
                    800:        while (prev);
                    801:        break;
                    802: 
1.6       cvs       803:      default:
                    804:        break;
                    805:      }
                    806: }
1.1       cvs       807: 
                    808: /*----------------------------------------------------------------------
1.30      cvs       809:    PutInContent    
                    810:    Put the string ChrString in the leaf of current element.
                    811:   ----------------------------------------------------------------------*/
1.39      cvs       812: Element         PutInContent (char *ChrString, ParserData *context)
1.30      cvs       813: 
                    814: {
                    815:    Element      el, child;
                    816:    ElementType  elType;
                    817:    int          length;
                    818: 
                    819:    el = NULL;
                    820:    if (context->lastElement != NULL)
                    821:      {
                    822:        /* search first leaf of current element */
                    823:        el = context->lastElement;
                    824:        do
                    825:          {
                    826:             child = TtaGetFirstChild (el);
                    827:             if (child != NULL)
                    828:                el = child;
                    829:          }
                    830:        while (child != NULL);
                    831:        elType = TtaGetElementType (el);
                    832:        length = 0;
                    833:        if (elType.ElTypeNum == 1)
                    834:           length = TtaGetTextLength (el);
                    835:        if (length == 0)
                    836:           TtaSetTextContent (el, ChrString, context->language, context->doc);
                    837:        else
                    838:           TtaAppendTextContent (el, ChrString, context->doc);
                    839:      }
                    840:    return el;
                    841: }
                    842: 
                    843: /*----------------------------------------------------------------------
1.51      cvs       844:    UnknownXhtmlNameSpace
                    845:    Create an element that belongs to a non-supported namespace
                    846:   ----------------------------------------------------------------------*/
                    847: void               UnknownXhtmlNameSpace (ParserData *context, char* content)
                    848: {
                    849:    ElementType     elType;
                    850:    Element         elInv, elText;
                    851: 
                    852:    /* Create a new Invalid_element */
                    853:    elType.ElSSchema = GetXMLSSchema (XHTML_TYPE, context->doc);
                    854:    elType.ElTypeNum = HTML_EL_Unknown_namespace;
                    855:    elInv = TtaNewElement (context->doc, elType);
                    856:    if (elInv != NULL)
                    857:      {
                    858:        XmlSetElemLineNumber (elInv);
                    859:        InsertXmlElement (&elInv);
                    860:        context->lastElementClosed = TRUE;
                    861:        elType.ElTypeNum = HTML_EL_TEXT_UNIT;
                    862:        elText = TtaNewElement (context->doc, elType);
                    863:        XmlSetElemLineNumber (elText);
                    864:        TtaInsertFirstChild (&elText, elInv, context->doc);
                    865:        TtaSetTextContent (elText, content, context->language, context->doc);
                    866:        TtaSetAccessRight (elText, ReadOnly, context->doc);
                    867:      }
                    868: }
                    869: 
                    870: /*----------------------------------------------------------------------
1.30      cvs       871:    CreateHTMLAttribute
                    872:    create an attribute of type attrType for the element el.
                    873:   ----------------------------------------------------------------------*/
                    874: void           CreateHTMLAttribute (Element       el,
                    875:                                    AttributeType attrType,
1.46      cvs       876:                                    char*         text,
1.30      cvs       877:                                    ThotBool      isInvalid,
                    878:                                    Document      doc,
                    879:                                    Attribute    *lastAttribute,
                    880:                                    Element      *lastAttrElement)
                    881:      
                    882: {
                    883:    int         attrKind;
                    884:    int         length;
1.39      cvs       885:    char       *buffer;
1.30      cvs       886:    Attribute   attr, oldAttr;
                    887: 
                    888:    if (attrType.AttrTypeNum != 0)
                    889:      {
                    890:        oldAttr = TtaGetAttribute (el, attrType);
                    891:        if (oldAttr != NULL)
                    892:         /* this attribute already exists */
                    893:         attr = oldAttr;
                    894:        else
                    895:         /* create a new attribute and attach it to the element */
                    896:         {
                    897:           attr = TtaNewAttribute (attrType);
                    898:           TtaAttachAttribute (el, attr, doc);
                    899:         }
                    900:        *lastAttribute = attr;
                    901:        *lastAttrElement = el;
                    902: 
                    903:        TtaGiveAttributeType (attr, &attrType, &attrKind);
                    904:        if (attrKind == 0)      /* enumerate */
                    905:         TtaSetAttributeValue (attr, 1, el, doc);
                    906: 
                    907:        /* attribute BORDER without any value (ThotBool attribute) is */
                    908:        /* considered as BORDER=1 */
                    909:        if (attrType.AttrTypeNum == HTML_ATTR_Border)
                    910:         TtaSetAttributeValue (attr, 1, el, doc);
                    911: 
                    912:        if (isInvalid)
                    913:         /* Copy the name of the invalid attribute as the content */
                    914:         /* of the Invalid_attribute attribute. */
                    915:         {
1.37      cvs       916:           length = strlen (text) + 2;
1.30      cvs       917:           length += TtaGetTextAttributeLength (attr);
1.37      cvs       918:           buffer = TtaGetMemory (length + 1);
1.30      cvs       919:           TtaGiveTextAttributeValue (attr, buffer, &length);
1.37      cvs       920:           strcat (buffer, " ");
                    921:           strcat (buffer, text);
1.30      cvs       922:           TtaSetAttributeText (attr, buffer, el, doc);
                    923:           TtaFreeMemory (buffer);
                    924:         }
                    925:      }
                    926: }
                    927: 
                    928: /*----------------------------------------------------------------------
                    929:    HTMLTypeAttrValue
                    930:    Value val has been read for the HTML attribute TYPE.
                    931:    Create a child for the current Thot element INPUT accordingly.
                    932:   ----------------------------------------------------------------------*/
1.46      cvs       933: void               HTMLTypeAttrValue (char       *val,
1.30      cvs       934:                                      Attribute   lastAttribute,
                    935:                                      Element     lastAttrElement,
                    936:                                      ParserData *context)
                    937: 
                    938: {
                    939:   ElementType      elType;
                    940:   Element          newChild;
                    941:   AttributeType    attrType;
                    942:   Attribute        attr;
1.39      cvs       943:   char             msgBuffer[MaxMsgLength];
1.30      cvs       944:   int              value;
                    945:   int              numberOfLinesRead;
                    946: 
                    947:   value = MapAttrValue (DummyAttribute, val);
                    948:   if (value < 0)
                    949:     {
1.37      cvs       950:       if (strlen (val) > MaxMsgLength - 40)
                    951:          val[MaxMsgLength - 40] = EOS;
                    952:       sprintf (msgBuffer, "Unknown attribute value \"type = %s\"", val);
1.42      cvs       953:       HTMLParseError (context->doc, msgBuffer);
1.30      cvs       954:       attrType.AttrSSchema = TtaGetDocumentSSchema (context->doc);
                    955:       attrType.AttrTypeNum = pHTMLAttributeMapping[0].ThotAttribute;
1.37      cvs       956:       sprintf (msgBuffer, "type=%s", val);
1.30      cvs       957:       CreateHTMLAttribute (context->lastElement, attrType, msgBuffer, TRUE,
                    958:                           context->doc, &lastAttribute, &lastAttrElement);
                    959:     }
                    960:   else
                    961:     {
                    962:       elType = TtaGetElementType (context->lastElement);
                    963:       if (elType.ElTypeNum != HTML_EL_Input)
                    964:        {
1.37      cvs       965:          if (strlen (val) > MaxMsgLength - 40)
                    966:            val[MaxMsgLength - 40] = EOS;
                    967:          sprintf (msgBuffer, "Duplicate attribute \"type = %s\"", val);
1.30      cvs       968:        }
                    969:       else
                    970:        {
                    971:          elType.ElSSchema = TtaGetDocumentSSchema (context->doc);
                    972:          elType.ElTypeNum = value;
                    973:          newChild = TtaNewTree (context->doc, elType, "");
                    974:          numberOfLinesRead = 0;
                    975:          TtaSetElementLineNumber (newChild, numberOfLinesRead);
                    976:          TtaInsertFirstChild (&newChild, context->lastElement, context->doc);
                    977:          if (value == HTML_EL_PICTURE_UNIT)
                    978:            {
                    979:              /* add the attribute IsInput to input pictures */
                    980:              attrType.AttrSSchema = elType.ElSSchema;
                    981:              attrType.AttrTypeNum = HTML_ATTR_IsInput;
                    982:              attr = TtaNewAttribute (attrType);
                    983:              TtaAttachAttribute (newChild, attr, context->doc);
                    984:            }
                    985:        }
                    986:     }
                    987: }
                    988: 
                    989: /*----------------------------------------------------------------------
                    990:    XhtmlTypeAttrValue 
                    991:    Value val has been read for the HTML attribute TYPE.
                    992:    Create a child for the current Thot element INPUT accordingly.
                    993:   ----------------------------------------------------------------------*/
1.46      cvs       994: void              XhtmlTypeAttrValue (char       *val,
1.30      cvs       995:                                      Attribute   currentAttribute,
                    996:                                      Element     lastAttrElement,
                    997:                                      ParserData *context)
                    998: 
                    999: {
                   1000:   ElementType     elType;
                   1001:   Element         newChild;
                   1002:   AttributeType   attrType;
                   1003:   Attribute       attr;
1.39      cvs      1004:   char            msgBuffer[MaxMsgLength];
1.30      cvs      1005:   int             value;
                   1006:   ThotBool        level;
                   1007: 
                   1008:   attrType.AttrTypeNum = DummyAttribute;
                   1009:   MapHTMLAttributeValue (val, attrType, &value);
                   1010:   if (value < 0)
                   1011:     {
1.37      cvs      1012:       sprintf (msgBuffer, "Unknown attribute value \"type=%s\"", val);
1.30      cvs      1013:       XmlParseError (errorParsing, msgBuffer, 0);
1.36      cvs      1014:       MapHTMLAttribute ("unknown_attr", &attrType, NULL,
1.30      cvs      1015:                        &level, context->doc);
1.37      cvs      1016:       sprintf (msgBuffer, "type=%s", val);
1.30      cvs      1017:       CreateHTMLAttribute (context->lastElement, attrType, msgBuffer, TRUE,
                   1018:                           context->doc, &currentAttribute, &lastAttrElement);
                   1019:     }
                   1020:   else
                   1021:     {
                   1022:       elType = TtaGetElementType (context->lastElement);
                   1023:       if (elType.ElTypeNum != HTML_EL_Input)
                   1024:        {
1.37      cvs      1025:          sprintf (msgBuffer, "Duplicate attribute \"type = %s\"", val);
1.30      cvs      1026:          XmlParseError (errorParsing, msgBuffer, 0);
                   1027:        }
                   1028:       else
                   1029:        {
                   1030:          elType.ElTypeNum = value;
                   1031:          newChild = TtaNewTree (context->doc, elType, "");
                   1032:          XmlSetElemLineNumber (newChild);
                   1033:          TtaInsertFirstChild (&newChild, context->lastElement, context->doc);
                   1034:          if (value == HTML_EL_PICTURE_UNIT)
                   1035:            {
                   1036:              /* add the attribute IsInput to input pictures */
                   1037:              attrType.AttrSSchema = elType.ElSSchema;
                   1038:              attrType.AttrTypeNum = HTML_ATTR_IsInput;
                   1039:              attr = TtaNewAttribute (attrType);
                   1040:              TtaAttachAttribute (newChild, attr, context->doc);
                   1041:            }
                   1042:        }
                   1043:     }
                   1044: }
                   1045: 
                   1046: /*----------------------------------------------------------------------
                   1047:    CreateAttrWidthPercentPxl
                   1048:    an HTML attribute "width" has been created for a Table of a HR.
                   1049:    Create the corresponding attribute IntWidthPercent or IntWidthPxl.
                   1050:    oldWidth is -1 or the old image width.
                   1051:   ----------------------------------------------------------------------*/
1.58      vatton   1052: void CreateAttrWidthPercentPxl (char *buffer, Element el,
                   1053:                                Document doc, int oldWidth)
1.30      cvs      1054: {
                   1055:   AttributeType   attrTypePxl, attrTypePercent;
                   1056:   Attribute       attrOld, attrNew;
                   1057:   int             length, val;
1.39      cvs      1058:   char            msgBuffer[MaxMsgLength];
1.30      cvs      1059:   ElementType    elType;
                   1060:   int             w, h;
                   1061:   ThotBool        isImage;
                   1062: 
                   1063:   elType = TtaGetElementType (el);
                   1064:   isImage = (elType.ElTypeNum == HTML_EL_PICTURE_UNIT ||
                   1065:             elType.ElTypeNum == HTML_EL_Data_cell ||
                   1066:             elType.ElTypeNum == HTML_EL_Heading_cell);
                   1067: 
                   1068:   /* remove trailing spaces */
1.37      cvs      1069:   length = strlen (buffer) - 1;
1.30      cvs      1070:   while (length > 0 && buffer[length] <= SPACE)
                   1071:     length--;
                   1072:   attrTypePxl.AttrSSchema = TtaGetDocumentSSchema (doc);
                   1073:   attrTypePercent.AttrSSchema = TtaGetDocumentSSchema (doc);
                   1074:   attrTypePxl.AttrTypeNum = HTML_ATTR_IntWidthPxl;
                   1075:   attrTypePercent.AttrTypeNum = HTML_ATTR_IntWidthPercent;
                   1076:   /* is the last character a '%' ? */
                   1077:   if (buffer[length] == '%')
                   1078:     {
                   1079:       /* remove IntWidthPxl */
                   1080:       attrOld = TtaGetAttribute (el, attrTypePxl);
                   1081:       /* update IntWidthPercent */
                   1082:       attrNew = TtaGetAttribute (el, attrTypePercent);
                   1083:       if (attrNew == NULL)
                   1084:        {
                   1085:          attrNew = TtaNewAttribute (attrTypePercent);
                   1086:          TtaAttachAttribute (el, attrNew, doc);
                   1087:        }
                   1088:       else if (isImage && oldWidth == -1)
                   1089:        {
                   1090:          if (attrOld == NULL)
                   1091:            oldWidth = TtaGetAttributeValue (attrNew);
                   1092:          else
                   1093:            oldWidth = TtaGetAttributeValue (attrOld);
                   1094:        }
                   1095:     }
                   1096:   else
                   1097:     {
                   1098:       /* remove IntWidthPercent */
                   1099:       attrOld = TtaGetAttribute (el, attrTypePercent);
                   1100:       /* update IntWidthPxl */
                   1101:       attrNew = TtaGetAttribute (el, attrTypePxl);
                   1102:       if (attrNew == NULL)
                   1103:        {
                   1104:          attrNew = TtaNewAttribute (attrTypePxl);
                   1105:          TtaAttachAttribute (el, attrNew, doc);
                   1106:        }
                   1107:       else if (isImage && oldWidth == -1)
                   1108:        {
                   1109:          TtaGiveBoxSize (el, doc, 1, UnPixel, &w, &h);
                   1110:          if (attrOld == NULL)
                   1111:            oldWidth = w * TtaGetAttributeValue (attrNew) / 100;
                   1112:          else
                   1113:            oldWidth = w * TtaGetAttributeValue (attrOld) / 100;          
                   1114:        }
                   1115:     }
                   1116: 
                   1117:   if (attrOld != NULL)
                   1118:     TtaRemoveAttribute (el, attrOld, doc);
1.43      cvs      1119:   if (sscanf (buffer, "%d", &val))
1.30      cvs      1120:     TtaSetAttributeValue (attrNew, val, el, doc);
                   1121:   else
                   1122:     /* its not a number. Delete attribute and send an error message */
                   1123:     {
                   1124:     TtaRemoveAttribute (el, attrNew, doc);
1.37      cvs      1125:     if (strlen (buffer) > MaxMsgLength - 30)
1.30      cvs      1126:         buffer[MaxMsgLength - 30] = EOS;
1.37      cvs      1127:     sprintf (msgBuffer, "Invalid attribute value \"%s\"", buffer);
1.42      cvs      1128:     HTMLParseError (doc, msgBuffer);
1.30      cvs      1129:     }
                   1130:   if (isImage)
                   1131:     UpdateImageMap (el, doc, oldWidth, -1);
                   1132: }
                   1133: 
                   1134: /*----------------------------------------------------------------------
1.58      vatton   1135:    CreateAttrHeightPercentPxl
                   1136:    an HTML attribute "width" has been created for a Table of a HR.
                   1137:    Create the corresponding attribute IntHeightPercent or IntHeightPxl.
                   1138:    oldHeight is -1 or the old image width.
                   1139:   ----------------------------------------------------------------------*/
                   1140: void CreateAttrHeightPercentPxl (char *buffer, Element el,
                   1141:                                Document doc, int oldHeight)
                   1142: {
                   1143:   AttributeType   attrTypePxl, attrTypePercent;
                   1144:   Attribute       attrOld, attrNew;
                   1145:   int             length, val;
                   1146:   char            msgBuffer[MaxMsgLength];
                   1147:   ElementType    elType;
                   1148:   int             w, h;
                   1149:   ThotBool        isImage;
                   1150: 
                   1151:   elType = TtaGetElementType (el);
                   1152:   isImage = (elType.ElTypeNum == HTML_EL_PICTURE_UNIT ||
                   1153:             elType.ElTypeNum == HTML_EL_Data_cell ||
                   1154:             elType.ElTypeNum == HTML_EL_Heading_cell);
                   1155: 
                   1156:   /* remove trailing spaces */
                   1157:   length = strlen (buffer) - 1;
                   1158:   while (length > 0 && buffer[length] <= SPACE)
                   1159:     length--;
                   1160:   attrTypePxl.AttrSSchema = TtaGetDocumentSSchema (doc);
                   1161:   attrTypePercent.AttrSSchema = TtaGetDocumentSSchema (doc);
                   1162:   attrTypePxl.AttrTypeNum = HTML_ATTR_IntHeightPxl;
                   1163:   attrTypePercent.AttrTypeNum = HTML_ATTR_IntHeightPercent;
                   1164:   /* is the last character a '%' ? */
                   1165:   if (buffer[length] == '%')
                   1166:     {
                   1167:       /* remove IntHeightPxl */
                   1168:       attrOld = TtaGetAttribute (el, attrTypePxl);
                   1169:       /* update IntHeightPercent */
                   1170:       attrNew = TtaGetAttribute (el, attrTypePercent);
                   1171:       if (attrNew == NULL)
                   1172:        {
                   1173:          attrNew = TtaNewAttribute (attrTypePercent);
                   1174:          TtaAttachAttribute (el, attrNew, doc);
                   1175:        }
                   1176:       else if (isImage && oldHeight == -1)
                   1177:        {
                   1178:          if (attrOld == NULL)
                   1179:            oldHeight = TtaGetAttributeValue (attrNew);
                   1180:          else
                   1181:            oldHeight = TtaGetAttributeValue (attrOld);
                   1182:        }
                   1183:     }
                   1184:   else
                   1185:     {
                   1186:       /* remove IntHeightPercent */
                   1187:       attrOld = TtaGetAttribute (el, attrTypePercent);
                   1188:       /* update IntHeightPxl */
                   1189:       attrNew = TtaGetAttribute (el, attrTypePxl);
                   1190:       if (attrNew == NULL)
                   1191:        {
                   1192:          attrNew = TtaNewAttribute (attrTypePxl);
                   1193:          TtaAttachAttribute (el, attrNew, doc);
                   1194:        }
                   1195:       else if (isImage && oldHeight == -1)
                   1196:        {
                   1197:          TtaGiveBoxSize (el, doc, 1, UnPixel, &w, &h);
                   1198:          if (attrOld == NULL)
                   1199:            oldHeight = w * TtaGetAttributeValue (attrNew) / 100;
                   1200:          else
                   1201:            oldHeight = w * TtaGetAttributeValue (attrOld) / 100;         
                   1202:        }
                   1203:     }
                   1204: 
                   1205:   if (attrOld != NULL)
                   1206:     TtaRemoveAttribute (el, attrOld, doc);
                   1207:   if (sscanf (buffer, "%d", &val))
                   1208:     TtaSetAttributeValue (attrNew, val, el, doc);
                   1209:   else
                   1210:     /* its not a number. Delete attribute and send an error message */
                   1211:     {
                   1212:     TtaRemoveAttribute (el, attrNew, doc);
                   1213:     if (strlen (buffer) > MaxMsgLength - 30)
                   1214:         buffer[MaxMsgLength - 30] = EOS;
                   1215:     sprintf (msgBuffer, "Invalid attribute value \"%s\"", buffer);
                   1216:     HTMLParseError (doc, msgBuffer);
                   1217:     }
                   1218:   if (isImage)
                   1219:     UpdateImageMap (el, doc, oldHeight, -1);
                   1220: }
                   1221: 
                   1222: /*----------------------------------------------------------------------
1.30      cvs      1223:    CreateAttrIntSize
                   1224:    an HTML attribute "size" has been created for a Font element.
                   1225:    Create the corresponding internal attribute.
                   1226:   ----------------------------------------------------------------------*/
1.46      cvs      1227: void              CreateAttrIntSize (char *buffer, Element el, Document doc)
1.30      cvs      1228: 
                   1229: {
                   1230:    AttributeType  attrType;
                   1231:    int            val, ind, factor, delta;
                   1232:    Attribute      attr;
1.37      cvs      1233:    char         msgBuffer[MaxMsgLength];
1.30      cvs      1234: 
                   1235:    /* is the first character a '+' or a '-' ? */
                   1236:    ind = 0;
                   1237:    factor = 1;
                   1238:    delta = 0;
                   1239:    if (buffer[0] == '+')
                   1240:      {
                   1241:        attrType.AttrTypeNum = HTML_ATTR_IntSizeIncr;
                   1242:        ind++;
                   1243:        factor = 2;
                   1244:      }
                   1245:    else if (buffer[0] == '-')
                   1246:      {
                   1247:        attrType.AttrTypeNum = HTML_ATTR_IntSizeDecr;
                   1248:        ind++;
                   1249:        factor = 2;
                   1250:      }
                   1251:    else
                   1252:      {
                   1253:        attrType.AttrTypeNum = HTML_ATTR_IntSizeRel;
                   1254:        delta = 1;
                   1255:      }
                   1256:    attrType.AttrSSchema = TtaGetDocumentSSchema (doc);
                   1257:    attr = TtaGetAttribute (el, attrType);
1.43      cvs      1258:    if (sscanf (&buffer[ind], "%d", &val))
1.30      cvs      1259:      {
                   1260:        val = val * factor + delta;
                   1261:        if (attr == NULL)
                   1262:         {
                   1263:           /* this attribute doesn't exist, create it */
                   1264:           attr = TtaNewAttribute (attrType);
                   1265:           TtaAttachAttribute (el, attr, doc);
                   1266:         }
                   1267:        TtaSetAttributeValue (attr, val, el, doc);
                   1268:      }
                   1269:    else
                   1270:      /* its not a number. Delete attribute and send an error message */
                   1271:      {
                   1272:        if (attr)
                   1273:          TtaRemoveAttribute (el, attr, doc);
1.37      cvs      1274:        if (strlen (buffer) > MaxMsgLength - 30)
1.30      cvs      1275:          buffer[MaxMsgLength - 30] = EOS;
1.37      cvs      1276:        sprintf (msgBuffer, "Invalid attribute value \"%s\"", buffer);
1.42      cvs      1277:        HTMLParseError (doc, msgBuffer);
1.30      cvs      1278:      }
                   1279: }
                   1280: /*----------------------------------------------------------------------
                   1281:    EndOfHTMLAttributeValue
                   1282:    Filling of an HTML attribute value
                   1283:   ----------------------------------------------------------------------*/
1.48      vatton   1284: void EndOfHTMLAttributeValue (char *attrValue,
                   1285:                              AttributeMapping *lastMappedAttr,
                   1286:                              Attribute currentAttribute,
                   1287:                              Element lastAttrElement,
                   1288:                              ThotBool UnknownAttr,
                   1289:                              ParserData *context,
                   1290:                              ThotBool isXML)
1.30      cvs      1291: {
1.48      vatton   1292:   AttributeType   attrType, attrType1;
                   1293:   Attribute       attr;
                   1294:   ElementType     elType;
                   1295:   Element         child, root;
                   1296:   Language        lang;
                   1297:   char            translation;
                   1298:   char            shape;
                   1299:   char           *buffer;
                   1300:   char           *attrName;
                   1301:   char            msgBuffer[MaxMsgLength];
                   1302:   int             val;
                   1303:   int             length;
                   1304:   int             attrKind;
                   1305:   ThotBool        done = FALSE;
1.30      cvs      1306: 
1.48      vatton   1307:   /* treatments of some particular HTML attributes */
                   1308:   if (!strcmp (lastMappedAttr->XMLattribute, "style"))
                   1309:     {
                   1310:       TtaSetAttributeText (currentAttribute, attrValue,
                   1311:                           lastAttrElement, context->doc);
                   1312:       ParseHTMLSpecificStyle (context->lastElement, attrValue,
1.61      quint    1313:                              context->doc, 100, FALSE);
1.48      vatton   1314:       done = TRUE;
                   1315:     }
                   1316:   else
                   1317:     {
                   1318:       if (!strcmp (lastMappedAttr->XMLattribute, "link"))
                   1319:        HTMLSetAlinkColor (context->doc, attrValue);
                   1320:       else if (!strcmp (lastMappedAttr->XMLattribute, "alink"))
                   1321:        HTMLSetAactiveColor (context->doc, attrValue);
                   1322:       else if (!strcmp (lastMappedAttr->XMLattribute, "vlink"))
                   1323:        HTMLSetAvisitedColor (context->doc, attrValue);
                   1324:     }
1.30      cvs      1325: 
1.48      vatton   1326:   if (!done)
                   1327:     {
                   1328:       val = 0;
                   1329:       translation = lastMappedAttr->AttrOrContent;
                   1330:       switch (translation)
                   1331:        {
                   1332:        case 'C':       /* Content */
                   1333:          child = PutInContent (attrValue, context);
                   1334:          if (child != NULL)
                   1335:            TtaAppendTextContent (child, "\" ", context->doc);
                   1336:          break;
                   1337:          
                   1338:        case 'A':
                   1339:          if (currentAttribute != NULL)
                   1340:            {
                   1341:              TtaGiveAttributeType (currentAttribute, &attrType, &attrKind);
                   1342:              switch (attrKind)
                   1343:                {
                   1344:                case 0: /* enumerate */
                   1345:                  if (isXML)
                   1346:                    MapHTMLAttributeValue (attrValue, attrType, &val);
                   1347:                  else
                   1348:                    val = MapAttrValue (lastMappedAttr->ThotAttribute,
1.40      cvs      1349:                                        attrValue);
1.48      vatton   1350:                  if (val < 0)
                   1351:                    {
                   1352:                      TtaGiveAttributeType (currentAttribute,
                   1353:                                            &attrType, &attrKind);
                   1354:                      attrName = TtaGetAttributeName (attrType);
                   1355:                      sprintf (msgBuffer,
1.51      cvs      1356:                               "Invalid attribute value \"%s = %s\"",
1.48      vatton   1357:                               attrName, attrValue);
                   1358:                      if (isXML)
                   1359:                        XmlParseError (errorParsing, msgBuffer, 0);
                   1360:                      else
1.51      cvs      1361:                        {
                   1362:                          HTMLParseError (context->doc, msgBuffer);
1.48      vatton   1363:                      /* remove the attribute and replace it by an */
1.51      cvs      1364:                      /* Invalid_attribute (not for XHTML) */
                   1365:                          TtaRemoveAttribute (lastAttrElement,
                   1366:                                              currentAttribute, context->doc);
1.48      vatton   1367:                          attrType.AttrSSchema = 
                   1368:                            TtaGetDocumentSSchema (context->doc);
                   1369:                          attrType.AttrTypeNum =
                   1370:                            pHTMLAttributeMapping[0].ThotAttribute;
1.51      cvs      1371:                          sprintf (msgBuffer, "%s=%s", attrName, attrValue);
                   1372:                          CreateHTMLAttribute (lastAttrElement, attrType,
                   1373:                                               msgBuffer, TRUE, context->doc,
                   1374:                                               &currentAttribute,
                   1375:                                               &lastAttrElement);
1.48      vatton   1376:                        }
                   1377:                    }
                   1378:                  else
                   1379:                    TtaSetAttributeValue (currentAttribute, val,
                   1380:                                          lastAttrElement, context->doc);
                   1381:                  break;
                   1382:                case 1: /* integer */
                   1383:                  if (attrType.AttrTypeNum == HTML_ATTR_Border &&
                   1384:                      !strcasecmp (attrValue, "border"))
                   1385:                    {
                   1386:                      /* border="border" for a table */
                   1387:                      val = 1;
                   1388:                      TtaSetAttributeValue (currentAttribute, val,
1.30      cvs      1389:                                            lastAttrElement, context->doc);
1.48      vatton   1390:                    }
                   1391:                  else if (sscanf (attrValue, "%d", &val))
                   1392:                    TtaSetAttributeValue (currentAttribute, val,
                   1393:                                          lastAttrElement, context->doc);
                   1394:                  else
                   1395:                    {
                   1396:                      TtaRemoveAttribute (lastAttrElement, currentAttribute,
                   1397:                                          context->doc);
                   1398:                      sprintf (msgBuffer,
                   1399:                               "Unknown attribute value \"%s\"",
                   1400:                               attrValue);
                   1401:                      if (isXML)
                   1402:                        XmlParseError (errorParsing, msgBuffer, 0);
                   1403:                      else
                   1404:                        HTMLParseError (context->doc, msgBuffer);
                   1405:                    }
                   1406:                  break;
                   1407:                case 2: /* text */
                   1408:                  if (!UnknownAttr)
                   1409:                    {
                   1410:                      TtaSetAttributeText (currentAttribute, attrValue,
                   1411:                                           lastAttrElement, context->doc);
1.55      cvs      1412:                      if (attrType.AttrTypeNum == HTML_ATTR_Language)
1.48      vatton   1413:                        {
                   1414:                          /* it's a LANG attribute value */
                   1415:                          lang = TtaGetLanguageIdFromName (attrValue);
                   1416:                          if (lang == 0)
                   1417:                            {
                   1418:                              sprintf (msgBuffer,
                   1419:                                       "warning - unsupported language: %s",
                   1420:                                       attrValue);
                   1421:                              if (isXML)
                   1422:                                XmlParseError (errorParsing, msgBuffer, 0);
                   1423:                              else
                   1424:                                HTMLParseError (context->doc, msgBuffer);
                   1425:                            }
                   1426:                          else
                   1427:                            {
                   1428:                              /* change current language */
                   1429:                              context->language = lang;
                   1430:                              if (isXML)
                   1431:                                SetLanguagInXmlStack (lang);
                   1432:                              else
                   1433:                                SetLanguagInHTMLStack (lang);
                   1434:                            }
                   1435:                          root = TtaGetRootElement (context->doc);
                   1436:                          if (lastAttrElement == root)
                   1437:                            /* it's a LANG attribute on the root element */
                   1438:                            /* set the RealLang attribute */
                   1439:                            {
                   1440:                              attrType1.AttrSSchema = TtaGetDocumentSSchema (context->doc);
                   1441:                              attrType1.AttrTypeNum = HTML_ATTR_RealLang;
                   1442:                              /* this attribute could be already present,
                   1443:                                 (lang and xml:lang attributes) */
                   1444:                              if (!TtaGetAttribute (lastAttrElement,
                   1445:                                                    attrType1))
                   1446:                                /* it's not present. Add it */
                   1447:                                {
                   1448:                                  attr = TtaNewAttribute (attrType1);
                   1449:                                  TtaAttachAttribute (lastAttrElement,
                   1450:                                                      attr, context->doc);
                   1451:                                  TtaSetAttributeValue (attr,
                   1452:                                                        HTML_ATTR_RealLang_VAL_Yes_,
                   1453:                                                        lastAttrElement,
                   1454:                                                        context->doc);
                   1455:                                }
                   1456:                            }
                   1457:                        }
                   1458:                      else if (attrType.AttrTypeNum == HTML_ATTR_accesskey)
                   1459:                        TtaAddAccessKey (context->doc, (unsigned int)attrValue[0],
                   1460:                                         lastAttrElement);
                   1461:                    }
                   1462:                  else
                   1463:                    {
1.51      cvs      1464:                      /* this is the content of an invalid attribute */
                   1465:                      /* append it to the current Invalid_attribute */
                   1466:                      if (!isXML)
                   1467:                        {
                   1468:                          length = strlen (attrValue) + 2;
                   1469:                          length += TtaGetTextAttributeLength (currentAttribute);
                   1470:                          buffer = TtaGetMemory (length + 1);
                   1471:                          TtaGiveTextAttributeValue (currentAttribute,
                   1472:                                                     buffer, &length);
                   1473:                          strcat (buffer, "=");
                   1474:                          strcat (buffer, attrValue);
                   1475:                          TtaSetAttributeText (currentAttribute, buffer,
                   1476:                                               lastAttrElement, context->doc);
                   1477:                          TtaFreeMemory (buffer);
                   1478:                        }
1.48      vatton   1479:                    }
                   1480:                  break;
                   1481:                case 3: /* reference */
                   1482:                  break;
                   1483:                }
                   1484:            }
                   1485:          break;
                   1486:          
                   1487:        case SPACE:
                   1488:          if (isXML)
                   1489:            XhtmlTypeAttrValue (attrValue, currentAttribute,
1.30      cvs      1490:                                lastAttrElement, context);
1.48      vatton   1491:          else
                   1492:            HTMLTypeAttrValue (attrValue, currentAttribute,
                   1493:                               lastAttrElement, context);
                   1494:          break;
                   1495:          
1.30      cvs      1496:         default:
                   1497:           break;
1.48      vatton   1498:        }
1.30      cvs      1499: 
                   1500:       if (lastMappedAttr->ThotAttribute == HTML_ATTR_Width__)
1.48      vatton   1501:        /* HTML attribute "width" for a table or a hr */
                   1502:        /* create the corresponding attribute IntWidthPercent or */
                   1503:        /* IntWidthPxl */
                   1504:        CreateAttrWidthPercentPxl (attrValue, lastAttrElement, context->doc, -1);
1.58      vatton   1505:       else if (lastMappedAttr->ThotAttribute == HTML_ATTR_Height_)
                   1506:        /* HTML attribute "width" for a table or a hr */
                   1507:        /* create the corresponding attribute IntHeightPercent or */
                   1508:        /* IntHeightPxl */
                   1509:        CreateAttrHeightPercentPxl (attrValue, lastAttrElement, context->doc, -1);
1.48      vatton   1510:       else if (!strcmp (lastMappedAttr->XMLattribute, "size"))
                   1511:        {
                   1512:          TtaGiveAttributeType (currentAttribute, &attrType, &attrKind);
                   1513:          if (attrType.AttrTypeNum == HTML_ATTR_Font_size)
                   1514:            CreateAttrIntSize (attrValue, lastAttrElement, context->doc);
                   1515:        }
                   1516:       else if (!strcmp (lastMappedAttr->XMLattribute, "shape"))
                   1517:        {
                   1518:          child = TtaGetFirstChild (lastAttrElement);
                   1519:          if (child != NULL)
                   1520:            {
                   1521:              switch (val)
                   1522:                {
                   1523:                case HTML_ATTR_shape_VAL_rectangle:
                   1524:                  shape = 'R';
                   1525:                  break;
                   1526:                case HTML_ATTR_shape_VAL_circle:
                   1527:                  shape = 'a';
                   1528:                  break;
                   1529:                case HTML_ATTR_shape_VAL_polygon:
                   1530:                  shape = 'p';
                   1531:                  break;
                   1532:                default:
                   1533:                  shape = SPACE;
                   1534:                  break;
                   1535:                }
                   1536:              TtaSetGraphicsShape (child, shape, context->doc);
                   1537:            }
                   1538:        }
                   1539:       else if (!strcmp (lastMappedAttr->XMLattribute, "value"))
                   1540:        {
                   1541:          elType = TtaGetElementType (lastAttrElement);
                   1542:          if (elType.ElTypeNum == HTML_EL_Text_Input ||
                   1543:              elType.ElTypeNum == HTML_EL_Password_Input ||
                   1544:              elType.ElTypeNum == HTML_EL_File_Input ||
                   1545:              elType.ElTypeNum == HTML_EL_Input)
                   1546:            /* create a Default_Value attribute with the same content */
                   1547:            {
                   1548:              attrType1.AttrSSchema = attrType.AttrSSchema;
                   1549:              attrType1.AttrTypeNum = HTML_ATTR_Default_Value;
                   1550:              attr = TtaNewAttribute (attrType1);
                   1551:              TtaAttachAttribute (lastAttrElement, attr, context->doc);
                   1552:              TtaSetAttributeText (attr, attrValue,
                   1553:                                   lastAttrElement, context->doc);
                   1554:            }
                   1555:        }
1.30      cvs      1556:       else
1.48      vatton   1557:        {
                   1558:          /* Some HTML attributes are equivalent to a CSS property:      */
                   1559:          /*      background     ->                   background         */
                   1560:          /*      bgcolor        ->                   background         */
                   1561:          /*      text           ->                   color              */
                   1562:          /*      color          ->                   color              */
                   1563:          if (!strcmp (lastMappedAttr->XMLattribute, "background"))
                   1564:            {
                   1565:              if (strlen (attrValue) > MaxMsgLength - 30)
                   1566:                attrValue[MaxMsgLength - 30] = EOS;
                   1567:              HTMLSetBackgroundImage (context->doc,
                   1568:                                      context->lastElement, STYLE_REPEAT, attrValue);
                   1569:            }
                   1570:          else if (!strcmp (lastMappedAttr->XMLattribute, "bgcolor"))
                   1571:            HTMLSetBackgroundColor (context->doc,
                   1572:                                    context->lastElement, attrValue);
                   1573:          else if (!strcmp (lastMappedAttr->XMLattribute, "text") ||
                   1574:                   !strcmp (lastMappedAttr->XMLattribute, "color"))
                   1575:            HTMLSetForegroundColor (context->doc,
                   1576:                                    context->lastElement, attrValue);
                   1577:        }
                   1578:     }
1.30      cvs      1579: }
                   1580: 
                   1581: /*----------------------------------------------------------------------
1.16      cvs      1582:    MapHTMLAttributeValue
1.2       cvs      1583:    Search in the Attribute Value Mapping Table the entry for the attribute
                   1584:    ThotAtt and its value AttrVal. Returns the corresponding Thot value.
1.1       cvs      1585:   ----------------------------------------------------------------------*/
1.39      cvs      1586: void    MapHTMLAttributeValue (char          *AttrVal,
1.30      cvs      1587:                               AttributeType  attrType,
                   1588:                               int           *value)
1.1       cvs      1589: {
1.45      cvs      1590:   int  i;
1.2       cvs      1591: 
1.45      cvs      1592:   *value = 0;
                   1593:   i = 0;
                   1594:   while (XhtmlAttrValueMappingTable[i].ThotAttr != attrType.AttrTypeNum &&
                   1595:         XhtmlAttrValueMappingTable[i].ThotAttr != 0)
                   1596:     i++;
                   1597:   if (XhtmlAttrValueMappingTable[i].ThotAttr == attrType.AttrTypeNum)
                   1598:     do
                   1599:       if (!strcmp (XhtmlAttrValueMappingTable[i].XMLattrValue, AttrVal))
                   1600:        *value = XhtmlAttrValueMappingTable[i].ThotAttrValue;
                   1601:       else 
                   1602:        i++;
                   1603:     while (*value <= 0 &&
                   1604:           XhtmlAttrValueMappingTable[i].ThotAttr == attrType.AttrTypeNum);
1.1       cvs      1605: }

Webmaster