Browse code

fast perfekt

Christian Fraß authored on 24/08/2018 15:59:38
Showing 10 changed files
... ...
@@ -4,7 +4,7 @@
4 4
 	<!--
5 5
 	<li>The following list gives an overview over prepositions:</li>
6 6
 	  -->
7
-	{{fsdraft-table-2d:adpositions.words:situation_id:type_id/reference_id}}
7
+	{{fsdraft-macro-adpositions:adpositions.words:situation_id:type_id/reference_id}}
8 8
 	<p>Some examples:</p>
9 9
 	<ul>{{list:section-adpositions.examples:adpositions-example.html.tpl}}</ul>
10 10
 </section>
... ...
@@ -1,7 +1,7 @@
1 1
 <section class="subsection" id="correlatives">
2 2
 	<header>Correlatives</header>
3 3
 	{{call::_proposal.html.tpl}}
4
-	{{fsdraft-table-2d:correlatives.words:domain_id:type_id}}
4
+	{{fsdraft-macro-correlatives:correlatives.words:domain_id:type_id}}
5 5
 	<div class="note note_information">
6 6
 		<span class="note_content">
7 7
 			<p>Some of these words are very unlikely to ever get used (e.g. <span class="type_word lang_flk">ni slag</span>). Nevertheless they exist and are listed for completeness.</p>
... ...
@@ -4,7 +4,7 @@
4 4
 	{{call::cases.html.tpl}}
5 5
 	{{call::definiteness.html.tpl}}
6 6
 	<p>The following table summarizes the information of this section:</p>
7
-	{{fsdraft-table-2d:declension.words:count_id/definiteness_id:case_id}}
7
+	{{fsdraft-macro-declension:declension.words:count_id/definiteness_id:case_id}}
8 8
 	<p>{{fsdraft-correlation:section-declension.example:type_sentence}}</p>
9 9
 </section>
10 10
 
... ...
@@ -1,6 +1,6 @@
1 1
 <section class="subsection" id="personal_pronouns">
2 2
 	<header>Personal Pronouns</header>
3
- 	{{fsdraft-table-2d:personal_pronouns.words:count_id/person_id/gender_id:type_id/case_id}}
3
+ 	{{fsdraft-macro-personal_pronouns:personal_pronouns.words}}
4 4
 	<div class="note note_information">
5 5
 		<span class="note_content">
6 6
 			<p>Since the word <span class="type_word lang_flk">man</span> simply means <span class="type_word lang_en">human being</span>, it can be understood as an implicit way to express an abstract actor; similar words like <span class="type_word lang_flk">lüd</span> (<span class="type_word lang_en">people</span>) or <span class="type_word lang_flk">di</span> can be used as well.</p>
... ...
@@ -6,7 +6,7 @@
6 6
 	<!--
7 7
 	<div class="note_information">It was not easy to find a phonology system for Folksprak.</div>
8 8
 	  -->
9
- 	{{fsdraft-table-1d:phonology_and_orthography:ipa/latin/runic/examples}}
9
+ 	{{fsdraft-macro-phonology_and_orthography:phonology_and_orthography:ipa/latin/runic/examples}}
10 10
  	<div class="note note_information">
11 11
 		<span class="note_content">
12 12
 	 		<p>It is permitted to pronounce the sounds a little differently, for example <span class="type_letter lang_flk">v</span> as <span class="ipa">ʋ</span> or <span class="type_letter lang_flk">s</span> as <span class="ipa">z</span>, whilst the sounds from the table above are the default.</p>
... ...
@@ -2,7 +2,9 @@
2 2
 	<header>Principles</header>
