Commit | Line | Data |
---|---|---|
b2e905a6 TN |
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 |