# liblouis: Generic Arabic Grade 1 table
#
# Based on the braille contraction modules in BRLTTY
#
# Copyright (C) 1995-2004 by The BRLTTY Team. 
# Copyright (C) 2004 by ViewPlus Technologies, Inc.,  www.viewplustech.com
# Copyright (C) 2004 by Computers to Help People, Inc., www.chpi.org  
# Copyright (C) 2011-2012 by Mesar Hameed <mesar.hameed@gmail.com>
#
# This file 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.

# This file 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 this file; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

# Maintained by John J. Boyer, director@chpi.org, www.chpi.org
#
# This table is built and maintained by Leon Ungier <Leon.Ungier@ViewPlus.com>
# with help and guidance from Mohammed R. Ramadan <mramadan@nattiq.com>

include text_nabcc.dis All display opcodes
include braille-patterns.cti # unicode braille.


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

space \t 0 tab					#  9
space \x000A 0
space \x000D 0
space \s 0 blank				# 32
punctuation ! 235				# 33
punctuation " 2356				# 34
sign # 3456					# 35
sign $ 4-234					# 36
sign % 25-1234					# 37
sign & 1234					# 38
punctuation ' 3					# 39 apostrophe

punctuation ) 356				# 40
punctuation ( 236				# 41

sign * 56-35					# 42
math + 56-235					# 43
punctuation , 46				# 44
punctuation - 36				# 45

punctuation \x06D4 256				# Arabic Full stop
punctuation . 256				# 46

math / 34					# 47
include loweredDigits6Dots.uti
punctuation : 25				# 58
punctuation ; 56				# 59
math < 0-246-0					# 60
math = 56-2356					# 61
math > 0-135-0					# 62
punctuation ? 1456				# 63
sign @ 4					# 64

include latinLetterDef6Dots.uti

punctuation [ 6-236				# 91
sign \\ 6-34					# 92
punctuation ] 356-6				# 93
sign ^ 346					# 94 circumflex accent
sign _ 456					# 95 underscore
sign ` 4					# 96 grave accent
punctuation { 5-236				# 123
sign | 1245					# 124
punctuation } 356-2				# 125
math ~ 45					# 126

space \X00A0 0					# 160 no-break space
sign \x00A2 4-14				# 162 ¢ cents sign
sign \x00A3 4-123				# 163 £ pounds sign

sign \x00A5 4-13456				# 165 ¥ yen sign

sign \x00A7 4-234-3				# 167 section sign §

sign \x00A9 2356-6-14-2356 			# 169 © copyright sign

sign \x00AB 2356 				# LEFT-POINTING DOUBLE ANGLE QUOTATION
sign \x00AE 16-256				# ® Registered mark

punctuation \x00Ad 36				# 173 soft hyphen

sign \x00B0 356					# 176 ° degrees sign

sign \x00B5 46-134				# 181 µ micro sign
sign \x00B6 4-1234-345				# 182 ¶ pilcrow sign

sign \x00BB 2356 				# RIGHT-POINTING DOUBLE ANGLE QUOTATION
sign \x00BF 236					# 191 inverted question mark

math \x00D7 56-236				# 215 × multiplication sign

math \x00F7 56-256				# 247 ÷ division sign

sign \x200C 9 					# ZERO WIDTH NON-JOINER
punctuation \x2010 36				# 8208 hyphen
punctuation \x2011 23478			# 8209 non-breaking hyphen

punctuation \x2013 6-36				# 8211	en dash


punctuation	\x2018 3			# 8216	smart single left quotation mark
punctuation	\x2019 3			# 8217	smart single right quotation mark

punctuation	\x201C 2356			# 8220	smart opening double quote
punctuation	\x201D 2356			# 8221	smart closing double quote
punctuation	\x201E 2356			# 8222	smart double low quotation mark
punctuation	\x201F 2356			# 8223	smart double high reverse quotation mark


punctuation \x2026 3-3-3			# 8230 smart ellipsis

sign \x20AC 4-15				# 8364 Euro sign
sign \x25CF 35 					# BLACK CIRCLE

#-------------------------- Arabic characters ---------------------------------

sign \x060C 5
sign \x061B 56
sign \x061F 236					# Arabic question mark (؟)
sign \x0621 3
sign \x0622 345
sign \x0623 34
sign \x0624 1256
sign \x0625 46
sign \x0626 13456
sign \x0627 1					# Alef (ا)
sign \x0628 12
sign \x0629 16
sign \x062B 1456
sign \x062A 2345				# Teh (ت)
sign \x062C 245
sign \x062D 156
sign \x062E 1346
sign \x062F 145
sign \x0630 2346
sign \x0631 1235
sign \x0632 1356
sign \x0633 234
sign \x0634 146
sign \x0635 12346
sign \x0636 1246
sign \x0637 23456
sign \x0638 123456
sign \x0639 12356
sign \x063A 126
sign \x0640 2
sign \x0641 124
sign \x0642 12345
sign \x0643 13
sign \x0644 123
sign \x0645 134
sign \x0646 1345
sign \x0647 125
sign \x0648 2456
sign \x0649 135
sign \x064A 24
sign \x064E 2
sign \x0650 15


sign \x064B 23
sign \x064C 26
sign \x064D 35
sign \x064F 136
sign \x0651 6
sign \x0652 25


always \x0644\x0627 1236
always \x0640\x0640\x0640\x064F 136
always \x0640\x0640\x0640\x064B 23
always \x0640\x0640\x0640\x064C 26

# --------------------------- end definitions ---------------------------------

include countries.cti

# include text.nabcc.dis All display opcodes
# include text_nabcc.dis All display opcodes

# Braille indicators
numsign 3456  number sign, just a dots operand
multind 56-6 letsign capsletter
# letsign 56
capsletter 6
begcapsword 6-6
endcapsword 6-3
emphclass italic
emphclass underline
emphclass bold
begemph italic 46
endemph italic 46-46
begemph bold 456
endemph bold 456-456
begcomp 456-346
endcomp 456-156

# the decimal digits
include litdigits6Dots.uti

# Arabic numerals
digit \x0660 345		# 0 (٠)
digit \x0661 1			# 1 (١)
digit \x0662 12 		# 2 (٢)
digit \x0663 14 		# 3 (٣)
digit \x0664 145 		# 4 (٤)
digit \x0665 15 		# 5 (٥)
digit \x0666 124 		# 6 (٦)
digit \x0667 1245 		# 7 (٧)
digit \x0668 125 		# 8 (٨)
digit \x0669 24 		# 9 (٩)

# Letters are defined in en-chardefs
# punctuation

# prepunc ( 356
# postpunc ) 236
prepunc ) 356
postpunc ( 236

prepunc " 2356
postpunc " 2356

prepunc ' 6-236
postpunc ' 356-3
word 'em = 
word 'tis =
word 'twas =
begnum # 3456-4 print number sign before number
midnum , 46
postpunc , 46
decpoint . 46
midnum - 36
hyphen - 36
#capsnocont
postpunc . 256
postpunc ; 23
midnum : 25
postpunc : 25
postpunc ! 235
midnum / 34
always / 34
always < 0-246-0
always > 0-135-0
postpunc ? 236
endnum % 25-1234
midnum ^ 346
always ^ 346
always ~ 45
always & 1234
midnum * 56-35
always * 56-35
always [ 6-236
always ] 356-3
always { 5-236
always } 356-2
prepunc ` 6-236
always @ 4
always \\ 6-34
always | 1245
always ... 3-3-3
always $ 4-234

# special character sequences
compbrl :// URLs
compbrl www.
compbrl .com
compbrl .edu
compbrl .gov
compbrl .mil
compbrl .net
compbrl .org
# include countries.cti
compbrl .doc
compbrl .htm
compbrl .html
compbrl .tex
compbrl .txt
compbrl .gif
compbrl .jpg
compbrl .png
compbrl .wav
compbrl .tar
compbrl .zip
