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