Merge pull request #554 from htacg/issue-365

Issue 365
This commit is contained in:
Jim Derry 2017-05-21 14:24:03 -04:00 committed by GitHub
commit 996ddb813d
7 changed files with 136 additions and 111 deletions

View file

@ -787,6 +787,16 @@ typedef enum
TidySortAttrAlpha /**< Sort attributes alphabetically */ TidySortAttrAlpha /**< Sort attributes alphabetically */
} TidyAttrSortStrategy; } TidyAttrSortStrategy;
/** Mode controlling capitalization of things, such as attributes.
** @remark This enum's starting value is guaranteed to remain stable.
*/
typedef enum
{
TidyUppercaseNo = 0, /**< Don't uppercase. */
TidyUppercaseYes, /**< Do uppercase. */
TidyUppercasePreserve /**< Preserve case. */
} TidyUppercase;
/** @} /** @}
** @name Document Tree ** @name Document Tree

View file

@ -824,15 +824,15 @@ static const Attribute* attrsLookup(TidyDocImpl* doc,
#if ATTRIBUTE_HASH_LOOKUP #if ATTRIBUTE_HASH_LOOKUP
for (p = attribs->hashtab[attrsHash(atnam)]; p && p->attr; p = p->next) for (p = attribs->hashtab[attrsHash(atnam)]; p && p->attr; p = p->next)
if (TY_(tmbstrcmp)(atnam, p->attr->name) == 0) if (TY_(tmbstrcasecmp)(atnam, p->attr->name) == 0)
return p->attr; return p->attr;
for (np = attribute_defs; np && np->name; ++np) for (np = attribute_defs; np && np->name; ++np)
if (TY_(tmbstrcmp)(atnam, np->name) == 0) if (TY_(tmbstrcasecmp)(atnam, np->name) == 0)
return attrsInstall(doc, attribs, np); return attrsInstall(doc, attribs, np);
#else #else
for (np = attribute_defs; np && np->name; ++np) for (np = attribute_defs; np && np->name; ++np)
if (TY_(tmbstrcmp)(atnam, np->name) == 0) if (TY_(tmbstrcasecmp)(atnam, np->name) == 0)
return np; return np;
#endif #endif

View file

@ -138,6 +138,14 @@ static PickListItems customTagsPicks = {
{ NULL } { NULL }
}; };
static PickListItems attributeCasePicks = {
{ "no", TidyUppercaseNo, { "0", "n", "f", "no", "false", NULL } },
{ "yes", TidyUppercaseYes, { "1", "y", "t", "yes", "true", NULL } },
{ "preserve", TidyUppercasePreserve, { "preserve", NULL } },
{ NULL }
};
#define MU TidyMarkup #define MU TidyMarkup
#define DG TidyDiagnostics #define DG TidyDiagnostics
@ -284,7 +292,7 @@ static const TidyOptionImpl option_defs[] =
{ TidySortAttributes, PP, "sort-attributes", IN, TidySortAttrNone,ParsePickList, &sorterPicks }, { TidySortAttributes, PP, "sort-attributes", IN, TidySortAttrNone,ParsePickList, &sorterPicks },
{ TidyStrictTagsAttr, MU, "strict-tags-attributes", BL, no, ParsePickList, &boolPicks }, /* 20160209 - Issue #350 */ { TidyStrictTagsAttr, MU, "strict-tags-attributes", BL, no, ParsePickList, &boolPicks }, /* 20160209 - Issue #350 */
{ TidyTabSize, PP, "tab-size", IN, 8, ParseInt, NULL }, { TidyTabSize, PP, "tab-size", IN, 8, ParseInt, NULL },
{ TidyUpperCaseAttrs, MU, "uppercase-attributes", BL, no, ParsePickList, &boolPicks }, { TidyUpperCaseAttrs, MU, "uppercase-attributes", IN, TidyUppercaseNo, ParsePickList, &attributeCasePicks },
{ TidyUpperCaseTags, MU, "uppercase-tags", BL, no, ParsePickList, &boolPicks }, { TidyUpperCaseTags, MU, "uppercase-tags", BL, no, ParsePickList, &boolPicks },
{ TidyUseCustomTags, MU, "custom-tags", IN, TidyCustomNo, ParsePickList, &customTagsPicks }, /* 20170309 - Issue #119 */ { TidyUseCustomTags, MU, "custom-tags", IN, TidyCustomNo, ParsePickList, &customTagsPicks }, /* 20170309 - Issue #119 */
{ TidyVertSpace, PP, "vertical-space", IN, no, ParsePickList, &autoBoolPicks }, /* #228 - tri option */ { TidyVertSpace, PP, "vertical-space", IN, no, ParsePickList, &autoBoolPicks }, /* #228 - tri option */
@ -1026,7 +1034,7 @@ void AdjustConfig( TidyDocImpl* doc )
{ {
TY_(SetOptionBool)( doc, TidyXmlOut, yes ); TY_(SetOptionBool)( doc, TidyXmlOut, yes );
TY_(SetOptionBool)( doc, TidyUpperCaseTags, no ); TY_(SetOptionBool)( doc, TidyUpperCaseTags, no );
TY_(SetOptionBool)( doc, TidyUpperCaseAttrs, no ); TY_(SetOptionInt)( doc, TidyUpperCaseAttrs, no );
/* TY_(SetOptionBool)( doc, TidyXmlPIs, yes ); */ /* TY_(SetOptionBool)( doc, TidyXmlPIs, yes ); */
} }

