1 ; say.conf |
|
2 ; |
|
3 ; language configuration |
|
4 ; |
|
5 ; The new language routines produce strings of the form |
|
6 ; prefix:[format:]data |
|
7 ; that are matched against the rules in this file to produce |
|
8 ; an output. |
|
9 ; |
|
10 ; The data is generally the string to be spelled (either a number, |
|
11 ; an ascii string or a date/time in the format specified below). |
|
12 ; It is available, in the right hand side of a rule, as variable ${SAY}. |
|
13 ; |
|
14 ; The format is optional and normally used only for date/time. |
|
15 ; The prefix is used to select the pronunciation - standard |
|
16 ; prefixes are |
|
17 ; num used for numbers |
|
18 ; enum used for enumerations |
|
19 ; date for dates |
|
20 ; time for times |
|
21 ; datetime for dates and times |
|
22 ; char for character strings |
|
23 ; phonetic for phonetic strings |
|
24 ; digit for digit strings |
|
25 ; |
|
26 ; but others can be used at will. |
|
27 ; |
|
28 ; Processing occurs as follows: |
|
29 ; If the format is empty, or there is no format, the entire |
|
30 ; string is matched against one of the pattern on the left hand side. |
|
31 ; On the first match, the various comma-separated components on the right |
|
32 ; hand side are pronounced, as follows: |
|
33 ; + a component starting with a prefix: (i.e. with a ':' in it) |
|
34 ; is re-processed according to these rules; |
|
35 ; + a component without a ':' in it is considered a filename and |
|
36 ; the corresponding file is played. |
|
37 ; |
|
38 ; If the format is non-empty, the format is split into its components |
|
39 ; (individual characters, or filenames in single quotes), and then |
|
40 ; filenames are played, whereas single characters are used to |
|
41 ; generate a new string format:pat:data to be processed. |
|
42 ; |
|
43 ; DATES/AND TIMES assume that the date info is available in |
|
44 ; the form YYYYMMDDHHmm.ss-dow-doy |
|
45 ; with 4 digits for the year, 2 for month, day, hour, minutes, seconds, |
|
46 ; one digit for the day-of-week, and 3 digits for the day-of-year. |
|
47 ; |
|
48 ; Example: |
|
49 ; datetime::200604172030.00-4-102 |
|
50 ; (typical format for a date) is first matched against the line |
|
51 ; datetime::. => date:AdBY 'digits/at' IMp:${SAY} |
|
52 ; which is normally present with the default format for dates. |
|
53 ; In turn, the format string "AdBY 'digits/at' IMp" results in |
|
54 ; the sequence |
|
55 ; date:A:200604172030.00-4-102 |
|
56 ; date:d:200604172030.00-4-102 |
|
57 ; date:B:200604172030.00-4-102 |
|
58 ; date:Y:200604172030.00-4-102 |
|
59 ; digits/at |
|
60 ; date:I:200604172030.00-4-102 |
|
61 ; date:M:200604172030.00-4-102 |
|
62 ; date:p:200604172030.00-4-102 |
|
63 ; |
|
64 ; |
|
65 ; Remember, normally X Z N are special, and the search is |
|
66 ; case insensitive, so you must use [X] [N] [Z] .. if you |
|
67 ; want exact match. |
|
68 |
|
69 ; We start with the basic rules that might be more-or-less |
|
70 ; language-independent |
|
71 |
|
72 [digit-base](!) ; base rule for digit strings |
|
73 ; XXX incomplete yet |
|
74 _digit:[0-9] => digits/${SAY} |
|
75 _digit:[-] => letters/dash |
|
76 _digit:[*] => letters/star |
|
77 _digit:[@] => letters/at |
|
78 _digit:[0-9]. => digit:${SAY:0:1}, digit:${SAY:1} |
|
79 |
|
80 [date-base](!) ; base rules for dates and times |
|
81 ; the 'SAY' variable contains YYYYMMDDHHmm.ss-dow-doy |
|
82 ; these rule map the strftime attributes. |
|
83 _date:Y:. => num:${SAY:0:4} ; year, 19xx |
|
84 _date:[Bb]:. => digits/mon-$[${SAY:4:2}-1] ; month name, 0..11 |
|
85 _date:[Aa]:. => digits/day-${SAY:16:1} ; day of week |
|
86 _date:[de]:. => num:${SAY:6:2} ; day of month |
|
87 _date:[hH]:. => num:${SAY:8:2} ; hour |
|
88 _date:[I]:. => num:$[${SAY:8:2} % 12] ; hour 0-12 |
|
89 _date:[M]:. => num:${SAY:10:2} ; minute |
|
90 ; XXX too bad the '?' function does not remove the quotes |
|
91 ; _date:[pP]:. => digits/$[ ${SAY:10:2} > 12 ? "p-m" :: "a-m"] ; am pm |
|
92 _date:[pP]:. => digits/p-m ; am pm |
|
93 _date:[S]:. => num:${SAY:13:2} ; seconds |
|
94 |
|
95 [en-base](!) |
|
96 _[n]um:0. => num:${SAY:1} |
|
97 _[n]um:X => digits/${SAY} |
|
98 _[n]um:1X => digits/${SAY} |
|
99 _[n]um:[2-9]0 => digits/${SAY} |
|
100 _[n]um:[2-9][1-9] => digits/${SAY:0:1}0, num:${SAY:1} |
|
101 _[n]um:XXX => num:${SAY:0:1}, digits/hundred, num:${SAY:1} |
|
102 |
|
103 _[n]um:XXXX => num:${SAY:0:1}, digits/thousand, num:${SAY:1} |
|
104 _[n]um:XXXXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2} |
|
105 _[n]um:XXXXXX => num:${SAY:0:3}, digits/thousand, num:${SAY:3} |
|
106 |
|
107 _[n]um:XXXXXXX => num:${SAY:0:1}, digits/million, num:${SAY:1} |
|
108 _[n]um:XXXXXXXX => num:${SAY:0:2}, digits/million, num:${SAY:2} |
|
109 _[n]um:XXXXXXXXX => num:${SAY:0:3}, digits/million, num:${SAY:3} |
|
110 |
|
111 _[n]um:XXXXXXXXXX => num:${SAY:0:1}, digits/billion, num:${SAY:1} |
|
112 _[n]um:XXXXXXXXXXX => num:${SAY:0:2}, digits/billion, num:${SAY:2} |
|
113 _[n]um:XXXXXXXXXXXX => num:${SAY:0:3}, digits/billion, num:${SAY:3} |
|
114 |
|
115 ; enumeration |
|
116 _e[n]um:X => digits/h-${SAY} |
|
117 _e[n]um:1X => digits/h-${SAY} |
|
118 _e[n]um:[2-9]0 => digits/h-${SAY} |
|
119 _e[n]um:[2-9][1-9] => num:${SAY:0:1}0, digits/h-${SAY:1} |
|
120 _e[n]um:[1-9]XX => num:${SAY:0:1}, digits/hundred, enum:${SAY:1} |
|
121 |
|
122 [it](digit-base,date-base) |
|
123 _[n]um:0. => num:${SAY:1} |
|
124 _[n]um:X => digits/${SAY} |
|
125 _[n]um:1X => digits/${SAY} |
|
126 _[n]um:[2-9]0 => digits/${SAY} |
|
127 _[n]um:[2-9][1-9] => digits/${SAY:0:1}0, num:${SAY:1} |
|
128 _[n]um:1XX => digits/hundred, num:${SAY:1} |
|
129 _[n]um:[2-9]XX => num:${SAY:0:1}, digits/hundred, num:${SAY:1} |
|
130 |
|
131 _[n]um:1XXX => digits/thousand, num:${SAY:1} |
|
132 _[n]um:[2-9]XXX => num:${SAY:0:1}, digits/thousands, num:${SAY:1} |
|
133 _[n]um:XXXXX => num:${SAY:0:2}, digits/thousands, num:${SAY:2} |
|
134 _[n]um:XXXXXX => num:${SAY:0:3}, digits/thousands, num:${SAY:3} |
|
135 |
|
136 _[n]um:1XXXXXX => num:${SAY:0:1}, digits/million, num:${SAY:1} |
|
137 _[n]um:[2-9]XXXXXX => num:${SAY:0:1}, digits/millions, num:${SAY:1} |
|
138 _[n]um:XXXXXXXX => num:${SAY:0:2}, digits/millions, num:${SAY:2} |
|
139 _[n]um:XXXXXXXXX => num:${SAY:0:3}, digits/millions, num:${SAY:3} |
|
140 |
|
141 _datetime::. => date:AdBY 'digits/at' IMp:${SAY} |
|
142 _date::. => date:AdBY:${SAY} |
|
143 _time::. => date:IMp:${SAY} |
|
144 |
|
145 [en](en-base,date-base,digit-base) |
|
146 _datetime::. => date:AdBY 'digits/at' IMp:${SAY} |
|
147 _date::. => date:AdBY:${SAY} |
|
148 _time::. => date:IMp:${SAY} |
|
149 |
|
150 [de](date-base,digit-base) |
|
151 _[n]um:0. => num:${SAY:1} |
|
152 _[n]um:X => digits/${SAY} |
|
153 _[n]um:1X => digits/${SAY} |
|
154 _[n]um:[2-9]0 => digits/${SAY} |
|
155 _[n]um:[2-9][1-9] => digits/${SAY:1}-and, digits/${SAY:0:1}0 |
|
156 _[n]um:1XX => digits/ein, digits/hundred, num:${SAY:1} |
|
157 _[n]um:[2-9]XX => digits/${SAY:0:1}, digits/hundred, num:${SAY:1} |
|
158 _[n]um:1XXX => digits/ein, digits/thousand, num:${SAY:1} |
|
159 _[n]um:[2-9]XXX => digits/${SAY:0:1}, digits/thousand, num:${SAY:1} |
|
160 _[n]um:XXXXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2} |
|
161 _[n]um:X00XXX => digits/${SAY:0:1}, digits/hundred, digits/thousand, num:${SAY:3} |
|
162 _[n]um:XXXXXX => digits/${SAY:0:1}, digits/hundred, num:${SAY:1} |
|
163 _[n]um:1XXXXXX => digits/eine, digits/million, num:${SAY:1} |
|
164 _[n]um:[2-9]XXXXXX => digits/${SAY:0:1}, digits/millions, num:${SAY:1} |
|
165 _[n]um:XXXXXXXX => num:${SAY:0:2}, digits/millions, num:${SAY:2} |
|
166 _[n]um:XXXXXXXXX => num:${SAY:0:3}, digits/millions, num:${SAY:3} |
|
167 |
|
168 _datetime::. => date:AdBY 'digits/at' IMp:${SAY} |
|
169 _date::. => date:AdBY:${SAY} |
|
170 _time::. => date:IMp:${SAY} |
|
171 |
|