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

* Noteworthy changes in release 3.16.0 (2020-11-30)
This release is mostly the work of Bert Frees. He has put in a lot of
work and pushed some major improvements with regards to how emphasis
is handled (and how this is documented). He fixed a crash when reading
URLs using computer braille. He also worked with many contributors to
get their improvements in. So we have better support for UEB, Dutch,
Urdu, Malayalam, Arabic, Bashkir, Uzbek, Russian computer braille and
for EBAE. I'd like to thank everybody for helping to bring liblouis
forward.

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

** New features
- A new opcode ~noemphchars~ was added. This gives you more control
  over the placement and scope of various emphasis indicators. Thanks
  to Bert Frees.
** Bug fixes
- Fix an endless loop when using =compbrlAtCursor= thanks to Bert
  Frees
** Braille table improvements
- Improvements to US EBAE conformance with BANA emphasis guidelines
  thanks to Benetech.org
- Fixed a problem with apostrophe in Malayalam thanks to Jake Kyle
- Improvements to contraction use in UEB thanks to James Bowden. In
  particular the checkmark (U+2713) is added, the emdash (U+2014) is
  fixed, the right single quote used as apostrophe between letters is
  fixed and finally some more accented letters have been added.
- Improvements to Urdu Braille and Malayalam thanks to Jake Kyle
- Add characters for Bashkir and Uzbek languages to the Russian
  computer braille table. Thanks to Andrey Yakuboy.
- New table for Bashkir uncontracted braille thanks to Rustam
  Churagulov and Gabidullin Yunir.
- Updated =<= and =>= symbols in the Arabic tables thanks to Ikrami
  Ahmad.
- Improvements to Dutch thanks to Bert Frees.
  - Every word part in a capitalized compound word counts in the
    length of a passage.
  - ~begcapsphrase~ is allowed to start in a word preceded by
    punctuation.
- Improved translation of ligatures in UEB thanks to Bert Frees.
- Multiple improvements to the Russian literary braille thanks to
  Andrey Yakuboy and Bert Frees:
  - Many new symbols (punctuation, bullets, math symbols, etc) have
    been added.
  - The table now includes the international phonetic alphabet table.
  - Punctuation after digits and fractions is now marked with dot 6 to
    avoid ambiguities.
  - Other changes to conform better with Russian braille rules.
  - A new table that indicates capital letters was added. This is the
    new recommended Russian table for braille display users.
  - Removed the old ~ru-ru-g1.utb~ in favor of ~ru-litbrl.ctb~ and
    ~ru-litbrl-detailed.utb~.

** Other changes
- Support for Python 2 has been removed. The python bindings now only
  support Python 3. The deprecation notice was announced in Release
  3.13 and the removal is finally done now.
- Improvements to the placement of emphasis and capital indicators.
- The documentation for the emphasis opcodes has been further improved
  thanks to Bert Frees.
** Deprecation notice
- None
** Backwards incompatible changes
- ~emphmodechars~ can and must now be set per emphasis class.
** Invisible changes
- The emphasis and capitalization handling code has seen major 
  streamlining, simplification and tidying thanks to Bert Frees.
** New, renamed or removed tables
*** New
- ba.utb
- ru-litbrl-detailed.utb
- en-us-emphasis.uti

*** Renamed
None

*** Removed
- ru-ru-g1.utb

* Noteworthy changes in release 3.15.0 (2020-08-31)
This release contains updates to the Afrikaans, Malayalam, Malay,
Israeli, classical English and Portuguese tables. It also contains a
new table for Coptic thanks to first-time contributor Ibraam Nasif.
Behind the scenes there have been major changes to the
cross-compilation tool-chain that will finally allow us to ship
pre-built windows binaries that contain ~lou_checkyaml.exe~.

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

** New features
None

** Bug fixes
None

** Braille table improvements
- New computer braille table for the Coptic language thanks to Ibraam
  Nasif from Coptic Bishopric of Youth
- Improvements to Afrikaans thanks to Christo de Klerk
  - Fixed correct handling of the ŉ character (0x149)
  - Prevent contraction of
    - "self" in "selfoon", "selfone",
    - "ui" in words and names like "quisling", "quidproquo",
      "quiëtis", "Quinten", "Quintus",
    - "er" in words like "konstituering".
- Improved table for Malayalam grade 1 thanks to Jake Kyle.
  - Fixed rules for Candrakkala character at the end of a word.
  - Fixed rules for letters ര മ ങ in certain contexts.
  - Improved back-translation.
- Improvements to grade 2 Malay braille thanks to Herbert Koh.
- Improvements to Israeli 6-dot thanks to BAUM Engineering.
  - Fixed number sign for Arabic digits.
  - Fixed Hebrew letters with dagesh.
- Added bullets to the classical English tables, thanks to Bue
  Vester-Andersen