View file

@ -1202,8 +1202,12 @@ static languageDefinition language_en = { whichPluralForm_en, {
"This option specifies if Tidy should output attribute names in upper " "This option specifies if Tidy should output attribute names in upper "
"case. " "case. "
"<br/>" "<br/>"
"The default is <var>no</var>, which results in lower case attribute " "When set to <var>no</var>, attribute names will be written in lower "
"names, except for XML input, where the original case is preserved. " "case. Specifying <var>yes</var> will output attribute names in upper "
"case, and <var>preserve</var> can used to leave attribute names "
"untouched. "
"<br/>"
"When using XML input, the original case is always preserved. "
}, },
{/* Important notes for translators: {/* Important notes for translators:
- Use only <code></code>, <var></var>, <em></em>, <strong></strong>, and - Use only <code></code>, <var></var>, <em></em>, <strong></strong>, and

View file

@ -3726,8 +3726,11 @@ static tmbstr ParseAttribute( TidyDocImpl* doc, Bool *isempty,
/* what should be done about non-namechar characters? */ /* what should be done about non-namechar characters? */
/* currently these are incorporated into the attr name */ /* currently these are incorporated into the attr name */
if ( cfg(doc, TidyUpperCaseAttrs) != TidyUppercasePreserve )
{
if ( !cfgBool(doc, TidyXmlTags) && TY_(IsUpper)(c) ) if ( !cfgBool(doc, TidyXmlTags) && TY_(IsUpper)(c) )
c = TY_(ToLower)(c); c = TY_(ToLower)(c);
}
TY_(AddCharToLexer)( lexer, c ); TY_(AddCharToLexer)( lexer, c );
lastc = c; lastc = c;

View file

@ -4833,7 +4833,7 @@ void TY_(ParseDocument)(TidyDocImpl* doc)
if ( !htmlOut ) if ( !htmlOut )
{ {
TY_(SetOptionBool)( doc, TidyUpperCaseTags, no ); TY_(SetOptionBool)( doc, TidyUpperCaseTags, no );
TY_(SetOptionBool)( doc, TidyUpperCaseAttrs, no ); TY_(SetOptionInt)( doc, TidyUpperCaseAttrs, no );
} }
} }
} }

View file

@ -1238,7 +1238,7 @@ static void PPrintAttribute( TidyDocImpl* doc, uint indent,
Bool xmlOut = cfgBool( doc, TidyXmlOut ); Bool xmlOut = cfgBool( doc, TidyXmlOut );
Bool xhtmlOut = cfgBool( doc, TidyXhtmlOut ); Bool xhtmlOut = cfgBool( doc, TidyXhtmlOut );
Bool wrapAttrs = cfgBool( doc, TidyWrapAttVals ); Bool wrapAttrs = cfgBool( doc, TidyWrapAttVals );
Bool ucAttrs = cfgBool( doc, TidyUpperCaseAttrs ); uint ucAttrs = cfg( doc, TidyUpperCaseAttrs );
Bool indAttrs = cfgBool( doc, TidyIndentAttributes ); Bool indAttrs = cfgBool( doc, TidyIndentAttributes );
uint xtra = AttrIndent( doc, node, attr ); uint xtra = AttrIndent( doc, node, attr );
Bool first = AttrNoIndentFirst( /*doc,*/ node, attr ); Bool first = AttrNoIndentFirst( /*doc,*/ node, attr );
@ -1287,7 +1287,7 @@ static void PPrintAttribute( TidyDocImpl* doc, uint indent,
if (c > 0x7F) if (c > 0x7F)
name += TY_(GetUTF8)(name, &c); name += TY_(GetUTF8)(name, &c);
else if (ucAttrs) else if (ucAttrs == TidyUppercaseYes)
c = TY_(ToUpper)(c); c = TY_(ToUpper)(c);
AddChar(pprint, c); AddChar(pprint, c);
@ -1734,8 +1734,8 @@ static void PPrintXmlDecl( TidyDocImpl* doc, uint indent, Node *node )
saveWrap = WrapOff( doc ); saveWrap = WrapOff( doc );
/* no case translation for XML declaration pseudo attributes */ /* no case translation for XML declaration pseudo attributes */
ucAttrs = cfgBool(doc, TidyUpperCaseAttrs); ucAttrs = cfg(doc, TidyUpperCaseAttrs);
TY_(SetOptionBool)(doc, TidyUpperCaseAttrs, no); TY_(SetOptionInt)(doc, TidyUpperCaseAttrs, no);
AddString( pprint, "<?xml" ); AddString( pprint, "<?xml" );
@ -1749,7 +1749,7 @@ static void PPrintXmlDecl( TidyDocImpl* doc, uint indent, Node *node )
PPrintAttribute( doc, indent, node, att ); PPrintAttribute( doc, indent, node, att );
/* restore old config value */ /* restore old config value */
TY_(SetOptionBool)(doc, TidyUpperCaseAttrs, ucAttrs); TY_(SetOptionInt)(doc, TidyUpperCaseAttrs, ucAttrs);
if ( node->end <= 0 || doc->lexer->lexbuf[node->end - 1] != '?' ) if ( node->end <= 0 || doc->lexer->lexbuf[node->end - 1] != '?' )
AddChar( pprint, '?' ); AddChar( pprint, '?' );