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

* 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
