# liblouis: Czech Grade 1 Braille Table
#
#  Copyright (C) 2004-2008 ViewPlus Technologies, Inc. www.viewplus.com
#  Copyright (C) 2004-2006 JJB Software, Inc. www.jjb-software.com
#  Copyright (C) 2012 Mesar Hameed <mesar.hameed@gmail.com>
#
#  This file is part of liblouis.
#
#  liblouis is free software: you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as
#  published by the Free Software Foundation, either version 2.1 of the
#  License, or (at your option) any later version.
#
#  liblouis is distributed in the hope that it will be useful, but
#  WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with liblouis. If not, see
#  <http://www.gnu.org/licenses/>.

# Created & maintained by Leon Ungier <Leon.Ungier@ViewPlus.com>.

include text_nabcc.dis

# ----------- define all chars --------------------------------------

space \t 0 tab						#  9
space \x000A 0
space \x000D 0
space \s 0 blank					# 32
punctuation ! 235				exclamation sign 						x0021
punctuation " 2356			double quote								x0022
sign # 3456							number sign									x0023
sign $ 3456-1246				dollar sign									x0024
sign % 3456-1234				percent sign								x0025
sign & 3456-12346				ampersand										z0026
punctuation ' 4					apostrophe									x0027
punctuation ( 236				left parenthesis						x0028
punctuation ) 356				right parenthesis						x0029
sign * 35								asterisk										x002A
math + 256							plus												002B
punctuation , 2					coma												002C
punctuation - 36				hyphen-minus								002D
punctuation . 3					point												002E
math / 12456						solidus											002F

include digits6Dots.uti

punctuation : 25				colon								x003A
punctuation ; 23				semicolon						x003B
punctuation < 126				less-than sign			x003C
math = 123456						equal sign					x003D
math > 345							greater-than sign		x003E
punctuation ? 26				question mark				x003F
sign @ 3456-12456				commercial at				x0040

include latinLetterDef6Dots.uti

