diff --git a/include/tidyenum.h b/include/tidyenum.h index 5f96935..58454fe 100644 --- a/include/tidyenum.h +++ b/include/tidyenum.h @@ -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; diff --git a/src/clean.c b/src/clean.c index 3e09416..9ef3d8b 100644 --- a/src/clean.c +++ b/src/clean.c @@ -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: diff --git a/src/config.c b/src/config.c index f47e452..abfa635 100644 --- a/src/config.c +++ b/src/config.c @@ -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 } }; diff --git a/src/language_en.h b/src/language_en.h index 8628e9b..976acda 100644 --- a/src/language_en.h +++ b/src/language_en.h @@ -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 , , , , and +
. + - Entities, tags, attributes, etc., should be enclosed in . + - Option values should be enclosed in . + - It's very important that
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 " }, /* ReportError, ReportFatal */ + { MOVED_STYLE_TO_HEAD, 0, "moved