Added various origin projects
[name-generation.git] / element-lists / lists / tsolyani / TsolyaniWordGenerator.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
3 <html>
4
5 <head>
6 <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
7 <meta name="generator" content="Adobe GoLive 6">
8 <title>Tekumel - Tsolyani Word Generator</title>
9 <script type="text/javascript" language="javascript">
10 <!--
11 // by Mark Pawelek
12 // based on the article in the Stategic Review
13 // Version 6 browsers only.
14
15 var tooFew = "Enter a numeric value for 'number of words' (1 - 100)";
16 var tooMany = "Too many words! Enter a value (1 - 100)";
17 var notNum = "Enter numberic digits only (1 - 100)"
18
19 function tryAgain(msg,oNum){
20 alert(msg);
21 oNum.select();
22 }
23
24 function cmdNumWords_onclick() {
25 var oNum = document.getElementById('txtNumWords');
26 var oTxt = document.getElementById('txtWords');
27 var oChk = document.getElementById('chkCapitalised');
28 var wl='';
29 var n=parseInt(oNum.value);
30
31 if (isNaN(n))
32 tryAgain(notNum, oNum)
33 else if (n<1)
34 tryAgain(tooFew, oNum)
35 else if (n>100)
36 tryAgain(tooMany, oNum)
37 else {
38 for (var j=1; j<=n; j++)
39 wl += ((oChk.checked) ? toUpper(Word()) : Word()) + '\n';
40 oTxt.value = wl;
41 }
42 return true
43 }
44
45 function UnNumbered(ary){
46 var position = d(ary.length)-1;
47 var arow = ary[position].split('|');
48 return arow[0].toString()
49 }
50
51 function getAssocA(ary, r) {
52 var z = d(r);
53 var key;
54 for (key in ary)
55 if (key>=z)
56 break;
57 return ary[key]
58 }
59
60 function toUpper(w) {
61 return (w.charAt(0).toUpperCase() + w.substring(1))
62 }
63
64 function d(X){
65 return Math.floor((X * Math.random() + 1))
66 }
67
68 function cmdCopyToClip_click(oName){
69 var oTxt = document.getElementById(oName)
70 oTxt.select();
71 return copy_clip(oTxt.value)
72 }
73
74 function copy_clip(txt){
75 if (window.clipboardData)
76 {
77 window.clipboardData.setData("Text", txt);
78 }
79 else if (window.netscape)
80 {
81 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
82 var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
83 if (!clip)
84 return;
85 var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
86 if (!trans)
87 return;
88 trans.addDataFlavor('text/unicode');
89 var str = new Object();
90 var len = new Object();
91 var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
92 var copytext=txt;
93 str.data=copytext;
94 trans.setTransferData("text/unicode",str,copytext.length*2);
95 var clipid=Components.interfaces.nsIClipboard;
96 if (!clip) return
97 false;
98 clip.setData(trans,null,clipid.kGlobalClipboard);
99 }
100 return false;
101 }
102
103 //Tsolyani Word Generator
104
105 var vowel1, vowelAlt, diphthongA, cons, conInit3, conInit2, consFin
106
107 vowel1 = ['i','a','o','u','ü','e','au','ai','oi'];
108 vowelAlt = ['ai','au','ua','ue','ae'];
109 diphthongA = ['i','a','o','u','ü','e'];
110
111 // GROUP I : 2 - 20; GROUP II : 22 - 40; GROUP III : 42 - 60;
112 cons = {2:"p",4:"b",6:"m",8:"f",10:"v",12:"w",14:"t",16:"d",18:"n",20:"th",22:"dh",24:"ch",26:"l",28:"y",30:"k",32:"g",34:"kh",36:"gh",37:"'",38:"q",40:"h",42:"w",44:"ts",46:"tl",48:"s",50:"sh",52:"z",54:"zh",55:"ss",56:"r",58:"l",60:"hl"};
113 conInit3 = ['mr','ms','dl','tr','nj'];
114 conInit2 = {2:'m',4:'n',6:'ng',8:'r',10:'l',12:'y',14:'s',16:'sh',18:'ss',19:'j'};
115 consFin = {2:'m',4:'n',6:'ng',8:'r',10:'l',12:'kh',14:'k',16:'s',18:'hl',19:'tl',20:'sh'};
116
117 function Word() {
118 var z = d(100);
119 if(z <= 10)
120 pname = vowel() + con() + vowel()
121 else if(z <= 20)
122 pname = vowel() + con() + vowel() + conFinal()
123 else if(z <= 30)
124 pname = vowel() + con() + vowel() + con() + vowel()
125 else if(z <= 40)
126 pname = con('i') + vowel() + conFinal()
127 else if(z <= 70)
128 pname = con('i') + vowel() + con() + vowel()
129 else if(z <= 90)
130 pname = con('i') + vowel() + con() + vowel() + conFinal()
131 else if(z <= 95)
132 pname = con('i') + vowel() + con() + vowel() + con() + vowel()
133 else
134 pname = con('i') + vowel() + con() + vowel() + con() + vowel() + conFinal();
135 return pname
136 }
137
138 function con(typ) {
139 var z = d(100);
140 if(z <= 50)
141 return consonant(typ)
142 else if(z <= 95)
143 return consonant2(typ)
144 else
145 return consonant3(typ)
146 }
147
148 function consonant2(typ) {
149 if (typ=='i')
150 return consonant()+conInitial2()
151 else
152 return consonant()+consonant()
153 }
154
155 function consonant3(typ) {
156 if(typ=='i')
157 return conInitial3()
158 else
159 return consonant()+consonant()+conInitial2()
160 }
161
162 function vowelOther() {
163 if(d(6)==1)
164 return diphthong()+diphthong()
165 else
166 return UnNumbered(vowelAlt)
167 }
168
169 function vowel() {
170 if(d(10)==1)
171 return vowelOther()
172 else
173 return UnNumbered(vowel1)
174 }
175
176 function diphthong() {
177 return UnNumbered(diphthongA)
178 }
179
180 function consonant() {
181 return getAssocA(cons, 60)
182 }
183
184 function conFinal() {
185 return getAssocA(consFin, 20)
186 }
187
188 function conInitial2(){
189 if (d(20)==1)
190 {
191 // specified as 'or other' in the article
192 // I didn't know what to do so I used a consonant (Groups I, II or III)
193 return getAssocA(cons, 60)
194 }
195 else
196 return getAssocA(conInit2, 19)
197 }
198
199 function conInitial3(){
200 return UnNumbered(conInit3)
201 }
202 // End word generator
203
204 //-->
205 </script>
206 </head>
207 <body>
208 <h1>Tsolyani random word generator</h1>
209 <p>For Tekumel. Based on the article &quot;Tsolyani Names Without Tears&quot;, by M. A. R. Barker, from &quot;The Strategic Review&quot;, (Vol. 1, #4,&nbsp;Winter 1975)</p>
210 <table border="1" cellspacing="1" cellpadding="0">
211 <tr>
212 <td>Enter <b>number of words</b> required: </td>
213 <td><input id="txtNumWords" name="txtNumWords" value="10" size="4"></td>
214 <td rowspan="4"><textarea id="txtWords" name="txtWords" rows="12" cols="30"></textarea></td>
215 </tr>
216 <tr>
217 <td>Capitalised? </td>
218 <td><input id="chkCapitalised" type="checkbox" name="chkCapitalised" checked></td>
219 </tr>
220 <tr>
221 <td colspan="2"><input type="button" id="cmdNumWords" onclick="return cmdNumWords_onclick()" name="cmdNumWords" value="Make Words"></td>
222 </tr>
223 <tr>
224 <td colspan="2"><input type="button" id="cmdCopyToClip" onclick="return cmdCopyToClip_click('txtWords')" name="cmdCopyToClip" value="Copy to clip-board"></td>
225 </tr>
226 </table>
227 <p>Based on the following groups of letters (see the article). Randomly generated words tend to have too many multiple adjacent consonants, which result in ugly unpronounceable words. Remove the ugly words and just keep the ones you like. Hey, it's easier than rolling dice and takes less thought than actually making up words from your imagination.</p>
228 <table border="1" cellspacing="1" cellpadding="0">
229 <tr>
230 <td>vowel </td>
231 <td>i, a, o, u, &uuml;, e, au, ai, oi</td>
232 </tr>
233 <tr>
234 <td>vowel (alternative)</td>
235 <td>ai, au, ua, ue, ae</td>
236 </tr>
237 <tr>
238 <td>diphthongs</td>
239 <td>i, a, o, u, &uuml;, e</td>
240 </tr>
241 <tr>
242 <td>consonant Group I</td>
243 <td>p, b, m, f, v, w, t, d, n, th</td>
244 </tr>
245 <tr>
246 <td>consonant Group II</td>
247 <td>dh, ch, l, y, k, g, kh, gh, ', q, h</td>
248 </tr>
249 <tr>
250 <td>consonant Group III</td>
251 <td>w, ts, tl, s, sh, z, zh, ss, r, l, hl</td>
252 </tr>
253 <tr>
254 <td>consonant Initial 3</td>
255 <td>mr, ms, dl, tr, nj</td>
256 </tr>
257 <tr>
258 <td>consonant&nbsp;Initial 2</td>
259 <td>m, n, ng, r, l, y, s, sh, ss, j</td>
260 </tr>
261 <tr>
262 <td>consonant&nbsp;Final</td>
263 <td>m, n, ng, r, l, kh, k, s, hl, tl, sh</td>
264 </tr>
265 </table>
266 <p></p>
267 <p> </p>
268 <p></p>
269 <p></p>
270 </body>
271 </html>