2019-07-09  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-19

       * Fix javascript build error,  and some favicon errors.


2019-10-09  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M5-git-18

       * [JSPWIKI-1115]: a few more dependency upgrades before 2.11.0-M5
         * Commons Text to 1.8
         * Flexmark to 0.50.40
         * Hsqldb to 2.5.0
         * JUnit to 5.5.2
         * Lucene to 8.2.0
         * Selenide to 5.3.1

2019-07-09  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-17

       * Few critical sonarcloud fixes; added clean parsing of "skin" parameter

2019-31-08  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-16

       * Fixed InfoContent.jsp vulnerability in old jspwiki template (templates/211/...)
         related to the rename parameter.

       * Fixed preview.jsp vulnerability related to the remember parameter.


2019-31-08  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-15

       * Improve UI accessibility (ref. sonarcloud report)

2019-27-08  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-14

       * XSS vulnerability on the page rename parameter

       * Few sonarcloud fixes

2019-24-08  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-13

       * Various small fixes in html & jsp files, reported by sonarcloud.

2019-24-08  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M5-git-12

       * [JSPWIKI-1115]: Upgrade flexmark to 0.50.28 and tomcat to 8.5.45

       * Ended up removing/replacing all @Deprecated code

2019-21-08  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-11

       * [JSPWIKI-1097] Various smaller JS refactorings, and bugfixes.

       * Clean up several minor JSP bugs reported by sonarcloud.

2019-08-19  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M5-git-10

       * Removed @Deprecated code. A complete analysis of what have changed will be available at
         http://jspwiki.apache.org/japicmp/index.html once 2.11.0.M5 gets released

       * [INFRA-18845]: switch Sonar instance to sonarcloud.io

2019-08-16  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M5-git-09

       * [JSPWIKI-893]: Cannot search for bold words with GermanAnalyzer

       * replaced all deprecated code

       * [JSPWIKI-1115]: Upgrade SLF4J to 1.7.28 and commons-lang from 2.6 to 3.9
         * dev-only breaking change: if you were using commons-lang transitively on your extension,
           you must declare it explicitly or migrate it to commons-lang 3

2019-08-06  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M5-git-08

       * [JSPWIKI-427]: Keywords for Lucene Index

       * [JSPWIKI-1114]: Show only part of Weblog entry on the overview page. Contributed by
         Ulf Dittmer, thanks!

       * [JSPWIKI-1115]: Upgrade bundled dependencies for 2.11.0.M5
         * Flexmark 0.50.26
         * JUnit 5.5.1
         * Lucene 8.1.1
         * Selenide 5.2.8
         * Tika 1.22
         * Tomcat 8.5.43

2019-16-07  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-07

       * [JSPWIKI-1097] Various smaller JS refactorings, and bugfixes.

       * Trim spaces from the rendered html to reduce page weight.

2019-09-07  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-06

       * [JSPWIKI-427]: Adding keyword support for JSPWiki pages.
         Use [{SET keywords=a,b,c}] to add keywords to a page.
         They will be shown in the info drop-down menu, and are added as
         META tags to your page.

       * Remove XSS vulnerability on the plain editor section drop-down

       * [JSPWIKI-1097] Various smaller JS refactorings


2019-04-07  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-05

       * Adapt to JAVA EE 7 XMLS scheme namespace to support container authentication.
         Minimum requirement since 2.11.0-M1 is JSP Servlet 3.1.
         (testcases with older web.xml still to be updated)


2019-06-15  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-04

       * [JSPWIKI-1097] Refactored %%collapse and %%collapsebox.
         Added keyboard support to expand/collapse lists and boxes. Bugfixes on cookie handling.


2019-05-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-03

        * [JSPWIKI-1112] EDITOR input fields (changenote,comment-signature )
          vulnerable to XSS.

       * [JSPWIKI-1097] Minor JS updates (cookie handling, %%collapse)


2019-05-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-02

        * Improved styling of the WYSIWYG editor toolbar

       * [JSPWIKI-1111] Improve handling of &entities;  in the WYSIWYG editor.

       * Improve the web app manifest making JSPWiki a progressive web app.
         You can now install JSPWIKI on the homescreen of your mobile device or tablet
         for quicker access and improve experience.

       * [JSPWIKI-1097] JS updates to start replacing mootools.js  (cookie handling)


2019-05-17  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M5-git-01

       * Accessibility improvements (ref. https://accessibilityinsights.io)

2019-05-11  Juan Pablo Santos (juanpablo AT apache DOT org)

       * prepare release for 2.11.0.M4

2019-05-02  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M4-git-13

       * [JSPWIKI-469] new TikaSearchProvider to index a lot more of attachments. It is not bundled
       by default, as it brings in a lot of dependencies (+55MB).
         * See https://jspwiki-wiki.apache.org/Wiki.jsp?page=TikaSearchProvider for installation instructions
         * Search provider contributed by Ulf Dittmer, thanks!

       * LuceneSearchProvider now indexes all attachment filenames, whether their content is parsed or not,
       and also scans .md and .xml files.

       * Updated missing es translations


2019-05-01  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-12

       * [JSPWIKI-1104] InsertPagePlugin now also supports cookie based
         inserts.
         The UserPreferences page has been extended to allow the users to view and
         delete page-based cookies.


2019-04-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-11

       * [JSPWIKI-1107] Fixing XSS vulnerability in the navigation breadcrumbs (Trail link)

       * Small ui improvement: make Attachment lists sortable on the attachment size field


2019-04-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-10

       * [JSPWIKI-1107], [JSPWIKI-1109] Fixing XSS vulnerability in various plugins.

       * [JSPWIKI-1106] Adding the jspwiki.attachment.forceDownload property


2019-04-28  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M4-git-09

       * [JSPWIKI-1110] Upgrade bundled dependencies for 2.11.0.M4

       * generate aggregated javadocs for http://jspwiki.apache.org/apidocs/index.html

2019-04-27  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-08

       * [JSPWIKI-1107] fixing file-type vulnerability

       * Fixing consistency of the sidebar collapse in Upload.jsp

2019-04-25  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-07

       * [JSPWIKI-1107] uploading attachments with illegal filename causes XSS vulnerability
         Fixing file upload vulnerability.

2019-04-23  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-06

       * [JSPWIKI-1109] ReferredPagesPlugin with illegal characters in parameters
         causes XSS vulnerability

2019-04-23  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-05

       * [JSPWIKI-1108] interwiki links with illegal characters causes XSS vulnerability

       * [JSPWIKI-1107] uploading attachments with illegal filename causes XSS vulnerability
         Fixing side-effect on slimbox links, when rendering the caption with illegal characters.

2019-04-22  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-04

       * [JSPWIKI-1107] uploading attachments with illegal filename causes XSS vulnerability

2019-04-05  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-03

       * [JSPWIKI-1100] Add support for mixed css-class & css-style markup

2019-04-05  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-02

       * [JSPWIKI-1101] Improve rendering of {{{inline preformatted text}}}

       * Change UI for attachement upload: by default, the FILE SELECTION input should be visible

2019-04-05  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M4-git-01

       * Added interwiki link for location links (google maps)
         eg: [Atomium|Location:Atomium, City of Brussels, Belgium]

       * Added plain editor configs as regular properties.
         By default, the editor preview, autosuggestion and tabcompletion are set.

       * Various small js / css tweaks.

       * Add format option to <wiki:Author/> to render force rendering of text iso link

2019-03-22  Juan Pablo Santos (juanpablo AT apache DOT org)

       * prepare release for 2.11.0.M3

2019-03-21  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M3-git-04

       * JSPWIKI-1095: DefaultURLConstructor#getForwardPage( HttpServletRequest req ) now always returns "Wiki.jsp"

       * JSPWIKI-1096: Upgrade bundled dependencies for 2.11.0-M3
         * flexmark to 0.40.24
         * lucene to 8.0.0
         * selenide to 5.2.2
         * slf4j to 1.7.26
         * tomcat to 8.5.39

2019-03-19  Juan Pablo Santos (juanpablo AT apache DOT org)

       * JSPWIKI-1094: mvn eclipse:eclipse fails, patch provided by Christian Fröhler, thanks! (no version bump)

2019-03-17  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M3-git-03

       * Remove unused top level JSP. See also [JSPWIKI-1093]

2019-03-09  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M3-git-02

       * Adding Drag & Drop capabilities to the standard JSPWiki editor:
         links automatically are converted to [description|url] format
         other content (text, tables, etc...) will be converted to wiki-markup.


2019-03-09  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M3-git-01

       * UserPreferences fixes
         - new toggle style for on/off switches
         - restyle bi-model checkboxes for Page Layout setting
         - fix a few style issues in the UserPreferences when in Dark Mode

       * The JSPWiki template should by default open up in the light mode.

       * Consistent css-style for the toolbar of the jspwiki wysiwyg editor

       * Added Description meta-tag to improve on-page SEO

       * Added the Content-Security-Policy meta-tag to reduce the risk of XSS attacks.


2019-03-04  Juan Pablo Santos (juanpablo AT apache DOT org)

       * prepare release for 2.11.0.M2

2019-02-21  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M2-git-10

       * o.a.jwpiki.util package moved to its own submodule

       * remove DefaultAclManager dependency from WikiEngine and other small refactors

2019-02-15  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M2-git-09

       * Clean browsers LocalStorage cache of unsaved page edits
         when switching between plain & WYSIWYG editors.

       * Fix (resizable) height of the wysiwig editor HTML viewer.


2019-02-15  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M2-git-08

       * WYSIWYG editor was still pointing to the Haddock template.


2019-02-15  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M2-git-07

       * JSPWIKI-1088: Fallback to default template if jspwiki.templateDir if the requested template folder is
         not found

       * JSPWIKI-1092: Upgrade bundled dependencies
         * flexmark to 0.40.16
         * gson to 2.8.5
         * lucene to 7.7.0
         * nekohtml to 1.9.22
         * stripes to 1.7.0-async (needed to test JSPWIKI-1088)
         * tomcat to 8.5.38

       * fixed css path and packaging of webresources

       * updated both new and missing es resources

2019-02-14  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M2-git-06

       * lots of internal refactorings, mostly around a) Task's implementations extracted to their own package
         and b) PageManager and PageLock moved to o.a.w.pages package, in order to untangle some class/package
         circular dependencies

       * JUnit updated to 5.4.0

2019-02-13  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M2-git-05

       * Adding DARK template to the User Preference.


2019-02-13  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M2-git-04

       * JSPWIKI-1091: Broken DIFF view
         Added some missing JSP in default template. (caused by template rename)

       * Added missing <html lang=..> localization


2019-02-08  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M2-git-03

       * merged [PR#10](https://github.com/apache/jspwiki/pull/10): DOCTYPE and HTML lang="en" attribute addition
         (thanks to Scott Fredrickson)

       * `o.a.w.util` package ready to be extracted to its own module

       * new `o.a.w.pages` package, with `PageSorter` becoming a `Comparator< String >` and no longer accesible from WikiContext
         * `PageSorter` is accesed now through `PageManager`
         * to compare WikiPages use `wikiPage.compareTo( anotherWikiPage );`
         * `sortPages` methods are also gone, as an alternative you can use something along these lines (see
           `AttachmentManager#listAttachments` for another example):
           `Collections.< WikiPage >sort( pages, Comparator.comparing( WikiPage::getName, m_engine.getPageManager().getPageSorter() ) );`
         * as a side effect of this change, `AbstractReferalPlugin#filter[AndSort]Collection` methods operate with
           `Collection< String >` instead of with plain `Collection` (except for `RecentChangesPlugin`, plugins
           inheriting this method were already doing it), custom plugins inheriting this method will have to use
           new `filterWikiPageCollection` method instead

       * other internal code refactors

2019-02-03  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M2-git-02

       * JSPWIKI-1074: Fixed buggy header width in Fixed Page Layout

2019-02-03  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M2-git-01

       * JSPWIKI-1090: Fixed READER view, bug caused by the rename of the HADDOCK template

2019-01-25  Juan Pablo Santos (juanpablo AT apache DOT org)

       * prepare release for 2.11.0.M1

2019-01-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-15: JSPWIKI-1086 - selenide-based functional tests infrastructure + login/logout
         associated tests (selenium tests currently kept for reference)

       * JSPWIKI-1085 - JSPWiki locale can be set server-side - to determine the locale used, the following order is used:
         1.- user-preference settings
         2.- if not set, see if there is a locale set server-side, as noted by
             jspwiki.preferences.default-locale setting on jspwiki[-custom].properties
         3.- if not set, browser's preferred language setting
         4.- if not set, JVM's default

       * JSPWIKI-1087 - upgrade bundled dependencies
         - commons-fileupload to 1.4
         - flexmark to 0.40.12
         - hsqldb updated to 2.4.1
         - cargo plugin to 1.7.1

2018-12-25  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-14: upgrade bundled dependencies
         - commons-fileupload to 1.3.3
         - ehcache to 2.10.6
         - flexmark to 0.35.0
         - junit to 5.3.2
         - lucene to 7.6.0
         - tomcat to 8.5.37

       * escape entities on Captcha.jsp request parameters

       * JSPWIKI-1084 - Jenkinsfile now builds both source and website, jspwiki-site job can still be triggered manually

       * few more polishing and minor refactors

2018-12-24  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M1-git-13: AJAX based search results are not shown.
         Fixing AJAXSearch.jsp.
         The java '<>' diamond operator is not allowed for source level below 1.7.

2018-12-15  Dirk Frederickx (brushed AT apache DOT org)

       * 2.11.0-M1-git-12: JSPWIKI-1083 - fixing bugs related to the new default template.
         - Rename HADDOCK template to DEFAULT template.
         - Moving a number of default jsp's (common for all templates)
           from templates/210 to templates/default.

2018-12-07  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-11: JSPWIKI-1082 - fix from 2.11.0.M1-rc1 - revert change from commit
	     87bf9b941fdf (Nov/11/2018) that ended up causing lots of ClassCastException

2018-12-03  Juan Pablo Santos (juanpablo AT apache DOT org)

       * prepare release for 2.11.0.M1

2018-11-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-10: backwards-incompatible change - move TextUtil.getRequiredProperty to WikiEngine

       * some more polishing and minor refactors

2018-11-13  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-09: fix JSP compilation error; added jspc plugin to ensure JSPs remain well-formed

       * JSPWiki's custom tags TLD moved to main module

       * some more polishing and minor refactors

2018-11-11  Juan Pablo Santos (juanpablo AT apache DOT org)

       * no version bump: some more polishing and minor refactors

2018-11-05  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-08: JSPWIKI-1080 try to load as many external third-party plugin jars as possible,
         instead of all-or-nothing

       * small backwards-incompatible changes:
         - CryptoUtil#verifySaltedPassword doesn't throw UnsupportedEncodingException anymore
         - TextUtil#urlDecode methods don't throw UnsupportedOperationException anymore
         - ClassUtil#getMappedObject methods now throw ReflectiveOperationException, IllegalArgumentException
           instead of WikiException
         - ClassUtil#getMappedClass method now throws ClassNotFoundException instead of WikiException

       * fix possible concurrency issue at ReferenceManager#serializeAttrsToDisk

       * remove commons-codec usage from source (it's carried onto the war as a transitive
         dependency though), plus several other small refactors

2018-11-02  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-07: removed a bunch of warnings throughout the code

       * added a Jenkinsfile

       * small backwards-incompatible change: WikiEngine#getRecentChanges() now returns a Set instead of a Collection

2018-10-30  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-06: fix JSPs using methods removed on 2.11.0-M1-git-05

2018-10-29  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-05: JSPWIKI-1081 - maven build refactor
         - java code split into its own module: custom extensions should now rely on
           the new org.apache.jspwiki:jspwiki-main dependency, instead of the
           org.apache.jspwiki:jspwiki-war:classes old one
         - parent-pom: clean-up + dependencies and plugins versions' set as maven properties
         - jspwiki-markdown module included into main war

       * several small code refactors, including some backwards-incompatible ones:
         - PropertiesUtils moved to the util package
         - ReferenceManager#findReferrers returns Set< String > instead of Collection< String >
         - AttachmentManager#listAttachments returns a List<Attachment> instead of a Collection
         - WikiEngine#findPages( String query, WikiContext wikiContext ) is removed, use
           WikiEngine#getSearchManager()#findPages( String query, WikiContext wikiContext ) instead

2018-10-26  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-04: JSPWIKI-1078 - update tests to JUnit 5.3.1

       * updated versions of maven plugins

       * flexmark updated to 0.34.56

2018-10-21  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-03: JSPWIKI-1083 - Haddock is now the default template
         - to bring back the 2.10 template set the jspwiki.templateDir property to "210"

       * JSPWIKI-1077 - added the following pages to the core pages' bundles, as they enable some more haddock functionality
         - CSSBackgroundGradients: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Background%20Gradients
         - CSSBackgroundPatterns: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Background%20Patterns
         - CSSInstagramFilters: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Instagram%20Filters
         - CSSPrettifyThemeTomorrowNightBlue: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Prettify%20Theme%20Tomorrow%20Night%20Blue
         - CSSPrettifyThemeTomorrowPrism: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Prettify%20Theme%20Prism
         - CSSRibbon: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Ribbon
         - CSSStripedText: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Striped Text
         - CSSThemeCleanBlue: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Clean%20Blue%20Theme
         - CSSThemeDark: see https://jspwiki-wiki.apache.org/Wiki.jsp?page=Dark%20Theme

2018-09-30  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-02: JSPWIKI-1076 - minimum required Servlet / JSP is now 3.1 / 2.3

       * JSPWIKI-1079 - add jspwiki-markdown to the main build

       * flexmark updated to 0.34.46

2018-09-14  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.11.0-M1-git-01: JSPWIKI-1076 - minimum required to build/run is now Java 8 / Maven 3.5.0

       * fix for JSPWIKI-932 - Failed to start managers. java.util.ConcurrentModificationException

2018-08-31  Juan Pablo Santos (juanpablo AT apache DOT org)

       * update flexmark to 0.34.22 and ASF parent pom to 21

       * prepare release for 2.10.5

2018-08-31  Siegfried Goeschl (sgoeschl@apache.org)

       * 2.10.5-git-09 : JSPWIKI-1073 Upgrade the jspwiki-portable build

2018-07-08  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.5-git-08 : update flexmark to 0.34.6 and slf4j to 1.7.25

2018-07-09  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.5-git-07 : fix to plain haddock editor related to the new
         functionality to recover unsaved page edits.

         You can test this like so:
         - open a page for edit in the haddock template
         - make some changes to the page
         - move to another page without saving (or close the browser tab)
         - click LEAVE when the popup 'changes you made may not be saved' appears.
         - reopen the page for edit
         - you should now receive a new popup which allows you to restore or abandon
           the unsaved changes


2018-07-08  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.5-git-06 : update bundled Apache Tomcat on portable JSPWiki to 7.0.90

2018-07-01  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.5-git-05 : few more haddock template updates

       * The haddock editor has now a page restore functionality to recover unsaved page
         edits.  When your session or login timer expires, or your accidentally close a
         browser tab without saving, etc...  your last changes are now preserved in the
         localstorage area of your browser.
         At the start of a new edit sessions,  you will be presented with a modal dialog
         to restore the cached page.

       * The "attach" and the "info" menu are now combined into a single navigation menu.
         The INFO or ATTACHMENT UPLOAD page can be accessed with an additional
         click of a button. This also improves usability on touch devices.

       * Small refinements of the Search and User buttons (top-right corner)
         to improve support for touch devices. (issue reported by Juan Pablo)


2018-06-17  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.5-git-04  Fine-tuning Haddock for mobile devices.

       * Improve accessibility on hover-menu's for touch-devices. They'll open after
         a touch-down event; and will close when touching any area outside the menu.

       * Fixing access to the Find and User menu's for touch devices.

       * Several small style improvements on the navigation bar for mobile devices
         (hiding CARET to indicate hover-menu's, ...)

       * Added touch-support for %%magnify style.

       * Breadcrumbs are now moved to a proper drop-down menu (...) on the navigation bar
         instead of the previously not-so-obvious 'mouse-over-zone' under the pagename.
         This also makes breadcrumbs accessible to the tablet & phone users.

       * Fixed a display error when uploading multiple attachements in one step.


2018-06-05  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.5-git-03  JSPWIKI-1071 Ajax request header 'Connection' forbidden
         impacting the DEFAULT jspwiki template.


2018-06-03  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.5-git-02

       * JSPWIKI-1070: (properly) Support JDK 10 builds

       * Generate sha1 and sha512 checksums for build artifacts

2018-05-27  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.5-git-01

       * JSPWIKI-1070: Support JDK 10 builds

2018-04-29  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.4-git-10  Bugfix in AddCSS.JS related to url() parsing

2018-04-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.4-git-09  Better support for mobile devices in the Haddock Template
            See JSPWIKI-835
            - Updates various styles to better fit small screens.  (tabs, accordion, columns, ...)
            - On small screens,  the sidebar is by default closed.
              On wider screens, the sidebar is open/closed based on the previous state
              which is saved in a cookie.

2018-04-22  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.4-git-08  Adding support for mobile devices to the Haddock Template
            See JSPWIKI-835
            Part-1 -- many style adjustment to fit smaller screens
            - Sidebar now slides over the main page on mobile devices
            - Header (pagename, and menu bar) are better fit for small screens
            - Width of several menu's and dropdowns is restricted for small screens
            - Editor toolbar resized for small screens

            Other:
            - JSPWIKI-1058 Editor toolbar now remains on screen, even when scrolling down
            - Small tweaks of the RecentChanges output
            - JSPWIKI-1068 : fixing positioning of the TitleBox


2018-04-19  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.4-git-07 Adding a favicon to the haddock template

2018-04-11  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.4-git-06  JSPWIKI-1069 i18n errors in german translation

2018-03-31  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.4-git-05  JSPWIKI-1068 TitleBox rendering on Haddock

2018-03-29  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.4-git-04

       * JSPWIKI-1039/JSPWIKI-1067: ACLs are not taken into account when cache
         is disabled / View-only ACLs are not enforced

2018-03-29  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.4-git-03

       * Main page can be revealed when invoking some JSPs without parameters
         (reported by Motohiko Matsuda, thanks!)

2018-03-25  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.4-git-02

       * Further fix on JSPWIKI-1064 - Link to non-existing page doesn't change if
         linked page is created, not all page caches were properly flushed.

2018-03-04  Juan Pablo Santos (juanpablo AT apache DOT org)

       * Fixed all javadoc errors when building using java 8 - no version bump

2018-02-25  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.4-git-01  Fixing Admin JSP Bugs

       * Quick fix to admin and user management pages:  adding proper tabs to
         the ADMIN page, fixing javascript bugs in user management page
         (reported by Harry)

2018-02-03  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-48

       * JSPWIKI-835 - better mobile experience: move sidebar to bottom on
         extra-small devices (< 768px, only on haddock template)

       * Some internal refactors to org.apache.wiki.WatchDog

       * Flexmark updated to 0.28.38.

2018-01-27  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-47

       * Another fix on JSPWIKI-1064 - Link to non-existing page doesn't change if
         linked page is created, as the page render cache must also take into account
         if the plugins should be rendered or not.

       * JSPWiki portable: Update bundled Apache Tomcat to latest version on 7.x branch
         and launch4j to 3.11.

       * JSPWiki portable: As appbundler is not longer accesible through java.net, use
         fork at https://github.com/teras/appbundler instead.

       * Updated maven plugins' versions to latest + use latest ASF parent pom.

2018-01-21  Juan Pablo Santos (juanpablo AT apache DOT org)

       * Updated <scm/> section from main pom.xml so it points to github repo

       * Flexmark updated to 0.28.34 (no version bump).

2017-12-30  Juan Pablo Santos (juanpablo AT apache DOT org)

       * Upgraded all test from JUnit 3 to JUnit 4 (no version bump).

2017-12-27  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-46

       * JSPWIKI-802 - Markdown support
         * urls are not set on attribute provider derived classes, as this has some
           unwanted side effects. Introduced JSPWikiLink, a wrapper around Flexmark's
           links which retain the original wiki link.
         * updated Flexmark to 0.28.24.

2017-12-16  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-45

       * Fixed JSPWIKI-1064 - Link to non-existing page doesn't change if linked page
         is created

       * Improvement on JSPWIKI-843 - exclude tests from test-jar

2017-12-08  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-44

       * JSPWIKI-802 - initial markdown support see
         https://jspwiki-wiki.apache.org/Wiki.jsp?page=Markdown%20Support
         for details

2017-12-03  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-43

       * Fixed JSPWIKI-843 - generate test-jar for jspwiki-war (wasn't being generated)

       * Extract WikiLink parsing operations from JSPWikiMarkupParser, LinkParser,
         VariableManager to their own class, LinkParsingOperations

       * Move (private) JSPWikiMarkupParser#getLocalBooleanProperty to
        (public) WikiContext#getBooleanWikiProperty

2017-11-16  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-42

       * small refactor to move some private constants to public at MarkupParser and
         WikiRenderer, so they can be reused throughout the code and custom extensions.

2017-08-22  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-41

       * WysiwygEditingRenderer isn't hardcoded in JSPs anymore, and can be substituted
         through jspwiki.renderingManager.renderer.wysiwyg property on jspwiki.properties.
         This allows to develop custom renderers which do not expect the same information
         as the existing ones.

       * Fixed DefaultFilterManager#modules not returning Collection< WikiModuleInfo >,
         as it was supposed to. This method wasn't used anywhere, until now, where it
         is used through FilterBean, a new JSPWiki AdminBean exposing existing filters
         information.

       * FilterBean runs parallel to PluginBean, which allowed some more minor internal
         refactorings and code polishing.

       * Moved some constants from JSPWikiMarkupParser to MarkupParser.

2017-07-16  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.3-git-40

       * Some small changes around JSPWikiMarkupParser, needed to develop
         custom markup parsers, which do not rely on the former class or
         WikiDocument.

       * Some other minor internal refactorings and code polishing

2017-05-14  Harry Metske (metskem@apache.org)

       * 2.10.3-git-39

       * JSPWIKI-1059 - ConcurrentModificationException in SessionMonitor

2017-04-22  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-38  Haddock Template updates

       * Fixing some minor issues with the Image plugin ALIGN parameter

       * %%magnify: add a magnifying glass to to reveal details of a cropped images.
         Hover the mouse above the image to see the effect.

       * Redesigned Header
         The header (including the menu bar) now shifts up when you scroll down,
         and reappears when scrolling back-up.  So you can quickly have access
         to all the menu's and the quick search function.  Clicking the pagename
         in the header get's you immediately back to the top of the page.
         The menu bar has now become part of the (coloured) header section.

       * Editor:
         Improved the speed of the editor quick preview when editing large pages.
         Updates to various editor auto-suggest dialogs.


2017-03-18  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-37  Haddock Template

       * JSPWIKI-1055:  Haddock Special Block Marker
         Added a few icons to improve rendering of contextual blocks in B/W.

2017-03-14  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-36  Haddock Template

       * Few fixes on the %%column style

2017-03-12  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-35  Haddock Template updates

       * ImagePlugin:  minor update to apply the css class and styles
         parameters to the image container, not to the whole table;
         escape HTML entities in captions.

       * several CSS stylesheet additions
         - image styles : effects, captions, frames, animation
         - background styles : color, background images

       * %%columns: bugfix, few more column styles

2017-03-05  Harry Metske (metskem@apache.org)

       * 2.10.3-git-34

       * JSPWIKI-1044 - URL in password recovery mail is relative while it should be absolute

2017-03-03  Harry Metske (metskem@apache.org)

       * 2.10.3-git-33.

       * Fixed JSPWIKI-1051 - Startup fails due to jspwiki.log (Permission denied)

2017-02-04  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-32

       * JSPWIKI-1050 The find and replace do not seem to work  (Haddock editor)

         Pressing Ctrl-F has been removed as short-cut key for the wiki editor.
         Ctrl-F brings you always to the standard browser dialog. (as expected)
         To open JSPWiki's Find&Replace dialog, click the toolbar button.

         The Find&Replace dialog now also indicates if text was selected before.
         If that case, the Find&Replace will run only on the selected text.


2017-01-21  Harry Metske (metskem@apache.org)

       * 2.10.3-git-31.

       * Fixed JSPWIKI-1047 - Access Control Lists do not work if page cache is deactivated (thanks to E. Poth)
       * minor bugfix in SessionsPlugin (StringIndexOutOfBoundsException when using the distinctUsers option

2017-01-21  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-30
         [JSPWIKI-1046 ]IE11 detection fixed, txs to patch of Albrecht Striffler.


2017-01-17  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-29
         JSPWIKI-1046 IE11 scrolling in content page blocked.
         IE detection not working on IE11; ok on Edge. New detection method implemented.

2017-01-15  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-28
         JSPWIKI-1045 IE11 rendering is broken for %%graphBars using color names.

2017-01-14  Harry Metske (metskem@apache.org)

       * 2.10.3-git-27.

       * Fixed JSPWIKI-1042 - Impossible to change user profile loginName, fullname, password (patch by Eric Kraußer)
       * Fixed JSPWIKI-1043 - Encode email subjects as UTF-8 (patch by Eric Kraußer)

2017-01-06  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-26
         JSPWIKI-1041: fix some lines in skin.css

2017-01-03  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-git-25: few Haddock template fixes

       * Remove the editor suggestion-dialogs scroll-bars (only visible on Windows)
         Fix a few formatting errors in sugestion dialogs.

       * Fixed the width of the table filter input field

       * Added console-logs to the editor for debugging on IE/EDGE
         (positioning of suggestion dialogs seems to be broken)

       * Update JSON XmlHttpRequest header to avoid IE/EDGE XML5619 Document Syntax errors

2016-12-31  Harry Metske (metskem@apache.org)

       * 2.10.3-git-24.

       * Fixed JSPWIKI-1035 - merged branch JSPWIKI-1035 back to master

2016-12-27  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-23.

       * Fix nesting of ul/li in RefferedPAgesPlugin.

2016-12-26  Harry Metske (metskem@apache.org)
       * Fixed JSPWIKI-1035 - Get rid of jspwiki.baseURL
         fixed remaining unit tests
       * changed Release postfix from "svn" to "git"

2016-12-19  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-22  Various HADDOCK updates & fixes.

       * [JSPWIKI-1038]: Fix allowing flexbox in Edge. (but not in IE)


2016-12-18  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-21  Various HADDOCK updates & fixes.

       * [JSPWIKI-1038]: IE's flexbox implementation is broken,
         no workaround for now.


2016-12-17  Dirk Frederickx (brushed AT apache DOT org)

       * Fixing RSSGenerator test with latest WeblogPlugin changes

2016-12-17  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-20  Various HADDOCK updates & fixes.

       * JSPWiki BLOGS
         Final update of the styling of JSPWiki's BLOGs.
         Also the fancy weblog calendar is now back in the sidebar
         when viewing a blog post.

       * Add-Comment JSP refactored:
         When adding a comment to a wiki-page, you will see the content of the main page
         at the top of the editing screen,  so you know what your are commenting on.
         Improved hover menu on the SAVE/POST button for entering the change-note and
         comment-signature fields.

       * Plain Editor:
         Many JS improvements related to the handling of text snippets.
         Several style updates to the editor and the auto-suggest dialogs.

       * Small refactoring of the Install.jsp to fit the bootstrap framework.

       * %%columns-<width>: fix the broken width parameter

       * %%graphbars: fix support for HTML-color-names (chrome, FF)

       * [JSPWIKI-979]: fix support for %%small {{{ preformatted text blocks }}}

       * [JSPWIKI-937]: fix handling of broken image links (also for FF)
         Fix for rendering of the attachement icon, e.g. in RecentChanges page.

       * Improved visualisation of interwiki links for Edit, Raw, Reader and Groups.

       * The Delete group command now gets you back to the Group view pages,  so it is
         easier for issuing subsequent group commands. (create,edit,delete)

       * Added %%maps to generate google maps viewer by simply including the address.

       * Few html5 FORM improvements: required fields, email input type, ...

       * Updated to bootstrap 3.3.7.


2016-12-13  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-19

       * JSPWIKI-1032 : Use image "src" attribute instead of "href"

2016-12-13  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-18

       * [JSPWIKI-1037] UI will not display with IE 9 or IE10.
          Issue with Flexbox implementation in IE.  (also applies to IE11)

       * Small style update on %%categories dropdown

2016-12-11  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-17

       * Allow concatenation of css-styles (classes) by using a "." separator,
         which is useful when adopting styles from the bootstrap framework

         EG. %%btn.btn-primary.btn-xs This looks like a small Button /%

2016-12-03  Harry Metske (metskem@apache.org)
       * Fixed JSPWIKI-1036 - Search for non-Latin characters fails (reported by Peter Paessler)

2016-09-16  Harry Metske (metskem@apache.org)
       * Fixed JSPWIKI-1033 - Incorrect relative navigations (reported by Niklas Polke)

2016-09-16  David Vittor (dvittor@apache.org)
       * Test commit to our new git repo.

2016-09-16  Harry Metske (metskem@apache.org)
       * Test commit to see how our new git repo works.

2016-08-25  Harry Metske (metskem@apache.org)

       * 2.10.3-svn-14

       * Fixed JSPWIKI-1031 provide stacktrace when throwing InternalWikiException, fix by Jürgen Weber.

2016-08-18  Harry Metske (metskem@apache.org)

       * 2.10.3-svn-13

       * Fixed JSPWIKI-1029 WebLogic does not find the properties file, fix by Jürgen Weber.

2016-08-18  Harry Metske (metskem@apache.org)

       * 2.10.3-svn-12

       * Fixed JSPWIKI-396 UTF-8 characters in wiki pages incorrectly rendered if served by Weblogic
         A rigorous fix by Jürgen Weber, ditched UtilJ2eeCompat, introduced new property "jspwiki.nofilterencoding".

2016-04-17  Harry Metske (metskem@apache.org)

       * 2.10.3-svn-11

       * Fixed JSPWIKI-936 error when remove page with link (Fix by Andrew Krasnoff)

2016-04-17  Harry Metske (metskem@apache.org)

       * 2.10.3-svn-10

       * Fixed JSPWIKI-935  RenderingManager uses ehcache if "jspwiki.usePageCache = false"

2016-04-06  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-9  Few fixes on the HADDOCK template

       * improved styling of broken image links

       * [JSPWIKI-934] Haddock: "page modified" markup differs to the original edits
         Improved styling of the PageModified/Conflict jsp's

       * Allow google-fonts in %%add-css


2016-04-03  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-8  Few more fixes on the HADDOCK template

       * Reorganize the attachment detail view, changing the
         order of columns to a more logical format.

       * Improve the rendering of the RecentChanges page

       * Fix the font for text in buttons with an icon

       * Fix the popup dialog position in the plain editor
         in case the textarea contains '<', '>' or '&' characters.

       * Hide the section-editlinks for weblog comments.

       * Fix the handling of the editor-type switch in the editor.


2016-03-27  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-7  Few more small fixes on the HADDOCK template

       * [JSPWIKI-918] HADDOCK: the "view" menu is back as a better way
         to navigate back to the main page from "Attach" or "Info" views.
         (also removed the ugly "Back to Parent Page" button)

       * [JSPWIKI-901] : Undo/Redo doesn't work in HADDOCK editor

       * [WeblogPlugin] : added support for filtering weblog entries according to weblog
            start-date and number of days. Now you can select weblog entries
            from a link from the WeblogArchive plugin.

       * [JSPWIKI-897] : Long page names in Haddock don't wrap gracefully
            Fixing printing issues with long page names.

       * Replace the attachment info icon, for not-inlined attachments

       * [JSPWIKI-904]: HADDOCK – the display status of the LeftMenu is retained,
         also after a page refresh.  (by means of a new "Sidebar" user-pref cookie)
         The "Hide-Sidebar" option is obsolete and thus removed from the UserPreferences.


2016-03-15  Harry Metske (metskem@apache.org)

       * 2.10.3-svn-6

       * Fixed JSPWIKI-931 VersioningFileProvider sets page author to "unknown" when it should be an authenticated user


2016-03-12  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-5

       * %%ADD-CSS: fix regexp for inline images on IE.

       * Fix posting of comments in the Haddock template

       * Fixed some missing localization of the weblogplugin.
         Few more tweaks of the styling of weblog entries & comments.



2016-03-08  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-4  Few more small fixes related to the HADDOCK template

       * Few fixes on well formed HTML (SearchBox.jsp, PageInfo.jsp, Nav.jsp)

       * Fixed some missing localizations in Nav.jsp.

       * Various improvements of the JSPWiki Weblog implementation and css styling.

       * Only show scrollbars on prettified blocks when appropriate (WINDOWS issues)


2016-03-08  Harry Metske (metskem@apache.org)

       * 2.10.3-svn-3

       * Added MaxPageNameLength support in SpamFilter

2016-02-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-2  Few more small fixes on the HADDOCK template

       * Added 2 new inter wiki references :
         [Raw:MainPage] for displaying the raw wikimarkup of a page
         [Reader:MainPage] to display a simplified reader view of a page
             (no left menu, layout fit for printing)

       * Fixing JS error on <IE11 : missing Array.from() (compatibility with mootools 1.5.1)

       * Fix for flexbox feature test  (IE)


2016-02-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.3-svn-1  Various small fixes on the HADDOCK template

       * Fix %%viewer "Mixed content" error  (avoid serving http content via https )
       * Fix visibility if the Titlebox page has no content
       * Add fallback for IE, when the browser doesn't support FLEXBOX support
       * Fix scrollbars on prettified sections on windows (IE, Chrome)
       * Add fallback font (SegoeUI) for windows because Helvetica Neue is not supported

       * Fix consistency of the styling of the "OK" buttons in many forms.
       * Fix indentation of section dropdown entries (plain editor)
       * Fix sorting by dates in the Attachment and Info view
       * JSPWIKI-921: increase legibility of the plain editor
       * JSPWIKI-928: fix odd fonts in the user control panel pop-up window
       * Add new Apache feather.png as logo background

       * Upgrade to mootools 1.6.0


2016-02-05  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-43

       * Added IP ban support in SpamFilter

2016-02-06  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-42

       * JSPWIKI-570: Cannot use another MarkupParser - hardcoded references to
         RenderingManager and JSPWikiMarkupParser - thanks to Piotr Tarnowski for all the
         analysis at JSPWIKI-570

2016-02-02  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-41

       * JSPWIKI-852: JSPWikiMarkupParser should report on which page a plugin was missing

2015-12-09  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-40

       * JSPWIKI-923: doreplace.png image is missing from CleanBlue skin

2015-09-19  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-39

       * [JSPWIKI-916] Pre-formatted text within a list renders
         to an unpleasantly small font size, due to relative font sizing.

2015-09-07  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-38

       * [JSPWIKI-903] Fixed a page redirect after attachment delete.

2015-09-06  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-37  Few Attachment tweaks in the HADDOCK template

       * Fixed display issue with long attachment names
       * Show loading animation after pressing the upload button
       * Improved display of file sizes with support for KB,MB,GB,TB.


2015-09-05  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-36  Improved Attachment upload in the HADDOCK template

       * Fixed the AttachementServlet so you can now select multiple files
         before pressing the upload button.  You can also use
         drap & drop if your browser supports it.

        * [JSPWIKI-903] Fixed a page redirect issue when deleting an
         attachment from the Attachment info page.

       * Fixed the zebra-stripes of the FIND AJAXSearch.jsp

       * Few small improvements on the plain editor suggestion dialogs.


2015-08-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-35

       * [JSPWIKI-912] Haddock Template: fixing the position of headers
         below the fixed navigation bar, when returning from a section edit.


2015-08-23  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-34  WYSIWYG improvements

       * Added the wysiwyg editor to the wro4j build process

       * Improved the stability of the  WysiwygEditingRenderer



2015-08-22  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-33  Fixed JSPWIKI-910 support configuring jspwiki with envvars
                        having dots replaced with underscores in the varnames

2015-08-16  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-32  Haddock Template updates & WYSIWYG editing

       Haddock Template:

       * [JSPWIKI-902] Printing improvements for the HADDOCK template,
         hiding sidebar, userbox, wrapping long page-names, and a few other tweaks.

       * The Page Footer now sticks to the bottom of the screen, even for short pages

       * Fixed an issue with the persistence of the status of collapsible lists

       * Added fixes for IE compatibility for the bootstrap css framework.

       * [JSPWIKI-892] Haddock editor should put the cursor at the top of the textarea,
         also when opening the editor with a certain section

       * Improved the header layout (suggestion of Harry) moving the quick search field
         into the searchbox dropdown.

       * [JSPWIKI-908] The basic editor toolbar icons (bold, italic, link, etc..)
         are back in the plain editor of HADDOCK.


       WYSIWYG further enhancements

       * (experimental) Included a plain vanilla wysiwyg editor to JSPWiki.
         This editor is based on mooEditable, MIT licensed.
         This editor is unfortunately not compatible with the default template.

         You can still add your own wysiwyg editor to JSPWiki -- hooks are provided
         for TinyMCE and CKeditor.

       * Added ajax-based live-preview for wysiwyg editors to the Haddock Template.
         When editing in wysiwyg mode, you now get immediately a preview of the wiki markup.
         (similar to the live-preview mode of the plain editor)

       * The wysiwyg editors are now resizable, just like the plain editor..


2015-08-04  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-31  Haddock Template small fixes

       * Loading error on hadock.js and haddock-edit.js fixed. (async attribute)
         Was breaking all editing js functions !

       * IEx tweaks
         - remove unnecessary scrollbars
         - attempt to resolve the broken icon-fonts on IE11

       * %%add-css style fix to handle special html entities


2015-08-04  David Vittor (dvittor@apache.org)

       * 2.10.2-svn-30

       * [JSPWIKI-900]: Fixed Problem with the WikiFormsPlugin Text Area

2015-08-02  Dirk Frederickx (brushed AT apache DOT org)

       * Fixed the unit tests for HtmlStringToWikiTranslatorTest

2015-08-02  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-29

       Some more Haddock template "tweaks":

       * Hide the attach & info navigation menu's for non-existing page

       * Improved the Info dropdown when no Author page exists.

       * Section titles remain visible, even with a sticky navigation menu.
         Eg. when clicking a table of contents entry, you should end up
         with a visible section header just below the sticky menu line.

       * Fixed: the top border of a TABLE was gone.

       * Added a version check on the user-preference cookie to be more robust ico changes.
         (hopefully no more cookie clean-up is needed when upgrading JSPWiki)

       * Sidebar:
         - The sidebar height now extends till the bottom of the page
         - 3 Sidebar modes are now working: left(default), right and hidden

       * Fixed the <wiki:Link> tag to support "cssClass" as attribute.

       * [JSPWIKI-430] All confirmation dialogs are now build with regular DOM elements.
         (check out the Log-out or Delete confirmation dialogs to see the improvement)


       WYSIWYG editors:

       * Added support for the WYSIWYG editor TinyMCE.jsp

       * Improved server side handling of HtmlStringToWiki translation

       * [JSPWIKI-622] Added an editor selection switch to the editor toolbar.
         It is now possible to switch between editors (plain, or other installed
         wysiwyg editors) while in Edit. (no need to go first via the Preferences screen)



2015-07-26  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-28

       Haddock Template commit of the remaining JSP's: UI for handling groups,
       workflow UI, and refactored JSP's for Login/Lostpw/Register.
       This concludes the re-design of all the haddock template JSP's.

       Other changes:

       * Fixed page redirections and improved the back button handling.
         Eg. Attachment DELETE will get you now back to the ATTACH view,
         not the INFO view.  See also [JSPWIKI-867]

       * Tabs & Accordion toggles can now include other markup, rather than only text.

       * Added CSS3-based automatic text hyphenation for browsers who support this.
         (also works with none justified text)

       * Attachment Upload UI improved: attachment types are represented by icons
         from the icon-font.

       * Attachment Info page to access version information on attachments
         should now be more user-friendly, with an extra INFO action button.
         (iso a hidden link via the version number)



2015-07-16  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-27

       More Haddock Template tweaks:

       * Removed annoying scroll-bars from the dropdown menu's which appeared in some browsers

       * Improved rendering of inserted dropdown's like the MoreMenu and HomeMenu,
         to make them better fit with bootstrap dropdown menu's.

       * Few fixes of the layout of the UserPreferences menu, and some refactoring
         of the UserPreferences.jsp and the Login.jsp.

       * Fixed an editor bug causing the Live Preview to slow down after some time.

       WYSIWYG editor in JSPWiki

       * Refreshed the WYSIWIG editor with the latest stable version of the
         CKeditor v4.5.1. (replacement of FCK) Standard version, with BootstrapCK4 skin.
         The update was done for both for the default and the Haddock template.
         FFS: server side translation from wiki-markup to HTML needs more work.
         ( WysiwygEditingRenderer.getString() often crashes )


2015-07-13  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-26

       * JSPWIKI-899: Russian set of wiki pages, contributed by Victor Fedorov, thanks!

2015-07-12  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-25

       * [JSPWIKI-896] Haddock template – user preferences are not saved.
         haddock-pref.js was not properly included into the build, due to lowercase
         issue in wro-haddock.xml.

       * [JSPWIKI-518] Saving after editing a section will return you to that  section.
         Fixed missing commits on wiki.js. Should work now.

       * Fixed issue with Accesskey

       * [JSPWIKI-433] Allow back button for TAB keys.
         It is now also possible to click a link to a hidden pane of a tabbed section
         (eg from the Table Of Contents) to automatically open that TAB pane.

       * Added a "title" attribute to the pagename in the header.  In case a very long
         pagename is truncated (with ellipsis ...) you can still see the full
         pagename when you hover the mouse over the pagename.


2015-07-09  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-24

       * Minor improvements:
       ** Use of StringBuilder over StringBuffer whenever possible.
       ** SLF4J upgraded to 1.7.12
       ** JUnit upgraded to 4.12, Jetty upgraded to 8.1.15

2015-07-05  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-23

       * [JSPWIKI-895] Haddock template links contain raw URL information when printed
         including a few tweaks on the print css

       * [JSPWIKI-518] Saving after editing a section will return you to that  section

       * Improved formatting of the Quick Navigation drop-down to show the text and the
         search score on a single line.  (Firefox)


2015-06-30  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-22

       * [JSPWIKI-894] Section editing using Haddock template appears broken.
         Fixed.  Also fixed for the default template.


2015-06-30  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-21

       HADDOCK Template fixes:

       * JSPWIKI-892  Haddock editor when launched is always at bottom of window in Firefox

       * Fixing latest update of Icon Styles


2015-06-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-20

       * JSPWIKI-891: Fixed annoying jumping behaviour in Firefox of the Haddock editor

       * JSPWIKI-885: LivePreview doesn't work
         The HADDOCK template has refresh mechanism based on "change events".
         (no periodic refreshes, like the default template)
         Improved trigger mechanism to catch all keystrokes; and at the same time
         reducing the debounce period (read - refresh time-out) to 1sec.


2015-06-28  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-19

       More Haddock template fixes

       * JSPWIKI-890 (Haddock template) popups dissappear when trying to get
         your mouse to it. Removed the space between the menu and the dropdown.

       * JSPWIKI-887 Slimbox image style for embedded images fixed to show
         readable link description even in case of missing *title* or *alt* attributes.

       * Updated JSPWikiFont, fixing display issues in FireFox.


2015-06-27  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-18

       Small fixes and tweaks on haddock template
       * Few improvements of the Reader template
       * SLIMBOX support for interwiki links
       * Small style tweaks
       * Fix UserBox issue in non-default language


2015-06-26  Siegfried Goeschl (sgoeschl@apache.org)

       * Fixed JSPWIKI-888 Enable cache timeouts for Portable JSPWiki.

2015-06-22  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.2-svn-17

       This is the third major check-in of the HADDOCK template, with mainly
       stabilization fixes related for the plain editor, and many UI improvements.
       The HADDOCK template is close to completion - go ahead and play with it.
       (group related JSPs still to be done)

       Summary of main changes:

       * Many Suggestion dialogs are added to the plain editor:
         links, link-options, images, acls, plugins, variables, %%styles,
         hexadecimal colors, fonts, symbols, %%icons, ...
         You can create new suggestion dialogs via json snippets in Wiki.Snips.js

       * Fixed [JSPWIKI-482] Wrong insert from the suggestion box

       * The editor toolbar is simplified, as most functions are reachable via the
         suggestion dialogs. The find & replace UI can be repositioned on the screen.

       * Sticky menu bar, which stays on top of the screen when scrolling down.

       * The Quick Navigation menu is redesigned to improve usability for creating
         and cloning new pages.
         [JSPWIKI-531] usability: hints on or mechanism for creating a page

       * New %%styles added:  %%dropcaps, %%flip, %%flop, %%addcss, %%progress,
         %%scrollable-250 (limit the height of a code-block, so it becomes scrollable )

       * Show READER view (also great for printing) has been added to the More menu.

       * [JSPWIKI-788] TabbedSection - support multiple tabbedSections in single
         document with same tab-identifiers

       * Updated to the latest mootools v1.5.1
       * Updated to wro4j 1.7.8

       * Some additional i18n properties added -- but translation still to be done.

2015-05-31  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-16

       * Fixed JSPWIKI-882 test-failure when using existing localized locale in OutComeTest (thanks to Marco Roeland)

2015-04-18  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-15

       * Fixed JSPWIKI-880 Glassfish 4 Wrong Chars Solution - Brasil PT, thanks to Renato Grosz

2015-03-06  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-14

       * Fixed JSPWIKI-878 (following up JSPWIKI-660) you can now also use environment variables to configure JSPWiki

2015-02-12  David Vittor (dvittor@apache.org)

       * 2.10.2-svn-13

       * Fixed JSPWIKI-867 - Deleting attachments should retain focus on the Attach tab

       * JSPWIKI-566 - problem with Cookie set preferences and the GSon.fromJson() parser

       * Fixed search icon in Smart Template "search.gif" instead of "search.png"

2015-01-30  David Vittor (dvittor@apache.org)

       * 2.10.2-svn-12

       * Fixed JSPWIKI-566 - Complete rewrite of AJAX functionality for JSPWiki

       * Fixed JSPWIKI-502 & JSPWIKI-760 - Show Wikipages in Search without Authorization

       * Fixed JSPWIKI-859 - Expose the WikiModuleInfo to the plugins and filters

       * Fixed JSPWIKI-866 - Additional parameters (url,version,desc,htmltemplate,authorurl) to jspwiki_module.xml WikiModuleInfo

2015-01-25  David Vittor (dvittor@apache.org)

       * 2.10.2-svn-11

       * Fixed JSPWIKI-876 - NotePlugin does not work on wiki without context

       * Fixed JSPWIKI-869 - JSPWiki Maven project cannot be imported into Eclipse

       * Updated JSPWIKI-867 - Deleting attachments should retain focus on the Attach tab

       * Updated JSPWIKI-566 - Some Ajax functionality added - not complete re-write yet

2014-12-08  Siegfried Goeschl (sgoeschl@apache.org)

       * Fixed JSPWIKI-829 - [Portable] Integrate jspwiki-portable into the jspwiki maven build

2014-11-04  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-10

       * Fixed JSPWIKI-874 - IllegalStateException running JSPWiki in Oracle Glassfish Server

2014-11-04  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-9

       * Fixed JSPWIKI-871 - upgraded nekohtml (0.9.5 => 1.9.21) and xercesImpl (2.4 => 2.10.0)

2014-11-04  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-8

       * Fixed JSPWIKI-870 - JSPWiki does not start, if tomcat directory path contains a white space.

2014-09-21  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-7

       * Fixed JSPWIKI-856 - Enhance FileSystemProvider to be able to save page attributes as properties, provided by David Vittor

2014-08-12  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-6

       * Fixed JSPWIKI-855: NullPointerException in FormInput.java:92, patch provided by Jürgen Weber - thanks!

2014-07-31  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-5

       * Fixed JSPWIKI-195 - do not allow more than one account with the same email address.
          ==> a new key (security.error.email.taken) was added to CoreResources.properties

       * minor encoding correction for the CoreResources_nl.properties

2014-07-07  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-4

       * Dependencies' upgrade: EhCache to 2.6.9, SLF4J to 1.7.7, Selenium to 2.42.0, Stripes to 1.5.7-classloaderfix
         and Jetty to 8.1.15

2014-06-23  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-3

       * Fixed JSPWIKI-847 - Recent Changes Plugin breaks markup if generates an empty table, reported by Dave Koelmeyer

2014-06-05  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.2-svn-2

       * Fixed JSPWIKI-843 - generate test-jars

       * Fixed JSPWIKI-844 - Replace org.apache.catalina dependency by applying Ichiro's patch. Thanks!

       * Fixed JSPWIKI-311 - Cannot save user profile in container managed authentication mode

       * Applied patch on JSPWIKI-841, which solves part of the issue, on unsuccesful login there is no error message
         with container managed authentication

2014-05-29  Harry Metske (metskem@apache.org)

       * 2.10.2-svn-1

       * Fixed JSPWIKI-396 - by making the server signature comparison case insensitive (reported by Jürgen Weber)

2014-05-23  Harry Metske (metskem@apache.org)

       * 2.10.1-svn-17

       * Fixed JSPWIKI-535 - direct links to sections with accents doesn't work

2014-04-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-16

       * First steps integrating Siegfried Goeschl's Wiki On A Stick (https://github.com/sgoeschl/apache-jspwiki -
         thanks!), portable module still pending.
       ** Fixes JSPWIKI-826 - [Portable] PropertyReader ignores the web app class loader

       * Lucene updated to 4.7.0

2014-04-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-15

       * Fixed JSPWIKI-822 - NPE thrown by PluginContext#getText()

       * JSPWIKI-814 - VersioningFileProvider does migrate original page properties (thanks to Brian Burch)

2014-04-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-14

       * Fixed JSPWIKI-832 - [Portable] Problems setting up multiple wikis using a shared JSPWiki libraries
         (patch by Siegfried Goeschl - thanks!)

       * Upgraded selenium-*-drivers to 2.41.0

2014-04-01  Harry Metske (metskem@apache.org)

       * 2.10.1-svn-13

       * Fixed JSPWIKI-831 - Container managed authorization does not work in tomcat

2014-03-17  Harry Metske (metskem@apache.org)

       * 2.10.1-svn-12

       * Fixed JSPWIKI-833 - temp policy file is created with wrong content (thanks to Dietrich Schmidt)

2014-03-11  Harry Metske (metskem@apache.org)

       * Fixed JSPWIKI-823 - set java.io.tmpdir to ${project.build.directory} in pom.xml

2014-03-11  Harry Metske (metskem@apache.org)

       * Fixed JSPWIKI-827 - Migrate the mvn_cheatsheet.txt to Markdown

2014-03-03  Harry Metske (metskem@apache.org)

       * 2.10.1-svn-11

       * Fixed JSPWIKI-813 - ReferenceManagerTest - two cases fail (thanks to Brian Burch)

2014-03-02  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-10

       This is the second major check-in of the HADDOCK template, with
       fixes and improvements mainly related to the plain editor.

       * Livepreview has been fixed, with ajax based on the fly page rendering.
         The livepreview area can now also be displayed side-by-side next to the editor textarea,
         so you can immediately see the rendered wiki-markup during edit.

       * Suggestion dialog boxes are shown while you type to assist entrance of more advanced
         wiki-markup such as links, %%styles, colors, fonts, plugins, and symbols.
         (but still heavily under development)

       * Section Editing has been improved: you can choose which part of the page you want to edit.

       * All icons are now based on an icon Font, replacing the FamFamFam icon set.
         Based on Font Awesome by Dave Gandy - http://fontawesome.iohttp://fontawesome.io/icons/

       * The find & replace UI has been enhanced, showing number of occurrences,
         supporting regular expressions, and supporting replacement for the first or all matches.

       * Text is automatically indented based on the indentation level of the previous line.

       * Using the TAB key inside the textarea will indent a line. Use shift+TAB to un-indent.
         Indentation also works when selecting multiple lines.

       * You can use shift+Enter to quickly insert line-breaks. (\\)


       Fixing following editor related JIRA tickets :

       * [JSPWIKI-382]  Remove posteditor.js

       * [JSPWIKI-482]  Wrong insert from the suggestion box

       * [JSPWIKI-443]  Full screen editor.
         Added a collapsible sidebar, and a side-by-side display of the live-preview area.

       * [JSPWIKI-336]  section selection box not working properly. Fixed.

       * Fixed the User-Preference page-unload event.


       Other changes :

       * New "layout" user-preference to switch between fluid or fixed-width page layout.

       * Added a info drop-down menu with a summary of the page-info.
         This is similar to page-footer section, but now accessible at the top of the page.

       * Replacing all *.png based icons by an icon font.  (eg. slimbox, filter, rss-feed )


2014-02-20  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-9

       * JS fix in haddock template : RegExp expression cause FF to crash.


2014-02-20  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-8

       * [JSPWIKI-769 related] jspwiki-portable module, right now only Windows executable is generated, cfr. with
         https://jspwiki-wiki.apache.org/Wiki.jsp?page=PortableBinaries

       * [JSPWIKI-817 related] Install.jsp is broken ==> Translation corrections (install.jsp.intro.[p1|p2|p3]) for ES

       * [JSPWIKI-821] TestEngine sometimes creates testrepositories with double timestamps after r1567444

2014-02-18  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-7

       * Various small fixes on the HADDOCK template (jsp/css/js) :

       * Fixing %%category dropdowns which were clipped when inside a %%accordion.
         Replacing js based animation by2.10.1-svn-12 css3 animation to show/hide the popup.

       * Fixing bug when saving the Preferences (detected by Harry)

       * Changed fixed-width layout into fluid layout, occupying all screen real-estate.
         (this could become a user-preference setting in the future)
         Slightly decreasing the size of the sidebar.


2014-02-18  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-6

       * Fixing the JSONRPCMAnager.emitJSONCall(..) so that it now renders
         the correct JSON RPC invocation javascript.

         You can test the RPCSamplePlugin like this:

              [{RPCSamplePlugin

              test
              }]

         We are still getting error-code: 490, "No permission to access this AJAX method!"
         when invoking a plugin generated json-rpc call.


2014-02-14  Dirk Frederickx (brushed AT apache DOT org)

       * 2.10.1-svn-5

         Introducing the HADDOCK template, a new template/ui for Apache JSPWiki.

         This template contains various UI improvements and JSP simplifications,
         a major redesign of the JSPWiki CSS stylesheet based on BOOTSTRAP
         (now modularly build with LESS) and a rework of the javascript routines
         based on mootools v1.4.x. (also the js is now split into modular class files)

         Be aware: this is a first commit -- expect things to be broken.
         More work is needed on the plain editor; the Group UI is to be fixed.
         Validation has been done against Safari, Chrome & FF;  IE testing is left
         to the adventurous user.

         HADDOCK lives peacefully next to the default template. To activate the new
         template, add following line to your jspwiki-custom.properties:

              jspwiki.templateDir = haddock


       * [JSPWIKI-504] New default look for 3.0

       * [JSPWIKI-431] Attachment Upload, support upload of multiple files, drag&drop,
              improved progress bars.
              However the server functionality to upload multiple files is
              currently broken. FFS

       * [JSPWIKI-432] Simplify Tabbed Section Markup
              Still maintaining backwards compatibility with the current %%tabbedSection
              markup.

       * [JSPWIKI-712] Entites in ChangeNote should be decoded with "keep editing"

       * [JSPWIKI-797] Refactoring the JSPWiki javascript routines, upgrade js libs:
               mootools-core-1.4.5
               mootools-more-1.4.0.1
               prettify (dd. 4 mar 2013)

       * [JSPWIKI-798] Refactoring the JSPWiki main CSS stylesheet -
               now based on the BOOTSTRAP CSS Framework

       * [JSPWIKI-430] DOM based popups to replace regular js alert or prompt dialog boxes
               Also the edit/clone UI has been refactored.
               Some delete confirmation dialog boxes are still to be converted.

       * [JSPWIKI-429] Improved SLIMBOX to support Youtube, flash and other formats.
                You can now also 'slimbox' another wiki-page or an external url.
                Based on this media viewer, also a %%carousel style has been added.

       * [JSPWIKI-478] Remember cookies of collapsible for all contexts
                Collapsible lists and boxes have been refactored, and styled with BOOTSTRAP.
                In general, all %%dynamic-styles are re-styled with BOOTSTRAP css components.

       * [JSPWIKI-693] style issues

       * [JSPWIKI-463] display error in default template

       * [JSPWIKI-449] Menuhide functionality is illogical
                The sidebar (aka Favorites) can be shown/hidden via a toggle button.
                By default, the sidebar is hidden in the Edit/Comment view, to give
                maximum square-meters to the edit text-area.

       * [JSPWIKI-512] CSS Error with Firefox 2.0.20

       *  Upgrade wro4j to latest version 1.7.3

2014-02-12  Juan Pablo Santos (juanpablo AT apache DOT org)

       * 2.10.1-svn-4

       * Fixed JSPWIKI-819: Consider replacing ECS with JDOM, thanks to Ichiro Furusato

       * TestEngine( Properties ) uses a different directory as page repo (JSPWIKI-813 related)
