# Attributes and dot patterns for the printable ASCII characters
#
#  Copyright (C) 2008 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/>.

# Attributes and dot patterns for the printable ASCII characters

space \x00a0 a
include spaces.uti

punctuation ! 2346				# 33
punctuation " 5						# 34
sign # 3456								# 35
sign $ 1246								# 36
sign % 146								# 37
sign & 12346							# 38
punctuation ' 3						# 39 apostrophe
punctuation ( 2356				# 40
punctuation ) 2356				# 41

sign * 16									# 42
math + 346								# 43
punctuation , 6						# 44
punctuation - 36					# 45
punctuation . 256					# 256
punctuation / 34									# 47
include loweredDigits6Dots.uti
punctuation : 156					# 58
punctuation ; 56					# 59
math < 126								# 60
math = 123456							# 61
math > 345								# 62
punctuation ? 1456				# 63
sign @ 2346								# 64

include latinLetterDef6Dots.uti

punctuation [ 2467				# 91
sign \\ 12567							# 92
punctuation ] 124567			# 93
sign ^ 457								# 94 circumflex accent
sign _ 456								# 95 underscore
sign ` 4									# 96 grave accent
# a - z										# 97 - 122
punctuation { 246					# 123
sign | 1256								# 124
punctuation } 12456				# 125
math ~ 45									# 126

sign \x00A2 4-14					# 162 ¢ cents sign
sign \x00A3 4-123					# 163 £ pounds sign

sign \x00A5 4-13456				#	165 ¥ yen sign

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

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

punctuation \x00Ad 36-36			# 173	  soft hyphen

sign \x00B0 356						# 176	  ° degrees sign
sign \x00B4 3 						# 180 ´ accute accent !!!! used for apostrophe override
sign \x00B5 46-134				# 181		µ micro sign
sign \x00B6 4-1234-345		#	182	  ¶ pilcrow sign

sign \x00BC 3456-1-256 #Quarter
sign \x00BD 3456-1-23 #Half

math \x00D7 56-236				# 215		× multiplication sign

math \x00F7 56-256				# 247		÷ division sign

punctuation \x2010 36-36			# 8208  hyphen
punctuation \x2013 36-36		# 8211	en dash
punctuation \x2014 36-36		# 8212	em dash
punctuation – 36-36		# 150	En dash


punctuation	\x2018 6-236			# 8216	smart single left quotation mark
punctuation	\x2019 356-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

sign \x20AC 4-15					# 8364 Euro sign

