liblouis NEWS -- history of user-visible changes.  	-*- org -*-

* Noteworthy changes in release 3.12.0 (2019-12-02)
This release contains major updates to the UEB, Afrikaans, Chinese,
Danish and Polish tables. Aside from that there have been many code
cleanups, such as the elimination of many global vars and bug fixes
such as an endless loop or a crash in ~lou_translate~.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/22?closed=1][the list of closed
issues]].

** New features
None
** Bug fixes
- Fix a memory leak when several tables are specified and some of them
  that can't be resolved. Thanks to André-Abush Clause.
- Fix an endless loop with multipass rules where ~endReplace~ is
  smaller or equal to ~startMatch~. Thanks to Bert Frees and Bue
  Vester-Andersen.
** Braille table improvements
- Punctuation corrections in Ethiopic Braille thanks to Dr. Tamru E.
  Belay.
- Fixes to the Norwegian 8dot braille table in regards to 4 Sami
  characters, capital and small letters S and Z with caron. Thanks to
  Oddvar Øyan and Lars Bjørndal.
- Improvements to Afrikaans contracted braille thanks to Christo de Klerk
  - Over 50 cases have been corrected where braille rules were not
    correctly applied in words, mainly in those cases where
    contractions depend on pronunciation; for example, ui or ie must
    not be contracted in requiem.
  - Corrected contraction errors caused by start or end of input not
    properly taken into account.
  - Words are no longer contracted into lower word contractions when
    they are adjacent to lower punctuation, for example: "hier.
  - Words are now contracted into their lower contractions when they
    are adjacent to upper punctuation, for example: (hier.
- New draft table for Dutch 8-dot computer braille thanks to Leonard
  de Ruijter.
- Updates to the Chinese braille table (~zh-tw.ctb~) thanks to
  Bo-Cheng Jhan, Coscell Kao, 特種兵, 黃偉豪, and Victor Cai.
- Fixes to Polish grade 1, thanks to Łukasz Golonka
  - Removes some unneeded ~midnum~ symbols from the Polish Grade 1.
  - Fixes some symbols which weren't defined according to the
    specification.
  - Makes it possible to type dot from a braille keyboard.
  - Adds Greek letters and some commonly used math operators to both
    the Grade 1 and the computer braille table.
- Fix several conflicts in ~fr-bfu-comp68.cti~ with regards to the IPA
  Unicode range. These had been especially noticed when
  ~compbrlAtCursor~ mode flag was used. Thanks to André-Abush Clause.
- Major Improvements to contraction use in UEB thanks to James Bowden.
- Updates to the Danish Tables thanks to Bue Vester-Andersen:
  - Added miscelaneous Unicode characters to 8 dots grade 1 and 2
    (accented letters, punctuation, arrows and some math signs).
    Most of these characters have not been defined in the Danish
    Braille standard. This implementation is purely experimental,
    and the characters may be changed later.
  - Updated the 6 dots tables with more Unicode characters
    (no arrows or math signs).
  - Corrected a bug in 8 dots grade 2, which resulted in the
    "var" contraction not always being properly applied.
** Other changes
- Make sure the log callback uses the same calling convention as all
  the other exported functions. Thanks to Leonard de Ruijter.
- Fix a problem with Non-ASCII characters in file paths in the Python
  bindings, thanks to André-Abush Clause.
- Eliminate some of the globals variables thanks to Bert Frees.
- The display and the translation are now separated at least
  internally, thanks to Bert Frees. As a reminder, there are two
  phases to a braille conversion:
  - translation :: liblouis uses the rules in the translation table to
                   convert characters to dots
  - display :: display the dots as characters. Usually liblouis uses
               the characters defined in display rules (in display
               tables) but as a fallback it uses mappings defined in
               the translation table, e.g. letter rules.
- No longer install ~lou_compare~, a tool that is used to run
  regression tests for UEB. As it is only run during testing it will
  no longer be installed by default on a users machine.
- Remove a hidden feature of ~lou_translate~ that would cause it to
  crash if passed an invalid file name. Thanks to Christian Egli.
- Raise an error if a dot pattern can not be displayed instead of
  silently ignoring it thanks to Bert Frees.
** Deprecation notice
None

** Backwards incompatible changes
None

** Invisible changes

** New, renamed or removed tables
*** New
- nl-comp8.utb

*** Renamed
None

*** Removed
None

* Noteworthy changes in release 3.11.0 (2019-09-02)
A tremendous amount of work by Dave Mielke and Bert Frees has gone
into this release. They have improved liblouis for use on note taker
devices, for backwards translation and a number of languages. Many
other contributors (listed below) have also helped in fixing bugs and
improving braille tables, such as Dutch, Mongolian, Polish, Ancient
Greek, Danish, Irish, Chinese, and American Braille Computer Code.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/21?closed=1][the list of closed
issues]].

** New features
- Enable ~always~ rules with a single character and a single braille
  cell for back-translation. Thanks to Bue Vester-Andersen.
- Implement ~noUndefined~ mode for forward translation, thanks to Dave
  Mielke.
- Use fallback braille representations (NABCC) for rendering undefined
  characters in hexadecimal notation, thanks to Dave Mielke.
- Always render undefined characters, also ASCII characters, in
  hexadecimal notation.
- Add a new metadata field ~index-name~ for selecting a table from a
  list fast and efficiently. It has the most important information
  first and no redundant information. It should look nice when sorted.
  This in contrast to the existing ~display-name~ field which is for
  describing a table accurately and should sound good. Thanks to Dave
  Mielke and Bert Frees.

** Bug fixes
- Don't let a caps passage end on a word with no letters. Thanks to
  Bert Frees.
- Handle word resets in the last word of an caps or emphasis passage
  if the end indicator was placed before the word. Thanks to Bert
  Frees.
- Never convert to lowercase if ~capsletter~ is not defined. Thanks to
  Bert Frees.
- Fix position mapping for back-translation when ~noUndefined~ mode is
  active. Thanks to Dave Mielke.
- Fix bug where a translation would hang on words that match both a
  ~nocont~ and a ~repeated~ rule. Thanks to Dave Mielke.
- Fix bug where the effect of ~capsnocont~ would leak to the next word
  if that word starts with a capital. Thanks to Bue Vester-Andersen.

** Braille table improvements
- Fix an issue with ordinal numbers inside caps passages in Dutch
  braille. Thanks to Bert Frees.
- Improved back-translation for Mongolian thanks to Angaragerdene.
- Fixes to Polish grade 1 and Polish computer braille thanks to Łukasz
  Golonka.
- Improvements to Ancient Greek braille, which has been renamed "Greek
  international braille". A version with composed accents is made
  available as a .uti table. Thanks to Dave Mielke and Μαρια
  Γεωργακαράκου (Maria Georgakarakou).
- Various improvements to modern Greek thanks to Dave Mielke.
- Improvements and fixes to Spanish contracted braille. Details in
  #741. Thanks to Juan Pablo Bello.
- Improvements and fixes to the Danish tables. Thanks to Bue
  Vester-Andersen.
- Add a display table to match Word CX which is used in Norway and
  Sweden, and maybe also in other countries thanks to Lars Bjørndal.
- Fix handling of colon within number in Dutch braille, thanks to Jake
  Kyle.
- Fix translation of bullet and dot operators in Dutch braille, thanks
  to Paul Rambags
- Added North American Braille Computer Code table (~en-nabcc.utb~)
  which is the counterpart of the ~text_nabcc.dis~ display table.
  Thanks to Dave Mielke.
- Add support for the International Phonetic Alphabet (IPA) to the
  Chinese bopomofo braille table, thanks to Hurt Huang and Sponge
  Jhan. Various improvements, including dot patterns and test cases, to
  the Chinese bopomofo braille table, thanks to Sponge Jhan.
- Unified English Braille no longer displays a single underscore when
  multiple underscores are in the text, thanks to André-Abush Clause.
- Update to Afrikaans uncontracted braille and new table for contracted
  braille. Thanks to Christo de Klerk and Greg Kearney.
- Update Irish braille (contracted and uncontracted) to the May 2019
  version of the specification, thanks to Ronan McGuirk

** Other changes
- The python wrapper now encodes and decodes strings to/from UTF-16
  and UTF-32 using the surrogatepass error handler. This ensures that
  single UTF-16 surrogate characters are processed correctly by the
  wrapper and don't raise an encoding/decoding error. Thanks to
  Leonard de Ruijter.
- Metadata keys and values are now case insensitive, thanks to Dave
  Mielke.
- Remove ~unicodedefs.cti~. It was obsolete and never meant to be
  included by any tables. Instead use the online references as
  mentioned in the documentation now. See also #696.
- ~lou_checkyaml~ test reporting has been improved, thanks to Bert
  Frees. For example it now has a ~--verbose~ option so that printing
  of expected failures can be enabled.
- Hyphenation tables have been removed from tables except those needed
  for ~nocross~ rules, thanks to Bert Frees.

  The idea is that the caller (for example ~odt2braille~ or
  ~liblouisutdml~) should be able to decide for themselves which
  hyphenation table to use. The case in which a table contains nocross
  rules is an exception. In this case the hyphenation patterns are a
  real part of the table. Because it is not recommended to append an
  own hyphenation table in this case, a ~#-has-nocross~ metadata field
  was added to indicate that a table contains nocross rules.
- ~lou_hyphenate~ can now handle more than just words (sequences of
  letters), e.g compound words, thanks to Bert Frees.

** Deprecation notice
- The ~noUndefinedDots~ mode has been renamed to ~noUndefined~. For
  backwards compatibility ~noUndefinedDots~ is still available in the
  header file and in the Python bindings, as an alias for
  ~noUndefined~.

** Backwards incompatible changes
None

** Invisible changes
   - Internally separate more clearly the display and translation
     phases.

** New, renamed or removed tables
*** New
- grc-international-common.uti
- grc-international-composed.uti
- grc-international-decomposed.uti
- en-nabcc.utb

*** Renamed
- gr-bb.ctb -> grc-international-en.utb

*** Removed
- unicodedefs.cti
- fi-fi.ctb

* Noteworthy changes in release 3.10.0 (2019-06-03)
This release comes across as quiet, containing just the usual
assortment of braille table improvements, cleanups, bug fixes and the
classic buffer overflow patches. But beware, a lot has happened behind
the scenes. Bert and Davy have been adding a new opcode to handle
special emphasis situations. A number of annoying restrictions with
regards to names, such as class names have been removed thank to Bert.
And lastly also thanks to Bert it is now possible to define inline
display tables in your YAML tests.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/20?closed=1][the list of closed
issues]].

