void CheckCaption( TidyDocImpl* doc, Node *node ) { AttVal *attval; char *value = null; CheckAttributes( doc, node ); for (attval = node->attributes; attval != null; attval = attval->next) { if ( tmbstrcasecmp(attval->attribute, "align") == 0 ) { value = attval->value; break; } } if (value != null) { if ( tmbstrcasecmp(value, "left") == 0 || tmbstrcasecmp(value, "right") == 0 ) ConstrainVersion( doc, VERS_HTML40_LOOSE ); else if ( tmbstrcasecmp(value, "top") == 0 || tmbstrcasecmp(value, "bottom") == 0 ) ConstrainVersion( doc, ~(VERS_HTML20|VERS_HTML32) ); else ReportAttrError( doc, node, attval, BAD_ATTRIBUTE_VALUE ); } }
Bool ParseRepeatAttr( TidyDocImpl* doc, const TidyOptionImpl* option ) { Bool status = yes; tmbchar buf[64] = {0}; uint i = 0; TidyConfigImpl* cfg = &doc->config; tchar c = SkipWhite( cfg ); while (i < sizeof(buf)-1 && c != EndOfStream && !IsWhite(c)) { buf[i++] = (tmbchar) c; c = AdvanceChar( cfg ); } buf[i] = '\0'; if ( tmbstrcasecmp(buf, "keep-first") == 0 ) cfg->value[ TidyDuplicateAttrs ].v = TidyKeepFirst; else if ( tmbstrcasecmp(buf, "keep-last") == 0 ) cfg->value[ TidyDuplicateAttrs ].v = TidyKeepLast; else { ReportBadArgument( doc, option->name ); status = no; } return status; }
/* cr, lf or crlf */ Bool ParseNewline( TidyDocImpl* doc, const TidyOptionImpl* entry ) { int nl = -1; tmbchar work[ 16 ] = {0}; tmbstr cp = work, end = work + sizeof(work); TidyConfigImpl* cfg = &doc->config; tchar c = SkipWhite( cfg ); while ( c!=EndOfStream && cp < end && !IsWhite(c) && c != '\r' && c != '\n' ) { *cp++ = (tmbchar) c; c = AdvanceChar( cfg ); } *cp = 0; if ( tmbstrcasecmp(work, "lf") == 0 ) nl = TidyLF; else if ( tmbstrcasecmp(work, "crlf") == 0 ) nl = TidyCRLF; else if ( tmbstrcasecmp(work, "cr") == 0 ) nl = TidyCR; if ( nl < TidyLF || nl > TidyCR ) ReportBadArgument( doc, entry->name ); else SetOptionInt( doc, entry->id, nl ); return ( nl >= TidyLF && nl <= TidyCR ); }
/* doctype: omit | auto | strict | loose | <fpi> where the fpi is a string similar to "-//ACME//DTD HTML 3.14159//EN" */ Bool ParseDocType( TidyDocImpl* doc, const TidyOptionImpl* option ) { tmbchar buf[ 32 ] = {0}; uint i = 0; Bool status = yes; TidyDoctypeModes dtmode = TidyDoctypeAuto; TidyConfigImpl* cfg = &doc->config; tchar c = SkipWhite( cfg ); /* "-//ACME//DTD HTML 3.14159//EN" or similar */ if ( c == '"' || c == '\'' ) { status = ParseString(doc, option); if (status) SetOptionInt( doc, TidyDoctypeMode, TidyDoctypeUser ); return status; } /* read first word */ while ( i < sizeof(buf)-1 && c != EndOfStream && !IsWhite(c) ) { buf[i++] = (tmbchar) c; c = AdvanceChar( cfg ); } buf[i] = '\0'; if ( tmbstrcasecmp(buf, "auto") == 0 ) dtmode = TidyDoctypeAuto; else if ( tmbstrcasecmp(buf, "omit") == 0 ) dtmode = TidyDoctypeOmit; else if ( tmbstrcasecmp(buf, "strict") == 0 ) dtmode = TidyDoctypeStrict; else if ( tmbstrcasecmp(buf, "loose") == 0 || tmbstrcasecmp(buf, "transitional") == 0 ) dtmode = TidyDoctypeLoose; else { ReportBadArgument( doc, option->name ); status = no; } if ( status ) SetOptionInt( doc, TidyDoctypeMode, dtmode ); return status; }
Bool tmbsamefile( ctmbstr filename1, ctmbstr filename2 ) { #if FILENAMES_CASE_SENSITIVE return ( tmbstrcmp( filename1, filename2 ) == 0 ); #else return ( tmbstrcasecmp( filename1, filename2 ) == 0 ); #endif }
/* Should only be called by options set by name ** thus, it is cheaper to do a few scans than set ** up every option in a hash table. */ const TidyOptionImpl* lookupOption( ctmbstr s ) { const TidyOptionImpl* np = option_defs; for ( /**/; np < option_defs + N_TIDY_OPTIONS; ++np ) { if ( tmbstrcasecmp(s, np->name) == 0 ) return np; } return NULL; }
/* add missing type attribute when appropriate */ void CheckSCRIPT( TidyDocImpl* doc, Node *node ) { AttVal *lang, *type; char buf[16]; CheckAttributes( doc, node ); lang = GetAttrByName( node, "language" ); type = GetAttrByName( node, "type" ); if ( !type ) { /* ReportMissingAttr( doc, node, "type" ); */ /* check for javascript */ if ( lang ) { tmbstrncpy( buf, lang->value, sizeof(buf) ); buf[10] = '\0'; if ( tmbstrncasecmp(buf, "javascript", 10) == 0 || tmbstrncasecmp(buf, "jscript", 7) == 0 ) { AddAttribute( doc, node, "type", "text/javascript" ); } else if ( tmbstrcasecmp(buf, "vbscript") == 0 ) { /* per Randy Waki 8/6/01 */ AddAttribute( doc, node, "type", "text/vbscript" ); } } else AddAttribute( doc, node, "type", "text/javascript" ); type = GetAttrByName( node, "type" ); ReportAttrError( doc, node, type, INSERTING_ATTRIBUTE ); } }