int tidyDocSaveStream( TidyDocImpl* doc, StreamOut* out ) { Bool showMarkup = cfgBool( doc, TidyShowMarkup ); Bool forceOutput = cfgBool( doc, TidyForceOutput ); #if SUPPORT_UTF16_ENCODINGS Bool outputBOM = ( cfgAutoBool(doc, TidyOutputBOM) == TidyYesState ); Bool smartBOM = ( cfgAutoBool(doc, TidyOutputBOM) == TidyAutoState ); #endif Bool xmlOut = cfgBool( doc, TidyXmlOut ); Bool xhtmlOut = cfgBool( doc, TidyXhtmlOut ); TidyTriState bodyOnly = cfgAutoBool( doc, TidyBodyOnly ); Bool dropComments = cfgBool(doc, TidyHideComments); Bool makeClean = cfgBool(doc, TidyMakeClean); Bool asciiChars = cfgBool(doc, TidyAsciiChars); Bool makeBare = cfgBool(doc, TidyMakeBare); Bool escapeCDATA = cfgBool(doc, TidyEscapeCdata); TidyAttrSortStrategy sortAttrStrat = cfg(doc, TidySortAttributes); if (escapeCDATA) TY_(ConvertCDATANodes)(doc, &doc->root); if (dropComments) TY_(DropComments)(doc, &doc->root); if (makeClean) { /* noop */ TY_(DropFontElements)(doc, &doc->root, NULL); TY_(WbrToSpace)(doc, &doc->root); } if ((makeClean && asciiChars) || makeBare) TY_(DowngradeTypography)(doc, &doc->root); if (makeBare) /* Note: no longer replaces in */ /* attribute values / non-text tokens */ TY_(NormalizeSpaces)(doc->lexer, &doc->root); else TY_(ReplacePreformattedSpaces)(doc, &doc->root); if ( sortAttrStrat != TidySortAttrNone ) TY_(SortAttributes)(&doc->root, sortAttrStrat); if ( showMarkup && (doc->errors == 0 || forceOutput) ) { #if SUPPORT_UTF16_ENCODINGS /* Output a Byte Order Mark if required */ if ( outputBOM || (doc->inputHadBOM && smartBOM) ) TY_(outBOM)( out ); #endif /* No longer necessary. No DOCTYPE == HTML 3.2, ** which gives you only the basic character entities, ** which are safe in any browser. ** if ( !TY_(FindDocType)(doc) ) ** TY_(SetOptionBool)( doc, TidyNumEntities, yes ); */ doc->docOut = out; if ( xmlOut && !xhtmlOut ) TY_(PPrintXMLTree)( doc, NORMAL, 0, &doc->root ); else if ( showBodyOnly( doc, bodyOnly ) ) TY_(PrintBody)( doc ); else TY_(PPrintTree)( doc, NORMAL, 0, &doc->root ); TY_(PFlushLine)( doc, 0 ); doc->docOut = NULL; } TY_(ResetConfigToSnapshot)( doc ); return tidyDocStatus( doc ); }
/* ensure that config is self consistent */ void AdjustConfig( TidyDocImpl* doc ) { if ( cfgBool(doc, TidyEncloseBlockText) ) SetOptionBool( doc, TidyEncloseBodyText, yes ); if ( cfgAutoBool(doc, TidyIndentContent) == TidyNoState ) SetOptionInt( doc, TidyIndentSpaces, 0 ); /* disable wrapping */ if ( cfg(doc, TidyWrapLen) == 0 ) SetOptionInt( doc, TidyWrapLen, 0x7FFFFFFF ); /* Word 2000 needs o:p to be declared as inline */ if ( cfgBool(doc, TidyWord2000) ) { doc->config.defined_tags |= tagtype_inline; DefineTag( doc, tagtype_inline, "o:p" ); } /* #480701 disable XHTML output flag if both output-xhtml and xml input are set */ if ( cfgBool(doc, TidyXmlTags) ) SetOptionBool( doc, TidyXhtmlOut, no ); /* XHTML is written in lower case */ if ( cfgBool(doc, TidyXhtmlOut) ) { SetOptionBool( doc, TidyXmlOut, yes ); SetOptionBool( doc, TidyUpperCaseTags, no ); SetOptionBool( doc, TidyUpperCaseAttrs, no ); /* SetOptionBool( doc, TidyXmlPIs, yes ); */ } /* if XML in, then XML out */ if ( cfgBool(doc, TidyXmlTags) ) { SetOptionBool( doc, TidyXmlOut, yes ); SetOptionBool( doc, TidyXmlPIs, yes ); } /* #427837 - fix by Dave Raggett 02 Jun 01 ** generate <?xml version="1.0" encoding="iso-8859-1"?> ** if the output character encoding is Latin-1 etc. */ if ( cfg(doc, TidyOutCharEncoding) != ASCII && cfg(doc, TidyOutCharEncoding) != UTF8 && #if SUPPORT_UTF16_ENCODINGS cfg(doc, TidyOutCharEncoding) != UTF16 && cfg(doc, TidyOutCharEncoding) != UTF16BE && cfg(doc, TidyOutCharEncoding) != UTF16LE && #endif cfg(doc, TidyOutCharEncoding) != RAW && cfgBool(doc, TidyXmlOut) ) { SetOptionBool( doc, TidyXmlDecl, yes ); } /* XML requires end tags */ if ( cfgBool(doc, TidyXmlOut) ) { #if SUPPORT_UTF16_ENCODINGS /* XML requires a BOM on output if using UTF-16 encoding */ ulong enc = cfg( doc, TidyOutCharEncoding ); if ( enc == UTF16LE || enc == UTF16BE || enc == UTF16 ) SetOptionInt( doc, TidyOutputBOM, yes ); #endif SetOptionBool( doc, TidyQuoteAmpersand, yes ); SetOptionBool( doc, TidyHideEndTags, no ); } }