** New features
- Add a new opcode ~emphmodechars~. Thanks to Bert Frees and Davy
  Kager.

** Bug fixes
- Remove memoization in ~checkAttr~. It wasn't implemented correctly,
  caused some weird bugs and probably didn't do much for performance.
  Thanks to Bert Frees.
- Fix multiple buffer overflows in ~compilePassOpcode~. Thanks to
  Cheng Wen for the report and to Christian Egli for the fix.
- Fix a build problem when building without libyaml thanks to Bert
  Frees.

** Braille table improvements
- Added modified letters to UEB thanks to Mike Gray.
- Complete overhaul of the U.S. six-dot computer braille tables to
  align with the CBC standard thanks to Timothy Wynn. There is now a
  sub-table for EBAE (~en-us-compbrl.uti~) and a stand-alone table
  (~en-us-comp6.ctb~).
  - Conforms to the CBC standard from BANA for character definitions
    that differ from the 8-dot ASCII braille (11 punctuation marks).
  - Added rules for braille indicators, emphasis indicators, and
    isolated lower-cell signs to the stand-alone table.
  - Uncontracted and contracted EBAE tables no longer use dot 7 when
    in computer braille mode.
  - ~en-us-compbrl.ctb~ was deleted because it was identical to
    ~en-us-comp6.ctb~.
- Update Bopomofo-based Chinese Braille thanks to Sponge Jhan
  - Correct various dot patterns of Chinese characters.
  - Add more known pattern exceptions of Chinese characters.
  - Apply ~word~ opcode to 倔 and 据.
  - Change dot pattern of ＆ to 456-12346.
- ~de-de-comp8.ctb~ now has definitions for musical Unicode characters
  thanks to Daniel Mayr
- Emphasis improvements in Unified French 6 dots Braille thanks to
  Ludovic Oger.
- Improvements to Unified English braille, Grade 2 thanks to James
  Datray from Freedom Scientific.
- Numerous back-translation fixes to Grade 2 of UK English and Unified
  English Braille thanks to Anthony Tibbs.
- Updates to Dutch Braille thanks to Bert Frees
  - Hyphen cancels the effect of emphasis indicator
  - Left/right curly brackets
  - Write currency symbols in full if they come after the number

** Other changes
- Remove various restrictions on which characters and braille cells
  can be used in translation rules, thanks to Bert Frees.
- Remove some code duplication in ~pattern.c~ thanks to Bert Frees
- It is now also possible to define inline tables when a display table
  has been defined thanks to Bert Frees
- Nightly snapshots of liblouis are now also built for win64 thanks to
  Bert Frees

** Deprecation notice
None

** Backwards incompatible changes
None

** New, renamed or removed tables
*** New
- en-us-compbrl.uti

*** Renamed
- chardefs.cti -> en-chardefs.cti

*** Removed
- en-us-compbrl.ctb

* Noteworthy changes in release 3.9.0 (2019-03-04)
This release has seen a tremendous amount of work by Bert Frees. He
was instrumental in pushing the improvements for Latvian, Norwegian
and Slovenian. But most prominently he pushed the big change for space
and control character handling through the door. These characters are
now no longer hard coded in liblouis. This should solve a few long
standing issues. Other than that there is the usual assortment of code
improvements and cleanups.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/19?closed=1][the list of closed
issues]].

** New features
- None

** Bug fixes
- Fix a problem in the callback registration in the Python bindings
  thanks to Leonard de Ruijter.
- Fixed memory leaks created by block scope compound literals thanks
  to Martin Gieseking.
- The hard coded rules dealing with white space have been replaced
  with a normal table that is included in all tables. This fixes a
  number of bugs to do with space and control characters. This (big)
  change has been brewing for a couple of releases and has finally
  landed. Thanks to Christian Egli and Bert Frees.

** Braille table improvements
- Major extension of the German 8 dot computer braille table thanks to
  Ali-Riza Ciftcioglu. For example the Euro sign or quote characters
  are finally defined.
- Fix a few issues with Hungarian grade1 and grade2 Braille thanks to
  Attila Hammer.
- Various improvements to Norwegian thanks to Lars Bjørndal, Jostein
  Austvik Jacobsen, Ammar Usama and Bert Frees.
- Updates to Bopomofo-based Chinese Braille thanks to Sponge Jhan:
  Improved Braille representation of Chinese characters, and rewritten
  Kana rules using multipass statements.
- Implement the new Slovenian Braille standard thanks to Robert Merič
  and Bert Frees.
- Updates to Latvian Grade 1 Braille thanks to Artis Raugulis and Bert
  Frees.
- Fixes to English, U.S. Grade 2 (ABAE) thanks to jdatray.

** Other changes
- Don't search for tables in ~/usr/local/share/liblouis/tables~ (or
  the Windows equivalent) if ~LOUIS_TABLEPATH~ is set.
- The log levels in ~liblouis.h~ are no longer exposed as ~LOG_FOO~
  but instead are now prefixed. So ~LOG_WARN~ becomes ~LOU_LOG_WARN~
  for example to issue a warning from a C program using liblouis. The
  actual values remain the same, so the ABI remains stable.

** Deprecation notice
- The ~locale~ opcode was never implemented and was just silently
  ignored. It is now removed from the tables and a warning will be
  issued if it is found in a table.

** Backwards incompatible changes

** New, renamed or removed tables
*** New
- None

*** Renamed
- spaces.ctb -> spaces.uti

*** Removed
- None

* Noteworthy changes in release 3.8.0 (2018-12-03)
The major focus of this release is on braille table updates. There are
major updates to German, Arabic, Chinese, Turkish, Dutch, Czech,
Latvian, Spanish and Ethiopic. Some of these new tables have only been
possible because Bert Frees fixed some nasty long standing bugs behind
the scene. Also there is the usual assortment of code improvements and
cleanups.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/18?closed=1][the list of closed
issues]].

** New features
- None

** Bug fixes
- Fix support more than 4 classes thanks to Bert Frees.
- Fix capitalization of words that match ~nocont~ rules thanks to Bert
  Frees.

** Braille table improvements
- Defined the undefined character for the Czech tables thanks to Jan
  Hegr.
- Improvements to Unified English braille thanks to Mike Gray
- Updated the Dutch table to the new 2017.1 braille standard thanks to
  Davy Kager.
- Improvements to the Polish grade 1 table, to make back-translations
  of diacritics working
- Fixes to Latvian braille table thanks to Gatis Grintals and Artis
  Raugulis.
- Improvements to traditional Mainland Chinese braille and two-cell
  Chinese Braille thanks to Sunian Loomee.
- Update Bopomofo-based Chinese Braille to version 2018-11 thanks to
  Bo-Cheng Jhan
  - Correct the default braille pattern of many Chinese characters
  - Add various Chinese phrases involving exceptions of braille
    patterns
  - Modify dot patterns of dashes for readability reasons
- Added a table for Turkish grade 2 thanks to Uğur Gürbüz and Simon
  Aittamaa
- Major upgrade to the German tables. They have been upgraded to /Das
  System der deutschen Brailleschrift/ (2018). They are much smaller
  now as they are based on ~lou_maketable~. As they now work for any
  locale (be it Switzerland or Germany) they have been merged into one
  set of tables for the different grades. Thanks to Christian
  Waldvogel.
- New table for Arabic contracted braille thanks to Ikrami Ahmad.
- New table for Arabic computer braille thanks to Ikrami Ahmad.
- Improvements to Arabic uncontracted braille thanks to Ikrami Ahmad.
- Improvements to Ethiopic thanks to Tamru E. Belay.
- New table for Spanish contracted braille thanks to Juan Pablo Bello.

** Other changes
- Updated the ~lou_allround~ and ~lou_trace~ test tools to include all
  the mode flags described in the documentation of the
  ~lou_translateString()~ function, thanks to Bue Vester-Andersen

** Deprecation notice
- None

** Backwards incompatible changes
- The ~pass1Only~ flag has been deprecated for a while and is now
  removed from the code, thanks to Bue Vester-Andersen.

** New, renamed or removed tables
*** New
- tr-g2.ctb
- ar-ar-g2.ctb
- ar-ar-comp8.utb
- es-g2.ctb

*** Renamed
- de-de-accents.cti -> de-accents.cti
- de-de-g0.utb -> de-g0.utb
- de-de-g1.ctb -> de-g1.ctb
- de-de-g2.ctb -> de-g2.ctb
- de-ch-g0.utb -> de-g0.utb
- de-ch-g1.ctb -> de-g1.ctb
- de-ch-g2.ctb -> de-g2.ctb

*** Removed
- ar-fa.utb
- Es-Es-g1.utb

* Noteworthy changes in release 3.7.0 (2018-09-03)
This release implements major improvements for back-translation thanks
to concerted efforts by Bue Vester-Andersen, Bert Frees, Timothy Lee
and others. In particular the input/output positions are now correct
also for back-translation. There are new and improved Chinese Braille
tables and some long awaited improvements to UEB. The release also has
some code cleanups and documentation improvements.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/17?closed=1][the list of closed
issues]].

** New features
- Added a new opcode ~midendnumericmodechars~. Characters defined with
  this opcode can appear in the middle or at the end of a number
  without canceling numeric mode. Thanks to Bue Vester-Andersen.

** Bug fixes
- Fix another stack-based buffer overflow in input parsing reported by
  Henri Salo thanks to Christian Egli.
- Fix input/output positions for back-translation. Thanks to excellent
  bug reports and patches by Timothy Lee, Bert Frees heroically sat down and
  reworked the handling of the input/output positions for
  back-translation. This solves numerous issues with backward
  translation.
- The returned ~inlen~ and ~outlen~ now always match thanks to the
  above work on input/output positions by Bert Frees.
- Major improvements in the back-translation of capitalized words
  (~capsword~) in conjunction with punctuation and numbers. Thanks to
  Bue Vester-Andersen
- Fixed a problem in the back-translation of numbers in conjunction
  with punctuation and letters. Thanks to Rimas Kudelis and Bue
  Vester-Andersen
- Fix a buffer overflow in ~matchCurrentInput~. Thanks to Hongxu Chen
  for reporting and to Christian Egli for fixing it.

** Braille table improvements
- Danish grade 2 tables: Reduced hyphenation to only the hyphens
  necessary for correct Braille translation. Replaced the longer rules
  with hyphenation for better cursor positioning. Corrected some words.
  Thanks to Bue Vester-Andersen.
