Track column numbers in addition to line numbers.
[htmlpurifier/rdancer.git] / NEWS
blob91891baf705adbc3745474f728bec8eef42ae0c6
1 NEWS ( CHANGELOG and HISTORY )                                     HTMLPurifier
2 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 = KEY ====================
5     # Breaks back-compat
6     ! Feature
7     - Bugfix
8       + Sub-comment
9     . Internal change
10 ==========================
12 3.1.2, unknown release date
13 ! %Output.AttrSort for when you need your attributes in alphabetical order to
14   deal with a bug in FCKEditor. Requested by frank farmer.
15 ! Enable HTML comments when %HTML.Trusted is on. Requested by Waldo Jaquith.
16 ! Proper support for name attribute. It is now allowed and equivalent to the id
17   attribute in a and img tags, and is only converted to id when %HTML.TidyLevel 
18   is heavy (for all doctypes).
19 ! %AutoFormat.RemoveEmpty to remove some empty tags from documents. Please don't
20   use on hand-written HTML.
21 ! Add error-cases for unsupported elements in MakeWellFormed. This enables
22   the strategy to be used, standalone, on untrusted input.
23 ! %Core.AggressivelyFixLt is on by default. This causes more sensible
24   processing of left angled brackets in smileys and other whatnot.
25 ! Test scripts now have a 'type' parameter, which lets you say 'htmlpurifier',
26   'phpt', 'vtest', etc. in order to only execute those tests. This supercedes
27   the --only-phpt parameter, although for backwards-compatibility the flag
28   will still work. 
29 ! AutoParagraph auto-formatter will now preserve double-newlines upon output.
30   Users who are not performing inbound filtering, this may seem a little
31   useless, but as a bonus, the test suite and handling of edge cases is also
32   improved.
33 ! Experimental implementation of forms for %HTML.Trusted
34 ! Track column numbers when maintain line numbers is on
35 - Fix two bugs in %URI.MakeAbsolute; one involving empty paths in base URLs,
36   the other involving an undefined $is_folder error.
37 - Throw error when %Core.Encoding is set to a spurious value. Previously,
38   this errored silently and returned false.
39 - Redirected stderr to stdout for flush error output.
40 - %URI.DisableExternal will now use the host in %URI.Base if %URI.Host is not
41   available.
42 - Do not re-munge URL if the output URL has the same host as the input URL.
43   Requested by Chris.
44 - Fix error in documentation regarding %Filter.ExtractStyleBlocks
45 - Prevent <![CDATA[<body></body>]]> from triggering %Core.ConvertDocumentToFragment
46 - Fix bug with inline elements in blockquotes conflicting with strict doctype
47 - Detect if HTML support is disabled for DOM by checking for loadHTML() method.
48 - Fix bug where dots and double-dots in absolute URLs without hostname were
49   not collapsed by URIFilter_MakeAbsolute.
50 - Fix bug with anonymous modules operating on SafeEmbed or SafeObject elements
51   by reordering their addition.
52 . Strategy_MakeWellFormed now operates in-place, saving memory and allowing
53   for more interesting filter-backtracking
54 . New HTMLPurifier_Injector->rewind() functionality, allows injectors to rewind
55   index to reprocess tokens.
56 . StringHashParser now allows for multiline sections with "empty" content; 
57   previously the section would remain undefined.
58 . Added --quick option to multitest.php, which tests only the most recent
59   release for each series.
60 . Added --distro option to multitest.php, which accepts either 'normal' or
61   'standalone'. This supercedes --exclude-normal and --exclude-standalone
63 3.1.1, released 2008-06-19
64 # %URI.Munge now, by default, does not munge resources (for example, <img src="">)
65   In order to enable this again, please set %URI.MungeResources to true. 
66 ! More robust imagecrash protection with height/width CSS with %CSS.MaxImgLength,
67   and height/width HTML with %HTML.MaxImgLength.
68 ! %URI.MungeSecretKey for secure URI munging. Thanks Chris
69   for sponsoring this feature. Check out the corresponding documentation
70   for details. (Att Nightly testers: The API for this feature changed before
71   the general release. Namely, rename your directives %URI.SecureMungeSecretKey =>
72   %URI.MungeSecretKey and and %URI.SecureMunge => %URI.Munge)
73 ! Implemented post URI filtering. Set member variable $post to true to set
74   a URIFilter as such.
75 ! Allow modules to define injectors via $info_injector. Injectors are 
76   automatically disabled if injector's needed elements are not found.
77 ! Support for "safe" objects added, use %HTML.SafeObject and %HTML.SafeEmbed.
78   Thanks Chris for sponsoring. If you've been using ad hoc code from the
79   forums, PLEASE use this instead.
80 ! Added substitutions for %e, %n, %a and %p in %URI.Munge (in order,
81   embedded, tag name, attribute name, CSS property name). See %URI.Munge
82   for more details. Requested by Jochem Blok.
83 - Disable percent height/width attributes for img.
84 - AttrValidator operations are now atomic; updates to attributes are not
85   manifest in token until end of operations. This prevents naughty internal
86   code from directly modifying CurrentToken when they're not supposed to.
87   This semantics change was requested by frank farmer.
88 - Percent encoding checks enabled for URI query and fragment
89 - Fix stray backslashes in font-family; CSS Unicode character escapes are
90   now properly resolved (although *only* in font-family). Thanks Takeshi Terada
91   for reporting.
92 - Improve parseCDATA algorithm to take into account newline normalization
93 - Account for browser confusion between Yen character and backslash in
94   Shift_JIS encoding. This fix generalizes to any other encoding which is not
95   a strict superset of printable ASCII. Thanks Takeshi Terada for reporting.
96 - Fix missing configuration parameter in Generator calls. Thanks vs for the
97   partial patch.
98 - Improved adherence to Unicode by checking for non-character codepoints.
99   Thanks Geoffrey Sneddon for reporting. This may result in degraded
100   performance for extremely large inputs.
101 - Allow CSS property-value pair ''text-decoration: none''. Thanks Jochem Blok
102   for reporting.
103 . Added HTMLPurifier_UnitConverter and HTMLPurifier_Length for convenient
104   handling of CSS-style lengths. HTMLPurifier_AttrDef_CSS_Length now uses
105   this class.
106 . API of HTMLPurifier_AttrDef_CSS_Length changed from __construct($disable_negative)
107   to __construct($min, $max). __construct(true) is equivalent to
108   __construct('0').
109 . Added HTMLPurifier_AttrDef_Switch class
110 . Rename HTMLPurifier_HTMLModule_Tidy->construct() to setup() and bubble method
111   up inheritance hierarchy to HTMLPurifier_HTMLModule. All HTMLModules
112   get this called with the configuration object.  All modules now
113   use this rather than __construct(), although legacy code using constructors
114   will still work--the new format, however, lets modules access the
115   configuration object for HTML namespace dependant tweaks.
116 . AttrDef_HTML_Pixels now takes a single construction parameter, pixels.
117 . ConfigSchema data-structure heavily optimized; on average it uses a third
118   the memory it did previously. The interface has changed accordingly,
119   consult changes to HTMLPurifier_Config for details.
120 . Variable parsing types now are magic integers instead of strings
121 . Added benchmark for ConfigSchema
122 . HTMLPurifier_Generator requires $config and $context parameters. If you 
123   don't know what they should be, use HTMLPurifier_Config::createDefault()
124   and new HTMLPurifier_Context().
125 . Printers now properly distinguish between output configuration, and 
126   target configuration. This is not applicable to scripts using
127   the Printers for HTML Purifier related tasks.
128 . HTML/CSS Printers must be primed with prepareGenerator($gen_config), otherwise
129   fatal errors will ensue.
130 . URIFilter->prepare can return false in order to abort loading of the filter
131 . Factory for AttrDef_URI implemented, URI#embedded to indicate URI that embeds
132   an external resource.
133 . %URI.Munge functionality factored out into a post-filter class.
134 . Added CurrentCSSProperty context variable during CSS validation
136 3.1.0, released 2008-05-18
137 # Unnecessary references to objects (vestiges of PHP4) removed from method
138   signatures.  The following methods do not need references when assigning from
139   them and will result in E_STRICT errors if you try:
140     + HTMLPurifier_Config->get*Definition() [* = HTML, CSS]
141     + HTMLPurifier_ConfigSchema::instance()
142     + HTMLPurifier_DefinitionCacheFactory::instance()
143     + HTMLPurifier_DefinitionCacheFactory->create()
144     + HTMLPurifier_DoctypeRegistry->register()
145     + HTMLPurifier_DoctypeRegistry->get()
146     + HTMLPurifier_HTMLModule->addElement()
147     + HTMLPurifier_HTMLModule->addBlankElement()
148     + HTMLPurifier_LanguageFactory::instance()
149 # Printer_ConfigForm's get*() functions were static-ified
150 # %HTML.ForbiddenAttributes requires attribute declarations to be in the
151   form of tag@attr, NOT tag.attr (which will throw an error and won't do
152   anything). This is for forwards compatibility with XML; you'd do best
153   to migrate an %HTML.AllowedAttributes directives to this syntax too.
154 ! Allow index to be false for config from form creation
155 ! Added HTMLPurifier::VERSION constant
156 ! Commas, not dashes, used for serializer IDs. This change is forwards-compatible
157   and allows for version numbers like "3.1.0-dev".
158 ! %HTML.Allowed deals gracefully with whitespace anywhere, anytime!
159 ! HTML Purifier's URI handling is a lot more robust, with much stricter
160   validation checks and better percent encoding handling. Thanks Gareth Heyes
161   for indicating security vulnerabilities from lax percent encoding.
162 ! Bootstrap autoloader deals more robustly with classes that don't exist,
163   preventing class_exists($class, true) from barfing.
164 - InterchangeBuilder now alphabetizes its lists
165 - Validation error in configdoc output fixed
166 - Iconv and other encoding errors muted even with custom error handlers that
167   do not honor error_reporting
168 - Add protection against imagecrash attack with CSS height/width
169 - HTMLPurifier::instance() created for consistency, is equivalent to getInstance()
170 - Fixed and revamped broken ConfigForm smoketest
171 - Bug with bool/null fields in Printer_ConfigForm fixed
172 - Bug with global forbidden attributes fixed
173 - Improved error messages for allowed and forbidden HTML elements and attributes
174 - Missing (or null) in configdoc documentation restored
175 - If DOM throws and exception during parsing with PH5P (occurs in newer versions
176   of DOM), HTML Purifier punts to DirectLex
177 - Fatal error with unserialization of ScriptRequired
178 - Created directories are now chmod'ed properly
179 - Fixed bug with fallback languages in LanguageFactory
180 - Standalone testing setup properly with autoload
181 . Out-of-date documentation revised
182 . UTF-8 encoding check optimization as suggested by Diego
183 . HTMLPurifier_Error removed in favor of exceptions
184 . More copy() function removed; should use clone instead
185 . More extensive unit tests for HTMLDefinition
186 . assertPurification moved to central harness
187 . HTMLPurifier_Generator accepts $config and $context parameters during
188   instantiation, not runtime
189 . Double-quotes outside of attribute values are now unescaped
191 3.1.0rc1, released 2008-04-22
192 # Autoload support added. Internal require_once's removed in favor of an
193   explicit require list or autoloading. To use HTML Purifier,
194   you must now either use HTMLPurifier.auto.php
195   or HTMLPurifier.includes.php; setting the include path and including
196   HTMLPurifier.php is insufficient--in such cases include HTMLPurifier.autoload.php
197   as well to register our autoload handler (or modify your autoload function
198   to check HTMLPurifier_Bootstrap::getPath($class)). You can also use
199   HTMLPurifier.safe-includes.php for a less performance friendly but more
200   user-friendly library load.
201 # HTMLPurifier_ConfigSchema static functions are officially deprecated. Schema
202   information is stored in the ConfigSchema directory, and the
203   maintenance/generate-schema-cache.php generates the schema.ser file, which
204   is now instantiated. Support for userland schema changes coming soon!
205 # HTMLPurifier_Config will now throw E_USER_NOTICE when you use a directive
206   alias; to get rid of these errors just modify your configuration to use
207   the new directive name.
208 # HTMLPurifier->addFilter is deprecated; built-in filters can now be
209   enabled using %Filter.$filter_name or by setting your own filters using
210   %Filter.Custom
211 # Directive-level safety properties superceded in favor of module-level
212   safety. Internal method HTMLModule->addElement() has changed, although 
213   the externally visible HTMLDefinition->addElement has *not* changed.
214 ! Extra utility classes for testing and non-library operations can
215   be found in extras/. Specifically, these are FSTools and ConfigDoc.
216   You may find a use for these in your own project, but right now they
217   are highly experimental and volatile.
218 ! Integration with PHPT allows for automated smoketests
219 ! Limited support for proprietary HTML elements, namely <marquee>, sponsored
220   by Chris. You can enable them with %HTML.Proprietary if your client
221   demands them.
222 ! Support for !important CSS cascade modifier. By default, this will be stripped
223   from CSS, but you can enable it using %CSS.AllowImportant
224 ! Support for display and visibility CSS properties added, set %CSS.AllowTricky
225   to true to use them.
226 ! HTML Purifier now has its own Exception hierarchy under HTMLPurifier_Exception.
227   Developer error (not enduser error) can cause these to be triggered.
228 ! Experimental kses() wrapper introduced with HTMLPurifier.kses.php
229 ! Finally %CSS.AllowedProperties for tweaking allowed CSS properties without
230   mucking around with HTMLPurifier_CSSDefinition
231 ! ConfigDoc output has been enhanced with version and deprecation info.
232 ! %HTML.ForbiddenAttributes and %HTML.ForbiddenElements implemented.
233 - Autoclose now operates iteratively, i.e. <span><span><div> now has
234   both span tags closed.
235 - Various HTMLPurifier_Config convenience functions now accept another parameter
236   $schema which defines what HTMLPurifier_ConfigSchema to use besides the
237   global default.
238 - Fix bug with trusted script handling in libxml versions later than 2.6.28.
239 - Fix bug in ExtractStyleBlocks with comments in style tags
240 - Fix bug in comment parsing for DirectLex
241 - Flush output now displayed when in command line mode for unit tester
242 - Fix bug with rgb(0, 1, 2) color syntax with spaces inside shorthand syntax
243 - HTMLPurifier_HTMLDefinition->addAttribute can now be called multiple times
244   on the same element without emitting errors.
245 - Fixed fatal error in PH5P lexer with invalid tag names
246 . Plugins now get their own changelogs according to project conventions.
247 . Convert tokens to use instanceof, reducing memory footprint and
248   improving comparison speed.
249 . Dry runs now supported in SimpleTest; testing facilities improved
250 . Bootstrap class added for handling autoloading functionality
251 . Implemented recursive glob at FSTools->globr
252 . ConfigSchema now has instance methods for all corresponding define* 
253   static methods.
254 . A couple of new historical maintenance scripts were added.
255 . HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php split into two files
256 . tests/index.php can now be run from any directory.
257 . HTMLPurifier_Token subclasses split into seperate files
258 . HTMLPURIFIER_PREFIX now is defined in Bootstrap.php, NOT HTMLPurifier.php
259 . HTMLPURIFIER_PREFIX can now be defined outside of HTML Purifier
260 . New --php=php flag added, allows PHP executable to be specified (command
261   line only!)
262 . htmlpurifier_add_test() preferred method to translate test files in to
263   classes, because it handles PHPT files too.
264 . Debugger class is deprecated and will be removed soon.
265 . Command line argument parsing for testing scripts revamped, now --opt value
266   format is supported.
267 . Smoketests now cleanup after magic quotes
268 . Generator now can output comments (however, comments are still stripped
269   from HTML Purifier output)
270 . HTMLPurifier_ConfigSchema->validate() deprecated in favor of
271   HTMLPurifier_VarParser->parse()
272 . Integers auto-cast into float type by VarParser.
273 . HTMLPURIFIER_STRICT removed; no validation is performed on runtime, only 
274   during cache generation
275 . Reordered script calls in maintenance/flush.php
276 . Command line scripts now honor exit codes
277 . When --flush fails in unit testers, abort tests and print message
278 . Improved documentation in docs/dev-flush.html about the maintenance scripts
279 . copy() methods removed in favor of clone keyword
281 3.0.0, released 2008-01-06
282 # HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained
283   until PHP 4 is completely deprecated, but no new features will be added
284   to it.
285   + Visibility declarations added
286   + Constructor methods renamed to __construct()
287   + PHP4 reference cruft removed (in progress)
288 ! CSS properties are now case-insensitive
289 ! DefinitionCacheFactory now can register new implementations
290 ! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting <style> from
291   documents and cleaning their contents up. Requires the CSSTidy library
292   <http://csstidy.sourceforge.net/>. You can access the blocks with the
293   'StyleBlocks' Context variable ($purifier->context->get('StyleBlocks')).
294   The output CSS can also be "scoped" for a specific element, use:
295   %Filter.ExtractStyleBlocksScope
296 ! Experimental support for some proprietary CSS attributes allowed:
297   opacity (and all of the browser-specific equivalents) and scrollbar colors.
298   Enable by setting %CSS.Proprietary to true.
299 - Colors missing # but in hex form will be corrected
300 - CSS Number algorithm improved
301 - Unit testing and multi-testing now on steroids: command lines,
302   XML output, and other goodies now added.
303 . Unit tests for Injector improved
304 . New classes:
305   + HTMLPurifier_AttrDef_CSS_AlphaValue
306   + HTMLPurifier_AttrDef_CSS_Filter
307 . Multitest now has a file docblock
309 2.1.3, released 2007-11-05
310 ! tests/multitest.php allows you to test multiple versions by running
311   tests/index.php through multiple interpreters using `phpv` shell
312   script (you must provide this script!)
313 - Fixed poor include ordering for Email URI AttrDefs, causes fatal errors
314   on some systems.
315 - Injector algorithm further refined: off-by-one error regarding skip 
316   counts for dormant injectors fixed
317 - Corrective blockquote definition now enabled for HTML 4.01 Strict
318 - Fatal error when <img> tag (or any other element with required attributes)
319   has 'id' attribute fixed, thanks NykO18 for reporting
320 - Fix warning emitted when a non-supported URI scheme is passed to the
321   MakeAbsolute URIFilter, thanks NykO18 (again)
322 - Further refine AutoParagraph injector. Behavior inside of elements
323   allowing paragraph tags clarified: only inline content delimeted by
324   double newlines (not block elements) are paragraphed.
325 - Buggy treatment of end tags of elements that have required attributes
326   fixed (does not manifest on default tag-set)
327 - Spurious internal content reorganization error suppressed
328 - HTMLDefinition->addElement now returns a reference to the created
329   element object, as implied by the documentation
330 - Phorum mod's HTML Purifier help message expanded (unreleased elsewhere)
331 - Fix a theoretical class of infinite loops from DirectLex reported
332   by Nate Abele
333 - Work around unnecessary DOMElement type-cast in PH5P that caused errors
334   in PHP 5.1
335 - Work around PHP 4 SimpleTest lack-of-error complaining for one-time-only
336   HTMLDefinition errors, this may indicate problems with error-collecting
337   facilities in PHP 5
338 - Make ErrorCollectorEMock work in both PHP 4 and PHP 5
339 - Make PH5P work with PHP 5.0 by removing unnecessary array parameter typedef
340 . %Core.AcceptFullDocuments renamed to %Core.ConvertDocumentToFragment 
341   to better communicate its purpose
342 . Error unit tests can now specify the expectation of no errors. Future
343   iterations of the harness will be extremely strict about what errors
344   are allowed
345 . Extend Injector hooks to allow for more powerful injector routines
346 . HTMLDefinition->addBlankElement created, as according to the HTMLModule
347   method
348 . Doxygen configuration file updated, with minor improvements
349 . Test runner now checks for similarly named files in conf/ directory too.
350 . Minor cosmetic change to flush-definition-cache.php: trailing newline is
351   outputted
352 . Maintenance script for generating PH5P patch added, original PH5P source
353   file also added under version control
354 . Full unit test runner script title made more descriptive with PHP version
355 . Updated INSTALL file to state that 4.3.7 is the earliest version we
356   are actively testing
358 2.1.2, released 2007-09-03
359 ! Implemented Object module for trusted users
360 ! Implemented experimental HTML5 parsing mode using PH5P. To use, add
361   this to your code:
362         require_once 'HTMLPurifier/Lexer/PH5P.php';
363         $config->set('Core', 'LexerImpl', 'PH5P');
364   Note that this Lexer introduces some classes not in the HTMLPurifier
365   namespace.  Also, this is PHP5 only.
366 ! CSS property border-spacing implemented
367 - Fix non-visible parsing error in DirectLex with empty tags that have
368   slashes inside attribute values.
369 - Fix typo in CSS definition: border-collapse:seperate; was incorrectly
370   accepted as valid CSS. Usually non-visible, because this styling is the
371   default for tables in most browsers. Thanks Brett Zamir for pointing
372   this out.
373 - Fix validation errors in configuration form
374 - Hammer out a bunch of edge-case bugs in the standalone distribution
375 - Inclusion reflection removed from URISchemeRegistry; you must manually
376   include any new schema files you wish to use
377 - Numerous typo fixes in documentation thanks to Brett Zamir
378 . Unit test refactoring for one logical test per test function
379 . Config and context parameters in ComplexHarness deprecated: instead, edit
380   the $config and $context member variables
381 . HTML wrapper in DOMLex now takes DTD identifiers into account; doesn't
382   really make a difference, but is good for completeness sake
383 . merge-library.php script refactored for greater code reusability and
384   PHP4 compatibility
386 2.1.1, released 2007-08-04
387 - Fix show-stopper bug in %URI.MakeAbsolute functionality
388 - Fix PHP4 syntax error in standalone version
389 . Add prefix directory to include path for standalone, this prevents
390   other installations from clobbering the standalone's URI schemes
391 . Single test methods can be invoked by prefixing with __only
393 2.1.0, released 2007-08-02
394 # flush-htmldefinition-cache.php superseded in favor of a generic
395   flush-definition-cache.php script, you can clear a specific cache
396   by passing its name as a parameter to the script
397 ! Phorum mod implemented for HTML Purifier
398 ! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
399   trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
400   for PHP4 (DirectLex).
401 ! Standalone file now available, which greatly reduces the amount of
402   includes (although there are still a few files that reside in the
403   standalone folder)
404 ! Relative URIs can now be transformed into their absolute equivalents
405   using %URI.Base and %URI.MakeAbsolute
406 ! Ruby implemented for XHTML 1.1
407 ! You can now define custom URI filtering behavior, see enduser-uri-filter.html
408   for more details
409 ! UTF-8 font names now supported in CSS
410 - AutoFormatters emit friendly error messages if tags or attributes they
411   need are not allowed
412 - ConfigForm's compactification of directive names is now configurable
413 - AutoParagraph autoformatter algorithm refined after field-testing
414 - XHTML 1.1 now applies XHTML 1.0 Strict cleanup routines, namely
415   blockquote wrapping
416 - Contents of <style> tags removed by default when tags are removed
417 . HTMLPurifier_Config->getSerial() implemented, this is extremely useful
418   for output cache invalidation
419 . ConfigForm printer now can retrieve CSS and JS files as strings, in
420   case HTML Purifier's directory is not publically accessible
421 . Introduce new text/itext configuration directive values: these represent
422   longer strings that would be more appropriately edited with a textarea
423 . Allow newlines to act as separators for lists, hashes, lookups and
424   %HTML.Allowed
425 . ConfigForm generates textareas instead of text inputs for lists, hashes,
426   lookups, text and itext fields
427 . Hidden element content removal genericized: %Core.HiddenElements can
428   be used to customize this behavior, by default <script> and <style> are
429   hidden
430 . Added HTMLPURIFIER_PREFIX constant, should be used instead of dirname(__FILE__)
431 . Custom ChildDef added to default include list
432 . URIScheme reflection improved: will not attempt to include file if class
433   already exists. May clobber autoload, so I need to keep an eye on it
434 . ConfigSchema heavily optimized, will only collect information and validate
435   definitions when HTMLPURIFIER_SCHEMA_STRICT is true.
436 . AttrDef_URI unit tests and implementation refactored
437 . benchmarks/ directory now protected from public view with .htaccess file;
438   run the tests via command line
439 . URI scheme is munged off if there is no authority and the scheme is the
440   default one
441 . All unit tests inherit from HTMLPurifier_Harness, not UnitTestCase
442 . Interface for URIScheme changed
443 . Generic URI object to hold components of URI added, most systems involved
444   in URI validation have been migrated to use it
445 . Custom filtering for URIs factored out to URIDefinition interface for
446   maximum extensibility
448 2.0.1, released 2007-06-27
449 ! Tag auto-closing now based on a ChildDef heuristic rather than a
450   manually set auto_close array; some behavior may change
451 ! Experimental AutoFormat functionality added: auto-paragraph and
452   linkify your HTML input by setting %AutoFormat.AutoParagraph and
453   %AutoFormat.Linkify to true
454 ! Newlines normalized internally, and then converted back to the
455   value of PHP_EOL. If this is not desired, set your newline format
456   using %Output.Newline.
457 ! Beta error collection, messages are implemented for the most generic
458   cases involving Lexing or Strategies
459 - Clean up special case code for <script> tags
460 - Reorder includes for DefinitionCache decorators, fixes a possible
461   missing class error
462 - Fixed bug where manually modified definitions were not saved via cache
463   (mostly harmless, except for the fact that it would be a little slower)
464 - Configuration objects with different serials do not clobber each
465   others when revision numbers are unequal
466 - Improve Serializer DefinitionCache directory permissions checks
467 - DefinitionCache no longer throws errors when it encounters old
468   serial files that do not conform to the current style
469 - Stray xmlns attributes removed from configuration documentation
470 - configForm.php smoketest no longer has XSS vulnerability due to
471   unescaped print_r output
472 - Printer adheres to configuration's directives on output format
473 - Fix improperly named form field in ConfigForm printer
474 . Rewire some test-cases to swallow errors rather than expect them
475 . HTMLDefinition printer updated with some of the new attributes
476 . DefinitionCache keys reordered to reflect precedence: version number,
477   hash, then revision number
478 . %Core.DefinitionCache renamed to %Cache.DefinitionImpl
479 . Interlinking in configuration documentation added using
480   Injector_PurifierLinkify
481 . Directives now keep track of aliases to themselves
482 . Error collector now requires a severity to be passed, use PHP's internal
483   error constants for this
484 . HTMLPurifier_Config::getAllowedDirectivesForForm implemented, allows
485   much easier selective embedding of configuration values
486 . Doctype objects now accept public and system DTD identifiers
487 . %HTML.Doctype is now constrained by specific values, to specify a custom
488   doctype use new %HTML.CustomDoctype
489 . ConfigForm truncates long directives to keep the form small, and does
490   not re-output namespaces
492 2.0.0, released 2007-06-20
493 # Completely refactored HTMLModuleManager, decentralizing safety
494   information
495 # Transform modules changed to Tidy modules, which offer more flexibility
496   and better modularization
497 # Configuration object now finalizes itself when a read operation is
498   performed on it, ensuring that its internal state stays consistent.
499   To revert this behavior, you can set the $autoFinalize member variable 
500   off, but it's not recommended.
501 # New compact syntax for AttrDef objects that can be used to instantiate
502   new objects via make()
503 # Definitions (esp. HTMLDefinition) are now cached for a significant
504   performance boost. You can disable caching by setting %Core.DefinitionCache
505   to null. You CANNOT edit raw definitions without setting the corresponding
506   DefinitionID directive (%HTML.DefinitionID for HTMLDefinition).
507 # Contents between <script> tags are now completely removed if <script>
508   is not allowed
509 # Prototype-declarations for Lexer removed in favor of configuration
510   determination of Lexer implementations.
511 ! HTML Purifier now works in PHP 4.3.2.
512 ! Configuration form-editing API makes tweaking HTMLPurifier_Config a
513   breeze!
514 ! Configuration directives that accept hashes now allow new string
515   format: key1:value1,key2:value2
516 ! ConfigDoc now factored into OOP design
517 ! All deprecated elements now natively supported
518 ! Implement TinyMCE styled whitelist specification format in
519   %HTML.Allowed
520 ! Config object gives more friendly error messages when things go wrong
521 ! Advanced API implemented: easy functions for creating elements (addElement)
522   and attributes (addAttribute) on HTMLDefinition
523 ! Add native support for required attributes
524 - Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
525 - DOMLex will not emit errors when a custom error handler that does not
526   honor error_reporting is used
527 - StrictBlockquote child definition refrains from wrapping whitespace
528   in tags now.
529 - Bug resulting from tag transforms to non-allowed elements fixed
530 - ChildDef_Custom's regex generation has been improved, removing several
531   false positives
532 . Unit test for ElementDef created, ElementDef behavior modified to
533   be more flexible
534 . Added convenience functions for HTMLModule constructors
535 . AttrTypes now has accessor functions that should be used instead
536   of directly manipulating info
537 . TagTransform_Center deprecated in favor of generic TagTransform_Simple
538 . Add extra protection in AttrDef_URI against phantom Schemes
539 . Doctype object added to HTMLDefinition which describes certain aspects
540   of the operational document type
541 . Lexer is now pre-emptively included, with a conditional include for the
542   PHP5 only version.
543 . HTMLDefinition and CSSDefinition have a common parent class: Definition.
544 . DirectLex can now track line-numbers
545 . Preliminary error collector is in place, although no code actually reports
546   errors yet
547 . Factor out most of ValidateAttributes to new AttrValidator class
549 1.6.1, released 2007-05-05
550 ! Support for more deprecated attributes via transformations:
551   + hspace and vspace in img
552   + size and noshade in hr
553   + nowrap in td
554   + clear in br
555   + align in caption, table, img and hr
556   + type in ul, ol and li
557 ! DirectLex now preserves text in which a < bracket is followed by
558   a non-alphanumeric character. This means that certain emoticons
559   are now preserved.
560 ! %Core.RemoveInvalidImg is now operational, when set to false invalid
561   images will hang around with an empty src
562 ! target attribute in a tag supported, use %Attr.AllowedFrameTargets
563   to enable
564 ! CSS property white-space now allows nowrap (supported in all modern
565   browsers) but not others (which have spotty browser implementations)
566 ! XHTML 1.1 mode now sort-of works without any fatal errors, and
567   lang is now moved over to xml:lang.
568 ! Attribute transformation smoketest available at smoketests/attrTransform.php
569 ! Transformation of font's size attribute now handles super-large numbers
570 - Possibly fatal bug with __autoload() fixed in module manager
571 - Invert HTMLModuleManager->addModule() processing order to check
572   prefixes first and then the literal module
573 - Empty strings get converted to empty arrays instead of arrays with
574   an empty string in them.
575 - Merging in attribute lists now works.
576 . Demo script removed: it has been added to the website's repository
577 . Basic.php script modified to work out of the box
578 . Refactor AttrTransform classes to reduce duplication
579 . AttrTransform_TextAlign axed in favor of a more general
580   AttrTransform_EnumToCSS, refer to HTMLModule/TransformToStrict.php to
581   see how the new equivalent is implemented
582 . Unit tests now use exclusively assertIdentical
584 1.6.0, released 2007-04-01
585 ! Support for most common deprecated attributes via transformations:
586   + bgcolor in td, th, tr and table
587   + border in img
588   + name in a and img
589   + width in td, th and hr
590   + height in td, th
591 ! Support for CSS attribute 'height' added
592 ! Support for rel and rev attributes in a tags added, use %Attr.AllowedRel
593   and %Attr.AllowedRev to activate
594 - You can define ID blacklists using regular expressions via
595   %Attr.IDBlacklistRegexp
596 - Error messages are emitted when you attempt to "allow" elements or
597   attributes that HTML Purifier does not support
598 - Fix segfault in unit test. The problem is not very reproduceable and
599   I don't know what causes it, but a six line patch fixed it.
601 1.5.0, released 2007-03-23
602 ! Added a rudimentary I18N and L10N system modeled off MediaWiki. It
603   doesn't actually do anything yet, but keep your eyes peeled.
604 ! docs/enduser-utf8.html explains how to use UTF-8 and HTML Purifier
605 ! Newly structured HTMLDefinition modeled off of XHTML 1.1 modules.
606   I am loathe to release beta quality APIs, but this is exactly that;
607   don't use the internal interfaces if you're not willing to do migration
608   later on.
609 - Allow 'x' subtag in language codes
610 - Fixed buggy chameleon-support for ins and del
611 . Added support for IDREF attributes (i.e. for)
612 . Renamed HTMLPurifier_AttrDef_Class to HTMLPurifier_AttrDef_Nmtokens
613 . Removed context variable ParentType, replaced with IsInline, which
614   is false when you're not inline and an integer of the parent that
615   caused you to become inline when you are (so possibly zero)
616 . Removed ElementDef->type in favor of ElementDef->descendants_are_inline
617   and HTMLDefinition->content_sets
618 . StrictBlockquote now reports what elements its supposed to allow,
619   rather than what it does allow
620 . Removed HTMLDefinition->info_flow_elements in favor of
621   HTMLDefinition->content_sets['Flow']
622 . Removed redundant "exclusionary" definitions from DTD roster
623 . StrictBlockquote now requires a construction parameter as if it
624   were an Required ChildDef, this is the "real" set of allowed elements
625 . AttrDef partitioned into HTML, CSS and URI segments
626 . Modify Youtube filter regexp to be multiline
627 . Require both PHP5 and DOM extension in order to use DOMLex, fixes
628   some edge cases where a DOMDocument class exists in a PHP4 environment
629   due to DOM XML extension.
631 1.4.1, released 2007-01-21
632 ! docs/enduser-youtube.html updated according to new functionality
633 - YouTube IDs can have underscores and dashes
635 1.4.0, released 2007-01-21
636 ! Implemented list-style-image, URIs now allowed in list-style
637 ! Implemented background-image, background-repeat, background-attachment
638   and background-position CSS properties. Shorthand property background
639   supports all of these properties.
640 ! Configuration documentation looks nicer
641 ! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
642   characters while %Core.Encoding is set to a non-UTF-8 encoding.
643 ! Support for configuration directive aliases added
644 ! Config object can now be instantiated from ini files
645 ! YouTube preservation code added to the core, with two lines of code
646   you can add it as a filter to your code. See smoketests/preserveYouTube.php
647   for sample code.
648 ! Moved SLOW to docs/enduser-slow.html and added code examples
649 - Replaced version check with functionality check for DOM (thanks Stephen
650   Khoo)
651 . Added smoketest 'all.php', which loads all other smoketests via frames
652 . Implemented AttrDef_CSSURI for url(http://google.com) style declarations
653 . Added convenient single test selector form on test runner
655 1.3.2, released 2006-12-25
656 ! HTMLPurifier object now accepts configuration arrays, no need to manually
657   instantiate a configuration object
658 ! Context object now accessible to outside
659 ! Added enduser-youtube.html, explains how to embed YouTube videos. See
660   also corresponding smoketest preserveYouTube.php.
661 ! Added purifyArray(), which takes a list of HTML and purifies it all
662 ! Added static member variable $version to HTML Purifier with PHP-compatible
663   version number string.
664 - Fixed fatal error thrown by upper-cased language attributes
665 - printDefinition.php: added labels, added better clarification
666 . HTMLPurifier_Config::create() added, takes mixed variable and converts into
667   a HTMLPurifier_Config object.
669 1.3.1, released 2006-12-06
670 ! Added HTMLPurifier.func.php stub for a convenient function to call the library
671 - Fixed bug in RemoveInvalidImg code that caused all images to be dropped
672   (thanks to .mario for reporting this)
673 . Standardized all attribute handling variables to attr, made it plural
675 1.3.0, released 2006-11-26
676 # Invalid images are now removed, rather than replaced with a dud
677   <img src="" alt="Invalid image" />. Previous behavior can be restored
678   with new directive %Core.RemoveInvalidImg set to false.
679 ! (X)HTML Strict now supported
680   + Transparently handles inline elements in block context (blockquote)
681 ! Added GET method to demo for easier validation, added 50kb max input size
682 ! New directive %HTML.BlockWrapper, for block-ifying inline elements
683 ! New directive %HTML.Parent, allows you to only allow inline content
684 ! New directives %HTML.AllowedElements and %HTML.AllowedAttributes to let
685   users narrow the set of allowed tags
686 ! <li value="4"> and <ul start="2"> now allowed in loose mode
687 ! New directives %URI.DisableExternalResources and %URI.DisableResources
688 ! New directive %Attr.DisableURI, which eliminates all hyperlinking
689 ! New directive %URI.Munge, munges URI so you can use some sort of redirector
690   service to avoid PageRank leaks or warn users that they are exiting your site.
691 ! Added spiffy new smoketest printDefinition.php, which lets you twiddle with
692   the configuration settings and see how the internal rules are affected.
693 ! New directive %URI.HostBlacklist for blocking links to bad hosts.
694   xssAttacks.php smoketest updated accordingly.
695 - Added missing type to ChildDef_Chameleon
696 - Remove Tidy option from demo if there is not Tidy available
697 . ChildDef_Required guards against empty tags
698 . Lookup table HTMLDefinition->info_flow_elements added
699 . Added peace-of-mind variable initialization to Strategy_FixNesting
700 . Added HTMLPurifier->info_parent_def, parent child processing made special
701 . Added internal documents briefly summarizing future progression of HTML
702 . HTMLPurifier_Config->getBatch($namespace) added
703 . More lenient casting to bool from string in HTMLPurifier_ConfigSchema
704 . Refactored ChildDef classes into their own files
706 1.2.0, released 2006-11-19
707 # ID attributes now disabled by default. New directives:
708   + %HTML.EnableAttrID - restores old behavior by allowing IDs
709   + %Attr.IDPrefix - %Attr.IDBlacklist alternative that munges all user IDs
710     so that they don't collide with your IDs
711   + %Attr.IDPrefixLocal - Same as above, but for when there are multiple
712     instances of user content on the page
713   + Profuse documentation on how to use these available in docs/enduser-id.txt
714 ! Added MODx plugin <http://modxcms.com/forums/index.php/topic,6604.0.html>
715 ! Added percent encoding normalization
716 ! XSS attacks smoketest given facelift
717 ! Configuration documentation now has table of contents
718 ! Added %URI.DisableExternal, which prevents links to external websites.  You
719   can also use %URI.Host to permit absolute linking to subdomains
720 ! Non-accessible resources (ex. mailto) blocked from embedded URIs (img src)
721 - Type variable in HTMLDefinition was not being set properly, fixed
722 - Documentation updated
723   + TODO added request Phalanger
724   + TODO added request Native compression
725   + TODO added request Remove redundant tags
726   + TODO added possible plaintext formatter for HTML Purifier documentation
727   + Updated ConfigDoc TODO
728   + Improved inline comments in AttrDef/Class.php, AttrDef/CSS.php
729     and AttrDef/Host.php
730   + Revamped documentation into HTML, along with misc updates
731 - HTMLPurifier_Context doesn't throw a variable reference error if you attempt
732   to retrieve a non-existent variable
733 . Switched to purify()-wide Context object registry
734 . Refactored unit tests to minimize duplication
735 . XSS attack sheet updated
736 . configdoc.xml now has xml:space attached to default value nodes
737 . Allow configuration directives to permit null values
738 . Cleaned up test-cases to remove unnecessary swallowErrors()
740 1.1.2, released 2006-09-30
741 ! Add HTMLPurifier.auto.php stub file that configures include_path
742 - Documentation updated
743   + INSTALL document rewritten
744   + TODO added semi-lossy conversion
745   + API Doxygen docs' file exclusions updated
746   + Added notes on HTML versus XML attribute whitespace handling
747   + Noted that HTMLPurifier_ChildDef_Custom isn't being used
748   + Noted that config object's definitions are cached versions
749 - Fixed lack of attribute parsing in HTMLPurifier_Lexer_PEARSax3
750 - ftp:// URIs now have their typecodes checked
751 - Hooked up HTMLPurifier_ChildDef_Custom's unit tests (they weren't being run)
752 . Line endings standardized throughout project (svn:eol-style standardized)
753 . Refactored parseData() to general Lexer class
754 . Tester named "HTML Purifier" not "HTMLPurifier"
756 1.1.1, released 2006-09-24
757 ! Configuration option to optionally Tidy up output for indentation to make up
758   for dropped whitespace by DOMLex (pretty-printing for the entire application
759   should be done by a page-wide Tidy)
760 - Various documentation updates
761 - Fixed parse error in configuration documentation script
762 - Fixed fatal error in benchmark scripts, slightly augmented
763 - As far as possible, whitespace is preserved in-between table children
764 - Sample test-settings.php file included
766 1.1.0, released 2006-09-16
767 ! Directive documentation generation using XSLT
768 ! XHTML can now be turned off, output becomes <br>
769 - Made URI validator more forgiving: will ignore leading and trailing
770   quotes, apostrophes and less than or greater than signs.
771 - Enforce alphanumeric namespace and directive names for configuration.
772 - Table child definition made more flexible, will fix up poorly ordered elements
773 . Renamed ConfigDef to ConfigSchema
775 1.0.1, released 2006-09-04
776 - Fixed slight bug in DOMLex attribute parsing
777 - Fixed rejection of case-insensitive configuration values when there is a
778   set of allowed values.  This manifested in %Core.Encoding.
779 - Fixed rejection of inline style declarations that had lots of extra
780   space in them.  This manifested in TinyMCE.
782 1.0.0, released 2006-09-01
783 ! Shorthand CSS properties implemented: font, border, background, list-style
784 ! Basic color keywords translated into hexadecimal values
785 ! Table CSS properties implemented
786 ! Support for charsets other than UTF-8 (defined by iconv)
787 ! Malformed UTF-8 and non-SGML character detection and cleaning implemented
788 - Fixed broken numeric entity conversion
789 - API documentation completed
790 . (HTML|CSS)Definition de-singleton-ized
792 1.0.0beta, released 2006-08-16
793 ! First public release, most functionality implemented. Notable omissions are:
794   + Shorthand CSS properties
795   + Table CSS properties
796   + Deprecated attribute transformations