Browse code

fancy table-stuff, woohoo!

bfadmin-master authored on26/04/2016 01:47:21
Showing8 changed files
... ...
@@ -2,4 +2,5 @@ temp/
2 2
 build/
3 3
 trash/
4 4
 refactor.sed
5
+draft.tar.xz
5 6
 
... ...
@@ -79,6 +79,7 @@ def main():
79 79
 		os.path.join(dirs["source"],"data","timeforms.json"),
80 80
 		os.path.join(dirs["source"],"data","adpositions.json"),
81 81
 		os.path.join(dirs["source"],"data","correlatives.json"),
82
+		os.path.join(dirs["source"],"data","x.json"),
82 83
 	]
83 84
 	
84 85
 	parts_logic_server = [
... ...
@@ -86,6 +87,7 @@ def main():
86 87
 		os.path.join(dirs["source"],"logic","server","data.php"),
87 88
 		os.path.join(dirs["source"],"logic","server","settings.php"),
88 89
 		os.path.join(dirs["source"],"logic","server","table.php"),
90
+		os.path.join(dirs["source"],"logic","server","sql.php"),
89 91
 	]
90 92
 	
91 93
 	parts_logic_client = [
... ...
@@ -9,7 +9,7 @@ clear: clean
9 9
 	@ rm --recursive --force build
10 10
 .PHONY: clear
11 11
 
12
-build/draft.html: source/data/phonology_and_orthography.json source/data/personal_pronouns.json source/data/word_functions.json source/data/timeforms.json source/data/adpositions.json source/data/correlatives.json source/logic/server/misc.php source/logic/server/data.php source/logic/server/settings.php source/logic/server/table.php source/structure/draft.html.php source/structure/meta.html.php source/structure/introduction.html.php source/structure/preface.html.php source/structure/key_parameters.html.php source/structure/toc.html.php source/structure/basics.html.php source/structure/phonology_and_orthography.html.php source/structure/grammar.html.php source/structure/personal_pronouns.html.php source/structure/correlatives.html.php source/structure/conjugation.html.php source/structure/infinite_verbforms.html.php source/structure/tempora_and_modi.html.php source/structure/declension.html.php source/structure/attributes.html.php source/structure/sentence_structure.html.php source/structure/vocabulary.html.php source/structure/principles.html.php source/structure/word_functions.html.php source/structure/adpositions.html.php source/structure/pronouns.html.php source/structure/dictionary.html.php
12
+build/draft.html: source/data/phonology_and_orthography.json source/data/personal_pronouns.json source/data/word_functions.json source/data/timeforms.json source/data/adpositions.json source/data/correlatives.json source/data/x.json source/logic/server/misc.php source/logic/server/data.php source/logic/server/settings.php source/logic/server/table.php source/logic/server/sql.php source/structure/draft.html.php source/structure/meta.html.php source/structure/introduction.html.php source/structure/preface.html.php source/structure/key_parameters.html.php source/structure/toc.html.php source/structure/basics.html.php source/structure/phonology_and_orthography.html.php source/structure/grammar.html.php source/structure/personal_pronouns.html.php source/structure/correlatives.html.php source/structure/conjugation.html.php source/structure/infinite_verbforms.html.php source/structure/tempora_and_modi.html.php source/structure/declension.html.php source/structure/attributes.html.php source/structure/sentence_structure.html.php source/structure/vocabulary.html.php source/structure/principles.html.php source/structure/word_functions.html.php source/structure/adpositions.html.php source/structure/pronouns.html.php source/structure/dictionary.html.php
13 13
 	@ echo -e '-- composing document ...'
14 14
 	@ mkdir --parents build
15 15
 	@ php source/structure/draft.html.php > build/draft.html
16 16
new file mode 100644
... ...
@@ -0,0 +1,1365 @@
1
+{
2
+	"domains": [
3
+		{
4
+			"id": "concrete",
5
+			"name": "Concrete"
6
+		},
7
+		{
8
+			"id": "person",
9
+			"name": "Person"
10
+		},
11
+		{
12
+			"id": "thing",
13
+			"name": "Thing"
14
+		},
15
+		{
16
+			"id": "posession",
17
+			"name": "Posession"
18
+		},
19
+		{
20
+			"id": "time",
21
+			"name": "Time"
22
+		},
23
+		{
24
+			"id": "location",
25
+			"name": "Location"
26
+		},
27
+		{
28
+			"id": "direction",
29
+			"name": "Direction"
30
+		},
31
+		{
32
+			"id": "cause",
33
+			"name": "Cause"
34
+		},
35
+		{
36
+			"id": "manner",
37
+			"name": "Manner"
38
+		},
39
+		{
40
+			"id": "type_id",
41
+			"name": "type_id"
42
+		},
43
+		{
44
+			"id": "amount",
45
+			"name": "Amount"
46
+		}
47
+	],
48
+	"types": [
49
+		{
50
+			"id": "interrogative",
51
+			"name": "Interrogative"
52
+		},
53
+		{
54
+			"id": "relative",
55
+			"name": "Relative"
56
+		},
57
+		{
58
+			"id": "demonstrative_far",
59
+			"name": "Demonstrative far"
60
+		},
61
+		{
62
+			"id": "demonstrative_near",
63
+			"name": "Demonstrative near"
64
+		},
65
+		{
66
+			"id": "universal",
67
+			"name": "Universal"
68
+		},
69
+		{
70
+			"id": "undefined",
71
+			"name": "Undefined"
72
+		},
73
+		{
74
+			"id": "negative",
75
+			"name": "Negative"
76
+		}
77
+	],
78
+	"words": [
79
+		{
80
+		    "domain_id":"concrete",
81
+		    "type_id":"interrogative",
82
+		    "language":"fs",
83
+		    "words":[
84
+		        "vilk"
85
+		    ]
86
+		},
87
+		{
88
+		    "domain_id":"concrete",
89
+		    "type_id":"interrogative",
90
+		    "language":"en",
91
+		    "words":[
92
+		        "which"
93
+		    ]
94
+		},
95
+		{
96
+		    "domain_id":"concrete",
97
+		    "type_id":"relative",
98
+		    "language":"fs",
99
+		    "words":[
100
+		        "vilk"
101
+		    ]
102
+		},
103
+		{
104
+		    "domain_id":"concrete",
105
+		    "type_id":"relative",
106
+		    "language":"en",
107
+		    "words":[
108
+		        "which"
109
+		    ]
110
+		},
111
+		{
112
+		    "domain_id":"concrete",
113
+		    "type_id":"demonstrative_far",
114
+		    "language":"fs",
115
+		    "words":[
116
+		        "jen"
117
+		    ]
118
+		},
119
+		{
120
+		    "domain_id":"concrete",
121
+		    "type_id":"demonstrative_far",
122
+		    "language":"en",
123
+		    "words":[
124
+		        "that"
125
+		    ]
126
+		},
127
+		{
128
+		    "domain_id":"concrete",
129
+		    "type_id":"demonstrative_near",
130
+		    "language":"fs",
131
+		    "words":[
132
+		        "dis"
133
+		    ]
134
+		},
135
+		{
136
+		    "domain_id":"concrete",
137
+		    "type_id":"demonstrative_near",
138
+		    "language":"en",
139
+		    "words":[
140
+		        "this"
141
+		    ]
142
+		},
143
+		{
144
+		    "domain_id":"concrete",
145
+		    "type_id":"universal",
146
+		    "language":"fs",
147
+		    "words":[
148
+		        "al"
149
+		    ]
150
+		},
151
+		{
152
+		    "domain_id":"concrete",
153
+		    "type_id":"universal",
154
+		    "language":"en",
155
+		    "words":[
156
+		        "every",
157
+		        "all"
158
+		    ]
159
+		},
160
+		{
161
+		    "domain_id":"concrete",
162
+		    "type_id":"undefined",
163
+		    "language":"fs",
164
+		    "words":[
165
+		        "et"
166
+		    ]
167
+		},
168
+		{
169
+		    "domain_id":"concrete",
170
+		    "type_id":"undefined",
171
+		    "language":"en",
172
+		    "words":[
173
+		        "some"
174
+		    ]
175
+		},
176
+		{
177
+		    "domain_id":"concrete",
178
+		    "type_id":"negative",
179
+		    "language":"fs",
180
+		    "words":[
181
+		        "ing"
182
+		    ]
183
+		},
184
+		{
185
+		    "domain_id":"concrete",
186
+		    "type_id":"negative",
187
+		    "language":"en",
188
+		    "words":[
189
+		        "no"
190
+		    ]
191
+		},
192
+		{
193
+		    "domain_id":"person",
194
+		    "type_id":"interrogative",
195
+		    "language":"fs",
196
+		    "words":[
197
+		        "vilk man",
198
+		        "ve"
199
+		    ]
200
+		},
201
+		{
202
+		    "domain_id":"person",
203
+		    "type_id":"interrogative",
204
+		    "language":"en",
205
+		    "words":[
206
+		        "who"
207
+		    ]
208
+		},
209
+		{
210
+		    "domain_id":"person",
211
+		    "type_id":"relative",
212
+		    "language":"fs",
213
+		    "words":[
214
+		        "vilk man",
215
+		        "ve"
216
+		    ]
217
+		},
218
+		{
219
+		    "domain_id":"person",
220
+		    "type_id":"relative",
221
+		    "language":"en",
222
+		    "words":[
223
+		        "who"
224
+		    ]
225
+		},
226
+		{
227
+		    "domain_id":"person",
228
+		    "type_id":"demonstrative_far",
229
+		    "language":"fs",
230
+		    "words":[
231
+		        "jen man"
232
+		    ]
233
+		},
234
+		{
235
+		    "domain_id":"person",
236
+		    "type_id":"demonstrative_far",
237
+		    "language":"en",
238
+		    "words":[
239
+
240
+		    ]
241
+		},
242
+		{
243
+		    "domain_id":"person",
244
+		    "type_id":"demonstrative_near",
245
+		    "language":"fs",
246
+		    "words":[
247
+		        "dis man"
248
+		    ]
249
+		},
250
+		{
251
+		    "domain_id":"person",
252
+		    "type_id":"demonstrative_near",
253
+		    "language":"en",
254
+		    "words":[
255
+
256
+		    ]
257
+		},
258
+		{
259
+		    "domain_id":"person",
260
+		    "type_id":"universal",
261
+		    "language":"fs",
262
+		    "words":[
263
+		        "al man",
264
+		        "alve"
265
+		    ]
266
+		},
267
+		{
268
+		    "domain_id":"person",
269
+		    "type_id":"universal",
270
+		    "language":"en",
271
+		    "words":[
272
+		        "everyone"
273
+		    ]
274
+		},
275
+		{
276
+		    "domain_id":"person",
277
+		    "type_id":"undefined",
278
+		    "language":"fs",
279
+		    "words":[
280
+		        "et man",
281
+		        "etve"
282
+		    ]
283
+		},
284
+		{
285
+		    "domain_id":"person",
286
+		    "type_id":"undefined",
287
+		    "language":"en",
288
+		    "words":[
289
+		        "someone"
290
+		    ]
291
+		},
292
+		{
293
+		    "domain_id":"person",
294
+		    "type_id":"negative",
295
+		    "language":"fs",
296
+		    "words":[
297
+		        "ing man",
298
+		        "ingve"
299
+		    ]
300
+		},
301
+		{
302
+		    "domain_id":"person",
303
+		    "type_id":"negative",
304
+		    "language":"en",
305
+		    "words":[
306
+		        "no one"
307
+		    ]
308
+		},
309
+		{
310
+		    "domain_id":"thing",
311
+		    "type_id":"interrogative",
312
+		    "language":"fs",
313
+		    "words":[
314
+		        "vilk ding",
315
+		        "vat"
316
+		    ]
317
+		},
318
+		{
319
+		    "domain_id":"thing",
320
+		    "type_id":"interrogative",
321
+		    "language":"en",
322
+		    "words":[
323
+		        "what"
324
+		    ]
325
+		},
326
+		{
327
+		    "domain_id":"thing",
328
+		    "type_id":"relative",
329
+		    "language":"fs",
330
+		    "words":[
331
+		        "vilk ding",
332
+		        "vat"
333
+		    ]
334
+		},
335
+		{
336
+		    "domain_id":"thing",
337
+		    "type_id":"relative",
338
+		    "language":"en",
339
+		    "words":[
340
+		        "what"
341
+		    ]
342
+		},
343
+		{
344
+		    "domain_id":"thing",
345
+		    "type_id":"demonstrative_far",
346
+		    "language":"fs",
347
+		    "words":[
348
+		        "jen ding",
349
+		        "dat"
350
+		    ]
351
+		},
352
+		{
353
+		    "domain_id":"thing",
354
+		    "type_id":"demonstrative_far",
355
+		    "language":"en",
356
+		    "words":[
357
+		        "that"
358
+		    ]
359
+		},
360
+		{
361
+		    "domain_id":"thing",
362
+		    "type_id":"demonstrative_near",
363
+		    "language":"fs",
364
+		    "words":[
365
+		        "dis ding"
366
+		    ]
367
+		},
368
+		{
369
+		    "domain_id":"thing",
370
+		    "type_id":"demonstrative_near",
371
+		    "language":"en",
372
+		    "words":[
373
+		        "this"
374
+		    ]
375
+		},
376
+		{
377
+		    "domain_id":"thing",
378
+		    "type_id":"universal",
379
+		    "language":"fs",
380
+		    "words":[
381
+		        "al ding",
382
+		        "alvat"
383
+		    ]
384
+		},
385
+		{
386
+		    "domain_id":"thing",
387
+		    "type_id":"universal",
388
+		    "language":"en",
389
+		    "words":[
390
+		        "everything"
391
+		    ]
392
+		},
393
+		{
394
+		    "domain_id":"thing",
395
+		    "type_id":"undefined",
396
+		    "language":"fs",
397
+		    "words":[
398
+		        "et ding",
399
+		        "etvat"
400
+		    ]
401
+		},
402
+		{
403
+		    "domain_id":"thing",
404
+		    "type_id":"undefined",
405
+		    "language":"en",
406
+		    "words":[
407
+		        "something"
408
+		    ]
409
+		},
410
+		{
411
+		    "domain_id":"thing",
412
+		    "type_id":"negative",
413
+		    "language":"fs",
414
+		    "words":[
415
+		        "ing ding",
416
+		        "ingvat"
417
+		    ]
418
+		},
419
+		{
420
+		    "domain_id":"thing",
421
+		    "type_id":"negative",
422
+		    "language":"en",
423
+		    "words":[
424
+		        "nothing"
425
+		    ]
426
+		},
427
+		{
428
+		    "domain_id":"posession",
429
+		    "type_id":"interrogative",
430
+		    "language":"fs",
431
+		    "words":[
432
+		        "av vilk man",
433
+		        "ves"
434
+		    ]
435
+		},
436
+		{
437
+		    "domain_id":"posession",
438
+		    "type_id":"interrogative",
439
+		    "language":"en",
440
+		    "words":[
441
+
442
+		    ]
443
+		},
444
+		{
445
+		    "domain_id":"posession",
446
+		    "type_id":"relative",
447
+		    "language":"fs",
448
+		    "words":[
449
+		        "av vilk man",
450
+		        "ves"
451
+		    ]
452
+		},
453
+		{
454
+		    "domain_id":"posession",
455
+		    "type_id":"relative",
456
+		    "language":"en",
457
+		    "words":[
458
+
459
+		    ]
460
+		},
461
+		{
462
+		    "domain_id":"posession",
463
+		    "type_id":"demonstrative_far",
464
+		    "language":"fs",
465
+		    "words":[
466
+		        "av jen man"
467
+		    ]
468
+		},
469
+		{
470
+		    "domain_id":"posession",
471
+		    "type_id":"demonstrative_far",
472
+		    "language":"en",
473
+		    "words":[
474
+
475
+		    ]
476
+		},
477
+		{
478
+		    "domain_id":"posession",
479
+		    "type_id":"demonstrative_near",
480
+		    "language":"fs",
481
+		    "words":[
482
+		        "av dis man"
483
+		    ]
484
+		},
485
+		{
486
+		    "domain_id":"posession",
487
+		    "type_id":"demonstrative_near",
488
+		    "language":"en",
489
+		    "words":[
490
+
491
+		    ]
492
+		},
493
+		{
494
+		    "domain_id":"posession",
495
+		    "type_id":"universal",
496
+		    "language":"fs",
497
+		    "words":[
498
+		        "av al man",
499
+		        "alves"
500
+		    ]
501
+		},
502
+		{
503
+		    "domain_id":"posession",
504
+		    "type_id":"universal",
505
+		    "language":"en",
506
+		    "words":[
507
+
508
+		    ]
509
+		},
510
+		{
511
+		    "domain_id":"posession",
512
+		    "type_id":"undefined",
513
+		    "language":"fs",
514
+		    "words":[
515
+		        "av et man",
516
+		        "etves"
517
+		    ]
518
+		},
519
+		{
520
+		    "domain_id":"posession",
521
+		    "type_id":"undefined",
522
+		    "language":"en",
523
+		    "words":[
524
+
525
+		    ]
526
+		},
527
+		{
528
+		    "domain_id":"posession",
529
+		    "type_id":"negative",
530
+		    "language":"fs",
531
+		    "words":[
532
+		        "av ing man",
533
+		        "ingves"
534
+		    ]
535
+		},
536
+		{
537
+		    "domain_id":"posession",
538
+		    "type_id":"negative",
539
+		    "language":"en",
540
+		    "words":[
541
+
542
+		    ]
543
+		},
544
+		{
545
+		    "domain_id":"time",
546
+		    "type_id":"interrogative",
547
+		    "language":"fs",
548
+		    "words":[
549
+		        "vilk tid",
550
+		        "van"
551
+		    ]
552
+		},
553
+		{
554
+		    "domain_id":"time",
555
+		    "type_id":"interrogative",
556
+		    "language":"en",
557
+		    "words":[
558
+		        "when"
559
+		    ]
560
+		},
561
+		{
562
+		    "domain_id":"time",
563
+		    "type_id":"relative",
564
+		    "language":"fs",
565
+		    "words":[
566
+		        "vilk tid",
567
+		        "van"
568
+		    ]
569
+		},
570
+		{
571
+		    "domain_id":"time",
572
+		    "type_id":"relative",
573
+		    "language":"en",
574
+		    "words":[
575
+		        "when"
576
+		    ]
577
+		},
578
+		{
579
+		    "domain_id":"time",
580
+		    "type_id":"demonstrative_far",
581
+		    "language":"fs",
582
+		    "words":[
583
+		        "jen tid",
584
+		        "dan"
585
+		    ]
586
+		},
587
+		{
588
+		    "domain_id":"time",
589
+		    "type_id":"demonstrative_far",
590
+		    "language":"en",
591
+		    "words":[
592
+		        "then"
593
+		    ]
594
+		},
595
+		{
596
+		    "domain_id":"time",
597
+		    "type_id":"demonstrative_near",
598
+		    "language":"fs",
599
+		    "words":[
600
+		        "dis tid",
601
+		        "no"
602
+		    ]
603
+		},
604
+		{
605
+		    "domain_id":"time",
606
+		    "type_id":"demonstrative_near",
607
+		    "language":"en",
608
+		    "words":[
609
+		        "now"
610
+		    ]
611
+		},
612
+		{
613
+		    "domain_id":"time",
614
+		    "type_id":"universal",
615
+		    "language":"fs",
616
+		    "words":[
617
+		        "al tid",
618
+		        "alvan"
619
+		    ]
620
+		},
621
+		{
622
+		    "domain_id":"time",
623
+		    "type_id":"universal",
624
+		    "language":"en",
625
+		    "words":[
626
+		        "always"
627
+		    ]
628
+		},
629
+		{
630
+		    "domain_id":"time",
631
+		    "type_id":"undefined",
632
+		    "language":"fs",
633
+		    "words":[
634
+		        "et tid",
635
+		        "etvan"
636
+		    ]
637
+		},
638
+		{
639
+		    "domain_id":"time",
640
+		    "type_id":"undefined",
641
+		    "language":"en",
642
+		    "words":[
643
+		        "sometimes"
644
+		    ]
645
+		},
646
+		{
647
+		    "domain_id":"time",
648
+		    "type_id":"negative",
649
+		    "language":"fs",
650
+		    "words":[
651
+		        "ing tid",
652
+		        "ingvan"
653
+		    ]
654
+		},
655
+		{
656
+		    "domain_id":"time",
657
+		    "type_id":"negative",
658
+		    "language":"en",
659
+		    "words":[
660
+		        "never"
661
+		    ]
662
+		},
663
+		{
664
+		    "domain_id":"location",
665
+		    "type_id":"interrogative",
666
+		    "language":"fs",
667
+		    "words":[
668
+		        "vilk sted",
669
+		        "var"
670
+		    ]
671
+		},
672
+		{
673
+		    "domain_id":"location",
674
+		    "type_id":"interrogative",
675
+		    "language":"en",
676
+		    "words":[
677
+		        "where"
678
+		    ]
679
+		},
680
+		{
681
+		    "domain_id":"location",
682
+		    "type_id":"relative",
683
+		    "language":"fs",
684
+		    "words":[
685
+		        "vilk sted",
686
+		        "var"
687
+		    ]
688
+		},
689
+		{
690
+		    "domain_id":"location",
691
+		    "type_id":"relative",
692
+		    "language":"en",
693
+		    "words":[
694
+		        "where"
695
+		    ]
696
+		},
697
+		{
698
+		    "domain_id":"location",
699
+		    "type_id":"demonstrative_far",
700
+		    "language":"fs",
701
+		    "words":[
702
+		        "jen sted",
703
+		        "dar"
704
+		    ]
705
+		},
706
+		{
707
+		    "domain_id":"location",
708
+		    "type_id":"demonstrative_far",
709
+		    "language":"en",
710
+		    "words":[
711
+		        "there"
712
+		    ]
713
+		},
714
+		{
715
+		    "domain_id":"location",
716
+		    "type_id":"demonstrative_near",
717
+		    "language":"fs",
718
+		    "words":[
719
+		        "dis sted",
720
+		        "har"
721
+		    ]
722
+		},
723
+		{
724
+		    "domain_id":"location",
725
+		    "type_id":"demonstrative_near",
726
+		    "language":"en",
727
+		    "words":[
728
+		        "here"
729
+		    ]
730
+		},
731
+		{
732
+		    "domain_id":"location",
733
+		    "type_id":"universal",
734
+		    "language":"fs",
735
+		    "words":[
736
+		        "al sted",
737
+		        "alvar"
738
+		    ]
739
+		},
740
+		{
741
+		    "domain_id":"location",
742
+		    "type_id":"universal",
743
+		    "language":"en",
744
+		    "words":[
745
+		        "everywhere"
746
+		    ]
747
+		},
748
+		{
749
+		    "domain_id":"location",
750
+		    "type_id":"undefined",
751
+		    "language":"fs",
752
+		    "words":[
753
+		        "et sted",
754
+		        "etvar"
755
+		    ]
756
+		},
757
+		{
758
+		    "domain_id":"location",
759
+		    "type_id":"undefined",
760
+		    "language":"en",
761
+		    "words":[
762
+		        "somewhere"
763
+		    ]
764
+		},
765
+		{
766
+		    "domain_id":"location",
767
+		    "type_id":"negative",
768
+		    "language":"fs",
769
+		    "words":[
770
+		        "ing sted",
771
+		        "ingvar"
772
+		    ]
773
+		},
774
+		{
775
+		    "domain_id":"location",
776
+		    "type_id":"negative",
777
+		    "language":"en",
778
+		    "words":[
779
+		        "nowhere"
780
+		    ]
781
+		},
782
+		{
783
+		    "domain_id":"direction",
784
+		    "type_id":"interrogative",
785
+		    "language":"fs",
786
+		    "words":[
787
+		        "to vilk sted",
788
+		        "varto"
789
+		    ]
790
+		},
791
+		{
792
+		    "domain_id":"direction",
793
+		    "type_id":"interrogative",
794
+		    "language":"en",
795
+		    "words":[
796
+
797
+		    ]
798
+		},
799
+		{
800
+		    "domain_id":"direction",
801
+		    "type_id":"relative",
802
+		    "language":"fs",
803
+		    "words":[
804
+		        "to vilk sted",
805
+		        "varto"
806
+		    ]
807
+		},
808
+		{
809
+		    "domain_id":"direction",
810
+		    "type_id":"relative",
811
+		    "language":"en",
812
+		    "words":[
813
+
814
+		    ]
815
+		},
816
+		{
817
+		    "domain_id":"direction",
818
+		    "type_id":"demonstrative_far",
819
+		    "language":"fs",
820
+		    "words":[
821
+		        "to jen sted",
822
+		        "darto"
823
+		    ]
824
+		},
825
+		{
826
+		    "domain_id":"direction",
827
+		    "type_id":"demonstrative_far",
828
+		    "language":"en",
829
+		    "words":[
830
+
831
+		    ]
832
+		},
833
+		{
834
+		    "domain_id":"direction",
835
+		    "type_id":"demonstrative_near",
836
+		    "language":"fs",
837
+		    "words":[
838
+		        "to dis sted",
839
+		        "harto"
840
+		    ]
841
+		},
842
+		{
843
+		    "domain_id":"direction",
844
+		    "type_id":"demonstrative_near",
845
+		    "language":"en",
846
+		    "words":[
847
+
848
+		    ]
849
+		},
850
+		{
851
+		    "domain_id":"direction",
852
+		    "type_id":"universal",
853
+		    "language":"fs",
854
+		    "words":[
855
+		        "to al sted",
856
+		        "alto"
857
+		    ]
858
+		},
859
+		{
860
+		    "domain_id":"direction",
861
+		    "type_id":"universal",
862
+		    "language":"en",
863
+		    "words":[
864
+
865
+		    ]
866
+		},
867
+		{
868
+		    "domain_id":"direction",
869
+		    "type_id":"undefined",
870
+		    "language":"fs",
871
+		    "words":[
872
+		        "to et sted",
873
+		        "etto"
874
+		    ]
875
+		},
876
+		{
877
+		    "domain_id":"direction",
878
+		    "type_id":"undefined",
879
+		    "language":"en",
880
+		    "words":[
881
+
882
+		    ]
883
+		},
884
+		{
885
+		    "domain_id":"direction",
886
+		    "type_id":"negative",
887
+		    "language":"fs",
888
+		    "words":[
889
+		        "to ing sted",
890
+		        "ingto"
891
+		    ]
892
+		},
893
+		{
894
+		    "domain_id":"direction",
895
+		    "type_id":"negative",
896
+		    "language":"en",
897
+		    "words":[
898
+
899
+		    ]
900
+		},
901
+		{
902
+		    "domain_id":"cause",
903
+		    "type_id":"interrogative",
904
+		    "language":"fs",
905
+		    "words":[
906
+		        "fur vilk grund",
907
+		        "varfur"
908
+		    ]
909
+		},
910
+		{
911
+		    "domain_id":"cause",
912
+		    "type_id":"interrogative",
913
+		    "language":"en",
914
+		    "words":[
915
+		        "why"
916
+		    ]
917
+		},
918
+		{
919
+		    "domain_id":"cause",
920
+		    "type_id":"relative",
921
+		    "language":"fs",
922
+		    "words":[
923
+		        "fur vilk grund",
924
+		        "varfur"
925
+		    ]
926
+		},
927
+		{
928
+		    "domain_id":"cause",
929
+		    "type_id":"relative",
930
+		    "language":"en",
931
+		    "words":[
932
+		        "why"
933
+		    ]
934
+		},
935
+		{
936
+		    "domain_id":"cause",
937
+		    "type_id":"demonstrative_far",
938
+		    "language":"fs",
939
+		    "words":[
940
+		        "fur jen grund",
941
+		        "darfur"
942
+		    ]
943
+		},
944
+		{
945
+		    "domain_id":"cause",
946
+		    "type_id":"demonstrative_far",
947
+		    "language":"en",
948
+		    "words":[
949
+
950
+		    ]
951
+		},
952
+		{
953
+		    "domain_id":"cause",
954
+		    "type_id":"demonstrative_near",
955
+		    "language":"fs",
956
+		    "words":[
957
+		        "fur dis grund",
958
+		        "harfur"
959
+		    ]
960
+		},
961
+		{
962
+		    "domain_id":"cause",
963
+		    "type_id":"demonstrative_near",
964
+		    "language":"en",
965
+		    "words":[
966
+
967
+		    ]
968
+		},
969
+		{
970
+		    "domain_id":"cause",
971
+		    "type_id":"universal",
972
+		    "language":"fs",
973
+		    "words":[
974
+		        "fur al grund",
975
+		        "alfur"
976
+		    ]
977
+		},
978
+		{
979
+		    "domain_id":"cause",
980
+		    "type_id":"universal",
981
+		    "language":"en",
982
+		    "words":[
983
+
984
+		    ]
985
+		},
986
+		{
987
+		    "domain_id":"cause",
988
+		    "type_id":"undefined",
989
+		    "language":"fs",
990
+		    "words":[
991
+		        "fur et grund",
992
+		        "etfur"
993
+		    ]
994
+		},
995
+		{
996
+		    "domain_id":"cause",
997
+		    "type_id":"undefined",
998
+		    "language":"en",
999
+		    "words":[
1000
+
1001
+		    ]
1002
+		},
1003
+		{
1004
+		    "domain_id":"cause",
1005
+		    "type_id":"negative",
1006
+		    "language":"fs",
1007
+		    "words":[
1008
+		        "fur ing grund",
1009
+		        "ingfur"
1010
+		    ]
1011
+		},
1012
+		{
1013
+		    "domain_id":"cause",
1014
+		    "type_id":"negative",
1015
+		    "language":"en",
1016
+		    "words":[
1017
+
1018
+		    ]
1019
+		},
1020
+		{
1021
+		    "domain_id":"manner",
1022
+		    "type_id":"interrogative",
1023
+		    "language":"fs",
1024
+		    "words":[
1025
+		        "vilk mot",
1026
+		        "hur"
1027
+		    ]
1028
+		},
1029
+		{
1030
+		    "domain_id":"manner",
1031
+		    "type_id":"interrogative",
1032
+		    "language":"en",
1033
+		    "words":[
1034
+		        "how"
1035
+		    ]
1036
+		},
1037
+		{
1038
+		    "domain_id":"manner",
1039
+		    "type_id":"relative",
1040
+		    "language":"fs",
1041
+		    "words":[
1042
+		        "vilk mot",
1043
+		        "hur"
1044
+		    ]
1045
+		},
1046
+		{
1047
+		    "domain_id":"manner",
1048
+		    "type_id":"relative",
1049
+		    "language":"en",
1050
+		    "words":[
1051
+		        "how"
1052
+		    ]
1053
+		},
1054
+		{
1055
+		    "domain_id":"manner",
1056
+		    "type_id":"demonstrative_far",
1057
+		    "language":"fs",
1058
+		    "words":[
1059
+		        "jen mot",
1060
+		        "so"
1061
+		    ]
1062
+		},
1063
+		{
1064
+		    "domain_id":"manner",
1065
+		    "type_id":"demonstrative_far",
1066
+		    "language":"en",
1067
+		    "words":[
1068
+		        "so"
1069
+		    ]
1070
+		},
1071
+		{
1072
+		    "domain_id":"manner",
1073
+		    "type_id":"demonstrative_near",
1074
+		    "language":"fs",
1075
+		    "words":[
1076
+		        "dis mot",
1077
+		        "so"
1078
+		    ]
1079
+		},
1080
+		{
1081
+		    "domain_id":"manner",
1082
+		    "type_id":"demonstrative_near",
1083
+		    "language":"en",
1084
+		    "words":[
1085
+		        "so"
1086
+		    ]
1087
+		},
1088
+		{
1089
+		    "domain_id":"manner",
1090
+		    "type_id":"universal",
1091
+		    "language":"fs",
1092
+		    "words":[
1093
+		        "al mot"
1094
+		    ]
1095
+		},
1096
+		{
1097
+		    "domain_id":"manner",
1098
+		    "type_id":"universal",
1099
+		    "language":"en",
1100
+		    "words":[
1101
+
1102
+		    ]
1103
+		},
1104
+		{
1105
+		    "domain_id":"manner",
1106
+		    "type_id":"undefined",
1107
+		    "language":"fs",
1108
+		    "words":[
1109
+		        "et mot"
1110
+		    ]
1111
+		},
1112
+		{
1113
+		    "domain_id":"manner",
1114
+		    "type_id":"undefined",
1115
+		    "language":"en",
1116
+		    "words":[
1117
+
1118
+		    ]
1119
+		},
1120
+		{
1121
+		    "domain_id":"manner",
1122
+		    "type_id":"negative",
1123
+		    "language":"fs",
1124
+		    "words":[
1125
+		        "ing mot"
1126
+		    ]
1127
+		},
1128
+		{
1129
+		    "domain_id":"manner",
1130
+		    "type_id":"negative",
1131
+		    "language":"en",
1132
+		    "words":[
1133
+
1134
+		    ]
1135
+		},
1136
+		{
1137
+		    "domain_id":"type",
1138
+		    "type_id":"interrogative",
1139
+		    "language":"fs",
1140
+		    "words":[
1141
+		        "vilk slag"
1142
+		    ]
1143
+		},
1144
+		{
1145
+		    "domain_id":"type",
1146
+		    "type_id":"interrogative",
1147
+		    "language":"en",
1148
+		    "words":[
1149
+		        "what kind of"
1150
+		    ]
1151
+		},
1152
+		{
1153
+		    "domain_id":"type",
1154
+		    "type_id":"relative",
1155
+		    "language":"fs",
1156
+		    "words":[
1157
+		        "vilk slag"
1158
+		    ]
1159
+		},
1160
+		{
1161
+		    "domain_id":"type",
1162
+		    "type_id":"relative",
1163
+		    "language":"en",
1164
+		    "words":[
1165
+
1166
+		    ]
1167
+		},
1168
+		{
1169
+		    "domain_id":"type",
1170
+		    "type_id":"demonstrative_far",
1171
+		    "language":"fs",
1172
+		    "words":[
1173
+		        "jen slag",
1174
+		        "solk"
1175
+		    ]
1176
+		},
1177
+		{
1178
+		    "domain_id":"type",
1179
+		    "type_id":"demonstrative_far",
1180
+		    "language":"en",
1181
+		    "words":[
1182
+		        "such"
1183
+		    ]
1184
+		},
1185
+		{
1186
+		    "domain_id":"type",
1187
+		    "type_id":"demonstrative_near",
1188
+		    "language":"fs",
1189
+		    "words":[
1190
+		        "dis slag"
1191
+		    ]
1192
+		},
1193
+		{
1194
+		    "domain_id":"type",
1195
+		    "type_id":"demonstrative_near",
1196
+		    "language":"en",
1197
+		    "words":[
1198
+
1199
+		    ]
1200
+		},
1201
+		{
1202
+		    "domain_id":"type",
1203
+		    "type_id":"universal",
1204
+		    "language":"fs",
1205
+		    "words":[
1206
+		        "al slag"
1207
+		    ]
1208
+		},
1209
+		{
1210
+		    "domain_id":"type",
1211
+		    "type_id":"universal",
1212
+		    "language":"en",
1213
+		    "words":[
1214
+
1215
+		    ]
1216
+		},
1217
+		{
1218
+		    "domain_id":"type",
1219
+		    "type_id":"undefined",
1220
+		    "language":"fs",
1221
+		    "words":[
1222
+		        "et slag"
1223
+		    ]
1224
+		},
1225
+		{
1226
+		    "domain_id":"type",
1227
+		    "type_id":"undefined",
1228
+		    "language":"en",
1229
+		    "words":[
1230
+
1231
+		    ]
1232
+		},
1233
+		{
1234
+		    "domain_id":"type",
1235
+		    "type_id":"negative",
1236
+		    "language":"fs",
1237
+		    "words":[
1238
+		        "ing slag"
1239
+		    ]
1240
+		},
1241
+		{
1242
+		    "domain_id":"type",
1243
+		    "type_id":"negative",
1244
+		    "language":"en",
1245
+		    "words":[
1246
+
1247
+		    ]
1248
+		},
1249
+		{
1250
+		    "domain_id":"amount",
1251
+		    "type_id":"interrogative",
1252
+		    "language":"fs",
1253
+		    "words":[
1254
+		        "vilk mang"
1255
+		    ]
1256
+		},
1257
+		{
1258
+		    "domain_id":"amount",
1259
+		    "type_id":"interrogative",
1260
+		    "language":"en",
1261
+		    "words":[
1262
+		        "how many",
1263
+		        "how much"
1264
+		    ]
1265
+		},
1266
+		{
1267
+		    "domain_id":"amount",
1268
+		    "type_id":"relative",
1269
+		    "language":"fs",
1270
+		    "words":[
1271
+		        "vilk mang"
1272
+		    ]
1273
+		},
1274
+		{
1275
+		    "domain_id":"amount",
1276
+		    "type_id":"relative",
1277
+		    "language":"en",
1278
+		    "words":[
1279
+		        "how many",
1280
+		        "how much"
1281
+		    ]
1282
+		},
1283
+		{
1284
+		    "domain_id":"amount",
1285
+		    "type_id":"demonstrative_far",
1286
+		    "language":"fs",
1287
+		    "words":[
1288
+		        "jen mang"
1289
+		    ]
1290
+		},
1291
+		{
1292
+		    "domain_id":"amount",
1293
+		    "type_id":"demonstrative_far",
1294
+		    "language":"en",
1295
+		    "words":[
1296
+
1297
+		    ]
1298
+		},
1299
+		{
1300
+		    "domain_id":"amount",
1301
+		    "type_id":"demonstrative_near",
1302
+		    "language":"fs",
1303
+		    "words":[
1304
+		        "dis mang"
1305
+		    ]
1306
+		},
1307
+		{
1308
+		    "domain_id":"amount",
1309
+		    "type_id":"demonstrative_near",
1310
+		    "language":"en",
1311
+		    "words":[
1312
+
1313
+		    ]
1314
+		},
1315
+		{
1316
+		    "domain_id":"amount",
1317
+		    "type_id":"universal",
1318
+		    "language":"fs",
1319
+		    "words":[
1320
+		        "al mang"
1321
+		    ]
1322
+		},
1323
+		{
1324
+		    "domain_id":"amount",
1325
+		    "type_id":"universal",
1326
+		    "language":"en",
1327
+		    "words":[
1328
+
1329
+		    ]
1330
+		},
1331
+		{
1332
+		    "domain_id":"amount",
1333
+		    "type_id":"undefined",
1334
+		    "language":"fs",
1335
+		    "words":[
1336
+		        "et mang"
1337
+		    ]
1338
+		},
1339
+		{
1340
+		    "domain_id":"amount",
1341
+		    "type_id":"undefined",
1342
+		    "language":"en",
1343
+		    "words":[
1344
+
1345
+		    ]
1346
+		},
1347
+		{
1348
+		    "domain_id":"amount",
1349
+		    "type_id":"negative",
1350
+		    "language":"fs",
1351
+		    "words":[
1352
+		        "ing mang"
1353
+		    ]
1354
+		},
1355
+		{
1356
+		    "domain_id":"amount",
1357
+		    "type_id":"negative",
1358
+		    "language":"en",
1359
+		    "words":[
1360
+
1361
+		    ]
1362
+		}
1363
+	]
1364
+}
1365
+
0 1366
new file mode 100644
... ...
@@ -0,0 +1,179 @@
1
+<?php
2
+	function sql_cross($table_left, $table_right)
3
+	{
4
+		$table_result = [];
5
+		array_map
6
+		(
7
+			function ($row_left) use (&$table_left,&$table_right,&$table_result)
8
+			{
9
+				array_map
10
+				(
11
+					function ($row_right) use (&$table_left,&$table_right,&$table_result,&$row_left)
12
+					{
13
+						$row_result = [];
14
+						foreach ($row_left as $key_left => $value_left) $row_result[$key_left] = $value_left;
15
+						foreach ($row_right as $key_right => $value_right) $row_result[$key_right] = $value_right;
16
+						array_push($table_result, $row_result);
17
+					},
18
+					$table_right
19
+				);
20
+			},
21
+			$table_left
22
+		);
23
+		return $table_result;
24
+	}
25
+	
26
+	function sql_cross_all($tables_source)
27
+	{
28
+		$n = count($tables_source);
29
+		if ($n == 1)
30
+		{
31
+			return $tables_source[0];
32
+		}
33
+		else
34
+		{
35
+			return sql_cross(sql_cross_all(array_slice($tables_source, $n-1)), $tables_source[$n-1]);
36
+		}
37
+	}
38
+	
39
+	function sql_rename($table_source, $column_from, $column_to)
40
+	{
41
+		return (
42
+			array_map
43
+			(
44
+				function ($row_in) use (&$column_from,&$column_to)
45
+				{
46
+					$row_out = [];
47
+					foreach ($row_in as $column => $value)
48
+					{
49
+						$row_out[($column == $column_from) ? $column_to : $column] = $row_in[$column];
50
+					}
51
+					return $row_out;
52
+				},
53
+				$table_source
54
+			)
55
+		);
56
+	}
57
+	
58
+	function sql_project($table_source, $columns)
59
+	{
60
+		return (
61
+			array_map
62
+			(
63
+				function ($row_in) use (&$columns)
64
+				{
65
+					$row_out = [];
66
+					array_map
67
+					(
68
+						function ($column) use (&$columns,&$row_in,&$row_out)
69
+						{
70
+							$row_out[$column] = $row_in[$column];
71
+						},
72
+						$columns
73
+					);
74
+					return $row_out;
75
+				},
76
+				$table_source
77
+			)
78
+		);
79
+	}
80
+	
81
+	function sql_add($table_source, $column, $assigner)
82
+	{
83
+		return (
84
+			array_map
85
+			(
86
+				function ($row_in) use (&$column,&$assigner)
87
+				{
88
+					$row_out = $row_in;
89
+					$row_out[$column] = $assigner($row_in);
90
+					return $row_out;
91
+				},
92
+				$table_source
93
+			)
94
+		);
95
+	}
96
+	
97
+	function sql_select($table_source, $predicate)
98
+	{
99
+		return (
100
+			array_filter
101
+			(
102
+				$table_source,
103
+				$predicate
104
+			)
105
+		);
106
+	}
107
+	
108
+	function sql_group($table_source, $column, $aggregators)
109
+	{
110
+		$groups = [];
111
+		array_map
112
+		(
113
+			function ($row_source) use (&$table_source,&$column,&$groups)
114
+			{
115
+				$value = $row_source[$column];
116
+				$group = null;
117
+				$index = null;
118
+				// foreach ($groups as $group_)
119
+				for ($index_ = 0; $index_ < count($groups); $index_ += 1)
120
+				{
121
+					$group_ = $groups[$index_];
122
+					if ($group_["value"] == $value)
123
+					{
124
+						$group = $group_;
125
+						$index = $index_;
126
+						break;
127
+					}
128
+				}
129
+				if ($group == null)
130
+				{
131
+					$group = ["value" => $value, "members" => []];
132
+					$index = count($groups);
133
+					array_push($groups, $group);
134
+				}
135
+				// array_push($group["members"], $row_source);
136
+				array_push($groups[$index]["members"], $row_source);
137
+			},
138
+			$table_source
139
+		);
140
+		$table_result = array_map
141
+		(
142
+			function ($group) use (&$column,&$aggregators)
143
+			{
144
+				$row_result = [];
145
+				$row_result[$column] = $group["value"];
146
+				foreach ($aggregators as $aggregator_key => $aggregator_value)
147
+				{
148
+					$args = array_map(function ($member) use (&$aggregator_key) {return $member[$aggregator_key];}, $group["members"]);
149
+					$row_result[$aggregator_key] = $aggregator_value($args);
150
+				}
151
+				return $row_result;
152
+			},
153
+			$groups
154
+		);
155
+		return $table_result;
156
+	}
157
+	
158
+	function sql_snap($table_source)
159
+	{
160
+		$columns = [];
161
+		$table_result = [];
162
+		array_map
163
+		(
164
+			function ($row_source)
165
+			{
166
+				
167
+			},
168
+			$table_source
169
+		);
170
+		return $table_result;
171
+	}
172
+	
173
+	/*
174
+	function sql_sort($table_source, $column)
175
+	{
176
+		
177
+	}
178
+	 */
179
+ ?>
... ...
@@ -2,70 +2,230 @@
2 2
 	include_once("source/logic/server/data.php");
3 3
 	include_once("source/logic/server/table.php");
4 4
 	include_once("source/logic/server/misc.php");
5
+	include_once("source/logic/server/sql.php");
5 6
  ?>
6 7
 <section class="subsection" id="correlatives">
7 8
 	<header>Correlatives</header>
8 9
 	<div class="note_error">This section is only a proposal yet; not part of the draft.</div>
9 10
 <?php
10
-	/*
11
-	function foobar($value)
11
+	$mode = 2;
12
+	switch ($mode)
12 13
 	{
13
-		$output = "";
14
-		$output .= implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value["original"]));
15
-		$output .= " ~ ";
16
-		$output .= implode(", ", array_map(function ($word) {global $configuration; return mark($word, ["word", "lang_" . $configuration["target"]]);}, $value["translated"]));
17
-		return $output;
18
-	}
19
-	 */
20
-	
21
-	$table = new class_table
22
-	(
23
-		[
24
-			new class_column
25
-			(
26
-				"Domain",
27
-				function ($row) {return $row["domain"];}
28
-			),
29
-			new class_column
30
-			(
31
-				"Interrogative/Relative",
32
-				_foo("interrogative"),
33
-				_bar("word")
34
-			),
35
-			new class_column
14
+		case 0:
15
+		{
16
+			$table = new class_table
36 17
 			(
37
-				"Demonstrative far",
38
-				_foo("demonstrative_far"),
39
-				_bar("word")
40
-			),
41
-			new class_column
18
+				[
19
+					new class_column
20
+					(
21
+						"Domain",
22
+						function ($row) {return $row["domain"];}
23
+					),
24
+					new class_column
25
+					(
26
+						"Interrogative / Relative",
27
+						_foo("interrogative"),
28
+						_bar("word")
29
+					),
30
+					new class_column
31
+					(
32
+						"Demonstrative far",
33
+						_foo("demonstrative_far"),
34
+						_bar("word")
35
+					),
36
+					new class_column
37
+					(
38
+						"Demonstrative near",
39
+						_foo("demonstrative_near"),
40
+						_bar("word")
41
+					),
42
+					new class_column
43
+					(
44
+						"Universal",
45
+						_foo("universal"),
46
+						_bar("word")
47
+					),
48
+					new class_column
49
+					(
50
+						"Undefined",
51
+						_foo("undefined"),
52
+						_bar("word")
53
+					),
54
+					new class_column
55
+					(
56
+						"Negative",
57
+						_foo("negative"),
58
+						_bar("word")
59
+					),
60
+				],
61
+				read_json("source/data/correlatives.json")
62
+			);
63
+			$table->generate();
64
+			break;
65
+		}
66
+		case 1:
67
+		{
68
+			global $configuration;
69
+			$database = read_json("source/data/x.json");
70
+			$data = $database["words"];
71
+			// $data = sql_cross($database["words"], sql_rename($database["words"]));
72
+			$data = sql_select($data, function ($row) {return ($row["language"] == "fs");});
73
+			$table = new class_table
42 74
 			(
43
-				"Demonstrative near",
44
-				_foo("demonstrative_near"),
45
-				_bar("word")
46
-			),
47
-			new class_column
75
+				[
76
+					new class_column("Domain (id)", function ($row) {return $row["domain_id"];}),
77
+					new class_column("Type (id)", function ($row) {return $row["type_id"];}),
78
+					new class_column
79
+					(
80
+						"Folksprak",
81
+						function ($row) {return $row["words"];},
82
+						function ($value) {global $configuration; return _baz($value, "word", "fs");}
83
+					),
84
+					/*
85
+					new class_column
86
+					(
87
+						$configuration["languagemap"][$configuration["target"]],
88
+						function ($row) {global $configuration; return $row["words"][$configuration["target"]];},
89
+						function ($value) {global $configuration; return _baz($value, "word", $configuration["target"]);}
90
+					),
91
+					 */
92
+				],
93
+				$data
94
+			);
95
+			$table->generate();
96
+			break;
97
+		}
98
+		case 2:
99
+		{
100
+			global $configuration;
101
+			$database = read_json("source/data/x.json");
102
+			$data = $database["words"];
103
+			$data = (
104
+				/*
105
+				sql_project
106
+				(
107
+				 */
108
+					sql_select
109
+					(
110
+						sql_rename
111
+						(
112
+							sql_cross
113
+							(
114
+								$data,
115
+								$database["domains"]
116
+							),
117
+							"name",
118
+							"domain_name"
119
+						),
120
+						function ($row) {return ($row["id"] == $row["domain_id"]);}
121
+					)/*,
122
+					["domain_id", "name", "type_id", "language", "words"]
123
+				)
124
+				 */
125
+			);
126
+			$data = (
127
+				/*
128
+				sql_project
129
+				(
130
+				 */
131
+					sql_select
132
+					(
133
+						sql_rename
134
+						(
135
+							sql_cross
136
+							(
137
+								$data,
138
+								$database["types"]
139
+							),
140
+							"name",
141
+							"type_name"
142
+						),
143
+						function ($row) {return ($row["id"] == $row["type_id"]);}
144
+					)/*,
145
+					["domain_name", "name", "language", "words"]
146
+				)
147
+				 */
148
+			);
149
+			$data = (
150
+				sql_select
151
+				(
152
+					$data,
153
+					function ($row) {return ($row["language"] == "fs");}
154
+				)
155
+			);
156
+			$data = (
157
+				sql_add
158
+				(
159
+					$data,
160
+					"type_name/words",
161
+					function ($row)
162
+					{
163
+						return ["key" => $row["type_id"], "value" => $row["words"]];
164
+					}
165
+				)
166
+			);
167
+			$data = (
168
+				sql_project
169
+				(
170
+					$data,
171
+					["domain_name", "type_name/words"]
172
+				)
173
+			);
174
+			$data = (
175
+				sql_group
176
+				(
177
+					$data,
178
+					"domain_name",
179
+					[
180
+						"type_name/words" => function ($args)
181
+						{
182
+							$output = [];
183
+							array_map
184
+							(
185
+								function ($arg) use (&$output)
186
+								{
187
+									$output[$arg["key"]] = $arg["value"];
188
+								},
189
+								$args
190
+							);
191
+							return $output;
192
+						},
193
+					]
194
+				)
195
+			);
196
+			$table = new class_table
48 197
 			(
49
-				"Universal",
50
-				_foo("universal"),
51
-				_bar("word")
52
-			),
53
-			new class_column
54
-			(
55
-				"Undefined",
56
-				_foo("undefined"),
57
-				_bar("word")
58
-			),
59
-			new class_column
60
-			(
61
-				"Negative",
62
-				_foo("negative"),
63
-				_bar("word")
64
-			),
65
-		],
66
-		read_json("source/data/correlatives.json")
67
-	);
68
-	$table->generate();
198
+				array_merge
199
+				(
200
+					[
201
+						new class_column("Domain", function ($row) {return $row["domain_name"];}),
202
+					],
203
+					array_map
204
+					(
205
+						function ($type)
206
+						{
207
+							return (
208
+								new class_column
209
+								(
210
+									("Type: " . $type["name"]),
211
+									function ($row) use (&$type) {return $row["type_name/words"][$type["id"]];},
212
+									function ($value) {return _baz($value, "word", "fs");}
213
+								)
214
+							);
215
+						},
216
+						$database["types"]
217
+					)
218
+				),
219
+				$data
220
+			);
221
+			$table->generate();
222
+			break;
223
+		}
224
+		default:
225
+		{
226
+			break;
227
+		}
228
+	}
69 229
  ?>
70 230
 <div class="note_information">Some of these words are very unlikely to ever get used (e.g. <span class="word lang_fs">ing slag</span>). Nevertheless they exist and are listed for completeness.</div>
71 231
 </section>
... ...
@@ -175,6 +175,9 @@ section
175 175
 {
176 176
 	&.chapter
177 177
 	{
178
+		border-top: 1px solid gray;
179
+		padding-top: 40px;
180
+		
178 181
 		margin-bottom: 160px;
179 182
 		
180 183
 		& > header
... ...
@@ -14,7 +14,10 @@ body
14 14
 	color: @color-fg;
15 15
 	
16 16
 	box-shadow: 2px 2px 2px black;
17
-	padding: 80px 40px;
17
+	padding-left: 80px;
18
+	padding-right: 80px;
19
+	padding-top: 120px;
20
+	padding-bottom: 120px;
18 21
 	max-width: 1000px;
19 22
 	margin: auto;
20 23
 }