- New Chinese Mandarin Braille Codes (Grade 1) and (Grade 2) thanks to
  Sunian Loomee. The first one is for Chinese Common Braille, commonly
  known as the old Braille where a Chinese character is composed of
  three Braille Symbols, consonants, vowels and tones. The second
  table is for Chinese double spelling Braille, commonly known as the
  new Braille where Chinese character is composed of two Braille
  Symbols, consonants and vowels, ( the tones are included in vowels ).
- Major update to the Urdu tables thanks to Jake Kyle.
- Back-translation of numbers in Latvian, Polish, Portuguese, Serbian,
  and Swedish has been fixed thanks to Bue Vester-Andersen.
- Improvements to UEB such as handling of /BLT/, /BLVD/ and /LLC/,
  number sign placement, final-letter groupsign usage and final-letter
  back-translation thanks to Mike Gray.
- Significant changes to Bopomofo-based Chinese Braille. Among other
  things there is now complete the support of /CJK Unified Ideographs
  Extension A/ and some symbols were added for Nemeth. Thanks to
  Sponge Jhan and 黃偉豪. With this change we can now properly handle
  duoyinzi, Chinese words that have more than one pronunciation. The
  granularity of the cursor movement can now reflect positions of all
  Chinese characters.

** Other changes
- Added documentation of opcodes which were previously introduced as
  part of the UEB work. Thanks to Bue Vester-Andersen.
- Test suite improvements: In addition to checking the translation the
  tests now also check if the provided ~inlen~ is the same as the
  returned ~inlen~ and retry the test with a larger output buffer.
- Fix a problem in the Makefiles that prevented liblouis from being
  built with automake 1.16. This is fixed now thanks to a patch from
  Samuel Thibault.
- Removal of the code for the /scripting language/ for multipass
  opcodes. This code was originally introduced in 2012 but never
  documented. Consequently it was never used. Meanwhile the original
  code for multipass opcodes was much improved. So there is no more
  need for this (duplicate) code and we are removing it.
- The nightly snapshots of pre-built windows binaries are now built
  with UCS4 enabled.

** Deprecation notice
- None

** Backwards incompatible changes
- None

** New, renamed or removed tables
*** New
- zhcn-g1.ctb
- zhcn-g2.ctb
*** Renamed
- None
*** Removed
Tables that are only useful in the context of liblouisutdml were moved
there
- marburg.ctb
- marburg_edit.ctb
- nemeth.ctb
- nemeth_edit.ctb
- ukmaths.ctb
- ukmaths_edit.ctb
- wiskunde-translation.cti
- wiskunde.ctb

* Noteworthy changes in release 3.6.0 (2018-06-04)
This release contains the usual assortment of braille table
improvements, cleanups and bug fixes. The most prominent change is the
refactoring of the call APIs by Bert Frees that makes the code much
more manageable and solid and will help us in the future to evolve the
library.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/16?closed=1][the list of closed
issues]].

** New features
- Add metadata fields =name= and =display-name= to tables thanks to
  Bert Frees. The =name= contains a description of the table in the
  native language. =display-name= contains an English description.
- YAML test enhancements
  - You can now test both forward and backwards translation with in
    the same YAML file and for the same set of tables tests thanks to
    Bue Vester-Andersen. See the documentation for the
    ~bothDirections~ testmode.
  - Add =maxOutputLength= option in YAML tests.

** Bug fixes
- Fix a bunch of buffer overflow errors in table parsing thanks to
  Samuel Thibault and Christian Egli (CVE-2018-11410 and
  CVE-2018-11440).
- Fix input-output mapping of context rules thanks to Bert Frees.
- Fix back tracking with all caps words thanks to Bert Frees.
- Fix context rules with lookback thanks to Bert Frees.
- Fix a memory leak in default table resolver thanks to Timothy Lee.
- Fix an array out of bounds error which caused a crash on i386 thanks
  to Samuel Thibault.
- Fix numerous stack-based buffer overflow in table parsing reported
  by Henri Salo and Edward-L thanks to Christian Egli (CVE-2018-11577,
  CVE-2018-11683, CVE-2018-11684 and CVE-2018-11685).

** Braille table improvements
- Fix some forward- and back-translation errors in Unified French Grade
  2 thanks to André-Abush Clause.
- Updates to the Simplified-Chinese Braille Translation Table thanks
  to Roshanson
  - Added many polygraphs to distinguish different meanings of a word
  - Letter identifiers have been modified. In China's school for the
    blind, when many visually impaired students learn, the lowercase
    letters often do not have to mark the identifiers deliberately. So
    in this version, we this item has been deleted.
  - Fixed a bug in the braille code that revises the space and 0
- Updates to Bopomofo-based Chinese Braille Table thanks to Bo-Cheng Jhan
  - Redefine some Chinese words and phrases
  - Add various Nemeth symbols such as arrows and parenthesis
  - Complete the support of CJK Compatibility block
  - Fix the support of various parentheses, brackets, and braces
  - Minor fixes (kana rules, punctuation marks, Greek alphabets)
- New 8 dot computer braille table for Czech thanks to Jan Hegr.
- Fixes to Czech 6 dot table thanks to Jan Hegr
  - Fixed curly brackets representation
  - Fixed number sign representation
  - Added copyright sign
- Minor fixes to Hebrew thanks to Erez Kugler.

** Other changes
- Refactoring thanks to Bert Frees
  - Simplify the emphasis class handling by combining all related vars
    in a struct =EmphasisClass=
  - Simplify input/output buffer handling
  - Combine =emphasisBuffer= and =transnoteBuffer=
  - Group match related vars in a struct =PassRuleMatch=
  - Remove dead code
- Fixed many warnings thanks to Christian Egli

** Deprecation notice
- The =mode= parameter in =lou_dotsToChar= never had any effect and is
  now deprecated.
- In 2012 a new way to specify the test and action part in context and
  multipass opcodes was introduced. It was never documented and has no
  known usage in the wild. However it opens up the attack surface to
  the table parsing code. Therefore it is deprecated and will be
  removed in the next release.

** Backwards incompatible changes
- None

** New, renamed or removed tables
*** New
- cs-comp8.utb
*** Renamed
- None
*** Removed
- Cz-Cz-g1.utb

* Noteworthy changes in release 3.5.0 (2018-03-05)
This release has a number of Braille table improvements, cleanups and
meta data enhancements. The most prominent new feature however is
probably the much improved test coverage. This has helped in tracing
and fixing a number of long standing bugs.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/15?closed=1][the list of closed
issues]].

** New features
- The same name can now be used in more than one ~class~ rule. The
  effect is that both set of characters become part of that one class.

** Bug fixes
- Fix a regression in inputPositions thanks to Bert Frees
- Treat characters within the range ~compbrlStart~ and ~compbrlEnd~ as
  a special case. This fixes many if not most of the problems with
  cursor position and the ~compbrlAtCursor~ mode. Thanks to Dave Mielke.
- Fix ~swapdd~ opcode thanks to Bert Frees
- Fix negation of attribute matcher in multipass expressions thanks to
  Bert Frees

