Index: build.xml
===================================================================
--- build.xml	(revision 4433)
+++ build.xml	(working copy)
@@ -237,8 +237,17 @@
 		</javac>
 	</target>
 
+	<target name="options-file" depends="compile">
+		<mkdir dir="${build.classes}/help/en" />
+		<exec executable="java" dir="${build.classes}" failonerror="true" failifexecutionfails="true" input="doc/options.txt">
+			<arg value="buildoptions.OptionsBuilder" />
+			<arg value="../../resources/help/en/options" />
+		</exec>
+	</target>
+	
+
 	<!-- Build into the build direcotory.  All resource files are copied in. -->
-	<target name="build" depends="compile" description="Build everything into the build direcotory">
+	<target name="build" depends="compile,options-file" description="Build everything into the build direcotory">
 		<copy todir="${build.classes}">
 			<fileset dir="${resources}">
 				<include name="*.csv"/>
Index: resources/help/en/options
===================================================================
--- resources/help/en/options	(revision 4433)
+++ resources/help/en/options	(nonexistent)
@@ -1,938 +0,0 @@
-The command line is of the format:
-
-    java.exe [java-options] -jar mkgmap.jar [mkgmap-options]
-
-=== Java options ===
-
-Details of the Java options are available at docs.oracle.com. The most likely
-options you may need to use are:
-
--Xmx<size>[g|G|m|M|k|K]
-    Use this option to set the maximum Java heap size in GB, MB, KB or bytes.
-    Mkgmap allows the use of multiple CPU cores, and the amount of heap memory
-    required increases proportionally with the number of CPU cores being used.
-    The default value may not be sufficient to allow mkgmap to use all the
-    available CPU cores, which will cause the run time to be longer than
-    necessary. To allow mkgmap to run optimally, you may need to use this
-    option to allow more memory to be allocated to the Java heap. Typically,
-    mkgmap requires about 500MB per core, so an 8-core processor might need to
-    specify -Xmx4g - note there is no space or equals sign in the option.
-
--enableassertions
-    Causes an error to be thrown if an assertion written in the mkgmap code is
-    evaluated as not true. This is useful in detecting bugs in the mkgmap code.
-
--Dlog.config=filename
-    Specifies a logging configuration file that allows you to enable and
-    disable specific logging messages. This is useful if you want to see
-    certain types of message that are not logged by default or choose where the
-    messages should be written. === Mkgmap options ===
-
-The order of the options is significant in that options only apply to
-subsequent input files. If you are using splitter, you probably will need to
-put most of your options before '-c template.args' (this file is generated by
-splitter).
-
-=== Information options ===
-
-These options provide information and do not require any input files.
-
---help[=help|options|links|copyright|logging]
-    Display help on the given topic. If the topic is omitted then general help
-    information is displayed, the same as in help=help.
-
---version
-    Write program version to stderr.
-
-=== File options ===
-
-filename
---input-file=filename
-    Read input data from the given file. This option (or just a filename) may
-    be specified more than once. Make sure you set all wanted options before
-    this.
-
---gmapsupp
-    Create a gmapsupp.img file that can be uploaded to a Garmin or placed in
-    "/Garmin" in a microSD card (such as by mounting the device in USB mass
-    storage mode). It can be used on already compiled img files, or if the
-    input files are not already compiled then they are compiled first and then
-    the gmapsupp is created.
-
---gmapi
-    Create a directory in the "gmapi" format required by Mac applications. Can
-    also be used for Windows programs.
-
--c filename
---read-config=filename
-    Each line of the named file contains a command option in the form
-    option=value or option:value. The options are included as arguments of the
-    executed command as if they had been specified on the command line with one
-    exception: a relative path given with option input-file is assumed to be
-    relative to the location of the file.
-
-     Lines beginning with a # character are ignored and can be used as
-    comments. Any command line option can be specified, however the leading
-    '--' must be omitted. The short option names with a single '-' cannot be
-    used, simply use the long name instead.
-
---output-dir=directory
-    Specify the directory in which all output files are written. It defaults to
-    the current working directory, i.e. the directory the command is executed
-    from.
-
--n name
---mapname=name
-    Set the name of the map. Garmin maps are identified by an 8 digit number.
-    The default is 63240001. It is best to use a different name if you are
-    going to be making a map for others to use so that it is unique and does
-    not clash with others.
-
---description=text
-    Set the descriptive text for the map. This may be displayed in QLandkarte,
-    MapSource or on a GPS, where it is normally shown below the family name.
-    Example: --description="Germany, Denmark" Please note: if you use splitter
-    to build a template.args file and pass it to mkgmap, then that file may
-    contain a "description" that will override this option. To prevent splitter
-    from overriding your description, place the --description option after "-c
-    template.args".
-
---country-name=name
-    Set the map's country name. The default is "COUNTRY".
-
---country-abbr=abbreviation
-    Set the map's abbreviated country name. The default is "ABC".
-
---region-name=name
-    Set the map's region name. By default, the map has no region name.
-
---region-abbr=abbreviation
-    Set the map's abbreviated region name. By default, the map has no
-    abbreviated region name.
-
-=== Label options ===
-
---code-page=number
-    Specify which international character set is to be used. Only 8 bit
-    character sets are supported so you have to specify which code page you
-    want to use. It is entirely dependent on the device firmware which code
-    pages are supported.
-
---latin1
-    This is equivalent to --code-page=1252.
-
---unicode
-    This is equivalent to --code-page=65001. Note that some devices don't
-    support Unicode maps produced by mkgmap.
-
---lower-case
-    Allow labels to contain lower case letters. Note that many Garmin devices
-    are not able to display lower case letters at an angle.
-
-=== Address search options ===
-
---index
-    Generate a global address search index. If the --gmapsupp option is also
-    given, then the index is generated within the resulting gmapsupp.img file
-    so that address search will work on a GPS device.
-
-     If both the --gmapsupp and any of --tdbfile, --gmapi, or --nsis options
-    are given alongside the --index option, then both indexes will be created.
-    Note that this will require roughly twice as much memory.
-
-     If the map is sent to the device by MapSource, it will enable find by name
-    and address search on the GPS.
-
-    The address fields are assigned by special mkgmap address tags using the
-    style file:
-  mkgmap:country
-  mkgmap:region
-  mkgmap:city
-  mkgmap:postal_code
-  mkgmap:street
-  mkgmap:housenumber
-  mkgmap:phone
-  (mkgmap:is_in - used by location-autofill=is_in)
-    
-    If the index is created from previously compiled .img files, then the same
-    code page and sorting options (e.g. --code-page, --latin1) must be used as
-    were used to compile the individual map tiles.
-
---split-name-index
-    Index each part of a street name separately. For example, if the street is
-    "Aleksandra Gryglewskiego" then you will be able to search for it as both
-    "Aleksandra" and "Gryglewskiego". It will also increase the size of the
-    index. Useful in countries where searching for the first word in name is
-    not the right thing to do. Words following an opening bracket '(' are
-    ignored.
-    See also option --road-name-config.
-
---road-name-config=filename
-    Provide the name of a file containing commonly used road name prefixes and
-    suffixes. This option handles the problem that some countries have road
-    names which often start or end with very similar words, e.g. in France the
-    first word is very often 'Rue', often followed by a preposition like 'de
-    la' or 'des'. This leads to rather long road names like 'Rue de la
-    Concorde' where only the word 'Concorde' is really interesting. In the USA,
-    you often have names like 'West Main Street' where only the word 'Main' is
-    important. Garmin software has some tricks to handle this problem. It
-    allows the use of special characters in the road labels to mark the
-    beginning and end of the important part. In combination with option
-    --split-name-index only the words in the important part are indexed.
-
-    
-    There are two main effects of this option:
-        - On the PC, when zooming out, the name 'Rue de la Concorde' is only
-        rendered as 'Concorde'.
-        - The index for road names only contains the important part of the
-        name. You can search for road name Conc to find road names like 'Rue de
-        la Concorde'. However, a search for 'Rue' will not list 'Rue de la
-        Concorde' or 'Rue du Moulin'. It may list 'Rueben Brookins Road' if
-        that is in the map. Only MapSource shows a corresponding hint.
-
-        
-        Another effect is that the index is smaller.
-    See comments in the sample roadNameConfig.txt for further details.
-
---mdr7-excl=name[,name...]
-    Specify words which should be omitted from the road index. It was added
-    before option road-name-config and is probably no longer needed.
-    Example usage: --x-mdr7-excl="Road, Street, Weg"
-
---mdr7-del=name[,name...]
-    Use this option if your style adds strings to the labels of roads which you
-    want to see in the map but which should not appear in the result list of a
-    road name / address search. The list is used like this: For each road
-    label, mkgmap searches for the last blank. If one is found, it checks
-    whether the word after it appears in the given list. If so, the word is
-    removed and the search is repeated. The remaining string is used to create
-    the index.
-    Example: Assume your style adds surface attributes like 'pav.' or 'unp.' to
-    a road label. You can use --mdr7-del="pav.,unp." to remove these suffixes
-    from the index.
-
---poi-excl-index=poi[-poi][,poi[-poi]...]
-    By default, mkgmap indexes the following POI types with a non-empty label:
-        - 0x00 .. 0x0f (cities, sub type 0, type <= 0xf)
-        - 0x2axx..0x30xx (Food & Drink, Lodging, ...)
-        - 0x28xx (no category ?)
-        - 0x64xx .. 0x66xx (attractions)
-    This option allows the exclusion of POI types from the index. The excluded
-    types are not indexed, but may still be searchable on a device, as some
-    devices seem to ignore most of the index, e.g. an Oregon 600 with firmware
-    5.00 only seems to use it for city search. If your device finds a POI name
-    like 'Planet' when you search for 'Net', it doesn't use the index because
-    the index created by mkgmap cannot help for that search.
-
-    
-    So, this option may help when you care about the size of the index or the
-    memory that is needed to calculate it. The option expects a comma separated
-    list of types or type ranges. A range is given with from-type-to-type, e.g.
-    0x6400-0x6405. First and last type are both excluded. A range can span
-    multiple types, e.g. 0x6400-0x661f.
-    Examples for usage:
-        - Assume your style adds a POI with type 0x2800 for each
-        addr:housenumber. It is not useful to index those numbers, so you can
-        use --poi-excl-index=0x2800 to exclude this.
-        - For the aforementioned Oregon you may use
-        --poi-excl-index=0x2a00-0x661f to reduce the index size.
-
---bounds=directory|zipfile
-    Specify a directory or zip file containing the pre-processed bounds files.
-    Bounds files in a zip file must be located in the zip file's root
-    directory.
-
-     The pre-processed boundaries are used to add special tags to all elements
-    (points, lines and polygons) containing the elements location information.
-    The style file can be used to assign the address tags mkgmap:country,
-    mkgmap:region etc. using these values.
-
-     The following special tags are added:
-::mkgmap:admin_level2 : Name of the admin_level=2 boundary 
-  mkgmap:admin_level3 : Name of the admin_level=3 boundary
-  ..
-  mkgmap:admin_level11
-  mkgmap:postcode : the postal_code value
-     Pre-processed bounds can be created with the following command:
-  java -cp mkgmap.jar
-    uk.me.parabola.mkgmap.reader.osm.boundary.BoundaryPreprocessor
-    <inputfile> <boundsdir>
-    
-    The input file must contain the boundaries that should be pre-processed. It
-    can have OSM, PBF or O5M file format. It is recommended that it contains
-    the boundary data only to avoid very high memory usage. The boundsdir gives
-    the directory where the processed files are stored. This directory can be
-    used as --bounds parameter with mkgmap.
-
---location-autofill=[option1,[option2]]
-    Controls how the address fields for country, region, city and zip info are
-    gathered automatically if the fields are not set by using the special
-    mkgmap address tags (e.g. mkgmap:city - see option index). Warning:
-    automatic assignment of address fields is somehow a best guess.
-    is_in
-        The is_in tag is analysed for country and region information.
-
-        
-    nearest
-        The city/hamlet points that are closest to the element are used to
-        assign the missing address fields. Beware that cities located in the
-        same tile are used only. So the results close to a tile border have
-        less quality.
-
---housenumbers
-    Enables house number search for OSM input files. All nodes and polygons
-    having addr:housenumber set are matched to streets. A match between a house
-    number element and a street is created if the street is located within a
-    radius of 150m and the addr:street tag value of the house number element
-    equals the mgkmap:street tag value of the street. The mkgmap:street tag
-    must be added to the street in the style file. For optimal results, the
-    tags mkgmap:city and mkgmap:postal_code should be set for the housenumber
-    element. If a street connects two or more cities this allows all addresses
-    along the road to be found, even when they have the same number.
-    Example for given street name:
-        Node - addr:street=Main Street addr:housenumber=2
-        Way 1 - name=Main Street
-        Way 2 - name=Main Street, mkgmap:street=Main Street
-        Way 3 - mkgmap:street=Mainstreet
-        Way 4 - name=Main Street [A504]
-    The node matches to Way 2. It has mkgmap:street set with a value equal to
-    the addr:street tag value of the house number node.
-
-     If the street is not given with addr:housenumber, mkgmap uses heuristics
-    to find the best match.
-
-     Tells mkgmap to write NET data. If you specify this option, you do not
-    need to specify --net and option -no-net is ignored.
-
-=== Overview map options ===
-
---overview-mapname=name
-    If --tdbfile is enabled, this gives the name of the overview .img and .tdb
-    files. The default map name is osmmap.
-
---overview-mapnumber=8 digit number
-    If --tdbfile is enabled, this gives the internal 8 digit number used in the
-    overview map and tdb file. The default number is 63240000.
-
---overview-levels=level:resolution[,level:resolution...]
-    Like levels, specifies additional levels that are to be written to the
-    overview map. Counting of the levels should continue. Up to 8 additional
-    levels may be specified, but the lowest usable resolution with MapSource
-    seems to be 11. The hard coded default is empty.
-    See also option --overview-dem-dist.
-
---remove-ovm-work-files
-    If overview-levels is used, mkgmap creates one additional file with the
-    prefix ovm_ for each map (*.img) file. These files are used to create the
-    overview map. With option --remove-ovm-work-files=true the files are
-    removed after the overview map was created. The default is to keep the
-    files.
-
-=== Style options ===
-
---style-file=filename
-    Specify an external file to obtain the style from. "file" can be a
-    directory containing files such as info, lines, options (see
-    resources/styles/default for an example). The directory path must be
-    absolute or relative to the current working directory when mkgmap is
-    invoked.
-
-     The file can be a zip file containing the files instead of a directory.
-
-     The files can be at the top level or contained in a folder within the zip
-    file. If the zip file contains more than one top level folder then each
-    folder is the name of a style that can be selected with the --style option.
-
-     The argument can also be a URL that specifies the location of a style
-    file.
-
---style=name
-    Specify a style name. Must be used if --style-file points to a directory or
-    zip file containing multiple styles. If --style-file is not used, it
-    selects one of the built-in styles.
-
---style-option=tag[=value][;tag[=value]...]
-    Provide a semicolon separated list of tags which can be used in the style.
-    The intended use is to make a single style more flexible, e.g. you may want
-    to use a slightly different set of rules for a map of a whole continent.
-    The tags given will be prefixed with "mkgmap:option:". If no value is
-    provided the default "true" is used. This option allows to use rules like
-    mkgmap:option:light=true & landuse=farmland {remove landuse} Example: --
-    style-option=light;routing=car will add the tags mkgmap:option:light=true
-    and mkgmap:option:routing=car to each element before style processing
-    happens.
-
---list-styles
-    List the available styles. If this option is preceded by a style-file
-    option then it lists the styles available within that file.
-
---check-styles
-    Perform some checks on the available styles. If this option is preceded by
-    a style-file option then it checks the styles available within that file.
-    If it is also preceded by the style option it will only check that style.
-
---levels=level:resolution[,level:resolution...]
-    Change the way that the levels on the map correspond to the zoom levels in
-    the device. See customisation help. The hard coded default is: "0:24, 1:22,
-    2:20, 3:18, 4:16", although each style can have its own default. The
-    default style for example overwrites it with "0:24, 1:22, 2:20, 3:18". Up
-    to 8 levels may be specified.
-
---name-tag-list=tag[,tag...]
-    Specify the tag that will be used to supply the name. Useful for language
-    variations. You can supply a list of tags and the first one found will be
-    used. e.g. --name-tag-list=name:en,int_name,name
-
-=== Product description options ===
-
---family-id=integer
-    This is an integer that identifies a family of products. Range: [1..9999]
-    Default: 6324
-
---family-name=name
-    If you build several maps, this option describes the family name of all of
-    your maps. Garmin will display this in the map selection screen.
-
-     Example: --family-name="OpenStreetmap mkgmap XL 2019"
-
---product-id=integer
-    This is an integer that identifies a product within a family. It is often
-    just 1, which is the default.
-
---product-version=integer
-    The version of the product. Default value is 100 which means version 1.00.
-
---series-name=name
-    This name will be displayed in MapSource in the map selection drop-down.
-    The default is "OSM map".
-
---area-name=name
-    Area name is displayed on Garmin units (or at least on eTrex) as the second
-    part of the mapname in the list of the individual maps.
-
---copyright-message=text
-    Specify a copyright message for files that do not contain one.
-
---copyright-file=filename
-    Specify copyright messages from a file. Note that the first copyright
-    message is not displayed on a device, but is shown in BaseCamp. The
-    copyright file must include at least two lines and be UTF-8 encoded. The
-    following symbols will be substituted by mkgmap: $MKGMAP_VERSION$,
-    $JAVA_VERSION$, $YEAR$, $LONG_DATE$, $SHORT_DATE$ and $TIME$. Time and date
-    substitutions use the local date and time formats.
-
---license-file=filename
-    Specify a file which content will be added as license. The license file
-    must be UTF-8 encoded. The following symbols will be substituted by mkgmap:
-    $MKGMAP_VERSION$, $JAVA_VERSION$, $YEAR$, $LONG_DATE$, $SHORT_DATE$ and
-    $TIME$. Time and date substitutions use the local date and time formats.
-    All entries of all maps will be merged in the overview map.
-
-=== Optimization options ===
-
---reduce-point-density=NUM
-    Simplifies the ways with the Douglas Peucker algorithm. NUM is the maximal
-    allowed error distance, by which the resulting way may differ from the
-    original one. This distance gets shifted with lower zoom levels.
-    Recommended setting is 4, this should lead to only small differences
-    (Default is 2.6, which should lead to invisible changes)
-
---reduce-point-density-polygon=NUM
-    Allows you to set the maximal allowed error distance for the DP algorithm
-    to be applied against polygons. Recommended setting is 8.
-
---merge-lines
-    Try to merge lines. This helps the simplify filter to straighten out longer
-    chunks at lower zoom levels. Decreases file size more. Increases paint
-    speed at low zoom levels. Default is enabled, use --no-merge-lines to
-    disable.
-
---min-size-polygon=NUM
-    Removes all polygons smaller than NUM from the map. This reduces map size
-    and speeds up redrawing of maps. Recommended value is 8 to 15, default is
-    8.
-    See also polygon-size-limits.
-
---polygon-size-limits=resolution:value[,resolution:value...]
-    Allows you to specify different min-size-polygon values for each
-    resolution. Sample:
-        --polygon-size-limits="24:12, 18:10, 16:8, 14:4, 12:2, 11:0"
-    If a resolution is not given, mkgmap uses the value for the next higher
-    one. For the given sample, resolutions 19 to 24 will use value 12,
-    resolution 17 and 18 will use 10, and so on. Value 0 means to not apply the
-    size filter. Note that in resolution 24 the filter is not used. The
-    following options are equivalent:
-        --min-size-polygon=12
-        --polygon-size-limits=24:12
-        --polygon-size-limits=24:0,23:12
-        --polygon-size-limits=24:0,23:12,22:12,21:12,16:12
-
-=== Hill Shading (DEM) options ===
-
-    Hill Shading is rendered by PC programs (MapSource or BaseCamp) or GPS
-    devices when the map includes a Digital Elevation Model (DEM). Use the
-    following options to add a DEM to the map and control its characteristics.
-    DEM creation requires files containing height information for the area
-    covered by the map, the so called hgt files, which typically cover 1 degree
-    latitude * 1 degree longitude and are named by the coordinates of their
-    bottom left corner (e.g. N53E009). They contain height information in a
-    grid of points. Typical hgt files contain either 1'' or 3'' data. 3'' files
-    have 1201 * 1201 points, which gives 2 * 1201 * 1201 = 2.884.802 bytes. 1''
-    files have 3601 * 3601 points, which gives 2 * 3601 * 3601 = 25.934.402
-    bytes. Other files are supported as long as the formula sqrt(size/2) gives
-    an integer value.
-
---dem=path[,path...]
-    The option expects a comma separated list of paths to directories or zip
-    files containing *.hgt files. Directories are searched for *.hgt files and
-    also for *.hgt.zip and *.zip files.
-    The list is searched in the given order, so if you want to use 1'' files
-    make sure that they are found first. There are different sources for *.hgt
-    files, some have so called voids which are areas without data. Those should
-    be avoided.
-
---dem-dists=number[,number...]
-    If given, the option specifies the resolution(s) or zoom level for the DEM
-    data. If not given, mkgmap tries to determine a reasonable value based on
-    the resolution found in the *.hgt files. For desktop programs like
-    MapSource or Basecamp you only need one zoom level, for GPS devices you
-    need one for each resolution given with the --levels option. The actual
-    values are given as distance between two DEM points and should be a
-    multiple or submultiple of the distance between two points in the hgt file,
-    that is 3314 for 1'' and 9942 for 3''. Higher distances mean lower
-    resolution and thus fewer bytes in the map. Reasonable values for the
-    highest resolution should not be much smaller than 50% hgt resolution, that
-    is somewhere between 1648 and 5520 for 1'' hgt input files (3312 is often
-    used), and 5520 to 9942 for 3'' hgt input files.
-    Example which should work with levels="0:24, 1:22, 2:20, 3:18":
-    --dem-dists=3312,13248,26512,53024
-    This was found in a Garmin Demo map for transalpin data created 2009.
-
---dem-interpolation=auto|bicubic|bilinear
-    Use this option to specify the method that is used to interpolate data from
-    hgt raster to the DEM raster. The value bicubic gives the highest precision
-    but is slower, bilinear is faster but less precise, it tends to smooth the
-    profile and thus also reduces DEM size compared to bicubic. The value auto
-    means that bicubic is used where is seems appropriate according to hgt
-    resolution and dem-dist value, else bilinear is used. The default is auto.
-
---dem-poly=filename
-    If given, the filename should point to a *.poly file in osmosis polygon
-    file format. The polygon described in the file is used to determine the
-    area for which DEM data should be added to the map. If not given, the DEM
-    data will cover the full tile area.
-
---overview-dem-dist=integer
-    If given, the option specifies the resolution(s) for the DEM data in the
-    overview map. If not given or 0, mkgmap will not add DEM to the overview
-    map. Reasonable values depend on the size of the area and the lowest
-    resolution used for the single tiles, good compromises are somewhere
-    between 55000 and 276160.
-
-=== Miscellaneous options ===
-
---max-jobs[=integer]
-    Specify the number of threads to be used for concurrent processing.
-    Increasing max-jobs will reduce the execution time, providing sufficient
-    memory is available and the value is not greater than the number of cores
-    in the CPU. If no value is specified, the limit is set to the number of CPU
-    cores. The default is for the limit to be automatically set to a reasonable
-    value based on the amount of memory allocated to the Java runtime and the
-    amount used in processing the first tile. To optimise mkgmap to use all
-    available CPU cores, you may need to use the Java -Xmx option to increase
-    the amount of available heap storage.
-
---keep-going
-    Don't quit whole application if an exception occurs while processing a map
-    - continue to process the other maps.
-
---block-size=integer
-    Changes the block size that is used in the generated map. This option is
-    not usually needed, but sometimes an error message will ask you to try a
-    value for this option.
-
---net
-    Tells mkgmap to write NET data, which is needed for address search and
-    routing. Use this option if you want address search, but do not need a map
-    that supports routing or house number search.
-
-    
---route
-    Tells mkgmap to write NET and NOD data, which are needed in maps that
-    support routing. If you specify this option, you do not need to specify
-    --net and --no-net is ignored.
-
---add-boundary-nodes-at-admin-boundaries=NUM
-    This option controls how mkgmap calculates special routing nodes which are
-    needed by Garmin software to allow routing between different map tiles.
-    These nodes are written to section 3 and 4 in the NOD file. When a road
-    crosses the tile boundary (bbox), the road is split at this point and such
-    a special node is written. This allows routing between one set of tiles
-    produced by splitter.jar. However, if you create a map from different sets
-    of tiles, those tiles are likely to overlap. For the overlapping tiles,
-    none of the entries in NOD3 match and thus routing across tile border
-    doesn't work when the route is not fully covered by one of the tiles. The
-    option tells mkgmap to add special nodes wherever a road touches or crosses
-    an administrative boundary. The NUM parameter specifies a filter for the
-    admin_level. Boundaries with a higher admin_level value are ignored. The
-    default value is 2 (country borders). Another reasonable value might be 4.
-    A value less or equal to 0 tells mkgmap to ignore intersections at
-    administrative boundaries.
-
---drive-on=left|right|detect|detect,left|detect,right
-    Explicitly specify which side of the road vehicles are expected to drive
-    on. If the first option is detect, the program tries to find out the proper
-    flag. If that detection fails, the second value is used (or right if none
-    is given). With OSM data as input, the detection tries to find out the
-    country each road is in and compares the number of drive-on-left roads with
-    the rest. Use the --bounds option to make sure that the detection finds the
-    correct country.
-
---check-roundabouts
-    Check that roundabouts have the expected direction (clockwise when vehicles
-    drive on the left). Roundabouts that are complete loops and have the wrong
-    direction are reversed. Also checks that the roundabouts do not fork or
-    overlap other roundabouts and that no more than one connecting highway
-    joins at each node.
-
---check-roundabout-flares
-    Check that roundabout flare roads point in the correct direction, are
-    one-way and don't extend too far.
-
---check-routing-island-len=INTEGER
-    Routing islands are small road networks which are not connected to other
-    roads. A typical case is a footway that is not connected to the main road
-    network, or a small set of ways on the inner courtyard of a large building.
-    These islands can cause problems if you try to calculate a route and the
-    GPS selects a point on the island as a start or end. It will fail to
-    calculate the route even if a major road is only a few steps away. If this
-    option is specified, then mkgmap will detect these islands. If the value is
-    set to zero, mkgmap will simply report the islands (you will need to set
-    uk.me.parabola.imgfmt.app.net.RoadNetwork.level=INFO to activate logging of
-    the message). If the value is greater than zero, mkgmap will mark islands
-    with a total length less than the specified value in metres as not
-    routable. Reasonable values are 500 or higher. The default is for the check
-    to not take place. If any of the roads forming the island touches a tile
-    boundary or a country border the island is ignored, as it may be connected
-    to other roads in a different tile.
-    See also option --add-boundary-nodes-at-admin-boundaries.
-    This option seems to cause routing problems in BaseCamp.
-
---max-flare-length-ratio=NUM
-    When checking flare roads, ignore roads whose length is greater than NUM
-    (an integer) times the distance between the nodes on the roundabout that
-    the flare roads connect to. Using this option with a value of at least 5
-    will cut down the number of legitimate roads that are flagged as flare road
-    problems. Default value is 0 (disabled) because it's not a completely
-    reliable heuristic.
-
---ignore-turn-restrictions
-    When reading OSM files, ignore any "restriction" relations.
-
---ignore-osm-bounds
-    When reading OSM files, ignore any "bounds" elements. With this option
-    selected generate-sea sometimes works better, but routing across tiles will
-    not work.
-
---preserve-element-order
-    Process the map elements (nodes, ways, relations) in the order in which
-    they appear in the OSM input. Without this option, the order in which the
-    elements are processed is not defined.
-
---cycle-map
-    Tells mkgmap that the map is for cyclists. This assumes that different
-    vehicles are different kinds of bicycles, e.g. a way with mkgmap:car=yes
-    and mkgmap:bicycle=no may be a road that is good for racing bikes, but not
-    for other cyclists. This allows the optimisation of sharp angles at
-    junctions of those roads. Don't use with the default style as that is a
-    general style!
-
---report-similar-arcs
-    Issue a warning when more than one arc connects two nodes and the ways that
-    the arcs are derived from contain identical points. It doesn't make sense
-    to use this option at the same time as using the cycleway creating options.
-
---report-dead-ends=LEVEL
-    Set the dead end road warning level. The value of LEVEL (which defaults to
-    1 if this option is not specified) determines those roads to report: 0 =
-    none, 1 = multiple one-way roads that join together but go nowhere, 2 =
-    individual one-way roads that go nowhere.
-
---add-pois-to-lines
-    Generate POIs for lines. For each line (must not be closed) POIs are
-    created at several points of the line. Each POI is tagged with the same
-    tags like the line and additional tags added by mkgmap:
-    mkgmap:line2poi=true and tag mkgmap:line2poitype having the following
-    values:
-    * start - The first point of the line
-    * end - The last point of the line
-    * inner - Each point of the line except the first and the last
-    * mid - The middle point
---add-pois-to-areas
-    Generate a POI for each polygon and multipolygon. The POIs are created
-    after the relation style but before the other styles are applied. Each POI
-    is tagged with the same tags of the area/multipolygon. Additionally the tag
-    mkgmap:area2poi=true is set so that it is possible to use that information
-    in the points style file. Artificial polygons created by multipolyon
-    processing are not used. The POIs are created at the following positions
-    (first rule that applies):
-    polygons:
-        First rule that applies of
-        * the first node tagged with a tag defined by the
-        --pois-to-areas-placement option
-        * the centre point
-    multipolygons:
-        First rule that applies of
-        * the node with role=label
-        * the centre point of the biggest area
---pois-to-areas-placement=tag=value[;tag=value...]
-    A POI is placed at the first node of the polygon tagged with the first
-    tag/value pair. If none of the nodes are tagged with the first tag-value
-    pair the first node tagged with the second tag-value pair is used and so
-    on. If none of the tag-value pairs matches or the taglist is empty, the
-    centre of the polygon is used. It is possible to define wildcards for tag
-    values like entrance=*.
-
-     Default: entrance=main;entrance=yes;building=entrance
-
---precomp-sea=directory|zipfile
-    Defines the directory or a zip file that contains precompiled sea tiles.
-    Sea files in a zip file must be located in the zip file's root directory or
-    in a sub directory sea. When this option is defined all natural=coastline
-    tags from the input OSM tiles are removed and the precompiled data is used
-    instead. This option can be combined with the generate-sea options
-    multipolygon, polygons and land-tag. The coastlinefile option is ignored if
-    precomp-sea is set.
-
---coastlinefile=filename[,filename...]
-    Defines a comma separated list of files that contain coastline data. The
-    coastline data from the input files is removed if this option is set. Files
-    must have OSM or PBF file format.
-
---generate-sea[=ValueList]
-    Generate sea polygons. ValueList is an optional comma separated list of
-    values:
-
-    multipolygon
-        generate the sea using a multipolygon (the default behaviour so this
-        really doesn't need to be specified).
-
-    polygons | no-mp
-        don't generate the sea using a multipolygon - instead, generate a
-        background sea polygon plus individual land polygons with tag
-        natural=land. This requires a suitable land polygon type to be defined
-        in the style file (suggested type is 0x010100) and the polygon must be
-        defined in the TYP file as having a higher drawing level than the sea
-        polygon type.
-
-    no-sea-sectors
-        disable the generation of "sea sectors" when the coastline fails to
-        reach the tile's boundary.
-    extend-sea-sectors
-        same as no-sea-sectors. Additional adds a point so coastline reaches
-        the nearest tile boundary.
-
-    land-tag=TAG=VAL
-        tag to use for land polygons (default natural=land).
-    close-gaps=NUM
-        close gaps in coastline that are less than this distance (metres)
-
-    floodblocker
-        enable the flood blocker that prevents a flooding of land by checking
-        if the sea polygons contain streets (works only with multipolygon
-        processing)
-
-    fbgap=NUM
-        flood blocker gap in metre (default 40) points that are closer to the
-        sea polygon do not block
-
-    fbthres=NUM
-        at least so many highway points must be contained in a sea polygon so
-        that it may be removed by the flood blocker (default 20)
-
-    fbratio=NUM
-        only sea polygons with a higher ratio (highway points * 100000 /
-        polygon size) are removed (default 0.5)
-
-    fbdebug
-        switches on the debugging of the flood blocker generates GPX files for
-        each polygon checked by the flood blocker
-
---make-poi-index
-    Generate a POI index in each map tile. Probably not used by modern devices,
-    but still supported.
-
---nsis
-    Write a .nsi file that can be used with the Nullsoft Scriptable Install
-    System (NSIS) to create a Windows Mapsource Installer.
-
---make-opposite-cycleways
-    Some one-way streets allow bicycle traffic in the reverse direction and
-    this option makes a way with the same points as the original that allows
-    bicycle traffic (in both directions).
-
---link-pois-to-ways
-    This option may copy some specific attributes of a POI to a small part of
-    the way the POI is located on. This can be used to let barriers block a way
-    or to lower the calculated speed around traffic signals. POIs with the tags
-    highway=* (e.g. highway=traffic_signals) or barrier=* (e.g.
-    barrier=cycle_barrier) are supported. The style developer must add at least
-    one of the access tags (mkgmap:foot, mkgmap:car etc.), mkgmap:road-speed
-    and/or mkgmap:road-class to the POI. The access tags are ignored if they
-    have no effect for the way, else a route restriction is added at the POI so
-    that only allowed vehicles are routed through it. The tags
-    mkgmap:road-speed and/or mkgmap:road-class are applied to a small part of
-    the way around the POI, typically to the next junction or a length of ~25m.
-    The tags are ignored for pedestrian-only ways.
-
---process-destination
-    Splits all motorway_link, trunk_link, primary_link, secondary_link, and
-    tertiary_link ways tagged with destination into two or three parts where
-    the second part is additionally tagged with mkgmap:dest_hint=*. The code
-    checks for the tags destination, destination:lanes, destination:street and
-    some variants with :forward/:backward like destination:forward or
-    destination:lanes:backward. If a value for destination is found, the
-    special tag mkgmap:dest_hint is set to it and the way is split. This
-    happens before the style rules are processed. This allows to use any
-    routable Garmin type (except 0x08 and 0x09) for that part so that the
-    Garmin device tells the name of this part as hint which destination to
-    follow.
-    See also --process-exits.
-
---process-exits
-    Usual Garmin devices do not tell the name of the exit on motorways while
-    routing with mkgmap created maps. This option splits each motorway_link,
-    trunk_link, primary_link, secondary_link, and tertiary_link way into three
-    parts. All parts are tagged with the original tags of the link.
-    Additionally the middle part is tagged with the following tags:
-
-        mkgmap:exit_hint=true
-        mkgmap:exit_hint_ref=<ref tag value of the exit>
-        mkgmap:exit_hint_name=<name tag value of the exit>
-        mkgmap:exit_hint_exit_to=<exit_to tag value of the exit>
-
-    Adding a rule checking the mkgmap:exit_hint=true makes it possible to use
-    any routable Garmin type (except 0x08 and 0x09) for the middle part so that
-    the Garmin device tells the name of this middle part as hint where to leave
-    the motorway/trunk. The first part must have type 0x08 or 0x09 so that
-    Garmin uses the hint.
-
---delete-tags-file=filename
-    Names a file that should contain one or more lines of the form TAG=VALUE or
-    TAG=*. Blank lines and lines that start with a # or ; are ignored. All
-    tag/value pairs in the OSM input are compared with these patterns and those
-    that match are deleted.
-
---ignore-fixme-values
-    Ignore all tags for which the value matches the regular expression pattern
-    "(?i)fix[ _]?+me".
-
---tdbfile
-    Write files that are essential to running with MapSource, a .tdb file and
-    an overview map. The options --nsis and --gmapi imply --tdbfile.
-
---show-profiles=1
-    Sets a flag in tdb file. The meaning depends on the availability of DEM
-    data (see "Hill Shading (DEM) options").
-    Without DEM data the flag enables profile calculation in MapSource or
-    Basecamp based on information from contour lines.
-    If DEM data is available the profile is calculated with that information
-    and the flag only changes the status line to show the height when you hover
-    over an area with valid DEM data.
-    The default is show-profiles=0.
-
---transparent
-    Make the map transparent, so that if two maps covering the same area are
-    loaded, you can see through this map to see details from the other map too.
-    Typically used for maps containing just contour lines. See --draw-priority
-    as well.
-
---draw-priority=integer
-    When two maps cover the same area and both are enabled in the device, this
-    option controls the order in which they are drawn in and therefore which
-    map is on top. Higher priorities are drawn "on top" of lower priorities.
-    The map drawn on top must be transparent for the one underneath to be seen.
-    The default value is 25.
-
---custom
-    Write a different TRE header. With this option, mkgmap writes the bytes
-    0x170401 instead of the default 0x110301 at offset 43. Useful for marine
-    maps.
-
---hide-gmapsupp-on-pc
-    Set a bit in the gmapsupp.img that tells PC software that the file is
-    already installed on the PC and therefore there is no need to read it from
-    the device.
-
---poi-address
-    Enable address / phone information to POIs. Address info is read according
-    to the "Karlsruhe" tagging schema. Automatic filling of missing information
-    could be enabled using the "location-autofill" option. Default is enabled,
-    use --no-poi-address to disable.
-
---verbose
-    Makes some operations more verbose. Mostly used with --list-styles.
-
---order-by-decreasing-area
-    Puts area/polygons into the map in decreasing size order, so that smaller
-    features are rendered over larger ones (assuming the draw order is equal).
-    The tag mkgmap:drawLevel can be used to override the natural area of a
-    polygon, so forcing changes to the rendering order.
-
-=== Deprecated and Obsolete Options ===
-
---drive-on-left
---drive-on-right
-    Deprecated; use drive-on instead. The options are translated to
-    drive-on=left|right.
-
---make-all-cycleways
-    Deprecated; use --make-opposite-cycleways instead. Former meaning: Turn on
-    all of the options that make cycleways.
-
---charset=name
-    Obsolete; use --code-page instead.
-
---map-features=filename
-    Obsolete; use --style-file instead.
-
---ignore-maxspeeds
-    Obsolete; former usage: When reading OSM files, ignore any "maxspeed" tags.
-
---ignore-builtin-relations
-    Obsolete; former usage: When reading OSM files, skip the built-in
-    processing of relations. This speeds up the processing non-routable map
-    layers that do not contain multipolygons. This implies
-    --ignore-turn-restrictions.
-
---road-name-pois[=GarminCode]
-    Obsolete; former usage: Generate a POI for each named road. By default, the
-    POIs' Garmin type code is 0x640a. If desired, a different type code can be
-    specified with this option. This is a workaround for not being able to
-    search for roads. 0x2f15: a blue dot in the middle of the road, and if you
-    select, or 'hover' over it, the street name appears.
-
---make-cycleways
-    Obsolete; former meaning: Some streets have a separate cycleway track/lane
-    just for bicycle traffic and this option makes a way with the same points
-    as the original that allows bicycle traffic. Also, bicycle traffic is
-    prohibited from using the original way (unless that way's bicycle access
-    has been defined).
-
---remove-short-arcs[=MinLength]
-    Now ignored, former usage: Merge nodes to remove short arcs that can cause
-    routing problems. If MinLength is specified (in metres), arcs shorter than
-    that length will be removed. If a length is not specified, only zero-length
-    arcs will be removed.
-
---adjust-turn-headings[=BITMASK]
-    Now ignored, former usage: Where possible, ensure that turns off to side
-    roads change heading sufficiently so that the GPS believes that a turn is
-    required rather than a fork. This also avoids spurious instructions to
-    "keep right/left" when the road doesn't actually fork.
-
-    Optional BITMASK (default value 3) allows you to specify which adjustments
-    are to be made (where necessary):
-
-        1 = increase angle between side road and outgoing main road
-        2 = increase angle between side road and incoming main road
Index: src/buildoptions/OptionsBuilder.java
===================================================================
--- src/buildoptions/OptionsBuilder.java	(nonexistent)
+++ src/buildoptions/OptionsBuilder.java	(working copy)
@@ -0,0 +1,145 @@
+package buildoptions;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class OptionsBuilder {
+
+
+	public static void main(String[] args) {
+		final int indentSize = 4;
+		boolean hasNonAscii = false;
+		int lineNumber = 0;
+		File outputFile = new File(args[0]);
+		System.setProperty("line.separator", "\n");
+		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+				BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile))) {
+			String line;
+			String previousLine = "";
+			int indent = 0;
+			boolean preformatted = false;
+			while((line = br.readLine()) != null) {
+				++lineNumber;
+				if (!line.matches("\\p{ASCII}*")) {
+					System.err.println("Line " + lineNumber + " contains one or more non-ASCII characters.\r\n" + line);
+					hasNonAscii = true;
+				}
+				if (preformatted) {
+					if (line.trim().compareToIgnoreCase("</pre>") == 0)
+						preformatted = false;
+					else {
+					    bw.write(line);
+					    bw.newLine();
+					}
+				} else {
+					line = line.replaceAll("\\s+", " ");
+					if (line.length() > 0) {
+						if (line.startsWith(";-")) {
+							line = line.substring(1);
+							indent = 0;
+							if (!previousLine.isEmpty()) {
+							    bw.write(previousLine);
+							    bw.newLine();
+							    previousLine = "";
+							}
+						}
+						else if (line.charAt(0) == ':') {
+							if (!previousLine.isEmpty()) {
+							    bw.write(previousLine);
+							    bw.newLine();
+							    previousLine = "";
+							}
+							indent = 1;
+							line = line.substring(1);
+							while (line.charAt(0) == ':') {
+								indent++;
+								line = line.substring(1);
+							}
+							if (line.charAt(0) == ';')
+								line = line.substring(1);
+						}
+						else if (line.trim().compareToIgnoreCase("<p>") == 0) {
+							if (!previousLine.isEmpty()) {
+							    bw.write(previousLine);
+							    bw.newLine();
+							    previousLine = "";
+							}
+							line = "";
+						    bw.newLine();
+						}
+						else if (line.trim().compareToIgnoreCase("<pre>") == 0) {
+							if (!previousLine.isEmpty()) {
+							    bw.write(previousLine);
+							    bw.newLine();
+							    previousLine = "";
+							}
+							line = "";
+						    preformatted = true;
+						}
+						line = line.trim();
+						if (!previousLine.isEmpty()) {
+							if (!line.isEmpty()) {
+								previousLine += " " + line;
+							}
+						} else {
+							previousLine = line;
+							for (int i = 0; i < indent; i++) {
+								for (int j = 0; j < indentSize; j++)
+									previousLine = " " + previousLine;
+							}
+						}
+						while (previousLine.length() > 79) {
+							line = previousLine.substring(0, 80);
+							int lastSpaceIndex = line.lastIndexOf(' ');
+							int firstNonSpaceIndex = 0;
+							while (firstNonSpaceIndex < 79) {
+								if (line.charAt(firstNonSpaceIndex) != ' ')
+									break;
+								firstNonSpaceIndex++;
+							}
+							if (lastSpaceIndex > firstNonSpaceIndex) {
+								line = line.substring(0, lastSpaceIndex);
+								previousLine = previousLine.substring(lastSpaceIndex + 1);
+								for (int i = 0; i < indent; i++) {
+									for (int j = 0; j < indentSize; j++)
+										previousLine = " " + previousLine;
+								}
+							    bw.write(line);
+							    bw.newLine();
+							}
+							else {
+							    bw.write(previousLine);
+							    bw.newLine();
+							    previousLine = "";
+							}
+						}
+					}
+					else {
+						indent = 0;
+						if (!previousLine.isEmpty()) {
+						    bw.write(previousLine);
+						    bw.newLine();
+						    previousLine = "";
+						}
+						bw.newLine();
+					}
+				}
+			}
+			if (!previousLine.isEmpty()) {
+			    bw.write(previousLine);
+			    bw.newLine();
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+			System.exit(-1);
+		}
+		if (hasNonAscii) {
+			System.exit(-1);
+		}
+	}
+
+}