punctuation [ 6-236			left square bracket		x005B
sign \\ 3456-1256				reverse solidus				x005C
punctuation ] 6-356			right square bracket	x005D
sign ^ 45								circumflex accent			x005E
sign _ 6-36							low line							x005F
sign ` 45-4							grave accent					x0060

# a - z								# 97 - 122							x0061-x007A

punctuation { 45-236		left curly bracket		x007B
sign | 456							vertical line					x007C
punctuation } 45-356		right curly bracket		x007D
math ~ 5								tilde									x007E
sign \x0080 15-136-1235-135										x0080

space \X00A0 0		no-break space																x00A0
sign ¢ 4-14				cent sign																			x00A2
sign £ 45-123			pound sign																		x00A3
sign ¤ 45-15			currency sign																	x00A4
sign ¥ 45-13456		yen	sign																			x00A5
sign § 346				section sign																	x00A7
sign © 2356-6-14-2356		copyright																x00A9
# punctuation « 45-2356		left-pointing double angle quotation 		x00AB
punctuation « 236				left-pointing double angle quotation 		x00AB
punctuation \x00AD 36 soft hyphen
sign ° 4-356			degree sign																		x00B0
sign ² 4-6-126		superscript 2 sign														x00B2
sign ³ 4-6-146		superscript 3 sign														x00B3
sign µ 46-134			micro sign																		x00B5
sign ¶ 4-1234-345 pilcrow sign (paragraph)											x00B6
sign ¹ 1-27				superscript 1 sign														x00B9
# punctuation » 2356-12		right-pointing double angle quotation		x00BB
punctuation » 356			right-pointing double angle quotation			x00BB
math ¼ 6-16-34-1456		vulgar fraction one quarter								x00BC
math ½ 6-16-34-126		vulgar fraction one half									x00BD
math ¾ 6-126-34-1456	vulgar fraction 3 quarters								x00BE



uplow \x00C0\x00E0 12356	letter a with grave							x00C0 / 00E0
uplow \x00C1\x00E1 16			letter a with acute									x00E1
uplow \x00C2\x00E2 16					letter a with circumflex						x00E2
uplow \x00C3\x00E3 126		letter a with tilde											x00E3
uplow Ää 345				A with diaeresis											x00C4 / 00E4
uplow Åå 16					A with ring above											x00C5 / 00E5
uplow \x00C6\x00E6 6-345	ae															x00C6
uplow Çç 12346							letter c with cedilla					x00C7 / 00E7
uplow Èè 2346								e with grave									x00C8 / 00E8
uplow \x00C9\x00E9 345			e with acute									x00E9
uplow \x00CA\x00EA 126			e with circumflex							x00EA
uplow \x00CB\x00EB 1246		e with diaeresis								x00EB
uplow \x00CD\x00ED 34			i with acute										x00ED
uplow \x00CE\x00EE 146		i with circumflex								x00EE
uplow \x00CF\x00EF 12456	i with diaeresis								x00CF / 00EF

uplow	\x00D3\x00F3	246		O with acute										x00D3 / 00F3
uplow \x00D4\x00F4 1456		o with circumflex												x00F4
uplow \x00D5\x00F5 246		o with tilde														x00F5
uplow Öö 246							O with diaeresis								x00D6 / 00F6
math × 236				multiplication sign											x00D7
uplow \x00D8\x00F8 246		o with stroke										x00D8 / 00F8

math ÷ 256				division sign										x00F7

uplow \x00DA\x00FA 346				u with acute							x00DA / 00FA
uplow \x00DB\x00FB 156				u with circumflex					x00FB
uplow \x00DC\x00FC 1256				u with diaeresis					x00FC
uplow \x00DD\x00FD 12346			y with acute							x00DD / 00FD

# the letter a with ogonek -----------------------------------
uplow \x0104\x0105 16

# the letter c with acute
uplow \x0106\x0107 146

uplow \x010C\x010D 146					C with caron
uplow \x010E\x010F 1456					D with caron


# the letter e with ogonek
uplow \x0118\x0119 156

uplow \x011A\x011B 126					E with caron

# the letter l with stroke
uplow \x0141\x0142 126

# the letter n with acute
uplow \x0143\x0144 1456
uplow \x0147\x0148 1246					N with caron

uplow \x0158\x0159 2456					R with caron

# the letter s	with acute
uplow \x015A\x015B 246

uplow \x0160\x0161 156						S with caron
uplow \x0164\x0165 1256						T with caron
uplow \x016C\x016D 23456						U with breve
uplow \x016E\x016F 23456					U with ring above


# the letter z	with acute
uplow \x0179\x017A 2346

# the letter z with dot above
uplow \x017B\x017C 12346

uplow \x017D\x017E 2346						Z with caron

punctuation	\x2010 36		 # 8208			hyphen
punctuation	\x2011 36		 # 8209			non-breaking hyphen
punctuation	\x2013 36		 # 8211			smart minus sign
punctuation	\x2018 3		 # 8216			smart single left quotation mark
punctuation	\x2019 3		 # 8217			smart single right quotation mark

punctuation	\x201C 236	 # 8220			smart opening double quote
punctuation	\x201D 356	 # 8221			smart closing double quote
punctuation	\x201E 236	 # 8222			smart double low quotation mark
punctuation	\x201F 356	 # 8223			smart double high reverse quotation mark
punctuation  \x2026 3-3-3 # 8230		smart ellipsis
noback sign \X25CF 35	 	 # 9679			black circle

# ------------------------------------------------------


capsletter 6				# single capital letter indicator
begcapsword 6-6			# a block of consecutive capital letters indicator


numsign 3456		#	number sign, just one operand
midnum , 3
midnum . 2
midnum + 235
midnum - 36
midnum / 256
midnum : 25
midnum = 2356

# endnum # 56-3456

prepunc " 236
postpunc " 356

prepunc ' 6-236
postpunc ' 356-3
postpunc '' 356
postpunc ''' 356-3-356

repeated *** 16-16-16

prepunc `` 236
prepunc ` 6-236

repeated --- 36-36-36

repeated ::: 25-25-25

repeated ~~~ 4-156-4-156-4-156
always \s-\s 36-36
always \s-\scom 36-36-14-135-134
always ... 3-3-3
always .\s.\s. 3-3-3 . . .

always \s­\s 36-36

# special character sequences
literal :// URLs
literal www.

literal .com
literal .edu
literal .gov
literal .mil
literal .net
literal .org

literal .doc
literal .htm
literal .html
literal .tex
literal .txt

literal .gif
literal .jpg
literal .png
literal .wav

literal .tar
literal .zip
