~~~~~~~~~~~
Text Tables
~~~~~~~~~~~

.. include:: prologue.rst

Description
===========

Files with names of the form ``*.ttb`` are text tables, and with names of the
form ``*.tti`` are text subtables. They are used by BRLTTY to translate the
characters on the screen into their corresponding 8-dot computer braille
representations (see |README.BrailleDots| for details).

Text tables can usually be found in the ``/etc/brltty/Text/`` directory (see
|README.Customize| for more details). See `Text Table List`_ for a list of
BRLTTY's text tables.

A text table consists of a sequence of directives, one per line, which define 
how each character is to be represented in braille. UTF-8 character encoding 
must be used. Whitespace (blanks, tabs) at the beginning of a line, as well as 
before and/or after any operand of any directive, is ignored. Lines containing 
only whitespace are ignored. If the first non-whitespace character of a line 
is ``#`` then that line is a comment and is ignored.

The precedence for determining the braille representation for a character is as
follows:

1) If the character is within the Unicode braille Row (U+2800 through U+28FF)
   then its low-order eight bits are used as follows:

   ===  ========  ===
   Hex  Binary    Dot
   ---  --------  ---
   01   00000001  1
   02   00000010  2
   04   00000100  3
   08   00001000  4
   10   00010000  5
   20   00100000  6
   40   01000000  7
   80   10000000  8
   ===  ========  ===

2) If the character is within the Unicode private use row U+F000 through U+F0FF
   then its low-order byte is:

   A) interpreted as a single-byte character within the locAL character set
   B) translated to Unicode
   C) reprocessed

3) An explicit representation (defined via `The Char Directive`_,
   `The Glyph Directive`_, or `The Byte Directive`_.

4) An equivalent representation (defined via `The Alias Directive`_).

5) The explicit representation of the Unicode base character.

6) The explicit representation of the transliterated ASCII character.

7) The explicit representation of the Unicode Replacement Character (U+FFFD).

8) The explicit representation of a question mark (``?``).

9) All eight braille dots.

Directives
==========

.. |character operand| replace::
   The character being defined.
   See `The String Operand`_ for details.

.. |byte operand| replace::
   The character being defined.
   It may be specified in any of the ways supported by `The String Operand`_
   except that the Unicode-specific forms (``\u``, ``\U``, ``\<``) may not be used.

.. |dots operand| replace::
   The braille representation for the character being defined.
   See `The Dots Operand`_ for details.

.. |cell operand| replace::
   The braille representation for the character being tested.
   See `The Cell Operand`_ for details.

The Char Directive
------------------

.. parsed-literal:: char *character* *dots* # *comment*

Use this directive to specify how a Unicode character is to be represented in
braille. A character defined via this directive can also be entered from a
braille keyboard. If several characters have the same braille representation
then only one of them should be defined via this directive - the others should
be defined via `The Glyph Directive`_ (which has the same syntax). If more than
one character with the same braille representation is defined via this
directive (which is allowed for backward compatibility) then the first one is
used when entered from a braille keyboard.

*character*
   |character operand|

*dots*
   |dots operand|

Examples::

   char a 1
   char b (12)
   char c ( 4  1   )
   char \\ 12567
   char \s 0
   char \x20 ()
   char \<LATIN_SMALL_LETTER_D> 145

The Glyph Directive
-------------------

.. parsed-literal:: glyph *character* *dots* # *comment*

Use this directive to specify how a Unicode character is to be represented in
braille. A character defined via this directive is output-only - it can't
be entered from a braille keyboard.

*character*
   |character operand|

*dots*
   |dots operand|

See `The Char Directive`_ for examples.

The Input Directive
-------------------

.. parsed-literal:: input *character* *dots* # *comment*

Use this directive to specify how a Unicode character is to be entered from a
braille keyboard. A character defined via this directive is input-only - its
actual braille representation isn't defined.

*character*
   |character operand|

*dots*
   |dots operand|

See `The Char Directive`_ for examples.

The Alias Directive
-------------------

.. parsed-literal:: alias *from* *to* # *comment*

Use this directive to define the *from* Unicode character such that it has the
same braille representation as the *to* Unicode character. See
`The String Operand`_ for details on how to specify both operands.

The Byte Directive
------------------

.. parsed-literal:: byte *byte* *dots* # *comment*

Use this directive to specify how a character in the local character set is to
be represented in braille. It has been retained for backward compatibility but
should not be used. Unicode characters should be defined (via either
`The Char Directive`_ or `The Glyph Directive`_) so that the text table remains
valid regardless of what the local character set is.

*byte*
   |byte operand|

*dots*
   |dots operand|

The IfGlyph Directive
---------------------

.. parsed-literal:: ifGlyph *character* *directive*

Use this directive to only process one or more directives if a character has a
braille representation.

*character*
   |character operand|

*directive*
   |directive operand|

Examples::

   ifGlyph C alias \u2103 C # degree Celsius

The IfNotGlyph Directive
------------------------

.. parsed-literal:: ifNotGlyph *character* *directive*

Use this directive to only process one or more directives if a character
doesn't have a braille representation.

*character*
   |character operand|

*directive*
   |directive operand|

Examples::

   ifNotGlyph \s glyph \s 0

The IfInput Directive
---------------------

.. parsed-literal:: ifInput *cell* *directive*

Use this directive to only process one or more directives if a character can be
entered from a braille keyboard.

*cell*
   |cell operand|

*directive*
   |directive operand|

The IfNotInput Directive
------------------------

.. parsed-literal:: ifNotInput *cell* *directive*

Use this directive to only process one or more directives if a character can't
be entered from a braille keyboard.

*cell*
   |cell operand|

*directive*
   |directive operand|

.. include:: nesting-directives.rst
.. include:: variable-directives.rst
.. include:: condition-directives.rst

Operands
========

.. include:: string-operand.rst

The Dots Operand
----------------

A *dots* operand is a sequence of one to eight dot numbers. If the dot numbers
are enclosed within (parentheses) then they may be separated from one another
by whitespace. A dot number is a digit within the range ``1``-``8``
as defined by the standard braille dot numbering convention (see
|README.BrailleDots| for details). The special dot number ``0`` is recognized
when not enclosed within (parentheses), and means no dots - it may not be used
in conjunction with any other dot number.

The Cell Operand
----------------

A *cell* operand is a sequence of one to eight dot numbers. A dot number is
a digit within the range ``1``-``8`` as defined by the standard braille dot
numbering convention (see |README.BrailleDots| for details). The special dot
number ``0`` is recognized, and means no dots - it may not be used in
conjunction with any other dot number.

Text Table List
===============

.. csv-table::
   :header-rows: 1
   :file: text-table.csv

