Issue #567 - add option, messages, and fix node iteration.

Add option TidyStyleTags, --fix-style-tags, Bool, to turn off
this action.

Add warning messages MOVED_STYLE_TO_HEAD, and FOUND_STYLE_IN_BODY.

Fully iterate ALL nodes in the body, in search of style tags...

Changes to be committed:
	modified:   include/tidyenum.h
	modified:   src/clean.c
	modified:   src/config.c
	modified:   src/language_en.h
	modified:   src/message.c
This commit is contained in:
Geoff McLane 2017-06-28 20:34:16 +02:00
parent d4ca02adfb
commit 50859e8258
5 changed files with 63 additions and 42 deletions

View File

@ -270,7 +270,9 @@ extern "C" {
FN(COERCE_TO_ENDTAG) \
FN(ELEMENT_NOT_EMPTY) \
FN(UNEXPECTED_END_OF_FILE) \
FN(UNEXPECTED_ENDTAG)
FN(UNEXPECTED_ENDTAG) \
FN(MOVED_STYLE_TO_HEAD) \
FN(FOUND_STYLE_IN_BODY)
/** These are report messages added by Tidy's accessibility module. */
@ -648,6 +650,7 @@ typedef enum
TidyXmlPIs, /**< If set to yes PIs must end with ?> */
TidyXmlSpace, /**< If set to yes adds xml:space attr as needed */
TidyXmlTags, /**< Treat input as XML */
TidyStyleTags, /**< Move sytle to head */
N_TIDY_OPTIONS /**< Must be last */
} TidyOptionId;

View File

@ -2647,57 +2647,56 @@ void TY_(FixAnchors)(TidyDocImpl* doc, Node *node, Bool wantName, Bool wantId)
}
}
/* Issue #567 - move style elements from body to head */
/* Issue #567 - move style elements from body to head
* ==================================================
*/
static void StyleToHead(TidyDocImpl* doc, Node *head, Node *node, Bool fix, int indent)
{
Node *next;
while (node)
{
next = node->next; /* get 'next' now , in case the node is moved */
/* dbg_show_node(doc, node, 0, indent); */
if (nodeIsSTYLE(node))
{
if (fix)
{
TY_(RemoveNode)(node); /* unhook style node from body */
TY_(InsertNodeAtEnd)(head, node); /* add to end of head */
TY_(ReportNotice)(doc, node, head, MOVED_STYLE_TO_HEAD); /* report move */
}
else
{
TY_(ReportNotice)(doc, node, head, FOUND_STYLE_IN_BODY);
}
}
else if (node->content)
{
StyleToHead(doc, head, node->content, fix, indent + 1);
}
node = next; /* process the 'next', if any */
}
}
void TY_(CleanStyle)(TidyDocImpl* doc, Node *html)
{
Node *node, *next, *head = NULL, *body = NULL;
Node *child;
Node *head = NULL, *body = NULL;
Bool fix = cfgBool(doc, TidyStyleTags);
if (!html)
return; /* oops, not given a start node */
#if 0 /* this failed??? */
for (node = html->content; node != NULL; node = node->next)
{
if (nodeIsHEAD(node))
head = node;
if (nodeIsBODY(node))
body = node;
}
#endif /* 0000000000000000000000 */
head = TY_(FindHEAD)( doc );
body = TY_(FindBody)( doc );
if (head != NULL && body != NULL)
if ((head != NULL) && (body != NULL))
{
/* found head and body */
for (node = body->content; node != NULL; node = next)
{
next = node->next;
if (nodeIsSTYLE(node))
{
TY_(RemoveNode)(node); /* unhool style node from body */
TY_(InsertNodeAtEnd)(head, node); /* add to end of head */
/* TODO: Add warning */
}
else if (node->content)
{
for (child = node->content; child != NULL; child = child->content)
{
if (nodeIsSTYLE(child))
{
TY_(RemoveNode)(child); /* unhool style node from body */
TY_(InsertNodeAtEnd)(head, child); /* add to end of head */
/* TODO: Add warning */
break;
}
}
}
}
StyleToHead(doc, head, body, fix, 0); /* found head and body */
}
}
/* ==================================================
*/
/*
* local variables:

View File

@ -312,6 +312,7 @@ static const TidyOptionImpl option_defs[] =
{ TidyXmlPIs, MU, "assume-xml-procins", BL, no, ParsePickList, &boolPicks },
{ TidyXmlSpace, MU, "add-xml-space", BL, no, ParsePickList, &boolPicks },
{ TidyXmlTags, MU, "input-xml", BL, no, ParsePickList, &boolPicks },
{ TidyStyleTags, MU, "fix-style-tags", BL, yes, ParsePickList, &boolPicks },
{ N_TIDY_OPTIONS, XX, NULL, XY, 0, NULL, NULL }
};

View File

@ -1512,6 +1512,18 @@ static languageDefinition language_en = { whichPluralForm_en, {
"This option specifies if Tidy should use the XML parser rather than the "
"error correcting HTML parser. "
},
{/* Important notes for translators:
- Use only <code></code>, <var></var>, <em></em>, <strong></strong>, and
<br/>.
- Entities, tags, attributes, etc., should be enclosed in <code></code>.
- Option values should be enclosed in <var></var>.
- It's very important that <br/> be self-closing!
- The strings "Tidy" and "HTML Tidy" are the program name and must not
be translated. */
TidyStyleTags, 0,
"This option specifies if Tidy should move all style tags to the "
"head of the document. "
},
/********************************************
@ -1890,8 +1902,9 @@ static languageDefinition language_en = { whichPluralForm_en, {
{ ELEMENT_NOT_EMPTY, 0, "%s element not empty or not closed" }, /* ReportError, ReportAttrError */
{ UNEXPECTED_END_OF_FILE, 0, "unexpected end of file %s" }, /* ReportError, ReportAttrError */
{ UNEXPECTED_ENDTAG, 0, "unexpected </%s>" }, /* ReportError, ReportFatal */
{ MOVED_STYLE_TO_HEAD, 0, "moved <style> tag to <head>! fix-style-tags: no to avoid." }, /* ReportWarning */
{ FOUND_STYLE_IN_BODY, 0, "found <style> tag in <body>! fix-style-tags: yes to move." }, /* ReportWarning */
#if SUPPORT_ACCESSIBILITY_CHECKS
/***************************************

View File

@ -249,6 +249,11 @@ void TY_(ReportNotice)(TidyDocImpl* doc, Node *element, Node *node, uint code)
}
message = TY_(tidyMessageCreateWithNode)(doc, element, code, TidyInfo, elemdesc, tagtype );
break;
case MOVED_STYLE_TO_HEAD:
case FOUND_STYLE_IN_BODY:
TagToString(element, elemdesc, sizeof(elemdesc));
message = TY_(tidyMessageCreateWithNode)(doc, element, code, TidyWarning, elemdesc);
break;
}
messageOut( message );