Location: PHPKode > scripts > SRESI > doc/CHANGELOG.txt
 - Bug-fix:
    - some of the folder and bookmark paths were never added (a bug
      introduced in 0.19.5, 6 long months ago, and only noticed now);
 - Legal:
    - clarify the license for Tag.ml (which is LGPL with a linking
      exception, as the included INRIA code mandates, instead of GPL
      like the rest of the application).
 - Bug-fixes:
    - output was constrained by the maximum string size
      (16MB on x86), we now use a regularly purged buffer,
    - folder descriptions were not used during XBEL import;
 - Clean-up:
    - Format.ml clean-up backported from the failed 0.19.15 branch,
    - better error reporting for data import;
 - Optimisation:
    - use of buffers accelerated the tree's large output.
 - Bug-fix:
    - fixed a possible collision when several hints influenced a branch;
 - Optimisation:
    - better use of the cache in Tag.Tr.build_branch,
    - faster hash to identify a portal folder.
 - Optimisation:
    - re-use a trick from pre- Tag.Tr.build_branch.
 - Bug Fixes:
    - a pair of bug with tag edition and clouds, leftover
      from an earlier (and persistently nagging) change,
    - hopefully the last of this dreaded family of bugs,
      with bookmarks addition in clouds this time.
 - Bug Fixes:
    - sort the tree branches again;
 - Clean-up:
    - rewrite a cleaner tree generation,
 - Optimisation:
    - use a caching system in Tag.Tr.build_branch.
 - Bug Fixes:
    - really clean the Cloud bug (it was in Tag.Tr.build),
    - reactivate the acidentally removed recursive shortcuts;
 - Clean-up:
    - simplify the Tag.Hints module,
    - simplify the Tag.Shortcuts module.


 - Clean-up:
    - remove all unbalancing optimisations to clarify the code,
    - move message infrastructure,
    - some simplification with bookmarks Views;
 - Legal:
    - change the license for Tag.ml (which is now LGPL with a linking
      exception, as the included INRIA code mandates, instead of GPL
      like the rest of the application).

 - Clean-up:
    - rewrite most of Formats.ml,
    - massive code restructuring,
    - separate the tags database from the bookmarks collection;
 - Regressions:
    - remove all unbalancing optimisations to clarify the code,
    - performance was unacceptably degraded for tree generation,
      with too many changes to track the problem down.

 - Known Bugs:
    - The root optional parameter in Tag.Tr.build does not and
      has never worked: it has just been papered over for now;
 - Bug Fixes:
    - an optimisation in Bookmarks.ml was used inconsistently
      and spoiled many bookmarks selections (including clouds);
 - Clean-up:
    - all Tag.ml functors use abstract types,
    - lots of churn in Set.S functor,
    - some Tag.mli documentation.

 - Bug Fixes:
    - HTMLsresi import did not work without root hints,
    - Tag.Hints.limit extended the hint instead of limiting it,
    - Tag.S.union did not work consistently when an element was in
      both sets (it is now consistent with Tag.S.add behaviour);
 - Clean-up:
    - the cloud tags are not removed from the cloud's bookmarks,
    - some redundant types removed from the Tag functors,
    - remove the Tag.optimisation type and use a named boolean instead,
    - define an element type to describe all the ways a tagged value
      can be identified and use this type to fuse some tag functions,
    - remove the Tree.i/Tree.t distinction;
 - Features:
    - Del.icio.us export lists the forbidden tags if there is a problem.

 - Clean-up:
    - replace the individual tags edition functions by a generic
      edit_tags function and a Tag.edit type,
    - remove dead Tag.Hint module;
 - Features:
    - extract hints and shortcuts from Tag.database,
    - define them as both modules and objects,
    - improve Tree.build (parameters for hints, shortcuts and root
      tags are now optional),
    - add cache-friendly options to their edition functions,
    - add forgotten 'List Shortcuts' option to the PHP scripts.

 - Bug Fixes:
    - root hints were not saved, merged, listed or counted in the stats;
 - Clean-up:
    - some arguments have become optional in the Tags.Set functions;
 - Features:
    - hints are split between hints (for explicit hierarchy declaration)
      and shortcuts (to declare implied tags).

 - Massive code refactoring:
    - the tagged data module now requires a 'hash' function instead
      of a 'compare' one,
    - Tag.ml provides generic functor for everything tagged, up to
      the portal,
    - Bookmarks.ml is built on these generic functors,
    - the code is currently quite messy (read really ugly);
 - Clean-up:
    - some (slight) API improvement and simplification in Tag.ml,
    - the Makefile now uses findlib if available.

 - Clean-up:
    - tagged bookmarks now use functors all the way through,
    - patterns are replaced by test functions built on-demand;
 - Features:
    - there is no pattern simplification anymore (massive rework to do),
    - the cloud management functions can be accessed from standard SRESI.

 - Bug Fixes:
    - tree generation in a cloud added the cloud tags to the tree
      root, which messed with subsequent cloud or portal display,
    - portal exports now work under Windows too;
 - Clean-up:
    - some simplifications in the PHP scripts;
 - Features:
    - support for root-level hints.

 - Bug Fixes:
    - tree generation in a cloud now uses hints correctly;
 - Clean-up:
    - the Tag.database interface was extensively reworked;
 - Features:
    - bookmarks in the collection now integrate hints directly;
 - Optimisations:
    - the Javascript output is back to Torisugari's faster version.

 - Bug Fixes:
    - the hint restriction called the extension method,
    - the TaggedSet.replace functions were quite simply _wrong_;
 - Clean-up:
    - Bookmarks.structures was folded back into Bookmarks.collection,
    - Tag.hints was folded back into Tag.database (preparation for later);
 - Optimisations:
    - hint edition now checks whether to unbalance or dump the structures.

 - Bug Fixes:
    - a quick and dirty fix to the tag count and tag cloud problem
      (a cleaner fix will demand a slight redesign, next version),
    - removed the extra escape_xml in portal titles,
    - fixed cloud management again,
    - hint edition unbalanced the collection even without any structure;
 - Clean-ups:
    - remove the redundant Bookmarks.Invalid_argument exception,
    - removed most of the Tag.No_change use,
    - remove some dead code,
    - turn the portal back from object to modules;
 - Optimisations
    - identify the folders through their tag's hash.

 - Bugfix:
    - the cloud system did not work, period;
 - Clean-ups:
    - change the interface to distinguish between portal bookmarks
      and folders without having to ressort to a trick,
    - push all export functions from the Action to the Format module;
 - Features:
    - remove the min/max from Bookmarks.collection#get_weighted_tags
      (I never used it anyway),
    - unfactorise the various portal export functions, to allow for
      more variation between the portal variants,
    - add a terse portal, lacking even the path information.

 - Features:
    - remove the fragment system,
    - add a view system:
       - only bookmarks in the current view can be edited,
       - the others bookmarks are kept in a safe box,
       - it is possible to recover bookmarks masked in earlier views,
         but only in order,
       - a filter_on_view function discards all bookmarks masked by the
         view (not the cloud),
    - use a similar system for clouds:
       - the cloud restricts the view further, with extra bookmarks kept
       - clouds are cached until an edit renders them outdated,
       - the cloud's tags are redundant and masked in the structures,
       - a filter_on_cloud function discards all bookmarks masked by both
         view and cloud,
    - remove the subset option in most commands,
    - update Interfce.ml; the PHP scripts and the documentation.

 - Bugfix:
    - update the Makefile (Messages.mli depends on Formats.mli),
    - the program state dump was broken;
 - Clean-ups:
    - create a 'structures' object that deals with bookmarks sets, tree
      and portal in a streamlined manner;
 - Optimisations:
    - add a fast element replacement function to the TaggedSet functor,
    - make the use of unbalancing optimisations depend on data size.

 - Bugfix:
    - update the Makefile (Formats depends on Tag);
 - Clean-ups:
    - unify the old 'inner' and 'export' bookmark types,
    - separate tags and paths from the bookmark type,
    - update the Formats functions accordingly,
    - separate get_portal_element into distinct methods for bookmarks
      and folders,
    - add the neglected unit type to functions and methods that need it,
    - move all No_change references to the Tag module's version,
    - separate the tag from the element in the TaggedSet functor,
    - extend the TaggedSet functor to use some functions on the untagged
      element (mem, get and remove).

 - Bug-fix:
    - the tags were not XML-escaped during Del.icio.us export;
 - Clean-ups:
    - isolate tags and their related functions in their own module,
    - separate the tags from the inner bookmark type;
 - Optimisations:
    - do a special set functor for tagged elements, where the tags are
      not involved in the set ordering and can be changed without hassle,
    - the bookmark rename and update function work from the URL or its
      hash and change the interface and PHP scripts accordingly.

 - Bug Fixes:
    - Tag.S.union did not work consistently when an element was in
      both sets (it is now consistent with Tag.S.add behaviour).
 - Bug Fixes:
    - HTMLsresi import did not work without root hints;
 - Features:
    - Del.icio.us export lists the forbidden tags if there is a problem.
 - Bug Fixes:
    - root hints were not merged, listed or counted in the stats.
 - Bug Fixes:
    - root hints were not saved.
 - Bug Fixes:
    - hints were used incorrectly during tree generation (again).
 - Bug Fixes:
    - the hash did not change when a bookmark's URL was updated,
    - the loose name and URL pattern matches were case-sensitive,
    - slight upgrades to the Makefile.

 - Optimisations:
    - bokmarks path computation is now done during portal generation, with
      said paths recorded in the portal (indexed by the bookmark hash).

 - Clean-ups:
    - some dead code removal and cosmetic arrangements,
    - update the help and error messages,
    - simplify the Messages.mli interface and update Action.ml
      and Interface.ml accordingly (including some unplanned-for
      consequences that muddy-up said modules),
    - change --limit-hint/-hl to --restrict-hint/-hr to avoid
      the collision with --list-hints/-hl;
 - Features:
    - the Messages.ml rewite using the pretty-printing library
      did not pan out, said library eludes me at this time;
 - Optimisations:
    - hintDB now saves and restores its derived tables too,
    - collection now also saves the portal,
    - we check for the All pattern to speed up bookmarks selection.

 - Clean-ups:
    - rewrite the hintDB object so its interfaces fit the real needs,
    - update Pattern.parse to leverage the hintDB object,
    - ditto for the tree-building functions,
    - small clean-ups in the tags and hints modules and objects,
    - the Windows port should be able to find its resources wherever it
      is installed in (with resources in the ./resources sub-directory).

 - Bug Fixes:
    - the self-completed hints were not discarded when the hints changed;
 - Clean-ups:
    - the Makefile was tuned a bit,
    - a '-s' shorthand for '-stats' was added, since the original '-s' has
      been replaced by '-bf' for a long time,
    - some dead code was removed (hint sets);
 - Optimisations:
    - the hints database was rewritten to allow a search by descendants too,
    - hint use was changed accordingly.

 - Bug Fixes:
    - SRESI deals more gracefully with multi-hints branches;
 - Clean-ups:
    - a slightly better separation between the Action and Message modules,
    - the PHP-specific options cannot be accessed outside of the PHP call;
 - Optimisations:
    - replace sets by a Hashtbl-based object for hints.

 - Bug Fixes:
    - remove debug echoes in the PHP scripts;
 - Optimisations:
    - replace sets by a Hashtbl-based object for folders.

 - Bug Fixes:
    - the exact tag list selection pattern and hints interacted badly,
    - the light portal export messed up the bookmark links;
 - Optimisations:
    - slight modifications to the tree-generation algorithm (the time
      benefits are data- and CPU-dependent, but its always saves RAM).

 - Clean-ups:
    - a better Makefile, thanks to Philippe Coval,
 - Optimisations:
    - Greatly improved tree-generation algorithm.

 - Bug Fixes:
    - restore the forgotten executable stripping in the Makefile;
 - Features:
    - completely rewrite the tree building functions.

 - Bug Fixes:
    - catch forgotten exception in selection parsing (exact tag list);
 - Features:
    - limit the tag cloud to significant tags (new limits computation
      based on geometrical mean, including a masking level),
    - add single/double column switch to portal outputs,
    - change the tree-generation algorithm (leaner, slightly faster, I
      did not follow my reasoning all the way last time I rewrote it),
    - add branch ordering to tree export,
    - tweak the portal, cloud and CSS.

 - Bug Fixes:
    - improve and debug the paths management functions;
 - Features:
   - add a partial tag list (ease of use, equivalent to a series of AND),
   - optimise the rename/update_bookmark functions,
   - display DSV and Opera correcly in the PHP scripts (extra <PRE> and
     </PRE> to remove when saving the results, though),
   - add a tag cloud output.

 - Bug Fixes:
    - an optimisation with add_bookmarks and portals revealed an old bug
      by preventing additions to an empty collection.

 - Bug Fixes:
    - a few bugs regarding the balanced status,
    - yet another bug about pattern parsing in the interface;
 - Code hygiene:
    - simplify and rework the Bookmarks.collection methods,
    - cull some dead code in Bookmarks module;
 - Features:
    - add No-Cache pragma to dynamic portal,
    - add the swap-tags function to the dynamic portal,
    - drop structures before a merge,
    - add the bookmark addition optimisation for folders and paths,
    - add the tag edition optimisations.

 - Bug Fixes:
    - many functions were not up-to-date between CLI interface, help
      messages and PHP scripts,
    - the pattern parsing in the interface failed for names, URL
      and tag list matches,
    - the selection pattern in rename_bookmarks was reversed,
    - a few fixes in the output formats,
    - the tag count function did not work on a collection subset;
 - Code hygiene:
    - massive clean-up and code factoring in all Portal outputs;
 - Features:
    - the tag count function now takes hints into account,
    - add optimisations for bookmarks filtering and addition.

 - Bug Fixes:
    - the interface choked on empty selection patterns instead of sending
      back everything;
 - Code hygiene:
    - factored some code in the Bookmarks.collection methods,
    - slight interface cleanup;
 - Features:
    - SRESI escapes and unescapes vertical bars in DSV,
    - add a tag count function (no cloud yet),
    - add partial exports (including portals, with cache),
    - added the framework for unbalanced structures (not used yet).

 - Bug Fixes:
    - HTMLsresi import did not work,
    - HTMLsresi export is more elegant with tag-less bookmarks and
      silently suppresses descendant-less hints (port from 0.16.2),
    - Mozilla export was flawed (extra newline in folder names),
    - SRESI is now more tolerant with Del.icio.us exports (port from 0.16.1),
    - DSV exports warn on | in tags and titles (port from 0.16.1),
    - catch forgotten exceptions in selection parsing,
    - miscellaneous small presentation fixes;
 - Features:
    - the selection grammar changed,
    - an exact tag list selection pattern was added.

 - Bug Fixes:
    - caught a forgotten exception in XML-based import functions,
    - tags were not renamed when the old lowercase form was the same as
      the new one (spotted by Andrey Bondarenko);
 - Code hygiene:
    - removed some useless messages left over from the loop interface;
 - Features:
    - better error reporting in Formats.ml;
 - Optimisations:
    - tag renaming now throws a No_change exception when the old and new
      tags are displayed the same way,
    - slight performance tweak in swap_tags.

 - Code hygiene:
    - bookmarks collection and program state are now objects, and all
      related functions have been rewritten in consequence;
 - Interface:
    - declaring an export as the default one is now an option on the export
      switch and action;
 - Regressions:
    - the documentation and comments are not up-to-date,
    - no more balanced/unbalanced optimisations,
    - the archive format only saves the data, not the structures anymore,
    - the interfaces will change somewhat;
 - Optimisations:
    - tags are now indexed, and their comparisons are done on their (integer)
      index instead of the strings themselves.

 - Features:
    - SRESI escapes and unescapes vertical bars in DSV,
    - add tag count/(embryonic) tag cloud function.

 - Bug Fixes:
    - HTMLsresi export is more elegant with tag-less bookmarks and
      silently suppresses descendant-less hints,
    - HTMLsresi import does not choke on descendant-less hints  or tag-less
      bookmarks anymore (Andrey Bondarenko),
    - the parser for selection patterns now recognises escaped quotes.

 - Bug Fixes:
    - backport the missed XML exception from 0.17.1,
    - backport the tag renaming bug from 0.17.1,
    - warn the user when exporting to DSV bookmarks with vertical bars
      in titles or tags (spotted by Andrey Bondarenko),
    - more tolerant export to Del.icio.us;
 - Code hygiene:
    - removed some useless messages (backport again);
 - Features:
    - backport the better error reporting in Formats.ml.

 - Features:
    - SRESI now handles UTF characters more or less correctly, using a double
        tag memorisation (one for comparisons, one for display).

 - Code hygiene:
    - first attempt at an object rewritet rying to change things progressively,
    - dead from beginners' mistakes, too much hassle and the progressive attempt
        gave too little interest to fix them instead of starting over,
    - still a good experience before the next attempt.

 - Bug Fixes (both spotted by Andrey Bondarenko again):
    - two typos messed DSV import, though not for sresi-generated files,
    - renaming a tag on the whole bookmark set just plain did not work
        (I had accidentally cut out the actual work during one of my
        optimisation runs: now that was fast performance!).

 - Bug Fixes:
    - the URL normalisation function was completly rethought and rewritten
        by Andrey Bondarenko to not choke on local files anymore (not perfect
        yet, but much better and cleaner),
    - an old XBEL export bug was finally found and squashed;
 - Code hygiene:
    - some minor clean-ups,
    - simplify the Bookmarks.simplify_pattern functions.

 - Features:
    - the tree-building algorithm now uses hints yet another way (my best
        to date, for what it's worth; raw code in dire need of a clean-up).

 - Code hygiene:
    - rewrite XBEL import alias management;
 - Documentation:
    - add the exemples to the distribution packages;
 - Features:
    - Torisugari's folder icons are now inlined,
    - the tree-building algorithm uses hints somewhat more smartly (not the
        final version yet, but getting close).

 - Bug Fixes:
    - add_bookmark killed the bookmarks paths even though they were correct,
    - delete_hint unbalanced the collection even when no structure was built,
    - SRESI was not able to read the Mozilla bookmarks files it generated,
    - use the fast (exception-free) version of create_bookmark while parsing
        HTML SRESI;
 - Features:
    - the Torisugari export did not work on old Konqueror versions,
    - Torisugari's folders got their icons back.

 - Bug Fixes:
    - changing a bookmark's URL did not change its hash;
 - Code hygiene:
    - the bookmark type now uses the hexadecimal version of the MD5 hash,
    - get rid of the cumbersome Loop interface (state dumps obsolete it).

 - Code hygiene:
    - remove the complex and ultimately useless portal naming scheme,
    - get_portal_element now always sends back bookmarks with their paths;
 - Features:
    - add a separate PHP export to replace the previous naming hack,
    - add edition functions to the PHP portal.

 - Bug Fixes:
    - the (inaccessible) Hash search pattern did not work;
 - Code hygiene:
    - some simplifications, but the code needs an overhaul;
 - Features:
    - add per-element portal output to the CLI,
    - add the portal output to the PHP scripts,
    - put together a quick hack to remove favicons from Mozilla bookmark
        files (nofav.ml, standalone program, not in the Makefile).

 - Code hygiene:
    - simplify the XML import modules (not yet over),
    - write a more efficient simplify_pattern,
    - better use of auto-display;
 - Features:
    - the last tag operations unbalance the structures instead of voiding them,
    - fuse SRESI Exchange and Flat HTML into HTML Sresi (useful at last),
    - the portal formatting types memorise their filenames pattern,
    - add cache control (-undo and -redo) to the CLI,
    - the PHP scripts give access to most functions (except for portals),
    - addition of Javascript and CSS in the PHP scripts.

 - Bug Fixes:
    - fixed (badly) a bug in Mozilla import (multi-line descritions);
 - Features:
    - a rough but functional PHP interface (access most of the CLI),
    - sresi can now send messages in plain text or HTML,
    - add a dump and restore function to save program state,
    - archive saves the current (balanced) structure by default,
    - finally realised there was no provision for hints in the CLI,
    - sresi can set an automatic display, done after each edition operation.

 - Bug Fixes:
    - hint use is now correct in tree generation,
    - add forgotten collection title in Mozilla bookmarks parsing,
    - suppress the useless empty lines during light portal exports;
 - Code hygiene:
    - optimise hint use in tree generation;
 - Features:
    - leftover bookmark tags are displayed in portal folders,
    - add the balance instruction to Interface.Loop,
    - adding a bookmark places it automagically where it fits best
        in the existing structures (which still become unbalanced).

 - Code hygiene:
    - some editing in Messages.ml,
    - some API changes in Bookmarks.mli,
    - rewrite the format identification and management in Formats.ml,
    - rewrite the portal and portal element exports in Formats.ml,
    - a smattering of small adjustments;
 - Features:
    - add a new format (DSV-equivalent XML, not the performances expected),
    - add the possibility to archive the data with a given detail level,
    - hook the structure functions (balance, build, drop, set) to the
        application engine,
    - hook the export of portal elements to the application engine,
    - warn of structure imbalance in the user-oriented outputs (Javascript
        and portals),
    - give a structure balancing option in the CLI.

 - Code hygiene:
    - completely change the Bookmarks.ml data structures (simpler bookmarks
        indexing and portal generation, no more code duplication, leaner API).

 - Bug Fixes:
    - the Del.icio.us import crashed when there was no user name,
    - faulty input could crash the DSV import;
 - Code hygiene:
    - catch some impossible exceptions in data import and send back their
        circumstances if they do come up.

 - Bug Fixes:
    - some portal generation functions were a bit off (not buggy per se,
        but weird nonetheless);
 - Code hygiene:
    - replace the function to upgrade a portal from light to complete with
        a backport from the upcoming 0.13 branch (about fivefold increase),
    - adjust a few functions to handle the new situation.

 - Bug Fixes:
    - portals built from unbalanced trees were not declared as unbalanced.

 - Bug Fixes:
    - fix regression in bookmarks renaming and updating for trees,
    - correct some faulty documentation;
 - Code hygiene:
    - turn some convoluted functions to the one-liners they should
        always have been (some tests on tags and bookmark sets),
    - warning: some ugly code bloat (removal on the 0.13 agenda);
 - Features:
    - bookmark renaming and updating now propagate in portals too.

 - Bug Fixes:
    - the calling name for the full portal was changed and not propagated
        everywhere (Interface.CLI),
    - a change with the collection title and tree root was not propagated,
    - fixed a last bug in tree mapping,
    - unmask two exceptions in Bookmarks.ml that should be caught later;
 - Features:
    - add_bookmark now unbalances the tree too,
    - added a quick and dirty version of Tree.add_tags,
    - the hint edition functions now unbalance tree and portal.

 - Bug Fixes:
    - the unbalanced tree generation was a sorry mess;
 - Features:
    - change data structures to:
      - allow unbalanced trees too,
      - reduce code duplication,
    - some code reordering to facilitate tree modifications,
    - ensure we only archive balanced data structures,
    - hook some more library functions to the application engine,
    - an attempt at improving bug reporting

 - Bug Fix:
    - catch a forgotten exception in Bookmarks.simplify;
 - Code hygiene:
    - put the treatment of Malformed URLs in the application, not the
        library (widespread changes, in Action, Bookmarks Formats and
    - a few changes in Bookmarks.ml;
 - Features:
    - add a bookmark update function,
    - invalidate the tree and portals a bit less often (rename and update
        bookmark, sometimes also tag renaming for the tree, add and delete
        bookmarks for the portals).

 - Bug Fix:
    - forgot to use hints in selections;
 - Code hygiene:
    - rewrite hints use in Bookmarks.simplify;
 - Features:
    - rewrite Bookmarks.need_hint to avoid some useless redundancy (BUG:
      works but should not),
    - also merges hints when merging bookmarks collections,
    - adding bookmarks unbalances portals instead of invalidating them,
    - slight API addition.

  - Code hygiene:
    - hide some code in unexported modules (Hints and Bookmarks in Bookmarks.ml),
    - some style clean-ups,
    - remove some useless baggage,
    - small bugfix in portal exports;
 - Features:
    - add flat HTML export.

 - API changes:
    - configurable header, separator and footer in Formats.print_(xml_)tags,
    - data import function for the two easy (XBEL) formats;
 - Bug Fix:
    - Delicious export did not raise an exception with complex tags.

 - Bug Fix:
    - fixed rare but idiotic bug in XBEL import (folder aliases),
    - fixed bug XBEL import (no title),
    - some windows portability bugs;
 - Code hygiene:
    - a few API improvements,
    - the API documentation,
    - replace the build shell script by a Makefile,
    - slight clean-up and extension of the CLI interface,
    - make Action use advanced types,
    - move the creation of advanced types to the interface,
    - removal of all Sys.command instructions,
    - replace the homebrewed Cache by OCaml Stack,
    - suppression of (much) obsolete baggage,
    - consolidation of many modules:
       - the bookmarks engine in Bookmarks,
       - the formatting and I/O in Formats,
       - the program engine in Action,
       - the user interface (what there is of it) and main() in Interface;
 - Features:
    - add Del.icio.us import and export,
    - add Mozilla import,
    - add "Light" portal structure and export (folder files only),
    - bite the bullet and add balanced/unbalanced portals (no use yet),
    - multi-layered definition of formatting types,
    - beginning of stylesheets support (in XBEL, Javascript, Portal),
    - try and do something about default styles (unfinished),
    - Windows support.

 - Bug Fix:
    - fixed subtle (and theorical) bug in Portal generation,
    - fix small bug in Opera export (extra ");
 - Code hygiene:
    - very slight clean-ups about everywhere;
 - Feature:
    - add Opera import (cleaner and easier than Mozilla).

 - Bug Fix:
    - fixed bug in Opera export (replace URL by bookmark title);
 - Code hygiene:
    - use the standard way of accessing data structures defined in other
      modules (and remove the now useless data access functions);
    - slight tweaks to the compilation script.

 - Bug Fix:
    - do not memorise the tree root in BmkPortal and adapt FmtPortal
      accordingly (very slight performance and memory optimisation in
      addition to presentation bugfix),
    - better parsing in FmtDSV;
 - Code hygiene:
    - when parsing an XBEL file, use the hierarchy when parsing tags,
      instead of parsing each bookmark's tag set individually (sadly
      no significant performance improvement on my own files, but
      surprisingly enough an archive file size reduction);
 - Feature:
    - finally add the rename portail function.

 - Code hygiene:
    - BmkPortal rewrite (cleaner, much faster).

 - Bug Fix:
    - IfLoop did not pass parentheses to Select,
    - stupid bug with parentheses in Select;
 - Code hygiene:
    - better and easier solution for the infinite recursion in Select,
    - some rework and simplification of the tree generation,
    - very slight simplification in BmkPortal,
    - more accurate error reporting in Select.

 - Bug Fix:
    - corrected a mismatch between IfLoop and the help messages,
    - more tolerant parsing of filenames in IfLoop, better help message,
    - stupid infinite recursion in Select when dealing with hints;
 - Code hygiene:
    - better integration of the former ExtParse functions in IfLoop.

 - Bug Fix:
    - deal with the DTD problems in FmtXBEL.

 - Code hygiene:
    - change the DSV format for better clarity, rewrite FmtDSV accordingly,
    - move the former DSV format to FmtOldDSV for compatibility purposes,
    - update relevant comments and documentation,
    - remove TagHint.get_tags function and its references.

 - Bug Fix:
    - the hints did not recurse correctly.

 - Bug Fix:
    - replace the Caml lexer used in Select by a homemade function and
      rewrite large parts of the parser to solve the last problems with
      faulty user input,
 - Code hygiene:
    - move selection parsing from Action to Bookmarks,
    - some clean-ups,
    - some degradations related to the new features, to be cleaned ASAP,
    - some more documentation,
    - some more comments,
    - some more error messages,
    - add copyright information to all code files;
 - Features:
    - the title is now saved in and read from the DSV file,
    - add a tag hint feature: a tag (possibly virtual) can be declared as
      'master tag' relative to a list of other tags: it will be used both
      to build a bookmarks tree more relevant to user's expectations and
      as a 'container' tag in searches (no recursion, however).

 - Bug Fix:
    - replace the Caml lexer used in Select by a homemade function and
      rewrite large parts of the parser to solve the last problems with
      faulty user input,
    - deal correctly with dots in IfLoop,
    - rework the portal output and stylesheet,
    - add a long forgotten ExtString.unescape_xml in FmtPortal;
 - Code hygiene:
    - integrate ExtParse to IfLoop.

 - Bug Fix:
    - an URL produced instead of ExactURL in Select.parse_ExactURL,
    - there are still bugs with badly formed user input, a rewrite of the
      Select module will be necessary, with adaptations elsewhere (for 0.10);
 - Code hygiene:
    - a better test for agglomerated operators.

 - Bug Fix:
    - in Select again, another instance of the previous bug with badly
      formed user input;
 - Code hygiene:
    - one more help messages (for Selection errors).

 - Bug Fix:
    - found and dealt with a forgotten exception I never caught,
    - make Select more tolerant of badly-formed user input;
 - Code hygiene:
    - some more help messages,
    - simplifications in the IfLoop function.

 - Bug Fix:
    - some stupid mix-up in Selection: the criteria were not normalised;
 - Optimisations:
    - some optimisations in Select too, while I was there.

 - Code hygiene:
    - found a more complete coding style, try and use it,
    - major clean-ups everywhere,
    - more tolerant parsing of selection patterns,
    - a smarter compilation script;
 - Features:
    - harsher tag normalisation function (everything lowercase),
    - restore the ExtURL.clean function in a saner form,
    - set the archive format as default,
    - an HTML + Javascript export (thank you again, Torisugari!),
    - an Opera export,
    - XBEL import (using the XML-Light library, licensed under the LGPL,
      http://tech.motion-twin.com/xmllight.html), including aliases;
 - Optimisations:
    - add a selection pattern simplification function,
    - make safe and unsafe versions of tag functions, to limit the use of
      ExtTag.clean function (useful at low level, not so much further up),
    - replace many lists by sets,
    - rewrite the tree generation algorithm (much smarter and faster),
    - redefine the Portal data structures for less redundancy, rewrite
      the generation algorithm (a tad faster and far less disk waste).

 - Bug Fix:
    - the clean_url function would have choked in many cases,
      got rid of it (this prevents selection by exact URL);
 - Code Hygiene:
    - use the Str module where applicable,
    - remove some more useless functions;
 - Features:
    - remove the clean_url function, no good with little real use;
 - Optimisations:
    - begin removing duplicate and useless function calls.

0.8.0: First 'stable' release
 - Bug Fix:
    - corrected a problem with keys written both uppercase and lowercase
      (everything normalised, first letter uppercase and the rest lowercase,
      otherwise it is a pain for searches);
 - Code Hygiene:
    - replace the bool * data structures by 'option' types,
    - remove some useless functions;
 - Optimisations:
    - begin replacing functions by their tail-recursive equivalents,
    - rewrite, optimise or remove some extended list functions,
    - rewrite BookmarksTree.build (less code reuse, but more efficient).

 - Bug fixes:
    - rewrite of the parsing functions in the Select module,
      clean-up and recovery of the forgotten '!' operator,
    - corrected an inverted test in 'delete keys';
 - Clean-ups:
    - improve some error messages,
    - the cache defaults at three levels in the interactive
      mode and 0 in the CLI mode.

 - Features:
    - 'version' switch and command,
    - 'add key' and 'delete key' are now 'add keys' and 'delete keys'.

 - Clean-up:
    - the interactive mode was simplified a bit.

 - Bug fixes:
    - program exit repaired;
 - Features:
    - the key listing and export can work from a subset,
    - the interactive mode can take several commands per line.

 - Bug fixes:
    - much more stable interactive mode;
 - Massive rewrite and code refactoring of the 0.6.0 version:
    - data structure changes,
    - more extensive use of exceptions,
    - cleaner Messages and IO modules,
    - each type definition went back to its own module,
    - split some modules,
    - some comments work;
 - Features:
    - a caching system,
    - many modules extended.

 - Code hygiene:
    - move the type declarations to their own module (is it a good idea?),
    - a messaging/reporting system;
 - Core:
    - structure changes: add sresi_state (title, list, tree and portal),
    - many rewritten functions (action, search, tests mostly),
    - interfaces:
       - new interface (interactive),
       - the interactive interface can get its orders and send its results
         from and to any channel, including named pipes,
       - each interface in its own module;
 - Features:
    - add serialised value save and restore,
    - add an out-of-program XBEL import function;
 - revamp web site and documentation.

 - Slight change to the web page and documentation's CSS;
 - Bug fixes:
    - corrections and optimisations related to pretty-printing;
 - Features:
    - the title is now an optional runtime parameter,
    - the folders are now sorted in alphabetical order,
    - slight adjustment to the portal CSS;
 - Optimisations:
    - optimise a few functions,
    - remove some redundant function calls.

 - Give the program a name (sresi);
 - Code hygiene:
    - revamp the compile.sh script,
    - remove the makefile,
    - some more code documentation;
 - Write the web page, including a revamp of the documentation;
 - Features:
    - portal export:
       - the style is slightly different (again),
       - two-columns style-sheet with icons;
    - "-o" tag added to redirect the output to a file or a directory.

 - Code hygiene:
    - slight clean-ups;
 - Features:
    - portal structure:
       - slight changes: more deductible information is memorised to
         optimise later treatments (including the actual export);
    - portal export:
       - now exported in standard-compliant XHTML 1.0 strict,
       - the style is slightly different,
       - the beginnings of a style-sheet.

 - Features:
    - slight structure change in the portal data structures,
    - the generated portal is now finer-grained.

 - Code hygiene:
    - move the titling of the tree from IOStyle to BookmarksTree,
    - remove uselessly opened Bookmark from ExportMozilla.mli,
    - move the print_endline from Action to IOStyle, necessary
      for file-printing,
    - move the style indentification from Signet to IOStyle and
      accordingly remove identify from IOStyle.mli;
 - Features:
    - the portal structure is now correct and complete,
    - generate a simple XHTML export from the portal structure;
    - add a file management module (nearly empty for now).

 - Features:
    - back to the portal export, new algorithm that actually works,
    - still for the portal, create and index the bookmarks list.

 - Bugs:
    - the clean_isolated_folders function destroyed some bookmarks, it
      has been replaced by an optmisation in the treatment of equivalent
      root keys,
    - this also solves the title problem much more elegantly,
    - Malformed URLs and DSV are more visible;
 - Optimisations:
    - equivalent bookmarks are treated as such as soon as they are found.

 - Bugs:
    - the clean_isolated_folders function considers the title as a tag
      like any other, and sorts it alphabetically (hack, add low-value
      chars around the title);
 - Code hygiene:
    - move the tree-building function from IOStyle to BookmarksTree;
 - Features:
    - beginning of a portal export, with navigation data (only the
      folders at this time).

 - Bug fixes:
    - There were many places where keys were not pretty-printed,
      making comparisons hasardous: everything was folded back in
      the comparison functions for safety,
    - listing the keys really closes the process now;
 - Code hygiene:
    - the usage function is now up-to-date;
 - Core changes:
    - bookmark trees may now have several keys,
    - isolated folders are simplified as well as isolated bookmarks.

 - Code hygiene:
    - some clean-ups,
    - move search pattern printing from Action to Search,
    - move the titling to the export function;
 - Features:
    - improve the URL cleaning functions,
    - improve loose URL matching,
    - add empty search pattern (select all),
    - add edition functions.

 - Code hygiene:
    - the search pattern parsing built for keys and hacked
      for URLs and titles has been reworked and streamlined,
    - the test code now remains accessible without a recompile,
    - style clean-ups according to the style guide,
    - add a basic README file;
 - Features:
    - add (some) special characters to the search patterns,
    - add the basics for bookmark edition.

 - Bugs:
    - the program stopped reading parameters after '-l';
 - Copyright concerns:
    - rewrite the borrowed parts,
    - add a license (GPL);
 - Code hygiene:
    - clean-ups,
    - clean_URL moved to ExtendedString, with
      the Bookmark version using the new one,
    - write a loader for the interpreter;
 - Features:
    - add string comparison to ExtendedString,
    - add search by name and URL, partial searches only,
      no special characters,
    - optimise negative searches,
    - most boolean functions can now work both ways.

 - Bugs:
    - change the order of actions;
 - Code hygiene:
    - splitting Action from the main program,
    - style clean-ups according to the style guide,
    - better help message;
 - Features:
    - add Search module for complex searches (only key-based for now),
    - unify the different searches,
    - add FormatStyle module:
       - identify formats,
       - build a bookmarks tree when necessary,
       - call the correct function to export them;
    - New export formats:
       - DSV,
       - Mozilla.

 - Bugs:
    - field separator in DSV becomes '|', as ';'
      is a legal character in URLs,
    - tabulations are considered as spaces in the
      string cleaning functions,
    - search by capitalised name becomes a separate
      function (though still a stub);
 - Code hygiene:
    - splitting Tools again (Strings and Lists modules);
    - splitting DSV from Bookmark;
    - style clean-ups according to the style guide,
 - Interface:
    - better error reporting for unimplemented options,
    - request ordering and sequencing,
    - implementation of key listing;
 - Data integrity:
    - Keys are capitalised (' ' and '-' as word separators);
    - URLs are cleaned somewhat (some errors are caught and reported).

 - Code hygiene:
    - style clean-ups according to the style guide,
    - replacing custom functions with standard ones,
    - joining the tools (Strings and Lists) modules;
 - Interface:
    - smarter error reporting for malformed bookmarks,
    - more command-line arguments and basic analysis,
      but only present as stubs.

 - Code hygiene:
    - style clean-ups according to the style guide,
    - replacing custom functions with standard ones,
    - splitting the code in modules;
 - XBEL export corrections;
 - Interface:
    - rudimentary main function,
    - bookmarks file as parameter,
    - basic error reporting,
    - rudimentary compilation script.

 - code clean-ups;
 - bookmarks sanitising:
    - remove leading, trailing and duplicate white spaces,
    - all keys stored in lower case;
 - key renaming;
 - selection:
    - by keys one has,
    - by keys one doesn't have.

 - bookmarks sanitising:
    - removal of duplicate keys,
    - key ordering;
 - DSV bookmarks:
    - DSV import in CAML,
    - DSV export;
 - XBEL export finalised.

 - new core algorithm and corresponding rewrite,
   the core is now finished;
 - some comments.

Older versions are not worth bothering with.

 - tree simplification functions.

 - basic concepts and exhaustive tree generation.
Return current item: SRESI