Skip to content

Issue 567 2 - style tag to head #579

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 28, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion include/tidyenum.h
Original file line number Diff line number Diff line change
@@ -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;

51 changes: 51 additions & 0 deletions src/clean.c
Original file line number Diff line number Diff line change
@@ -2647,6 +2647,57 @@ void TY_(FixAnchors)(TidyDocImpl* doc, Node *node, Bool wantName, Bool wantId)
}
}

/* 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 *head = NULL, *body = NULL;
Bool fix = cfgBool(doc, TidyStyleTags);

if (!html)
return; /* oops, not given a start node */

head = TY_(FindHEAD)( doc );
body = TY_(FindBody)( doc );

if ((head != NULL) && (body != NULL))
{
StyleToHead(doc, head, body, fix, 0); /* found head and body */
}
}
/* ==================================================
*/

/*
* local variables:
* mode: c
2 changes: 2 additions & 0 deletions src/clean.h
Original file line number Diff line number Diff line change
@@ -78,5 +78,7 @@ void TY_(FixAnchors)(TidyDocImpl* doc, Node *node, Bool wantName, Bool wantId);
void TY_(FixXhtmlNamespace)(TidyDocImpl* doc, Bool wantXmlns);
void TY_(FixLanguageInformation)(TidyDocImpl* doc, Node* node, Bool wantXmlLang, Bool wantLang);

/* Issue #567 - move style elements from body to head */
void TY_(CleanStyle)(TidyDocImpl* doc, Node *html);

#endif /* __CLEAN_H__ */
1 change: 1 addition & 0 deletions src/config.c
Original file line number Diff line number Diff line change
@@ -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 }
};

15 changes: 14 additions & 1 deletion src/language_en.h
Original file line number Diff line number Diff line change
@@ -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

/***************************************
5 changes: 5 additions & 0 deletions src/message.c
Original file line number Diff line number Diff line change
@@ -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 );
3 changes: 3 additions & 0 deletions src/tidylib.c
Original file line number Diff line number Diff line change
@@ -2011,6 +2011,9 @@ int tidyDocCleanAndRepair( TidyDocImpl* doc )
if (tidyXmlTags)
return tidyDocStatus( doc );

/* Issue #567 - move style elements from body to head */
TY_(CleanStyle)(doc, &doc->root);

/* simplifies <b><b> ... </b> ...</b> etc. */
if ( mergeEmphasis )
TY_(NestedEmphasis)( doc, &doc->root );