Experimentally working.

This commit is contained in:
Jim Derry 2017-10-07 11:04:18 -04:00
parent 2e2062ddec
commit 483d17e39b
4 changed files with 51 additions and 9 deletions

View file

@ -243,6 +243,9 @@ extern "C" {
FN(NOFRAMES_CONTENT) \ FN(NOFRAMES_CONTENT) \
FN(NON_MATCHING_ENDTAG) \ FN(NON_MATCHING_ENDTAG) \
FN(OBSOLETE_ELEMENT) \ FN(OBSOLETE_ELEMENT) \
FN(OPTION_REMOVED) \
FN(OPTION_REMOVED_APPLIED) \
FN(OPTION_REMOVED_UNAPPLIED) \
FN(PREVIOUS_LOCATION) \ FN(PREVIOUS_LOCATION) \
FN(PROPRIETARY_ATTR_VALUE) \ FN(PROPRIETARY_ATTR_VALUE) \
FN(PROPRIETARY_ATTRIBUTE) \ FN(PROPRIETARY_ATTRIBUTE) \

View file

@ -303,7 +303,12 @@ static const TidyOptionImpl option_defs[] =
}; };
/* List of deprecated options and their replacements. */ /* Deleted options. This array keeps track of options that have been
** removed from Tidy, and suggests a replacement. When a deleted option is
** used, client programs will have the opportunity to consume the option
** first via the callback, and if not handled by the callback, will be
** handled by Tidy, generally by setting an alternate or new option.
*/
static const struct { static const struct {
ctmbstr name; /**< name of the deprecated option */ ctmbstr name; /**< name of the deprecated option */
TidyOptionId replacementId; /**< Id of the replacement option, or 0 if none. */ TidyOptionId replacementId; /**< Id of the replacement option, or 0 if none. */
@ -503,7 +508,11 @@ static void ReparseTagDecls( TidyDocImpl* doc, uint changedUserTags )
} }
/* returns the option id of the replacement Tidy option for optName. */ /* Returns the option id of the replacement Tidy option for optName. Because
** an option might not have a replacement (0, TidyUnknownOption), a return
** value of N_TIDY_OPTIONS indicates an error, i.e., that the option isn't
** in the deprecated list.
*/
static TidyOptionId getOptionReplacement( ctmbstr optName ) static TidyOptionId getOptionReplacement( ctmbstr optName )
{ {
uint i = 0; uint i = 0;
@ -519,26 +528,31 @@ static TidyOptionId getOptionReplacement( ctmbstr optName )
} }
/* indicates whether or not optName is deprecated */ /* Indicates whether or not optName is deprecated */
static Bool isOptionDeprecated( ctmbstr optName ) static Bool isOptionDeprecated( ctmbstr optName )
{ {
return getOptionReplacement( optName ) != N_TIDY_OPTIONS; return getOptionReplacement( optName ) != N_TIDY_OPTIONS;
} }
/* forward declaration */ /* Forward declaration */
Bool GetPickListValue(); Bool GetPickListValue();
/* substitute the new option for the deprecated one. */ /* Aubstitute the new option for the deprecated one. */
static Bool subDeprecatedOption( TidyDocImpl* doc, ctmbstr oldName, ctmbstr oldValue) static Bool subDeprecatedOption( TidyDocImpl* doc, ctmbstr oldName, ctmbstr oldValue)
{ {
TidyOptionId newOptId = getOptionReplacement( oldName ); TidyOptionId newOptId = getOptionReplacement( oldName );
ctmbstr newName = TY_(getOption)( newOptId )->name;
TidyDoc tdoc = tidyImplToDoc( doc );
if ( newOptId == TidyUnknownOption ) if ( newOptId == TidyUnknownOption )
{ {
printf("%s has been removed, and there is no replacement.\n", oldName); TY_(Report)( doc, NULL, NULL, OPTION_REMOVED, oldName );
return no; return no;
} }
/********************/
/* `show-body-only` */
/********************/
if ( TY_(tmbstrcasecmp)( oldName, "show-body-only" ) == 0 ) if ( TY_(tmbstrcasecmp)( oldName, "show-body-only" ) == 0 )
{ {
uint value; uint value;
@ -548,22 +562,24 @@ static Bool subDeprecatedOption( TidyDocImpl* doc, ctmbstr oldName, ctmbstr oldV
{ {
if ( value == TidyNoState ) if ( value == TidyNoState )
{ {
printf("show-body-only is deprecated; use show-markup. No action taken.\n"); TY_(Report)( doc, NULL, NULL, OPTION_REMOVED_UNAPPLIED, oldName, newName );
TY_(SetOptionBool)( doc, newOptId, value ); TY_(SetOptionBool)( doc, newOptId, value );
} }
else else
{ {
TY_(SetOptionBool)( doc, newOptId, value ); TY_(SetOptionBool)( doc, newOptId, value );
printf("show-body-only has been removed; use show-markup, which has been set to `body-only`.\n"); ctmbstr val = tidyOptGetCurrPick( tdoc, newOptId );
TY_(Report)( doc, NULL, NULL, OPTION_REMOVED_APPLIED, oldName, newName, val );
} }
} }
else else
{ {
printf("Report bad argument %s\n", oldValue); printf("-->Report bad argument %s\n", oldValue);
} }
return yes; return yes;
} }
return no; return no;
} }

View file

@ -1906,6 +1906,9 @@ static languageDefinition language_en = { whichPluralForm_en, {
{ NOFRAMES_CONTENT, 0, "%s not inside 'noframes' element" }, { NOFRAMES_CONTENT, 0, "%s not inside 'noframes' element" },
{ NON_MATCHING_ENDTAG, 0, "replacing unexpected %s with </%s>" }, { NON_MATCHING_ENDTAG, 0, "replacing unexpected %s with </%s>" },
{ OBSOLETE_ELEMENT, 0, "replacing obsolete element %s with %s" }, { OBSOLETE_ELEMENT, 0, "replacing obsolete element %s with %s" },
{ OPTION_REMOVED, 0, "option \"%s\" no longer exists, and no replacement could be found." },
{ OPTION_REMOVED_APPLIED, 0, "option \"%s\" replaced with \"%s\", which Tidy has set to \"%s\"." },
{ OPTION_REMOVED_UNAPPLIED, 0, "option \"%s\" replaced with \"%s\", but Tidy could not set it for you." },
{ PREVIOUS_LOCATION, 0, "<%s> previously mentioned" }, { PREVIOUS_LOCATION, 0, "<%s> previously mentioned" },
{ PROPRIETARY_ATTR_VALUE, 0, "%s proprietary attribute value \"%s\"" }, { PROPRIETARY_ATTR_VALUE, 0, "%s proprietary attribute value \"%s\"" },
{ PROPRIETARY_ATTRIBUTE, 0, "%s proprietary attribute \"%s\"" }, { PROPRIETARY_ATTRIBUTE, 0, "%s proprietary attribute \"%s\"" },

View file

@ -345,6 +345,9 @@ static struct _dispatchTable {
{ NOFRAMES_CONTENT, TidyWarning, formatStandard }, { NOFRAMES_CONTENT, TidyWarning, formatStandard },
{ NON_MATCHING_ENDTAG, TidyWarning, formatStandard }, { NON_MATCHING_ENDTAG, TidyWarning, formatStandard },
{ OBSOLETE_ELEMENT, TidyWarning, formatStandard }, { OBSOLETE_ELEMENT, TidyWarning, formatStandard },
{ OPTION_REMOVED, TidyConfig, formatStandard },
{ OPTION_REMOVED_APPLIED, TidyConfig, formatStandard },
{ OPTION_REMOVED_UNAPPLIED, TidyConfig, formatStandard },
{ PREVIOUS_LOCATION, TidyInfo, formatStandard }, { PREVIOUS_LOCATION, TidyInfo, formatStandard },
{ PROPRIETARY_ATTR_VALUE, TidyWarning, formatAttributeReport }, { PROPRIETARY_ATTR_VALUE, TidyWarning, formatAttributeReport },
{ PROPRIETARY_ATTRIBUTE, TidyWarning, formatAttributeReport }, { PROPRIETARY_ATTRIBUTE, TidyWarning, formatAttributeReport },
@ -749,12 +752,29 @@ TidyMessageImpl *formatStandard(TidyDocImpl* doc, Node *element, Node *node, uin
} break; } break;
case STRING_UNKNOWN_OPTION: case STRING_UNKNOWN_OPTION:
case OPTION_REMOVED:
{ {
ctmbstr str; ctmbstr str;
if ( (str = va_arg( args, ctmbstr)) ) if ( (str = va_arg( args, ctmbstr)) )
return TY_(tidyMessageCreateWithLexer)(doc, code, level, str); return TY_(tidyMessageCreateWithLexer)(doc, code, level, str);
} break; } break;
case OPTION_REMOVED_UNAPPLIED:
{
ctmbstr s1 = va_arg( args, ctmbstr );
ctmbstr s2 = va_arg( args, ctmbstr );
return TY_(tidyMessageCreateWithLexer)(doc, code, level, s1, s2);
}
case OPTION_REMOVED_APPLIED:
{
ctmbstr s1 = va_arg( args, ctmbstr );
ctmbstr s2 = va_arg( args, ctmbstr );
ctmbstr s3 = va_arg( args, ctmbstr );
return TY_(tidyMessageCreateWithLexer)(doc, code, level, s1, s2, s3);
}
case BAD_SURROGATE_LEAD: case BAD_SURROGATE_LEAD:
case BAD_SURROGATE_PAIR: case BAD_SURROGATE_PAIR:
case BAD_SURROGATE_TAIL: case BAD_SURROGATE_TAIL: