/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
 
XMLmind XML Editor addon for Docgen
===================================

This addon customizes the bundled DocBook 5 configuration so that it
will be better for editing documentations conforming to the Docgen
conventions. The customization will only affect the documents that has
conformance="docgen" in their root element, not all DocBook documents.

Requires at least XXE 4.2.1. Last tested on 7.4.1.


How to install
--------------

Just copy the docbook-for-freemarker directory into "addon"
subdirectory of your XXE user preferences directory, which is
(usually):

On UNIX:
  $HOME/.xxe/addon

On Windows 7-10:
  c:\Users\%USERNAME%\AppData\Roaming\XMLmind\XMLEditor<V>\addon
  (replace %USERNAME% with your user name that you see in the Windows start menu,
  <V> with the XEE major version.)
  
On Windows XP:
  C:\Documents and Settings\%USERNAME%\Application Data\XMLmind\XMLeditor<V>\addon

Then restart XXE if it was running. From now on all DocBook 5 XML-s
whose root element has a conformance="docgen" attribute will be opened
with this addon. Other DocBook documents are not affected.


How to update the addon
-----------------------

Repeat the installation procedure (overwrite the files), then you have
to clear the Quick Start cache through the XXE menu:
"Options" -> "Preferences" -> "Advanced" -> "Cached data".