3 3
 	<p>The word stock of Folksprak is &dash; with minor exceptions &dash; derived from the modern Germanic languages (e.g. English, German, Swedish, &#8230;) and/or their precursors (e.g. Old English, Old Norse, Proto Germanic, etc.). Branches which no longer emerge today (e.g. the East Germanic languages like Gothic), were not incorporated.</p>
4 4
 	<p>The following table gives an overview about the typical transitions of phones from Proto-Germanic to some of todays natural Germanic languages and Folksprak, along with example words in square brackets:</p>
5
+	{{fsdraft-macro-principles:transitions.data}}
6
+	<br/>
7
+	<br/>
5 8
 	<span class="todo">more entries</span>
6
-	{{fsdraft-table-2d:transitions.data:transition_id:language_id}}
7 9
 </section>
8 10
 
... ...
@@ -1,7 +1,7 @@
1 1
 [
2 2
 	{
3 3
 		"type": "lateral approximant",
4
-		"ipa": "/l/",
4
+		"ipa": "l",
5 5
 		"latin": "'L'/'l'",
6 6
 		"runic": "'ᛚ'",
7 7
 		"remark": null,
... ...
@@ -13,7 +13,7 @@
13 13
 	},
14 14
 	{
15 15
 		"type": "nasal",
16
-		"ipa": "/m/",
16
+		"ipa": "m",
17 17
 		"latin": "'M'/'m'",
18 18
 		"runic": "'ᛗ'",
19 19
 		"remark": null,
... ...
@@ -25,7 +25,7 @@
25 25
 	},
26 26
 	{
27 27
 		"type": "nasal",
28
-		"ipa": "/n/",
28
+		"ipa": "n",
29 29
 		"latin": "'N'/'n'",
30 30
 		"runic": "'ᚾ'",
31 31
 		"remark": null,
... ...
@@ -37,7 +37,7 @@
37 37
 	},
38 38
 	{
39 39
 		"type": "nasal",
40
-		"ipa": "/ŋ/",
40
+		"ipa": "ŋ",
41 41
 		"latin": "'Ng'/'ng'",
42 42
 		"runic": "'ᛜ'",
43 43
 		"remark": null,
... ...
@@ -49,7 +49,7 @@
49 49
 	},
50 50
 	{
51 51
 		"type": "plosive",
52
-		"ipa": "/g/",
52
+		"ipa": "g",
53 53
 		"latin": "'G'/'g'",
54 54
 		"runic": "'ᚷ'",
55 55
 		"remark": null,
... ...
@@ -61,7 +61,7 @@
61 61
 	},
62 62
 	{
63 63
 		"type": "plosive",
64
-		"ipa": "/k/",
64
+		"ipa": "k",
65 65
 		"latin": "'K'/'k'",
66 66
 		"runic": "'ᚲ'",
67 67
 		"remark": null,
... ...
@@ -73,7 +73,7 @@
73 73
 	},
74 74
 	{
75 75
 		"type": "plosive",
76
-		"ipa": "/b/",
76
+		"ipa": "b",
77 77
 		"latin": "'B'/'b'",
78 78
 		"runic": "'ᛒ'",
79 79
 		"remark": null,
... ...
@@ -85,7 +85,7 @@
85 85
 	},
86 86
 	{
87 87
 		"type": "plosive",
88
-		"ipa": "/p/",
88
+		"ipa": "p",
89 89
 		"latin": "'P'/'p'",
90 90
 		"runic": "'ᛈ'",
91 91
 		"remark": null,
... ...
@@ -97,7 +97,7 @@
97 97
 	},
98 98
 	{
99 99
 		"type": "plosive",
100
-		"ipa": "/d/",
100
+		"ipa": "d",
101 101
 		"latin": "'D'/'d'",
102 102
 		"runic": "'ᛞ'",
103 103
 		"remark": null,
... ...
@@ -109,7 +109,7 @@
109 109
 	},
110 110
 	{
111 111
 		"type": "plosive",
112
-		"ipa": "/t/",
112
+		"ipa": "t",
113 113
 		"latin": "'T'/'t'",
114 114
 		"runic": "'ᛏ'",
115 115
 		"remark": null,
... ...
@@ -121,7 +121,7 @@
121 121
 	},
122 122
 	{
123 123
 		"type": "fricative",
124
-		"ipa": "/v/",
124
+		"ipa": "v",
125 125
 		"latin": "'V'/'v'",
126 126
 		"runic": "'ᚹ'",
127 127
 		"remark": null,
... ...
@@ -133,7 +133,7 @@
133 133
 	},
134 134
 	{
135 135
 		"type": "fricative",
136
-		"ipa": "/f/",
136
+		"ipa": "f",
137 137
 		"latin": "'F'/'f'",
138 138
 		"runic": "'ᚠ'",
139 139
 		"remark": null,
... ...
@@ -145,7 +145,7 @@
145 145
 	},
146 146
 	{
147 147
 		"type": "fricative",
148
-		"ipa": "/s/",
148
+		"ipa": "s",
149 149
 		"latin": "'S'/'s'",
150 150
 		"runic": "'ᛊ'",
151 151
 		"remark": null,
... ...
@@ -157,7 +157,7 @@
157 157
 	},
158 158
 	{
159 159
 		"type": "fricative",
160
-		"ipa": "/h/",
160
+		"ipa": "h",
161 161
 		"latin": "'H'/'h'",
162 162
 		"runic": "'ᚺ'",
163 163
 		"remark": null,
... ...
@@ -169,7 +169,7 @@
169 169
 	},
170 170
 	{
171 171
 		"type": "tap/flap",
172
-		"ipa": "/ɾ/",
172
+		"ipa": "ɾ",
173 173
 		"latin": "'R'/'r'",
174 174
 		"runic": "'ᚱ'",
175 175
 		"remark": null,
... ...
@@ -181,7 +181,7 @@
181 181
 	},
182 182
 	{
183 183
 		"type": "halfvowel",
184
-		"ipa": "/j/",
184
+		"ipa": "j",
185 185
 		"latin": "'J'/'j'",
186 186
 		"runic": "'ᛃ'",
187 187
 		"remark": null,
... ...
@@ -193,7 +193,7 @@
193 193
 	},
194 194
 	{
195 195
 		"type": "vowel",
196
-		"ipa": "/i/",
196
+		"ipa": "i",
197 197
 		"latin": "'I'/'i'",
198 198
 		"runic": "'ᛁ'",
199 199
 		"remark": null,
... ...
@@ -205,7 +205,7 @@
205 205
 	},
206 206
 	{
207 207
 		"type": "vowel",
208
-		"ipa": "/e/",
208
+		"ipa": "e",
209 209
 		"latin": "'E'/'e'",
210 210
 		"runic": "'ᛖ'",
211 211
 		"remark": "only a few variations of English have that sound; it is somehow similar to the vowel in 'air'",
... ...
@@ -217,7 +217,7 @@
217 217
 	},
218 218
 	{
219 219
 		"type": "vowel",
220
-		"ipa": "/a/",
220
+		"ipa": "a",
221 221
 		"latin": "'A'/'a'",
222 222
 		"runic": "'ᚨ'",
223 223
 		"remark": null,
... ...
@@ -229,7 +229,7 @@
229 229
 	},
230 230
 	{
231 231
 		"type": "vowel",
232
-		"ipa": "/o/",
232
+		"ipa": "o",
233 233
 		"latin": "'O'/'o'",
234 234
 		"runic": "'ᛟ'",
235 235
 		"remark": null,
... ...
@@ -241,7 +241,7 @@
241 241
 	},
242 242
 	{
243 243
 		"type": "vowel",
244
-		"ipa": "/u/",
244
+		"ipa": "u",
245 245
 		"latin": "'U'/'u'",
246 246
 		"runic": "'ᚢ'",
247 247
 		"remark": null,
... ...
@@ -253,7 +253,7 @@
253 253
 	},
254 254
 	{
255 255
 		"type": "vowel",
256
-		"ipa": "/ø/",
256
+		"ipa": "ø",
257 257
 		"latin": "'Ö'/'ö', alternatively 'Oy'/'oy'",
258 258
 		"runic": "'ᛟᛇ'",
259 259
 		"remark": "similar to vowels used in words like 'earl', 'worry', 'hurt'",
... ...
@@ -265,7 +265,7 @@
265 265
 	},
266 266
 	{
267 267
 		"type": "vowel",
268
-		"ipa": "/y/",
268
+		"ipa": "y",
269 269
 		"latin": "'Ü'/'ü', alternatively 'Uy'/'uy'",
270 270
 		"runic": "'ᚢᛇ'",
271 271
 		"remark": "hardly any variation of English has that sound, but it can be learned easily by interpolating between /u/ and /i/",
... ...
@@ -13,6 +13,19 @@
13 13
 		{"transition_id": "t07", "language_id": "isl", "phones": ["-a-"], "examples": ["dagur"]},
14 14
 		{"transition_id": "t07", "language_id": "flk", "phones": ["-a-"], "examples": ["dag"]},
15 15
 		
16
+		{"transition_id": "t08", "language_id": "gem", "phones": ["-ai-"], "examples": ["snaiwaz","saiwiz"]},
17
+		{"transition_id": "t08", "language_id": "eng", "phones": ["-ea-","-ow-"], "examples": ["snow","sea"]},
18
+		{"transition_id": "t08", "language_id": "afr", "phones": ["-ee-","-eeu-"], "examples": ["sneeu","see"]},
19
+		{"transition_id": "t08", "language_id": "nld", "phones": ["-ee-","-eeuw-"], "examples": ["sneeuw","zee"]},
20
+		{"transition_id": "t08", "language_id": "yid", "phones": ["-ey-"], "examples": ["שניי",null]},
21
+		{"transition_id": "t08", "language_id": "deu", "phones": ["-ee-"], "examples": ["Schnee","See"]},
22
+		{"transition_id": "t08", "language_id": "dan", "phones": ["-ø-","-e-"], "examples": ["sne","sø"]},
23
+		{"transition_id": "t08", "language_id": "nob", "phones": ["-ø-","-jø-"], "examples": ["snø","sjø"]},
24
+		{"transition_id": "t08", "language_id": "swe", "phones": ["-jö-"], "examples": ["snö","sjö"]},
25
+		{"transition_id": "t08", "language_id": "nno", "phones": ["-ø-"], "examples": ["snø",null]},
26
+		{"transition_id": "t08", "language_id": "isl", "phones": ["-jó-","-ær-"], "examples": ["snær","sjór"]},
27
+		{"transition_id": "t08", "language_id": "flk", "phones": ["-e-"], "examples": ["sne","se"]},
28
+
16 29
 		{"transition_id": "t00", "language_id": "gem", "phones": ["-au-"], "examples": ["braudą","raudaz","skauniz","augô","draumaz","baumaz"]},
17 30
 		{"transition_id": "t00", "language_id": "eng", "phones": ["-ea-","-e-","-ey-"], "examples": ["bread","red","sheen","eye","dream","beam"]},
18 31
 		{"transition_id": "t00", "language_id": "afr", "phones": ["-oo-","-o-"], "examples": ["brood"]},
... ...
@@ -173,7 +173,8 @@ a
173 173
 	font-weight: bold;
174 174
 }
175 175
 
176
-.type_letter
176
+.type_letter,
177
+.type_rune
177 178
 {
178 179
 	&.lang_flk
179 180
 	{
... ...
@@ -337,16 +338,16 @@ a
337 338
 
338 339
 .todo
339 340
 {
340
-	&:before
341
-	{
342
-		content: "[ToDo] ";
343
-	}
344
-	
345 341
 	margin: 4px;
346 342
 	padding: 4px;
347 343
 	background-color: hsv(  0,100%, 50%);
348 344
 	color: white;
349 345
 	font-weight: bold;
346
+	
347
+	&:before
348
+	{
349
+		content: "[ToDo] ";
350
+	}
350 351
 }
351 352
 
352 353
 .code
... ...
@@ -64,7 +64,7 @@ function format_list(
64 64
 	return (
65 65
 		function (pieces) {
66 66
 			return (
67
-				(pieces.length <= 0)
67
+				((pieces === undefined) || (pieces === null) || (pieces.length <= 0))
68 68
 				? "?"
69 69
 				: pieces.map(format_single(type, language)).join(", ")
70 70
 			);
... ...
@@ -454,10 +454,11 @@ function anordnen(
454 454
  */
455 455
 function xmlwrap(
456 456
 	name : string,
457
-	kern : string
457
+	kern : string,
458
+	att : string = ""
458 459
 ) : string
459 460
 {
460
-	return (("<" + name + ">") + kern + ("</" + name + ">") + "\n");
461
+	return (("<" + name + att + ">") + kern + ("</" + name + ">") + "\n");
461 462
 }
462 463
 
463 464
 
... ...
@@ -467,7 +468,8 @@ function xmlwrap(
467 468
 function htmltable(
468 469
 	titel : Array<string>,
469 470
 	daten : Array<Array<string>>,
470
-	_2d : boolean = false
471
+	classes : Array<string> = [],
472
+	_2d : boolean = false,
471 473
 )
472 474
 : string
473 475
 {
... ...
@@ -511,7 +513,8 @@ function htmltable(
511 513
 						.join("")
512 514
 					)
513 515
 				)
514
-			)
516
+			),
517
+			(" class=\"" + classes.join(" ") + "\"")
515 518
 		)
516 519
 	);
517 520
 }
... ...
@@ -572,9 +575,10 @@ export function definieren(
572 575
 					let tabelle__ : string = htmltable(
573 576
 						tabelle_.kopf,
574 577
 						tabelle_.rumpf,
578
+						["datatable"],
575 579
 						false
576 580
 					);
577
-					let style = xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
581
+					let style : string = ""; // xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
578 582
 					return (style + tabelle__);
579 583
 				},
580 584
 			},
... ...
@@ -643,9 +647,406 @@ export function definieren(
643 647
 					let tabelle__ : string = htmltable(
644 648
 						tabelle_.kopf,
645 649
 						tabelle_.rumpf,
650
+						["datatable"],
646 651
 						true
647 652
 					);
648
-					let style = xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
653
+					let style : string = ""; // xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
654
+					return (style + tabelle__);
655
+				}
656
+			},
657
+			{
658
+				"name": "fsdraft-macro-phonology_and_orthography",
659
+				"funktion": (args) => (wert) => {
660
+					let tabelle_ : {kopf : Array<string>; rumpf : Array<Array<string>>;} = {
661
+						"kopf": [
662
+							"IPA-sound",
663
+							"Latin letter Representation",
664
+							"Runic Representation",
665
+							"Folksprak Example",
666
+							"English Example",
667
+						],
668
+						"rumpf": (
669
+							wert
670
+							.map(
671
+								(eintrag) => {
672
+									const format_repr : (repr : string, type : string)=>string = (repr, type) => {
673
+										let repr_ : string = repr;
674
+										let regexp : RegExp = (new RegExp("'([^']*)'", "g"));
675
+										while (true) {
676
+											let matching : any = regexp.exec(repr);
677
+											if (matching === null) {
678
+												break;
679
+											}
680
+											else {
681
+												repr_ = repr_.replace(matching[0], mark(matching[1], ["type_" + type, "lang_flk"]));
682
+											}
683
+										}
684
+										return repr_;
685
+									};
686
+									const format_example : (word : string, language_id : string)=>string = (word, language_id) => {
687
+										if (word == null) {
688
+											return "--";
689
+										}
690
+										else {
691
+											let word_ : string = word;
692
+											{
693
+												let regexp : RegExp = (new RegExp("'([^']*)'", "g"));
694
+												while (true) {
695
+													let matching : any = regexp.exec(word);
696
+													if (matching === null) {
697
+														break;
698
+													}
699
+													else {
700
+														word_ = word_.replace(matching[0], mark(matching[1], ["type_word", "lang_" + language_id]));
701
+													}
702
+												}
703
+											}
704
+											{
705
+												let regexp : RegExp = (new RegExp("_([^_]*)_", "g"));
706
+												while (true) {
707
+													let matching : any = regexp.exec(word);
708
+													if (matching === null) {
709
+														break;
710
+													}
711
+													else {
712
+														word_ = word_.replace(matching[0], "<u>" + matching[1] + "</u>");
713
+													}
714
+												}
715
+											}
716
+											return word_;
717
+										}
718
+									};
719
+									let ipa : string = mark(eintrag["ipa"], ["ipa"]);
720
+									let latin : string = format_repr(eintrag["latin"], "letter");
721
+									let runic : string = format_repr(eintrag["runic"], "rune");
722
+									let example_source : string = format_example(eintrag["examples"]["flk"], "flk");
723
+									let example_target : string = format_example(eintrag["examples"][configuration["target"]], configuration["target"]);
724
+									return [
725
+										ipa,
726
+										latin,
727
+										runic,
728
+										example_source,
729
+										example_target,
730
+									];
731
+								}
732
+							)
733
+						),
734
+					};
735
+					let tabelle__ : string = htmltable(
736
+						tabelle_.kopf,
737
+						tabelle_.rumpf,
738
+						["datatable"],
739
+						false
740
+					);
741
+					return (tabelle__);
742
+				}
743
+			},
744
+			{
745
+				"name": "fsdraft-macro-principles",
746
+				"funktion": (args) => (wert) => {
747
+					let tabelle : {meta : any; data : any;} = anordnen(
748
+						{
749
+							"daten": wert,
750
+							"senkrecht": [
751
+								"transition_id",
752
+							],
753
+							"waagerecht": [
754
+								"language_id",
755
+							],
756
+							"feldsatz_kuerzen": false,
757
+						}
758
+					);
759
+					let tabelle_ : {kopf : Array<string>; rumpf : Array<Array<string>>;} = {
760
+						"kopf": (
761
+							[].concat(
762
+								Object.keys(tabelle.meta.x)
763
+								.map(
764
+									(label) => (
765
+										// JSON.stringify(tabelle.meta.x[label])
766
+										objvals(tabelle.meta.x[label]).join("/")
767
+									)
768
+								)
769
+							)
770
+						),
771
+						"rumpf": tabelle.data.map(
772
+							(satz) => (
773
+								Object.keys(satz)
774
+								.filter(
775
+									(label) => (label !== "_")
776
+								)
777
+								.map(
778
+									(label) => {
779
+										if (label === "_") {
780
+											return objvals(tabelle.meta.y[satz[label]]).join("/")
781
+										}
782
+										else {
783
+											let head = satz[label][0];
784
+											if (head !== undefined) {
785
+												return (
786
+													(
787
+														(head["phones"].length <= 0)
788
+														? "?"
789
+														: (
790
+															head["phones"]
791
+															.map(
792
+																(phone) => (
793
+																	mark(phone, ["type_letter", "lang_" + head["language_id"]])
794
+																)
795
+															)
796
+															.join(
797
+																", "
798
+															)
799
+														)
800
+													)
801
+													+ "<br/>"
802
+													+ (
803
+														(head["examples"][0] != undefined)
804
+														? ("[" + mark(head["examples"][0], ["type_word", "lang_" + head["language_id"]]) + "]")
805
+														: ""
806
+													)
807
+												);
808
+											}
809
+											else {
810
+												return "?";
811
+											}
812
+										}
813
+									}
814
+								)
815
+							)
816
+						),
817
+					};
818
+					let tabelle__ : string = htmltable(
819
+						tabelle_.kopf,
820
+						tabelle_.rumpf,
821
+						["datatable"],
822
+						false
823
+					);
824
+					let style : string = ""; // xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
825
+					return (style + tabelle__);
826
+				}
827
+			},
828
+			{
829
+				"name": "fsdraft-macro-personal_pronouns",
830
+				"funktion": (args) => (wert) => {
831
+					let tabelle : {meta : any; data : any;} = anordnen(
832
+						{
833
+							"daten": wert,
834
+							"senkrecht": [
835
+								"count_id",
836
+								"person_id",
837
+								"gender_id",
838
+							],
839
+							"waagerecht": [
840
+								"type_id",
841
+								"case_id",
842
+							],
843
+						}
844
+					);
845
+					let tabelle_ : {kopf : Array<string>; rumpf : Array<Array<string>>;} = {
846
+						"kopf": (
847
+							[""].concat(
848
+								Object.keys(tabelle.meta.x)
849
+								.map(
850
+									(label) => (
851
+										objvals(tabelle.meta.x[label]).join("/")
852
+									)
853
+								)
854
+							)
855
+						),
856
+						"rumpf": tabelle.data.map(
857
+							(satz) => (
858
+								Object.keys(satz)
859
+								.map(
860
+									(label) => {
861
+										if (label === "_") {
862
+											return objvals(tabelle.meta.y[satz[label]]).join("/")
863
+										}
864
+										else {
865
+											let language_from : string = "flk";
866
+											let language_to : string = configuration["target"];
867
+											let source : {[language_id : string] : Array<string>} = {};
868
+											satz[label].forEach((eintrag) => {source[eintrag["language_id"]] = eintrag["words"];});
869
+											return format_correlation("type_word", language_from, language_to)(source);
870
+										}
871
+									}
872
+								)
873
+							)
874
+						),
875
+					};
876
+					let tabelle__ : string = htmltable(
877
+						tabelle_.kopf,
878
+						tabelle_.rumpf,
879
+						["datatable"],
880
+						true
881
+					);
882
+					let style : string = ""; // xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
883
+					return (style + tabelle__);
884
+				}
885
+			},
886
+			{
887
+				"name": "fsdraft-macro-correlatives",
888
+				"funktion": (args) => (wert) => {
889
+					let tabelle : {meta : any; data : any;} = anordnen(
890
+						{
891
+							"daten": wert,
892
+							"senkrecht": [
893
+								"domain_id",
894
+							],
895
+							"waagerecht": [
896
+								"type_id",
897
+							],
898
+						}
899
+					);
900
+					let tabelle_ : {kopf : Array<string>; rumpf : Array<Array<string>>;} = {
901
+						"kopf": (
902
+							[""].concat(
903
+								Object.keys(tabelle.meta.x)
904
+								.map(
905
+									(label) => (
906
+										objvals(tabelle.meta.x[label]).join("/")
907
+									)
908
+								)
909
+							)
910
+						),
911
+						"rumpf": tabelle.data.map(
912
+							(satz) => (
913
+								Object.keys(satz)
914
+								.map(
915
+									(label) => {
916
+										if (label === "_") {
917
+											return objvals(tabelle.meta.y[satz[label]]).join("/")
918
+										}
919
+										else {
920
+											let language_from : string = "flk";
921
+											let language_to : string = configuration["target"];
922
+											let source : {[language_id : string] : Array<string>} = {};
923
+											satz[label].forEach((eintrag) => {source[eintrag["language_id"]] = eintrag["words"];});
924
+											return format_correlation("type_word", language_from, language_to)(source);
925
+										}
926
+									}
927
+								)
928
+							)
929
+						),
930
+					};
931
+					let tabelle__ : string = htmltable(
932
+						tabelle_.kopf,
933
+						tabelle_.rumpf,
934
+						["datatable"],
935
+						true
936
+					);
937
+					let style : string = ""; // xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
938
+					return (style + tabelle__);
939
+				}
940
+			},
941
+			{
942
+				"name": "fsdraft-macro-adpositions",
943
+				"funktion": (args) => (wert) => {
944
+					let tabelle : {meta : any; data : any;} = anordnen(
945
+						{
946
+							"daten": wert,
947
+							"senkrecht": [
948
+								"situation_id",
949
+							],
950
+							"waagerecht": [
951
+								"type_id",
952
+								"reference_id",
953
+							],
954
+						}
955
+					);
956
+					let tabelle_ : {kopf : Array<string>; rumpf : Array<Array<string>>;} = {
957
+						"kopf": (
958
+							[""].concat(
959
+								Object.keys(tabelle.meta.x)
960
+								.map(
961
+									(label) => (
962
+										objvals(tabelle.meta.x[label]).join("/")
963
+									)
964
+								)
965
+							)
966
+						),
967
+						"rumpf": tabelle.data.map(
968
+							(satz) => (
969
+								Object.keys(satz)
970
+								.map(
971
+									(label) => {
972
+										if (label === "_") {
973
+											return objvals(tabelle.meta.y[satz[label]]).join("/")
974
+										}
975
+										else {
976
+											let language_from : string = "flk";
977
+											let language_to : string = configuration["target"];
978
+											let source : {[language_id : string] : Array<string>} = {};
979
+											satz[label].forEach((eintrag) => {source[eintrag["language_id"]] = eintrag["words"];});
980
+											return format_correlation("type_word", language_from, language_to)(source);
981
+										}
982
+									}
983
+								)
984
+							)
985
+						),
986
+					};
987
+					let tabelle__ : string = htmltable(
988
+						tabelle_.kopf,
989
+						tabelle_.rumpf,
990
+						["datatable"],
991
+						true
992
+					);
993
+					let style : string = ""; // xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
994
+					return (style + tabelle__);
995
+				}
996
+			},
997
+			{
998
+				"name": "fsdraft-macro-declension",
999
+				"funktion": (args) => (wert) => {
1000
+					let tabelle : {meta : any; data : any;} = anordnen(
1001
+						{
1002
+							"daten": wert,
1003
+							"senkrecht": [
1004
+								"count_id",
1005
+								"definiteness_id",
1006
+							],
1007
+							"waagerecht": [
1008
+								"case_id",
1009
+							],
1010
+						}
1011
+					);
1012
+					let tabelle_ : {kopf : Array<string>; rumpf : Array<Array<string>>;} = {
1013
+						"kopf": (
1014
+							[""].concat(
1015
+								Object.keys(tabelle.meta.x)
1016
+								.map(
1017
+									(label) => (
1018
+										objvals(tabelle.meta.x[label]).join("/")
1019
+									)
1020
+								)
1021
+							)
1022
+						),
1023
+						"rumpf": tabelle.data.map(
1024
+							(satz) => (
1025
+								Object.keys(satz)
1026
+								.map(
1027
+									(label) => {
1028
+										if (label === "_") {
1029
+											return objvals(tabelle.meta.y[satz[label]]).join("/")
1030
+										}
1031
+										else {
1032
+											let language_from : string = "flk";
1033
+											let language_to : string = configuration["target"];
1034
+											let source : {[language_id : string] : Array<string>} = {};
1035
+											satz[label].forEach((eintrag) => {source[eintrag["language_id"]] = eintrag["words"];});
1036
+											return format_correlation("type_word", language_from, language_to)(source);
1037
+										}
1038
+									}
1039
+								)
1040
+							)
1041
+						),
1042
+					};
1043
+					let tabelle__ : string = htmltable(
1044
+						tabelle_.kopf,
1045
+						tabelle_.rumpf,
1046
+						["datatable"],
1047
+						true
1048
+					);
1049
+					let style : string = ""; // xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
649 1050
 					return (style + tabelle__);
650 1051
 				}
651 1052
 			},