- Improved Portuguese grade 1 thanks to Bue Vester-Andersen.
  - Fixed forward translation of &, <, >, `, ¶ and '.
  - Improved back-translation. The table is now tagged as going both
    forward and backward.
  - Added missing square root sign.

** Other changes
None

** Deprecation notice
None

** Backwards incompatible changes
None

** Invisible changes
- Major rework of the cross-compilation tool-chain. There are now
  Docker images that should allow for local builds of binaries for 32
  and 64 bit. These include the libyaml library so the binaries contain
  ~lou_checkyaml.exe~. This will allow table creators to test their
  changes locally under windows.

** New, renamed or removed tables
*** New
- cop-eg-comp8.utb

*** Renamed
None

*** Removed
None

* Noteworthy changes in release 3.14.0 (2020-06-02)
This release contains major updates to Arabic, Dutch 8-dot computer
braille, German, Russian computer braille, Ukrainian computer braille
and Uzbek. Also there are new tables for Israeli multi-language
Hebrew/Arabic/English braille and Malay. Aside from that there have
been many code cleanups and bug fixes.

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

** New features
- Add new test mode in ~lou_checkyaml~ for testing display
  tables. Thanks to Bert Frees.

** Bug fixes
- Work around a bug that causes an endless loop in French uncontracted
  braille thanks to André-Abush Clause.

** Braille table improvements
- Updates to the Russian computer braille table thanks to Andrey
  Yakuboy:
  - Fixed diacritics, Greek letters and Hebrew.
  - Added new Cyrillic letters.
  - Fixed several minor bugs.
- New table for Uzbek braille thanks to BAUM Engineering.
- New table for Ukrainian computer braille thanks to Andrey
  Yakuboy and Oleh Shpai.
- Improvements to Arabic thanks to Ikrami Ahmad and Mada, Qatar
  Assistive Technology Center.
  - Added a lot of new symbols (algebra, geometry, Greek, etc.) to the
    grade 1 table.
  - Changed some symbols for less conflicts with grade 2.
  - Implemented letter sign / grade 1 indicator to cancel numbers and
    inhibit contractions when in grade 2.
  - Updated 8-dot computer braille table for better (easier to
    memorize) presentation of basic math symbols and punctuation
    marks.
  - Improved back-translation.
- Improvement to German thanks to Bue Vester-Andersen.
  - Removed superfluous letter sign before certain lesser-used
    accented letters.
- Final version of Dutch 8-dot computer braille table thanks to
  Leonard de Ruijter.
- New Israeli multi-language Hebrew/Arabic/English tables for both
  uncontracted and computer braille. Thanks to BAUM Engineering and
  Erez Kugler from TSR Gaash.
- New table for grade 2 Malay braille (Malaysia) thanks to Herbert
  Koh.

** Other changes
- You can now use up to 256 ~noletsign~ characters in a table, thanks
  to Christian Egli.
- Major improvements to the documentation for the /Standing Alone
  Sequences/ and their related opcodes such as ~seqdelimiter~ and also
  clarifications regarding the ~begcaps~ and ~endcaps~ opcodes thanks
  to Bue Vester-Andersen.

** Deprecation notice
- The ~class~ opcode has been deprecated in favor of ~attribute~,
  which has been enhanced to do everything ~class~ can do.

** Backwards incompatible changes
None

** Invisible changes
** New, renamed or removed tables
*** New
- uz-g1.utb
- ar-ar-g1-core.uti
- ar-ar-math.uti
- he-IL.utb
- he-IL-comp8.utb

*** Renamed
None

*** Removed
- da-dk.dis :: This table has long been superseded by
  ~da-dk-octobraille.dis~.
- da-lt.ctb :: This table was a step on the way to defining a Danish 8
  dot standard. The table was referring to an old Danish Braille
  note-taker from the 80s and 90s, which is not used any more.
- fi1.ctb and fi2.ctb :: These tables are obsolete. Use
  ~fi-fi-8dot.ctb~ instead.

* Noteworthy changes in release 3.13.0 (2020-03-02)
A tremendous amount of work by lots of different people has gone into
this release. Bert Frees for example added new opcodes, fixed long
standing bugs (with emphasis and capitalization), made the
documentation more clear and helped table contributors bringing in
their improvements. Bue Vester-Andersen added major improvements to
Danish and German braille. This release also contains much improved
tables for Afrikaans, Russian computer braille, Urdu and Chinese.

On a personal note I'd like to say that this is the 20th release of
liblouis shipped by the current release team Bert Frees and Christian
Egli. I hope we can continue to do so.

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

** New features
- The ~nocross~ opcode has been made into a prefix opcode, which means
  that it can now be used in combination not just with the ~always~
  opcode but also with other translation opcodes such as ~begword~,
  e.g. ~nocross begword sh 146~ for example. The old usage of the
  opcode no longer works, see [[Backwards incompatible changes]].
- Added a new opcode ~rependword~, needed to implement Malay
  braille. Thanks to Bert Frees.
- Emphasis and capitals can now be marked correctly in more
  cases. Thanks to Bert Frees.
  - When ~begemphword~ (~begcapsword~) is defined but not
    ~endemphword~ (~endcapsword~), use ~emphletter~ (~capsletter~) to
    mark every character in an emphasized (capitalized) part that ends
    in the middle of a word.
  - When ~begemphword~ (~begcapsword~) and ~begemph~ (~begcaps~) are
    both not defined, use ~emphletter~ (~capsletter~) to mark every
    emphasized (uppercase) letter.
  - ~capsnocont~ has no influence anymore on whether ~capsletter~ is
    used for every uppercase letter or not, see [[Backwards incompatible
    changes]].

** Bug fixes
- Fix a crash on sparc64 thanks to Samuel Thibault.
- Fixed a bug where the ~inputPos~ array was not monotonically
  increasing. This is a problem for language bindings that try to do
  hyphenation based on this information. Thanks to Bert Frees.
- A couple of small Coverity fixes thanks to David King.
- Fix an infinite loop involving multipass rules and backtranslation
  thanks to Bert Frees and Bue Vester-Andersen.
- Fix several problems in the Python bindings thanks to Leonard de
  Ruijter, Łukasz Golonka and André-Abush Clause:
  - Ensure that the mbcs encoding is always used to encode file path
    on Windows, especially when 'Unicode UTF-8' feature is enabled.
  - ~getTypeformForEmphClass~ was passed a decoded string on Python 3
    instead of an encoded one.
  - The same applies to ~compileString~. We encoded the input string,
    but never used that encoded one when passing it to liblouis.
- ~begemphword~ (~begcapsword~) and ~endemphword~ (~endcapsword~) are
  now used for single letters within a word when ~emphletter~
  (~capsletter~) is not defined.
- For backward translation the returned input length is now equal to
  the initial input length (as it is for forward translation) thanks
  to Bert Frees.

** Braille table improvements
- Improvements to Afrikaans thanks to Christo de Klerk
  - Fixed back translation of some lower words.
  - Fixed several contraction errors where contractions are based on
    pronunciation or occur where compound words join.
  - Eliminated grade 1 indicator where a single letter follows a
    single apostrophe to indicate an abbreviated word, e.g. 'k for ek.
  - Corrected the use of the grade 1 indicator in grade 2 with signs
    which would conflict with contractions, such as the trademark sign
    that would conflict with the contraction of tussen.
  - Fixed the back translation conflict between the UEB circle shape
    indicator and words containing $= being the contraction for
    "alge".
- Improvements to Russian computer braille table thanks to Andrey
  Yakuboy.
  - The table is now based on the Unicode character set. A lot of new
    characters were added that aren't in KOI8-R, including Greek,
    Hebrew, accented letters and so on.
  - For special characters we now follow the definitions from other
    software (JAWS, TSS, DBT) instead of following the American
    standard.
- Improvements to Urdu Braille thanks to Jake Kyle
  - Changed definition of \x0624 (Waw with hamza above) from dots 1256
    to dots 3-2456 following advice from proof reader.
  - Added 2 character versions of letter plus diactric (previously
    only the one character versions defined):
- Updates to the Danish Tables thanks to Bue Vester-Andersen:
  - Fixed back-translation for some JAWS Braille drivers, which
    deliver Unicode characters to Liblouis as input from a Braille
    keyboard.
  - Ensured proper use of letsign in connection with accented letters.
  - Re-arranged and strengthened tests to include all Unicode
    characters defined in the tables.
- Updates to the Chinese braille table (~zh-tw.ctb~) thanks to
  Bo-Cheng Jhan, Coscell Kao and Victor Cai.
- New experimental German tables for grade 0 (Basisschrift) and grade
  1 (Vollschrift) that are more suitable for back-translation, thanks
  to Bue Vester-Andersen.
  - All capital letters are marked.
  - Accented letters are translated using ~de-accents-detailed.cti~ to
    make the translation as detailed as possible.
  - Apostrophes and single quotation marks are translated the same.

** Other changes
- The documentation for the emphasis opcodes has been reworked and is
  now much more clear and accurate thanks to Bert Frees.

** Deprecation notice
- Python 2 is [[https://www.python.org/dev/peps/pep-0373/][no longer maintained]] since the beginning of this year.
  The current liblouis Python bindings work with both Python 2 and 3.
  However the support for Python 2 will be dropped in the next release
  (3.14) at the beginning of June 2020. If you have code that uses the
  liblouis Python bindings with Python 2 then please refer to the
  [[https://docs.python.org/3/howto/pyporting.html][official porting guide]] for help with migrating it.

** Backwards incompatible changes
- Since the ~nocross~ opcode has been made into a prefix opcode, it
  must now be used in combination with another opcode. For example
  ~nocross sh 146~ must now be written as ~nocross always sh 146~.
- The ~capsnocont~ opcode can not be used anymore to control whether
  ~capsletter~ is inserted for every uppercase letter. This now
  depends on whether ~begcaps~ and ~begcapsword~ are defined.

** Invisible changes
** New, renamed or removed tables
*** New
- de-g0-bidi-core.uti
- de-g0-bidi.utb
- de-g1-bidi-core.cti
- de-g1-bidi.ctb

*** Renamed
None

*** Removed
None

* 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