** Braille table improvements
- Add a display table that maps braille dots to brl/brf character set.
  For an in depth explanation see the corresponding [[https://github.com/liblouis/liblouis/issues/503][github issue]].
  Thanks to Rimas Kudelis
- Major Improvements to Unified French Grade 2 thanks to André-Abush
  Clause
- Fix braille number input for Greek Braille thanks to Dave Mielke
- Add a fix for "phad" according to UEB Rule 10.7.3 thanks to Anthony
  Tibbs
- Updates to the Urdu tables thanks to Jake Kyle from Compass Braille
- Updates to the Chinese braille table (~zh-tw.ctb~) thanks to
  Bo-Cheng Jhan
- ~IPA.utb~ now contains a more complete list of phonetic symbols,
  including some that might conflict with other tables. For this
  reason it is not suitable for inclusion in other tables. A separate
  table ~IPA-unicode-range.uti~ has been added for this
  purpose. Thanks to Ludovic Oger.
- The Mongolian table has been improved and there is now also support
  for grade 2 thanks to Tsengel Maidar.
- Minor updates to the Danish tables thanks to Bue Vester-Andersen
- Fix back translation of numbers in Dutch, Finnish and Canadian
  French, thanks to Leonard de Ruijter.
- New table for Ukrainian thanks to Sergiy Moskalets.

** Other changes
*** Improved documentation
- Extend the documentation on multipass opcodes. Thanks to Dave Mielke
  and Christian Egli.
- Remove the deprecation note of the '=' dots operand. While there are
  still problems with back-translation we will not remove support for
  it. See also the discussion in the [[https://github.com/liblouis/liblouis/issues/500][github issue]].

*** Improved meta data information in tables
The meta data in the tables such as locale, contraction grade, etc has
been improved and is now also used when testing from a YAML test.
Thanks to Bert Frees.

*** Major overhaul of the YAML test suite
**** Support for proper testing of cursor positions
Due to problems in the cursor position computation the YAML test
suite was improved to support proper testing of cursor position also
in combination with input, output position and modes. In essence all
of the liblouis API is now supported and can be tested via the YAML
tests. Thanks to Christian Egli.

**** Support for table selection via meta data query
The tables to be tested can now be specified via a meta data query in
addition to specifying them by filename. See the documentation for
more details. Internally the YAML tests have been split up into tests
that test the braille translation for a particular locale (now located
in ~tests/braille_specs~) and tests that check a specific feature of
liblouis. Thanks to Bert Frees.

** Deprecation notice
None

** Backwards incompatible changes
- The translation mode ~comp8Dots~ has been removed as it was never
  really implemented anyway
- Support for the ~pass1Only~ flag has now been removed. Thanks to Bue
  Vester-Andersen.
- The old UEB tables ~UEBC-g1.ctb~ and ~UEBC-g2.ctb~ have been removed
  as the have been superseded by ~en-ueb-g1.ctb~ and ~en-ueb-g2.ctb~.
- The french tables ~fr-2007.ctb~, ~fr-fr-g1.utb~, ~fr-fr-g2.ctb~,
  ~fr-ca-g1.utb~ and ~fr-ca-g2.ctb~ have been removed. Use
  ~fr-bfu-comp6.utb~ for 6 dots literary, ~fr-bfu-comp8.utb~ for 8
  dots computer and ~fr-bfu-g2.ctb~ for contracted braille instead.

** New, renamed or removed tables
*** New
- IPA-unicode-range.uti
- mn-MN-g2.ctb
- uk.utb
*** Renamed
- mn-MN.utb -> mn-MN-g1.utb
*** Removed
- fr-2007.ctb
- fr-ca-g1.utb
- Fr-Ca-g2.ctb
- fr-fr-g1.utb
- Fr-Fr-g2.ctb
- UEBC-g1.ctb
- UEBC-g2.ctb

* Noteworthy changes in release 3.4.0 (2017-12-04)
This release brings together a lot of work by lots of different
people. Probably the most prominent fix is the work on output
positions by Bue and Bert. NVDA should benefit from this. Then there
are new and massively improved tables like the Lithuanian 6-dot table
by Rimas or the improved back-translation for French by Michel and
André-Abush to name just a few. There are too many contributors to
name them here, thanks to them all.

For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/14?closed=1][the list of closed
issues]].

** New features
- Add support for ~inputPos~ and ~outputPos~ checking in
  ~lou_checkyaml~ thanks to Bue Vester-Andersen. See the manual for
  details and examples.
** Bug fixes
- output positions (~outputPos~) are now calculated based on input
  positions (~inputPos~) thanks to Bert Frees. This avoids a whole
  class of bugs that previously plagued the output positions. This fix
  also obviates the need for the ~pass1Only~ flag. See below for the
  deprecation notice.
** Braille table improvements
- Addition of Nemeth and Kangxi radical characters and other
  improvements to Chinese braille (~zh-tw.ctb~) thanks to Bo-Cheng
  Jhan and 黃偉豪.
- Improvements to the Spanish chardefs table thanks to Luis Lorente
  Barajas and Simon Aittamaa.
- Fixed a lowercase ó in Spanish first reported for NVDA thanks to
  Sukil Etxenike.
- New Norwegian 6-dot display braille table for Braillo embossers
  thanks to Lars Bjørndal
- Added a bunch of whitespace-like codepoints as spaces thanks to
  Rimas Kudelis
- Added Lithuanian 6-dot table thanks to Rimas Kudelis.
- Addition of more characters to the French tables thanks to Samuel
  Thibault
- Improvements to the Hungarian tables thanks to Attila Hammer
- Improvements to the Mongolian tables thanks to Tsengel Maidar
- Fix some math signs in Czech Braille (~cs-chardefs.cti~). Thanks to
  Christian Herden of ViewPlus for reporting this.
- Updates to the SEB British Braille Tables thanks to Paul Wood
- Massive improvements to French back-translation thanks to Michel
  Such and André-Abush Clause
** Other changes
*** Improved documentation
- Bue Vester-Andersen added some notes about back-translation and
  documented all possible values of the ~mode~ parameter. Also the
  description of ~decpoint~ and ~litdigit~ was improved.
- The ~match~ opcode is now documented thanks to Mike Gray and
  Christian Egli.

*** lou_maketable
Numerous bug fixes and performance enhancements thanks to Bert Frees

*** Code refactoring
Many global variables have been removed thanks to Bert Frees

*** Code formatting
Thanks to clang-format There is now a uniform coding style over the
whole code base

*** Fix broken NMakefile
Thanks to Davy Kager building with nmake should work again

** Deprecation notice
The ~pass1Only~ flag has been deprecated. Its use should be avoided,
and it will be completely removed from the code in the next version of
Liblouis. When using the ~pass1Only~ flag in this release you will get
a warning.

** Backwards incompatible changes
None

** New, renamed or removed tables
*** New
- no-no-braillo-047-01.dis
- lt-6dot.utb
*** Renamed
None
*** Removed
None

* Noteworthy changes in release 3.3.0 (2017-09-04)
This release brings a slew of Braille table improvements, fixes a
number of security related bugs and introduces a new tool to generate
liblouis Braille tables based on a corpus of know good Braille
translations. For a detailed list of all the changes refer to [[https://github.com/liblouis/liblouis/milestone/13?closed=1][the list
of closed issues]].

** New features
*** maketable tool
A new tool ~lou_maketable~ enables the creation of tables based on a
corpus of known good Braille translations. This has huge potential to
simplify table maintenance for tables that have so far been dominated
by large exception lists. Thanks to Bert Frees.
*** Meta data query API
A new API and a corresponding command line tool to query table meta
data thanks to Bert Frees

** Bug fixes
*** Back translation
- UEB grade 2
  - Fix back-translation of whole word contractions followed by other
    contractions thanks to James Teh.
  - Fix back-translation for contractions followed by punctuation
    thanks to James Teh.
*** Security
- Fix a number of CVEs (illegal address access, buffer overflow and
  use-after-free or in terms of CVEs: CVE-2017-13738, CVE-2017-13739,
  CVE-2017-13740, CVE-2017-13741, CVE-2017-13742 and CVE-2017-13744)
  thanks to Mike Gorse.
- Fix CVE-2017-13743 thanks to Christian Egli.

** Braille table improvements
- New table for Croatian grade 1 Braille thanks to Zlatko Sobočan.
- Fixes and tests for Slovak Braille thanks to Simon Aittamaa
- Numerous fixes in the character definitions of the Spanish tables
  thanks to Simon Aittamaa
- Unified French 6 dots and 8 dots improvements for back-translation
  thanks to Michel Such
- Updates to the Chinese braille table thanks to Coscell Kao
- Updates to Nemeth character definitions thanks to Attila Hammer
- The Hungarian tables now conform to the new 2017 standard thanks to
  Attila Hammer

** Backwards incompatible changes
- The constant ~otherTrans~ has been removed in both the C API and the
  corresponding Python bindings.
- The constants ~ucBrl~, ~noUndefinedDots~ and ~partialTrans~ have
  different values now in both the C API and the corresponding Python
  bindings.

** New, renamed or removed tables
*** New
- hr-g1.ctb
*** Renamed
- hr.ctb -> hr-comp8.utb
*** Removed

* Noteworthy changes in release 3.2.0 (2017-06-06)
Aside from the usual improvements to Braille tables this release
focuses on improving the internal infrastructure. Numerous bugs have
been fixed, the CI infrastructure also checks mingw builds now and MSVC
compatibility has been massively improved. For a detailed list of all
the changes refer to [[https://github.com/liblouis/liblouis/milestone/10?closed=1][the list of closed issues]].

** Bug fixes
- Fix capsnocont opcode. Also mark capital letters with capsletter
  symbol when capsnocont is defined but no begcapsword indicator is
  defined. Thanks to Bue Vester-Andersen.
- Fix the syllable opcode. It had been broken under some circumstances
  since 3.0. Thanks to Bert Frees and Christian Egli.
** Other changes
- Fix building of Python bindings when cross-compiling. Thanks to
  Chris Brannon
- lou_checkyaml is now only installed if libyaml is available. Thanks
  to Christian Egli
- Major internal changes to improve MSVC compatibility. Thanks to Davy
  Kager
- Enhance documentation on usage of display tables in particular
  in conjunction with Unicode dot patterns. Thanks to Bert Frees
** Braille table improvements
- Improvements to the Swedish 8-dots table (~se-se.ctb~) thanks to
  Kevin Derome
- Improvements to the Simplified-Chinese Braille table thanks to
  Roshanson
- Fixes for the International Phonetic Alphabet Braille table thanks
  to Ludovic Oger
- Added more Unicode symbols (fractions and not equal) to the UEB
  tables. Thanks to Paul Wood and James Bowden.
- Fixes to UEB grade 2 (en-ueb-g2.ctb) thanks to Mike Gray.
- Vastly improved Danish tables thanks to Bue Vester-Andersen.
  - New literary tables for 6 dots, mainly for embossing (no
    back-translation).
  - Improved back-translation in 6 dots tables, all grades.
  - New support for many Unicode characters in all 6 dots tables.
  - Strengthened internal tests to prevent breaking of tables due to
    changes in the code.
  - Fixed 8 dots tables which were broken in the previous version.
- New Braille tables for Sinhala script thanks to Ashoka Bandula
  Weerawardhana.
- New Hungarian grade 2 Braille table thanks to Attila Hammer.
- Improvements to UEB in particular to symbols specified mostly on the
  Appendix 3 (Symbols List) from the Rules of Unified English Braille
  Second Edition 2013 document thanks to Victor Montalvão.
- Improvements to Persian 8 dot computer Braille table thanks to
  Mohammadreza Rashad.
** Backwards incompatible changes
- The old Greek table gr-gr-g1.utb is gone. Use el.ctb instead
- The doctests are gone. They have been superseded by the YAML tests.
- The internal API which was previously in louis.h has been made
  internal, i.e. the file is renamed to internal.h and the function
  names are prepended with underscores ('_').

** New, renamed or removed tables
*** New
- sin.cti
- sin.utb
- hu-hu-g2.ctb (new)
- da-dk-6miscChars.cti (new)
- da-dk-g16-lit.ctb (new)
- da-dk-g26-lit.ctb (new)
- da-dk-g26l-lit.ctb (new)
*** Renamed
- gr-gr-g1.utb (removed and replaced by el.ctb)
*** Removed
- da-chardefs6.cti
- da-dk-common6.uti
- da-dk-g26-patches.cti
- da-dk-g2core.cti
- da-dk-nocaps.uti

* Noteworthy changes in release 3.1.0 (2017-03-06)
An influx of new contributors have made sure that liblouis continues
to improve. Back translation has seen major improvements, there are
some additional modes to help screen readers, for many tables meta
data has been added, the Python bindings are more robust, Windows
support has been improved, the YAML test suite has been generalized
and as usual new and improved braille tables have been included. On
the licensing front we managed to get almost all tables re-licensed to
LGPLv2.1+.

** New features
*** Meta data
Most of the translation tables now contain meta data. This makes them
discoverable. Programs can use the lou_findTable function to find a
table based on a query.

*** noUndefinedDots mode
Add a noUndefinedDots mode to disable the output of dot numbers when
back-translating undefined patterns. Thanks to James Teh.

When back translating input from a braille keyboard cell by cell, it is
desirable to output characters as soon as they are produced.
Similarly, when back translating contracted braille, it is desirable to
provide a "guess" to the user of the characters they typed. To achieve
this, liblouis needs to have the ability to produce no text when
indicators (which don't produce a character by themselves) are not
followed by another cell. This works already for indicators liblouis
knows about such as capital sign, number sign, etc., but it does not
work for indicators which are not (and cannot be) specifically defined
as indicators. For example, in UEB, dots 4 5 6 alone produces the text
"\456/". Setting the noUndefinedDots mode suppresses this dot number
output.

*** partialTrans mode
Add a partialTrans mode to specify that back-translation input should
be treated as an incomplete word. Thanks to James Teh.
  
If this mode is set, rules that apply only for complete words or at
the end of a word will not take effect. This is intended to be used
when translating input typed on a braille keyboard to provide a rough
idea to the user of the characters they are typing before the word is
complete.

*** YAML test framework
The YAML framework has been extended and is much more useful now. You
can test multiple tables within one YAML file, you can define test
tables directly inline and you can test multiple tables using the same
test data. Refer to the documentation for the details.

If really not wanted the YAML tests can be disabled by specifying
~configure --without-yaml~.

** Bug fixes
- Fixes implicit declaration of 'pattern_check' thanks to  Reiner Dolp
- Fix a stackoverflow crash on applications with smaller stack size.
  Thanks to Victor Montalvão.
- Fix the \v escape sequence. Thanks to Davy Kager.
- The Python bindings now give a helpful error if liblouis has been
  compiled with a different character size than Python. Thanks to Matt
  Wenn.
- Massive bug fixes in multipass rules. Dave Mielke has done a
  tremendous job improving the multipass machinery also in the
  context of back-translation. Where needed nofor/noback has been
  added to the multipass rules.

** Other changes
- Improvements to the Emacs mode for editing liblouis tables thanks to
  Christian Egli
- Documenting lou_charSize thanks to Reiner Dolp
- Support for relative table paths in the tests. This will make sure
  you always know which table a test actually uses.
- Infrastructure to build windows binaries in a Docker container,
  thanks to Bert Frees

** Braille table improvements
- UEB improvements, thanks to Mike Gray
  - Fixed apostrophe and back translation
  - Added rules for Unicode apostrophe handling
  - Improvements to UEB and Nemeth math
- Complete overhaul of Lithuanian 8-dots table, thanks to Rimas
  Kudelis
- New Urdu 6 Dot Grade 1 and 2 Braille tables thanks to Jake Kyle
- Improvements to Italian 8 dots computer braille, thanks to Simone
  Dal Maso.
- New table ~unicode-braille.utb~ that helps to back translate braille
  input to Unicode braille output, thanks to Leonard de Ruijter.
- Improvements to the Chinese braille table thanks to Coscell Kao.
- New Turkish braille table for grade 1 that should replace the
  old ~tr.ctb~ table, thanks to Arend Arends.
- New Persian grade 1 table and 8-dots computer table thanks to
  Mohammadreza Rashad.
- New table for the International Phonetic Alphabet thanks to Ludovic
  Oger
- Fixes for the French 6 and 8 dots tables thanks to Michel Such. Some
  errors have been fixed and many Unicode characters have been added.
- Add an extended 8-dot computer braille table for U.S. English thanks
  to Davy Kager. The table is tailored for use on Windows (CP-1252)
  and uses dot patterns from Windows screen readers, but should be
  useful on other platforms too.
- New Greek table that is better than the existing Greek Grade 1
  Braille Table (gr-gr-g1.utb) thanks to Dave Mielke.
- Improved number back-translations on fr-fr-g1 and vi-g1 tables
  thanks to Victor Montalvao.
- New Chinese Braille table for use in the mainland of China thanks to
  Kaifang Bao of RejoinTech.
- The Black Circle character is commonly used for displaying password
  characters. The absence of its definition leads to users not being
  able to know how many characters were typed in such fields. This has
  been improved for many tables thanks to Victor Montalvao.

** License changes
- DocArch has agreed to re-license their tables, so we have 8 more
  tables under the LGPLv2.1+.

** Backwards incompatible changes
- The naming in the YAML test framework has changed slightly from
  `tables:` to `table:`.

* Noteworthy changes in release 3.0.0 (2016-07-14)
This is the biggest release of liblouis in years. The major news are
that we now have proper support for UEB and secondly that liblouis is
now licensed under [[https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html][LGPLv2.1+]].

In order to support UEB the internals of liblouis have seen a major
rewrite. New Opcodes have been added to support the requirements for
proper UEB for example for emphasis handling or to handle proper
translation of numbers. Changes to the opcodes are described in the
documentation. Some of these changes are not backwards compatible. All
tables that come with liblouis have been migrated. If you have private
tables look at the section on upgrading from previous versions in the
[[https://github.com/liblouis/liblouis/wiki/Emphasis-Opcodes#upgrade-from-previous-versions][wiki]].

This release also changes the C API. External applications will have
to adapt the way they call liblouis. In particular the typeform
parameter has changed.

The license of the library and most of the tables has been changed to
LGPLv2.1. For a detailed list which tables are still in the process of
migrating the license refer to the [[https://github.com/liblouis/liblouis/wiki/Licensing-of-liblouis-tables][wiki page about the license change]].

** New features
- Numerous features to support UEB properly. Thanks to Mike Gray,
  William Freeman, Davy Kager, Keith Creasy and the American Printing
  House for the Blind for sponsoring this work.
  - support the many emphasis classes needed for UEB.
  - support translation of numbers according to the rules of UEB.
  - Capitalization is now handled just like emphasis.
  - support for numeric mode
- UTF-8 support for all tools thanks to Christian Egli.
- The YAML tests now allow for an optional test description. See the
  documentation for more details.
- Add ~lou_checkTable~ and ~lou_getTypeformForEmphClass~ to the C API
  and to the Python bindings
** Bug fixes
- Stop buffer overrun in ~lou_getProgramPath~, and also free memory
  after usage. Thanks to Michael Curran.
** Other changes
- The license of the library and most of the tables has been changed
  to [[https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html][LGPLv2.1+]].
- Improvements to the test suite:
  - Output is printed to ~stderr~. This helps with locating errors when
    testing with the YAML test suite.
  - typeform is included in output.
** Braille table improvements
- Improved Finish 6-dot braille thanks to Jukka Eerikäinen
- Improvements to the Chinese braille table thanks to Coscell Kao
- Improvements to Mongolian thanks to Tsengel Maidar and Sreeja Param
- Added new Slovak tables based off the official Slovak braille
  standard thanks to Peter Vagner
- Changes to the Norwegian tables. There are now three Norwegian 8-dot
  tables
  - ~no-no-comp8.ctb~: Norwegian 8-dot computer braille table
  - ~no-no-8dot.utb~: Norwegian 8-dot braille table
  - ~no-no-8dot-fallback-6dot-g0.utb~: Norwegian 8-dot braille table
    with uncontracted 6-dot fallback
- Changes to the Dutch tables
  - Conforms better to the standard.
  - ~nl-BE-g1.ctb~ renamed to ~nl-BE-g0.utb~
  - ~nl-NL-g1.ctb~ renamed to ~nl-NL-g0.utb~
- Improvements to Danish tables: Added grade 2 with limited
  contractions to 6 and 8 dots. Corrected contraction of many words.
  - Renamed:
    - ~da-ansi8.dis~ -> ~da-dk-octobraille.dis~
    - ~da-dk-g16.utb~ -> ~da-dk-g16.ctb~
    - ~da-dk-g18.utb~ -> ~da-dk-g18.ctb~
    - ~hyph_da_DK.dic~ -> ~hyph_brl_da_dk.dic~
  - Removed: ~da-dk-g28caps.cti~, ~da-dk-g28-patches.cti~ and
    ~da-chardefs8.cti~
** Backwards incompatible changes
- The json based harness test suite has been removed as its
  functionality has been superceded by the YAML tests. Please use
  these from now on.
- A number of opcodes to handle emphasis have been renamed.
- The C API regarding the typeform parameter has changed.

* Noteworthy changes in release 2.6.5 (2015-12-1)
This minor release introduces new tables (Mongolian and Norwegian 8
dot) and new features to the tracing tool. But the most exiting news
about this release is probably the fact that 12 developers have
contributed to it, showing how widely used liblouis is and how
actively the development progresses.

** New features
- A DEF file is now generated automatically for the windows builds.
  Thanks to Christian Egli
- lou_trace supports backtranslation now. Thanks to Bert Frees

** Bug fixes
- Fix a bug in the findtable code. Thanks to Michael Katzmann for the
  report.
- Fix some compile time warnings on Windows, thanks to Bue
  Vester-Andersen.
- Fixes to the logging code by Arend Arends.

** Other changes
- Add test data for EUB symbols, thanks to Paul Wood
- Clean up dead code i.e. remove support for (undocumented) nobreak
  opcode. Thanks to Bue Vester-Andersen.

** Braille table improvements
- New Mongolian table thanks to Tsengel Maidar and Sreeja Param.
- Improvements to the Chinese braille table thanks to Coscell Kao.
- Massive improvements to Norwegian, thanks to Lars Bjørndal, Ammar
  Usama and Jostein Austvik Jacobsen. They added a 8 dot table and
  lots of test data.
- Improvements to Hungarian, thanks to Attila Hammer

* Noteworthy changes in release 2.6.4 (2015-08-31)
This is a minor release in terms of features. But in terms of test
coverage and stability it is a vast improvement over previous versions
of Liblouis. The new YAML based test suite contains more than a
million of validated translations. Every change in Liblouis is tested
against this corpus ensuring the change doesn't break anything.

** New features
- YAML based harness tests. Harness tests can now be written in simple
  YAML notation and they are integrated with the normal `make check`
  command. They can be used for both ucs2 and ucs4 and no Python is
  required. Thanks to Christian Egli.

** Bug fixes
- Use a separate gnulib instance for the library and the tools. Use
  the strndup module to avoid build problems on windows.
- Fix a problem with the nocross opcode when used in combination with
  the opcodes nocont and compbrl, thanks to Bue Vester-Andersen.
- Fix a problem with the decoding of the harness test files. Thanks to
  Bert Frees.
- Fix numerous problems in the way braille indicators are handled.
  There is now a safe version of the checkAttr function which makes
  sure that no attributes are checked beyond the boundaries of the
  currentInput. This fixes the random behavior with tests where the
  emphasis extends to the end of the input string. Thanks to Christian
  Egli.

** Other changes
- if found use texi2any to build the documentation, thanks to Martin
  Michlmayr.
- Fix permissions of Korean tables, thanks to Peter Lundblad.
- Update the windows build instructions, thanks to Bue
  Vester-Andersen.

** Braille table improvements
- Improvements to Hungarian, thanks to Attila Hammer
- Improvements to Hungarian 8 dot and Serbian grade 1, thanks to
  Zvonimir Stanecic

* Noteworthy changes in release 2.6.3 (2015-06-01)
Given the release number you might think this is only a minor release.
However looking at the number of developers who contributed to it and
the number of pull requests and issues that were solved this turns out
to be a very impressive and solid release. Most prominently we have a
new function to discover tables based on meta data in table headers.
Also makeinfo is no longer required to build liblouis. And lastly we
have numerous improvements in Braille tables such as Korean,
Vietnamese and UEB to name just a few.

** New features
- [beta] The new function lou_findTable can be used for table
  discovery based on meta data in table headers. Thanks to Bert Frees.
- The Python API now has a new function to check tables aptly named
  ~checkTable~. Thanks to Davy Kager.

** Bug fixes
- Fixed a problem in resolveTable when using a Java resolver, thanks
  to Bert Frees

** Other changes
- The build dependency on makeinfo is now optional. If it is not
  installed we simply do not build the documentation.

** Braille table improvements
- Improvements to Bengali, Devanagari, Kannada, Gujarati, Malayalam,
  Telugu and Oriya, thanks to Sreeja Param
- Corrections and improvements made to en-GB tables thanks to Paul
  Wood
- Vast restructuring to Korean tables. In 2006 the Institute for Korean
  Braille modified some dots in Korean Braille. Specifically, some
  punctuation dots are now based on English. To accommodate this change
  and to retain the old tables, the Korean table set was revised as
  follows:
  - Added three files: ko-chars, the Korean characters dictionary, and
    rules for g1 and g2.
  - ko-g1 and ko-g2 are now interface files that includes needed
    files.
  - Added three files for Korean Braille 2006 revision along with a
    test harness.
- New table for Polish 8 dot computer braille. Thanks to Karol Pecyna.
- New table for Vietnamese 6 dot. Thanks to Harri Pasanen.
- Corrections and improvements made to UEB tables thanks to Paul Wood
  - Typeform passage indicators
  - Degree sign
  - Dash signs
  - Math signs
  - Accent modifiers
  - Accented letters

* Noteworthy changes in release 2.6.2 (2015-03-02)
This release, which was mostly pushed out the door by Bert and Mesar,
fixes a long standing emphasis bug, adds more functionality to the
harness test suite and improves, as usual, on Braille tables. Notably
there is a brand new finish table backed by Celia.

** New features
- Harness tests now can test for typeform differences.

** Bug fixes
- Fix for emphasis bug, thanks to Michael Gray

** Braille table improvements
- Correction to comments in Norwegian generic tables, thanks to Lars
  Bjørndal
- Corrections to dot patterns in no-no-g0.utb thanks to Lars Bjørndal
- Corrections and additional test cases for Hungarian grade 1, thanks
  to Hammer Attila.
- New 6-dot table for Finnish thanks to Jukka Eerikäinen from
  Celia. The existing tables for Finnish were 8-dot, but there is an
  official specification only for 6-dot braille in Finnish.

* Noteworthy changes in release 2.6.1 (2014-12-01)
This release focuses on table and documentation improvements. The
documentation has been restructured to cater to people starting with
writing Braille tables. End users will see improvements to Braille for
Danish, Dutch, Hungarian, Irish and UK English.

** New features
*** New Braille tables
- New grade 1 and grade 2 Gaeilge tables implementing the 2014 UIB
  standard. Including tests, thanks to Ronan McGuirk, Mesar Hameed.

** Braille table improvements
- Updates and correction to Hungarian braille tables, thanks to Hammer
  Attila.
- Correction to English UK grade 2 braille tables and new tests,
  thanks to Paul Wood, Mesar Hameed
- Vastly improved Danish tables thanks to Bue Vester-Andersen
  - back-translation, both in 6 dots grade 2 and 8 dots grade 2.
  - Better handling of dash, slash, and other punctuation within words
    in 8 dots grade 2.
- New table for Dutch (Netherlands) thanks to Henri Apperloo from CBB

** Bug fixes
- fix a compiler warning in the logging code. Thanks Peter Lundblad
  for reporting it and Michael Whapples for fixing the problem.

** Documentation updates
- The documentation has been restructured to be more beginner friendly
  and a short introduction to translation table writing has been
  added. Thanks to Joseph Lee and Christian Egli

** Other changes
- When compiling with mingw or cygwin resulting dll is liblouis.dll.
- runHarness.py: add new output format, compact output mode suitable
  for grepping.

** Backwards incompatible changes
- Deleted ga.ctb now superseded by ga-g1.utb and ga.g2.ctb.
- Nl-Nl-g1.utb has been removed. It is superseded by nl-NL-g1.ctb.
- nl-be-g1.utb has been removed. It is superseded by nl-BE-g1.ctb.

* Noteworthy changes in release 2.6.0 (2014-09-01)
This is the first release by the new maintainer team. A lot of work by
people from across the community contributed to this release. There
are massive additions and updates to the Braille tables (e.g.
Afrikaans, Hebrew, many Indian languages, Korean) and also changes to
the C API to enable call backs for error messages and warnings.

** New features
*** New Braille tables
- Tables for Afrikaans, Cherokee, Hawaiian, Maori, Sotho and Tswana
  were donated by Greg Kearney. Afrikaans, Cherokee, Maori and Hawaiian
  all are grade 1 tables and with the exception of Cherokee were
  derived from World Braille Usage 2013. The Cherokee was taken from
  the specification published at www.cbtbc.org/cherokee/.
*** Logging callback
There is now a callback system in place to get error messages and
warnings. This can be used from programs that use liblouis to log
warnings for example.

** Bug fixes
- fix back translation problems when word gets split in unusual places
  causing back translation of whole words for example K5 back
  translates to Knowledgeen, M>k back translates to Moreark, and M5
  back translates to Moren.  This caused over 8400 extra back
  translation errors in en-us-g2 and 5000 in en-ueb-g2. Thanks to Ken
  Perry.
- Fixed bug to prevent removal of \xffff between largesign rules. This
  solves a Liblouisutdml bug where \xffff is used as a segment
  delimiter.
- Fixed a bug in back translation, when a letsign was encountered, the
  letsign was being applied beyond the element it applied to.
- Fix memory leaks in the default table resolver introduced in the
  previous release.
- Fixes to the build system by Simon Aittamaa

** Braille table improvements
- Major improvements to Indian tables thanks to the Indian National
  Institute for Visually Handicapped, in particular Dipendra Manocha,
  Mesar Hameed, Dinesh Kaushall and Sreeja Parameswaran:
  - Corrected opcodes for letters, punctuation marks, digits, signs
    etc.
  - Updated braille codes according to prescribed braille codes for
    each Unicode character by the Braille Council of India for all
    Indian languages.
  - defined rules for dealing with Nukhta character in Hindi table
  - defined rule to insert dot-1 between consonant followed by full
    vowel character in all Indian Languages
  - defined rules for shifting of halant character before the
    consonant. This character is placed after the consonant in normal
    typing but need to be before the consonant in braille. This rule
    is applicable for all Indian languages.
  - defined rules for two conjunct characters "ksha and gya" used in
    all Indian Languages for which there are specific codes in
    Braille.
- New Hebrew table that is based on the new unified Hebrew Braille
  code standard that was put together on January 2014 after a
  conference with all of the specialists in this field in Israel. It
  includes improved representation of Hebrew letters, special letters
  that are called Nikud, and punctuation symbols. The old Braille
  standard is not relevant any more. Thanks to Adi Kushnir.
- UEB table fixes: Fix ity contraction, fixed the missing end word
  contraction ;n ;d sign 46. thanks to Ken Perry.
- Fix for Norwegian where letsign is affecting some extra characters
  thanks to Lars Bjørndal
- Much improved hyphenation for Norwegian thanks to Lars Bjørndal
- Korean Grade 2 now includes support for reading English text using
  grade 2.
- en-us-g1.ctb and en-ueb.g1.ctb are now able to display 8 dot Unicode
  braille.

* Noteworthy changes in release 2.5.4 (2014-03-03)
This release contains nine months worth of braille table improvements
for example for Danish, UEB, en-us, Nemeth, Bulgarian, Slovenian and
many more. Also there are fixes to the core for table path resolving
and back-translation.

** New features
   - Added function lou_registerTableResolver for plugging in a table
     resolver callback from your host language.

** Bug fixes
   - Fixed ENDSEGMENT indicator in computer Braille thanks to John
     Boyer.
   - Emphasized words should now be contracted consistently thanks to
     John Boyer.
   - Fixed several problems with back-translation. A slash within a
     number and strings such as 5-inch-diameter and 25-year-old-man
     should now back-translate correctly. Thanks to John Boyer.
   - Fixed a problem with syllable opcode. Thanks to John Boyer.
   - Fix warnings with gcc 4.8.2. Thanks to Peter Lundblad.
   - When a table is specified with an absolute or relative path, the
     "includes" in that table will now work as expected, meaning files
     in the same directory will be found.

** Braille table improvements
   - fr-bfu-comp8.utb: corrections, zero was wrongly displayed in some
     instances.
   - en-us-g2.ctb, en-ueb-g2.ctb: Fixes for that's, can't and s'
     thanks to Ken Perry.
   - en-us-g2.ctb: Fix for back-translation of things like
     http://address.com, words including after, capsigns. thanks to
     Ken Perry.
   - Further corrections and testcases to the Hungarian tables thanks
     to Hammer Attila
   - Fixed letter sign in en-us and en-ueb tables. Thanks to John
     Boyer and Ken Perry.
   - UEB Fixes thanks to Mesar Hameed, Ken Perry and Joseph Lee:
     - chardefs - correct title and fixed a long standing bug
       where dots 46 was inserted between letters (especially for web
       addresses).
     - Fix problem with at sign.
     - Removed section of accented letters, that were left behind from
       US table.
     - Added todo for accents, to define according to the formal docs.
     - Corrected mathematical forall symbol.
     - Modified emphasis dot combinations to follow UEB standard.
     - Corrected the display of period when used as a midword.
     - Ensure 'inin' is correctly back-translated in words such as
       asinine, feminine and others.
   - Bulgarian bg.ctb: updated to meet modern standards (added Latin
     letters, corrected punctuation/mathematical symbols, misc typos).
     Thanks to Rumiana Kamenska
   - en-gb-g1.utb: Fixes thanks to Paul Wood
   - Fix for the lich sign in the German tables. Thanks to Halim
     Sahin.
   - Nemeth improvements thanks to John Boyer.
     - Spaces in nemethdefs.cti were changed to unbreakable spaces.
       This was done so that Nemeth expressions would not be broken
       between lines.
     - The number sign is now inserted between the minus sign and the
       number at the beginning of an expression. Some problems with
       pass2 opcodes have also been corrected.
   - The Esperanto table has additional punctuation characters and a
     test harness. Thanks to Aaron Cannon.
   - Added missing symbols to the US English BRF display table. Thanks
     to Aaron Cannon.
   - Improvements to the Slovenian table and a new Slovenian eight dot
     computer table provided by Jožef Gregorc.
   - Fixes to the Norwegian tables thanks to Lars Bjørndal
     - Fixes for less than / greater than.
     - Add entries for URLs, domains and file names.
   - Added ne.utb, an alternative Nepali braille table. One of ne.utb
     or ne.ctb will be removed/merged in a future version. Keeping
     both for the time being so that users can test and give feedback
     on which is most correct. Thanks to Him Prasad Gautam, and Mesar
     Hameed
   - Much improved danish grade 1 and grade 2 6 and 8 dot braille,
     thanks to Bue Vester-Andersen and Mesar Hameed

** Backwards incompatible changes
   - Delete the table chardefs-ueb.cti as these rules are now provided
     by en-ueb-chardefs.uti

** Invisible changes
   - Refactoring in compileTranslationTable.c: separated more clearly
     the compilation from the table resolving, removed duplicate code,
     etc.

* Noteworthy changes in release 2.5.3 (2013-06-21)
** New features
*** New Braille tables
    - Korean grade 1 and grade 2 thanks to Joseph Lee
    - U.K. English 8 dot computer braille table thanks to David
      Reynolds
    - New Russian literary and computer braille tables thanks to Igor
      B. Poretsky. These replace the older Russian tables which are
      left for backwards compatibility.
    - New hyphenation dictionary for Russian thanks to Igor B.
      Poretsky.
    - Updated hyphenation tables for the Norwegian language (nynorsk
      and bokmål) thanks to Lars Bjørndal.
    - New hyphenation dictionary for Esperanto thanks to Aaron Cannon.
    - New Esperanto grade 1 table, using the x system for accented
      letters, thanks to Aaron Cannon.

*** runHarness.py: 
    Accept filename globs on the commandline to run specific harness files.
    In tests/harness, one can do make <filename> or make runall
    Removed from make check because these checks are checking the validity
    of our tables, rather than validity of the code.

** Braille Table Improvements
   - da-dk-g2.ctb, mostly rewritten to use nocross and hyphenation
     table.
   - Most tables: removed the default collapse whitespace statements,
     if you need to compress whitespace, consider adding compress.ctb
     to the list of tables when processing.
   - Corrections to Unified English Braille Code (Grade 1 and 2),
     thanks to Joseph Lee
   - Corrections to apostrophes in the Computer Spanish 8 dots Braille
     table (Es-Es-G0.utb). Thanks to Juan C. Buno.
   - Corrections for double angle quotation marks and emphasis marks
     in the Norwegian Grade 0 Braille Table. Thanks to Knut Arne
     Bjørndal.
   - Fixes for a minor problem regarding the noletsign in Norwegian
     contracted braille. Thanks to Lars Bjørndal.
   - Corrections to the Italian table thanks to Igor B. Poretsky.
   - Corrections to the Hungarian grade 1 table thanks to Hammer
     Attila
   - Corrections to English, U.S. Grade 2 (ABAE) table. Thanks to Ken
     Perry for reporting the bug and John J. Boyer for fixing it.
   - Further reorganization of the tables to remove duplication. Move
     litdigit opcode common parts and include where needed.
   - Removed obsolete en-us-g1.utb, which has been replaced by
     en-us-g1.ctb.
   - Added dictionary harness tests for: en-ueb-g2.ctb, en-us-g2.ctb.
   - Corrections to Nemeth character definitions thanks to Neil
     Soiffer.
   - Corrections to the Esperanto table thanks to Aaron Cannon.

** Bug Fixes
   - Cursor position calculation is now based on the same code that
     calculates inpos and outpos. This probably solves a number of
     bugs.
   - Fix nocross opcode processing.
   - Fix several buffer over/under runs in
     lou_translateString.c:hyphenate.
   - Fix the '=' problem, i.e. fix inputPositions calculation for the
     case where the equals sign is used as the dots operand. Thanks to
     Bert Frees
   - Fix a bug when resizing a table. Previously not all references to
     this table were updated.

** Backwards incompatible changes
   - The feature that allowed a mapping between language code and
     Braille table was removed as it contained a out-of-bounds access
     bug, was never documented and probably never used. Thanks to
     Peter Nilsson Lundblad and Jeremy Roman for analyzing this
     problem and providing a patch.

* Noteworthy changes in release 2.5.2 (2012-12-18)

While initially planned as mainly a bug fix release this release
contains some notable new features: There is a new tool to trace which
rules have been used to perform a translation. Also along with other
new tables the long awaited table for UEB is finally here.

** New features
*** New tool to trace rule application
    There is a new tool (lou_trace) which helps to trace which rules
    have been used to perform a Braille translation. This is helpful
    for writing Braille tables. See the documentation for more
    information.
*** New Braille tables
    - Inuktitut grade 1, thanks to Greg Kearney.
    - UEB grade 1 and 2, thanks to Joseph Lee. These tables replace
      the old UEB tables (UEBC-g1.utb and UEBC-g2.ctb).
    - Korean table thanks to Joseph Lee

** Braille Table Improvements
   - da-dk-g2.ctb, fixes for transposed â, å, æ, ä, ø  and ö,
     corrected/improved harness tests.
   - Corrections for en-GB-g2.ctb thanks to Paul Wood
   - Corrections to the Hungarian grade 1 table thanks to Hammer
     Attila

** Bug Fixes
   - Update gnulib
   - Fix a bug in the correct opcode which causes sometimes random
     results when translating. Thanks to Bert Frees.
   - Fixes for compiler warnings.
   - Fix some Valgrind warnings about invalid reads
 
* Noteworthy changes in release 2.5.1 (2012-9-24)

** Braille Table Improvements
- Fix encoding problem in italian table and added more character
  definitions. Thanks to Simone Dal Maso <simone.dalmaso@juvox.it>.
- Rename it-it-g1.utb to it-it-comp6.utb and it-it-g1.utb2 to
  it-it-comp8.utb.

** Bug fixes
- Fix outputPos and inlen where an input character generates multiple
  output characters.

* Noteworthy changes in release 2.5.0 (2012-9-10)

This release contains a tremendous amount of work many developers.
Many long standing bugs have been fixed. The tables can finally be in
UTF-8. A grand table cleanup removed duplication from the tables.
There are now two extensive test frameworks for table writers. A
number of new tables have been contributed on top of the usual
assortment of table improvements. Thanks to all of this liblouis has
already seen quite a bit of uptake in a number of places, notably the
new DAISY pipeline will ship with this release of liblouis.

NOTE: If you have private tables you might want to migrate them to
utf-8. To do this just use iconv as follows:

  $ iconv -f latin-1 -t utf-8 <input >output

** New features
*** New Braille tables
    - Estonian grade 0, thanks to Jürgen Dengo.
    - Portuguese 8 dot Computer braille, Thanks to Rui Fontes
*** UTF-8 support in tables
    Braille tables can now contain UTF-8 in the opcode arguments.
*** Improvements to the python bindings
    All constants defined in liblouis.h are now exposed in the bindings.
*** Add a doctest infrastructure
    These tests are based on the Python doctest framework and are only
    run if there is a Python interpreter on the system
*** Add a test harness
    This test infrastructure allows the user to do table tests in a
    simple and concise syntax. These tests are based on the Python
    nose testing framework and are only run if either Python 2.x or
    3.x with the related nose python module is installed on the
    system. See the documentation for more information. Thanks to
    Mesar Hameed.
*** Add a test harness generator
    A harness generator that uses simple text files with a little
    formatting to help to generate the json harness files. The purpose
    of this tool is to make it much easier and faster to add checks
    for a given table. You are expected to read the generated harness
    file and make necessary changes, the tool only helps you to get
    the tests into the harness format, not check their validity.
*** Support for Python 3 in the Python bindings
    The Python bindings now work for both Python 2 and Python 3.
    Thanks to Michael Whapples.

** Improved C-based test framework
   - Improved the test framework to be able to test translations
     involving Unicode.
   - Added numerous tests, e.g. for lowercase and Unicode, for the
     input position, for repeated, etc.

** Improved the documentation
   - Document the test harness (json format, fields, flags).
   - Document the use of Valgrind to find memory leaks
   - Improve the documentation on the display opcode

** Bug fixes
   - lou_allround and lou_translate now properly handle Unicode
     characters
   - Fix some issues reported by Valgrind
   - Fix inputPos for situation where context and multipass opcodes
     are involved
   - Fixed a number of bugs with the letter, uppercase and lowercase
     opcodes when dealing with Unicode
   - Fixed a couple of bugs with hyphenation (documentation, Python
     bindings and a number of buffer overruns in the C library).
     Thanks Milan Zamazal <pdm@brailcom.org> for reporting this.
   - Fix a bug in the $a. matcher in the multipass rules where only 32
     chars were matched. It now matches 0xffff chars.
   - Fix a bug reported by James Teh related to pass1Only

** Braille Table Improvements
   - all table files have consistent encoding, UTF-8.
   - The grand table cleanup: Reorganize the tables to remove
     duplication. Move common parts such as Latin letter, eight and
     six dot digit definitions to separate files which are then
     included. This should ease table maintenance. Thanks to Mesar Hameed. 
   - Fixes to de-de-comp8.ctb thanks to Aliminator83@gmail.com
   - hu1.ctb renamed to hu-hu-g1.ctb
   - hu.ctb renamed to hu-hu-comp8.ctb
   - eo.ctb renamed to eo-g1.ctb
   - Fixes to eo-g1.ctb thanks to Aaron Cannon <cannona@fireantproductions.com>
   - hu-hu-g1.ctb: improvements and extensive test harness, with
     working back-translation, Thanks to Hammer Attila
   - Fixes to fr-bfu-comp6.utb and fr-bfu-comp8.utb thanks to Michel
     Such <michel.such@free.fr>
   - Reworked and extended Ethiopic braille table ethio-g1.ctb,
     superseeds gez*, thanks to Dr. Tamru E. Belay
     <g.braille@sympatico.ca>
   - Fixes to no-no-g3.ctb thanks to Lars Bjørndal <lars@lamasti.net>

* Noteworthy changes in release 2.4.1 (2012-2-22)

** New features
   - Czech hyphenation table thanks to Jan Hegr
   - Spanish grade 1 table provided by José Enrique Fernández del
     Campo and Juan Carlos Buño Suárez
   - New Tamil table thanks to Mesar Hameed

** Braille Table Improvements
   - Improvements to the Portuguese grade1 braille tables
   - Updates and additions to Icelandic 8-dot braille table.
   - Improvements to the uncontracted Spanish computer braille table.
   - Improvements to the Norwegian braille table thanks to David Hole.

* Noteworthy changes in release 2.4.0 (2012-01-31)

** New features
   - New Generic Farsi Grade 1 table: A new table for Generic Farsi
     Grade 1 braille has been provided by Mesar Hameed.
   - Emacs mode for editing Braille tables thanks to Christian Egli

** Braille Table Improvements
   - Improvements to the French comp6 and comp8 braille tables
   - Improvements to the Romanian braille table
   - Improvements to the Generic Arabic Grade 1 table
   - Improvements to the Czech tables thanks to Jan Halousek and to
     Jan Hegr

* Noteworthy changes in release 2.3.0 (2011-05-09)

This release contains support for many more languages than before
(Swedish, Kurdish, Ethiopic, Serbian, many Indian languages). The
search path for tables is now a list of paths. Finally there is the
usual assortment of bug fixes.

** New features
*** Multiple table search path
    The environment variable LOUIS_TABLEPATH can now contain a list of
    paths (separated by commas) where liblouis should look for tables.
    This allows the user to keep local tables.
*** New --quiet option for lou_checktable
    lou_checktable writes to stderr even in the case of success. This
    can now be suppressed with the new option --quiet.
*** New Swedish table
    A new table for Swedish braille has been provided by Samuel
    Thibault.
*** New table for Sorani (Kurdish)
    A new table for Sorani (Kurdish) Braille has been donated by Peter
    Engström from Index Braille
*** New table for Ethiopic
    A new table for Ethiopic Braille has been donated by Tamru E.
    Belay PH.D from Adaptive Technology Center for the Blind (ATCB)
*** New table for Serbian
    A new table for Serbian Braille has been donated by Peter Engström
    from Index Braille

** Improved the documentation
   The deprecated opcodes have been moved to a separate section

** Bug fixes
   - Fixed a long standing bug with an infinite loop in the table
     compiler

** Braille Table Improvements
   - Improvements to the Chinese braille table
   - Improvements to the Flemish Braille Math Code tables
   - Improvements to the Dutch	Braille tables
   - Improvements to the Spanish Braille tables.
   - Fixes for the uncontracted French 6 and 8 dot tables
   - Improved support for Italian 8 dot
   - Improvements to the Generic Arabic Grade 1 table

* Noteworthy changes in release 2.2.0 (????-??-??)

** New features
*** New tables
    - Support for many indian languages
    - Support for Icelandic 6- and 8-dot
    - Support for Catalan
    - Support for Dutch Braille (for Belgium and the Netherlands)
    - Support for Flemish Braille Math Code (a.k.a. Woluwe code)


*** New functions to make libraries relocatable
    Two new functions, to set the search path for tables and files.
    They make the library relocatable. See the in the documentation
    for lou_setDataPath and lou_getDataPath.

** Bug fixes
    - Improved support for Spanish
    - Improved Norwegian tables

* Noteworthy changes in release 2.1.1 (2010-8-23)

** Bug fixes
   - Fixed problems with the Danish grade 2 table
   - Fixed problems with the Marburg maths table for mathematics and
     the UK maths table for mathematics

* Noteworthy changes in release 2.1.0 (2010-8-19)

** New features
*** New tables
    - Added tables for Portuguese grade 1 and 2
    - Added unicode.dis for Unicode braille
*** Modified tables
    - Updated Danish tables
*** Implemented language to table mapping
*** New format of error messages
    The error messages are now reported in a format similar to the one
    used in gcc. 
*** New opcode
    - added undefined opcode
*** Python bindings
    - Allow the user to configure the maximum output length by
      specifying a number by which the input length is multiplied
      using the outlenMultiplier module variable. The default will
      handle the case where every input character is undefined in the
      translation table. Previously, this was hard-coded to 2, which
      was insufficient in some cases.
    - Add compbrlLeftCursor mode constant.
    - Add compileString function which wraps lou_compileString.
    - Corrections/clarifications to docstrings.
    - Add python binding for the lou_hyphenate function.
    - Added python wrapper for lou_backTranslateString and lou_backTranslate.

*** liblouisxslt as an example
    Add liblouisxslt as an example to python/examples. This is
    basically an extension of libxslt that lets you invoke liblouis
    from an xslt stylesheet to do Braille translation on text nodes
    for example. 
*** compbrlLeftCursor
    Added a patch provided by Volker Bijewitz to implement
    compbrlLeftCursor.

** Bug fixes
*** output cursorPos
    Fix the output cursorPos when the compbrlAtCursor mode is enabled
    and the characters around the cursor translate to multiple braille
    cells, such as in the Chinese braille tables.
*** outpos when doing back translation
    Include a patch by Timothy Lee to fix outpos when doing back translation
      (issue 11)
*** inputPos/outputPos for undefined characters
    Fix the input/output position arrays for characters in the input
      which are undefined in the translation table.
*** table fixes
    - Fixed a bug with back translation of '*n'. (issue 13)
    - Fixes to the en-us-g2.ctb table
*** Python bindings
    - Remove unnecessary imports, allowing the bindings to run in Python
      2.7. (issue 12)
    - lou_translate* writes output information in typeform, so
      allocate enough bytes for it. Fixes possible buffer overruns and
      resultant crashes.
*** Miscellaneous
    - Fixes to the man page generation to fix issues that were
      reported by the Debian packaging builder
    - Do not invoke help2man when cross-compiling 
    - Documentation updates (issue 10)
    - Removing noletsign defaults
    - Many small fixes

* Noteworthy changes in release 2.0.0 (2010-7-6)

** New features
*** New functions
    - Adding lou_charSize function

* Noteworthy changes in release 1.9.0 (2010-6-29)

** New features
*** New functions
    - lou_dotsToChar and lou_charToDots function
    - Added lou_compileString for adding entries to tables at
      run-time.

* Noteworthy changes in release 1.8.0 (2009-11-23)

This release contains a number of improvements notably the integration
of gnulib, the automatic generation of man pages and the addition of
tables for German grade 2.

** New features
*** New tables
    - Tables German Grade 2
    - Swiss German
    - Swedish (1989 standard)
    - Swedish (1996 standard)

*** Modified tables
    - Updated Norwegian tables
    - Updated Chinese braille table

*** man pages
    All tools accept the --version and --help options and are
    documented in man pages

*** Corpus based test cases for tables
    You can now have corpus based tests for tables. See the README in
    tests/table_test_corpuses.

** Bug fixes
   - config.h is no longer exported
   - Many small fixes

* Noteworthy changes in release 1.7.0 (2009-08-21)

The main new feature of this release is the support for UK and Marburg
math. Other changes include a new tool to check hyphenation and the
usual improvement and addition of tables. Also The test suite has been
enhanced and finally passes.

** New features
*** New tables
    - Tables for UK and Marburg math
    - Hong Kong Cantonese
    - Hebrew
    - Hungarian
    - Slovene
    - Tibetan
    - Irish
    - Maltese

*** Modified tables
    - Updated Norwegian tables
    - Bug fixes in Russian tables
    - Updated French tables

*** lou_checkhyphens tool
    New tool to check hyphenation
*** rpm spec file
*** Test cases for tables
    The tables can now be tested with `make check'
*** New opcodes
    - noback and nofor opcode prefixes
    - grouping opcode
    - multipass subopcodes

** Bug fixes
   - Fix for library name and Python bindings
   - Documentation fixes
   - Many small fixes

* Noteworthy changes in release 1.6.2 (2009-05-01)

This release contains a new opcode for Malaysian Braille. See the
documentation for a description of the new opcode.

** New features

*** repword opcode 
The repword opcode is needed for Malaysian Braille

* Noteworthy changes in release 1.6.1 (2009-04-21)

This is mostly a bug fix release. It contains many bug fixes that were
discovered in the course of developing UK Math tables.

** Bug fixes

*** bug fixes for correct, context and multipass opcodes
*** bug fixes for largesign opcode
*** fixed bug with French back-translation
*** fixed the installation path for docs
*** documentation improvement

* Noteworthy changes in release 1.6 (2009-03-04)

This release features support for Danish and Russian and updated
tables for French and Norwegian. The search path for tables can now be
specified using an environment variable. Finally there is the usual
assortment of bug fixes.

** New features

*** exactdots opcode
The exactdots opcode is intended for use in liblouisxml
semantic-action files to specify exact dot patterns, as in
mathematical codes.
*** LOUIS_TABLEPATH env variable
You can now specify where liblouis is to look for tables with the
LOUIS_TABLEPATH environment variable.
*** New Tables for Danish and Russian
There is now support for Danish and Russian.

** Bug fixes

*** Updated French and Norwegian tables
*** Use stdcall calling convention if building for Windows

** Changes in behavior

None

* Noteworthy changes in release 1.5 (2009-01-21)

This is a big release for liblouis. It's the first time that it is
done from the Google code page. A number of people have contributed,
namely John Boyer (table debugger, bug fixes), Eitan Isaacson (Python
bindings), James Teh (Python bindings, bug fixes), Christian Egli
(documentation) and Michel Such (table for French grade 2).


** New features

*** Python bindings
The liblouis library can now be used from Python. For more info
consult the README file in the python directory.

*** Table debugger
liblouis now comes with a debugger that can help to find problems with
translation tables.

*** French table for grade 2
There is now a translation table for French grade 2.

*** pass1Only mode bit
The new pass1Only mode bit will help developers of screen readers as
the cursor will stay where it is expected to.

** Bug fixes

Fix the inpos array values for the case where a rule has an output
length which is larger than its input length.

fixed multi-word phrases

fixed bug in character display

fixed bug in findOpcodeName

lou_version now returns the correct liblouis version

** Changes in behavior

None

#+OPTIONS: toc:nil num:nil
