Browse code

fast vollständig

Christian Fraß authored on 22/08/2018 18:04:02
Showing 26 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,2 @@
1
+<li>{{fsdraft-correlation::type_sentence}}</li>
2
+
... ...
@@ -4,15 +4,8 @@
4 4
 	<!--
5 5
 	<li>The following list gives an overview over prepositions:</li>
6 6
 	  -->
7
-	{{fold:adpositions.words:situation_id:type_id/reference_id}}
7
+	{{fsdraft-table-2d:adpositions.words:situation_id:type_id/reference_id}}
8 8
 	<p>Some examples:</p>
9
-	<ul>
10
-		<li>{{fsdraft_format_correlation:section-adpositions.examples.0:type_sentence}}</li>
11
-		<li>{{fsdraft_format_correlation:section-adpositions.examples.1:type_sentence}}</li>
12
-		<li>{{fsdraft_format_correlation:section-adpositions.examples.2:type_sentence}}</li>
13
-		<li>{{fsdraft_format_correlation:section-adpositions.examples.3:type_sentence}}</li>
14
-		<li>{{fsdraft_format_correlation:section-adpositions.examples.4:type_sentence}}</li>
15
-		<li>{{fsdraft_format_correlation:section-adpositions.examples.5:type_sentence}}</li>
16
-	</ul>
9
+	<ul>{{list:section-adpositions.examples:adpositions-example.html.tpl}}</ul>
17 10
 </section>
18 11
 
... ...
@@ -2,7 +2,7 @@
2 2
 	<header>Cases</header>
3 3
 	<p>Regular nouns can appear in two cases: <span class="grammarterm">nominative</span> and <span class="grammarterm">genitive</span>.</p>
4 4
 	<p>The base form of a noun is the nominative, which does not receive any marker.</p>
5
-	<p>The genitive is formed by appending the suffix <span class="type_word lang_flk">-(e)s</span> to the word, e.g. {{fsdraft_format_correlation:section-cases.example1:type_word}}. The marker for the plural has to be applied first, e.g. {{fsdraft_format_correlation:section-cases.example2:type_word}}.</p>
5
+	<p>The genitive is formed by appending the suffix <span class="type_word lang_flk">-(e)s</span> to the word, e.g. {{fsdraft-correlation:section-cases.example1:type_word}}. The marker for the plural has to be applied first, e.g. {{fsdraft-correlation:section-cases.example2:type_word}}.</p>
6 6
 	<p></p>
7 7
 </section>
8 8
 
... ...
@@ -1,7 +1,7 @@
1 1
 <section class="subsection" id="correlatives">
2 2
 	<header>Correlatives</header>
3 3
 	{{call::_proposal.html.tpl}}
4
-	{{fold:correlatives.words:domain_id:type_id}}
4
+	{{fsdraft-table-2d: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>
... ...
@@ -3,135 +3,8 @@
3 3
 	{{call::numeri.html.tpl}}
4 4
 	{{call::cases.html.tpl}}
5 5
 	{{call::definiteness.html.tpl}}
6
-<p>The following table summarizes the information of this section:</p>
7
-<?php
8
-	$data_common = read_json("source/data/common.json");
9
-	$data_declension = read_json("source/data/declension.json");
10
-	
11
-	$data = $data_declension["words"];
12
-	{
13
-		{
14
-			if (true)
15
-			{
16
-				$data = sql_cross($data, $data_common["counts"]);
17
-				$data = sql_select($data, function ($row) {return ($row["count_id"] == $row["id"]);});
18
-				$data = sql_delete($data, ["count_id", "id"]);
19
-				$data = sql_rename($data, "name", "count_name");
20
-			}
21
-			else
22
-			{
23
-				$data = sql_rename($data, "count_id", "count_name");
24
-			}
25
-		}
26
-		{
27
-			if (true)
28
-			{
29
-				$data = sql_cross($data, $data_common["definitenesses"]);
30
-				$data = sql_select($data, function ($row) {return ($row["definiteness_id"] == $row["id"]);});
31
-				$data = sql_delete($data, ["definiteness_id", "id"]);
32
-				$data = sql_rename($data, "name", "definiteness_name");
33
-			}
34
-			else
35
-			{
36
-				$data = sql_rename($data, "definiteness_id", "definiteness_name");
37
-			}
38
-		}
39
-		{
40
-			if (true)
41
-			{
42
-				$data = sql_cross($data, $data_common["cases"]);
43
-				$data = sql_select($data, function ($row) {return ($row["case_id"] == $row["id"]);});
44
-				$data = sql_delete($data, ["case_id", "id"]);
45
-				$data = sql_rename($data, "name", "case_name");
46
-			}
47
-			else
48
-			{
49
-				$data = sql_rename($data, "case_id", "case_name");
50
-			}
51
-		}
52
-	}
53
-	
54
-	$table = new class_table
55
-	(
56
-		[
57
-			new class_column("Language", "language_id"),
58
-			new class_column("Count", "count_name"),
59
-			new class_column("Definiteness", "definiteness_name"),
60
-			new class_column("Case", "case_name"),
61
-			new class_column("Words", "words", function ($x) {return json_encode($x);}),
62
-		],
63
-		$data
64
-	);
65
-	
66
-	$table->snap
67
-	(
68
-		[
69
-			"label_vertical" => function ($column) {return "";},
70
-			"columns_vertical" =>
71
-			[
72
-				$table->columns_get()[1],
73
-				$table->columns_get()[2],
74
-			],
75
-			"label_horizontal" => function ($column, $value) {return $value;},
76
-			"columns_horizontal" =>
77
-			[
78
-				$table->columns_get()[3],
79
-			],
80
-			"columns_data" =>
81
-			[
82
-				$table->columns_get()[0],
83
-				$table->columns_get()[4],
84
-			],
85
-			"data_aggregator" => function ($values)
86
-			{
87
-				return $values;
88
-			},
89
-			"data_formatter" => function ($value)
90
-			{
91
-				switch (1)
92
-				{
93
-					case 0:
94
-					{
95
-						return format_list("type_word", "flk")($value[0]["words"]);
96
-						break;
97
-					}
98
-					case 1:
99
-					{
100
-						global $configuration;
101
-						$value_ = [];
102
-						foreach (["flk",$configuration["target"]] as $language_id)
103
-						{
104
-							$value_[$language_id] = array_reduce
105
-							(
106
-								array_map
107
-								(
108
-									function ($dataset) {return $dataset["words"];},
109
-									array_filter($value, function ($dataset) use (&$language_id) {return ($dataset["language_id"] == $language_id);})
110
-								),
111
-								function ($x, $y) {return array_merge($x, $y);},
112
-								[]
113
-							);
114
-						}
115
-						return (
116
-							format_correlation("type_word")
117
-							(
118
-								[
119
-									"flk" => $value_["flk"],
120
-									$configuration["target"] => $value_[$configuration["target"]],
121
-								]
122
-							)
123
-						);
124
-						break;
125
-					}
126
-					default:
127
-					{
128
-						return json_encode($value);
129
-						break;
130
-					}
131
-				}
132
-			},
133
-		]
134
-	)->generate();
135
- ?>
136
-<p>{{fsdraft_format_correlation:section-declension.example:type_sentence}}</p></section>
6
+	<p>The following table summarizes the information of this section:</p>
7
+	{{fsdraft-table-2d:declension.words:count_id/definiteness_id:case_id}}
8
+	<p>{{fsdraft-correlation:section-declension.example:type_sentence}}</p>
9
+</section>
137 10
 
... ...
@@ -1,7 +1,7 @@
1 1
 <section class="subsection" id="definiteness">
2 2
 	<header>Definiteness</header>
3
-	<p>The undefinite aspect of a singular noun is formed by using the article <span class="type_word lang_flk">en</span>, e.g. {{fsdraft_format_correlation:section-definiteness.example1:type_word}}. Undefinite plural nouns don't have an article, e.g. {{fsdraft_format_correlation:section-definiteness.example2:type_word}}.</p>
4
-	<p>The definite aspect of both singular and plural nouns is formed by using the article <span class="type_word lang_flk">de</span>, e.g. {{fsdraft_format_correlation:section-definiteness.example3:type_word}}.</p>
3
+	<p>The undefinite aspect of a singular noun is formed by using the article <span class="type_word lang_flk">en</span>, e.g. {{fsdraft-correlation:section-definiteness.example1:type_word}}. Undefinite plural nouns don't have an article, e.g. {{fsdraft-correlation:section-definiteness.example2:type_word}}.</p>
4
+	<p>The definite aspect of both singular and plural nouns is formed by using the article <span class="type_word lang_flk">de</span>, e.g. {{fsdraft-correlation:section-definiteness.example3:type_word}}.</p>
5 5
 	<span class="todo">abstract aspect like in "sand is dry"</span>
6 6
 </section>
7 7
 
... ...
@@ -1,8 +1,8 @@
1 1
 <section class="subsection" id="infinite_verbforms">
2 2
 	<header>Infinite Verbforms</header>
3
-	<p>The <span class="grammarterm">infinitive</span> is formed by appending <span class="type_word lang_flk">-e</span> to the verb stem, e.g. {{fsdraft_format_correlation:section-infinite_verbforms.example1:type_word}}. In some cases it is mandatory to mark the infinitive with the special particle <span class="type_word lang_flk">tu</span> in order to form the <span class="grammarterm">extended intfinitive</span>, e.g.: {{fsdraft_format_correlation:section-infinite_verbforms.example2:type_sentence}}.</p>
3
+	<p>The <span class="grammarterm">infinitive</span> is formed by appending <span class="type_word lang_flk">-e</span> to the verb stem, e.g. {{fsdraft-correlation:section-infinite_verbforms.example1:type_word}}. In some cases it is mandatory to mark the infinitive with the special particle <span class="type_word lang_flk">tu</span> in order to form the <span class="grammarterm">extended intfinitive</span>, e.g.: {{fsdraft-correlation:section-infinite_verbforms.example2:type_sentence}}.</p>
4 4
 	<span class="todo">Specify cases for extended infinitive</span>
5
-	<p>The <span class="grammarterm">active participle</span> is formed by appending <span class="type_word lang_flk">-end</span> to the verb stem, e.g. {{fsdraft_format_correlation:section-infinite_verbforms.example3:type_word}}.</p>
6
-	<p>The <span class="grammarterm">passive participle</span> is formed by appending <span class="type_word lang_flk">-et</span> to the verb stem, e.g. {{fsdraft_format_correlation:section-infinite_verbforms.example4:type_word}}. If pronouncable, the <span class="type_letter lang_flk">e</span> in the ending can be omitted, e.g. <span class="type_word lang_flk">skrivt</span>.</p>
5
+	<p>The <span class="grammarterm">active participle</span> is formed by appending <span class="type_word lang_flk">-end</span> to the verb stem, e.g. {{fsdraft-correlation:section-infinite_verbforms.example3:type_word}}.</p>
6
+	<p>The <span class="grammarterm">passive participle</span> is formed by appending <span class="type_word lang_flk">-et</span> to the verb stem, e.g. {{fsdraft-correlation:section-infinite_verbforms.example4:type_word}}. If pronouncable, the <span class="type_letter lang_flk">e</span> in the ending can be omitted, e.g. <span class="type_word lang_flk">skrivt</span>.</p>
7 7
 </section>
8 8
 
... ...
@@ -1,2 +1,2 @@
1
-<li>{{fsdraft_format_correlation::type_word}}</li>
1
+<li>{{fsdraft-correlation::type_word}}</li>
2 2
 
... ...
@@ -3,7 +3,7 @@
3 3
 	{{call::_proposal.html.tpl}}
4 4
 	<p>The following verbs are modal verbs in Folksprak:</p>
5 5
 	<ul>{{list:section-modal_verbs.list:modal_verbs-listentry.html.tpl}}</ul>
6
-	<p>Modal verbs in contrast to normal verbs never take an extended infinitive as object, e.g. {{fsdraft_format_correlation:section-modal_verbs.example1:type_sentence}}, but {{fsdraft_format_correlation:section-modal_verbs.example2:type_sentence}}</p>
6
+	<p>Modal verbs in contrast to normal verbs never take an extended infinitive as object, e.g. {{fsdraft-correlation:section-modal_verbs.example1:type_sentence}}, but {{fsdraft-correlation:section-modal_verbs.example2:type_sentence}}</p>
7 7
 	<p>The special modal verb <span class="type_word lang_flk">vöre</span> is used for expressing the subjunctive.</p>
8 8
 </section>
9 9
 
... ...
@@ -1,9 +1,9 @@
1 1
 <section class="subsection" id="negation">
2 2
 	<header>Negation</header>
3 3
 	{{call::_proposal.html.tpl}}
4
-	<p>In order to negate the meaning of a predicate, one shall place the word <span class="type_word lang_flk">nit</span> after the flected verb part of the predicate. Example: {{fsdraft_format_correlation:section-negation.examples.0:type_sentence}}</p>
5
-	<p>If the verb takes a direct object it is allowed to place the object before the <span class="type_word lang_flk">nit</span>. Example: {{fsdraft_format_correlation:section-negation.examples.1:type_sentence}}</p>
6
-	<p>Negations can also be expressed implicitly by using negative correlatives. Example: {{fsdraft_format_correlation:section-negation.examples.2:type_sentence}}</p>
7
-	<p>Doubled negations (both explicit and implicit ones) cancel each other out. Example: {{fsdraft_format_correlation:section-negation.examples.3:type_sentence}}</p>
4
+	<p>In order to negate the meaning of a predicate, one shall place the word <span class="type_word lang_flk">nit</span> after the flected verb part of the predicate. Example: {{fsdraft-correlation:section-negation.examples.0:type_sentence}}</p>
5
+	<p>If the verb takes a direct object it is allowed to place the object before the <span class="type_word lang_flk">nit</span>. Example: {{fsdraft-correlation:section-negation.examples.1:type_sentence}}</p>
6
+	<p>Negations can also be expressed implicitly by using negative correlatives. Example: {{fsdraft-correlation:section-negation.examples.2:type_sentence}}</p>
7
+	<p>Doubled negations (both explicit and implicit ones) cancel each other out. Example: {{fsdraft-correlation:section-negation.examples.3:type_sentence}}</p>
8 8
 </section>
9 9
 
... ...
@@ -1,6 +1,6 @@
1 1
 <section class="subsection" id="numeri">
2 2
 	<header>Count</header>
3 3
 	{{call::_proposal.html.tpl}}
4
-	<p>The plural of a noun is formed by appending the syllable <span class="type_word lang_flk">-er</span>, e.g. {{fsdraft_format_correlation:section-numeri.example:type_word}}.</p>
4
+	<p>The plural of a noun is formed by appending the syllable <span class="type_word lang_flk">-er</span>, e.g. {{fsdraft-correlation:section-numeri.example:type_word}}.</p>
5 5
 </section>
6 6
 
... ...
@@ -1,6 +1,6 @@
1 1
 <section class="subsection" id="personal_pronouns">
2 2
 	<header>Personal Pronouns</header>
3
- 	{{fold:personal_pronouns.words:count_id/person_id/gender_id:type_id/case_id}}
3
+ 	{{fsdraft-table-2d:personal_pronouns.words:count_id/person_id/gender_id:type_id/case_id}}
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>
... ...
@@ -13,7 +13,7 @@
13 13
 	</div>
14 14
 	<div class="note note_information">
15 15
 		<span class="note_content">
16
-			<p>A reflexive genitive can be formed by inserting the word <span class="word lang_flk">egen</span> (<span class="type_word lang_en">own</span>), for example {{fsdraft_format_correlation:section-personal_pronouns.example:type_sentence}} (A's book was given to B).</p>
16
+			<p>A reflexive genitive can be formed by inserting the word <span class="word lang_flk">egen</span> (<span class="type_word lang_en">own</span>), for example {{fsdraft-correlation:section-personal_pronouns.example:type_sentence}} (A's book was given to B).</p>
17 17
 		</span>
18 18
 	</div>
19 19
 	<div class="note note_reasoning">
... ...
@@ -1,9 +1,3 @@
1
-<?php
2
-	global $configuration;
3
-	include_once("source/logic/server/data.php");
4
-	include_once("source/logic/server/table.php");
5
-	include_once("source/logic/server/misc.php");
6
- ?>
7 1
 <section class="section" id="phonology_and_orthography">
8 2
 	<header>Phonology and Orthography</header>
9 3
 	<!--
... ...
@@ -12,79 +6,7 @@
12 6
 	<!--
13 7
 	<div class="note_information">It was not easy to find a phonology system for Folksprak.</div>
14 8
 	  -->
15
-<?php
16
-	$table = new class_table
17
-	(
18
-		[
19
-			new class_column
20
-			(
21
-				"IPA-sound",
22
-				"ipa",
23
-				function ($value)
24
-				{
25
-					return format($value);
26
-				}
27
-			),
28
-			/*
29
-			new class_column
30
-			(
31
-				"Type",
32
-				"type"];
33
-				}
34
-			),
35
-			 */
36
-			new class_column
37
-			(
38
-				"Latin letter Representation",
39
-				"latin",
40
-				function ($value)
41
-				{
42
-					return format($value, ["letter", "lang_flk"]);
43
-				}
44
-			),
45
-			new class_column
46
-			(
47
-				"Runic Representation",
48
-				"runic",
49
-				function ($value)
50
-				{
51
-					return format($value, ["letter", "lang_flk", "runic"]);
52
-				}
53
-			),
54
-			new class_column
55
-			(
56
-				$configuration["languagemap"]["flk"] . " Example",
57
-				"examples",
58
-				function ($value)
59
-				{
60
-					return format($value["flk"], ["word", "lang_flk"]);
61
-				}
62
-			),
63
-			new class_column
64
-			(
65
-				$configuration["languagemap"][$configuration["target"]] . " Example",
66
-				"examples",
67
-				function ($value) use (&$configuration)
68
-				{
69
-					return format($value[$configuration["target"]], ["word", "lang_" . $configuration["target"]]);
70
-				}
71
-			),
72
-			/*
73
-			new class_column
74
-			(
75
-				"Remark",
76
-				"remark",
77
-				function ($value)
78
-				{
79
-					return format($value);
80
-				}
81
-			),
82
-			 */
83
-		],
84
-		read_json("source/data/phonology_and_orthography.json")
85
-	);
86
-	$table->generate();
87
- ?>
9
+ 	{{fsdraft-table-1d:phonology_and_orthography:ipa/latin/runic/examples}}
88 10
  	<div class="note note_information">
89 11
 		<span class="note_content">
90 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>
... ...
@@ -1,111 +1,8 @@
1
-<?php
2
-global $configuration;
3
-include_once("source/logic/server/data.php");
4
-include_once("source/logic/server/sql.php");
5
-include_once("source/logic/server/table.php");
6
- ?>
7 1
 <section class="section" id="principles">
8 2
 	<header>Principles</header>
9 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>
10 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>
11 5
 	<span class="todo">more entries</span>
12
-<?php
13
-	$data_common = read_json("source/data/common.json");
14
-	$data_transitions = read_json("source/data/transitions.json");
15
-	
16
-	$data = $data_transitions["data"];
17
-	{
18
-		{
19
-			$data = sql_select($data, function ($row) {return in_array($row["language_id"], ["gem","flk","eng","deu","nld","dan","nob","swe","isl"]);});
20
-		}
21
-		{
22
-			{
23
-				$data = sql_cross($data, $data_common["languages"]);
24
-				$data = sql_select($data, function ($row) {return ($row["language_id"] == $row["id"]);});
25
-				$data = sql_delete($data, ["id"]);
26
-				$data = sql_rename($data, "name", "language_name");
27
-			}
28
-		}
29
-	}
30
-		
31
-	$table = new class_table
32
-	(
33
-		[
34
-			new class_column("Transition", "transition_id"),
35
-			new class_column("Language", "language_name"),
36
-			new class_column("Language ID", "language_id"),
37
-			new class_column("Phones", "phones"),
38
-			new class_column("Examples", "examples"),
39
-		],
40
-		$data
41
-	);
42
-	
43
-	$table->snap
44
-	(
45
-		[
46
-			"label_vertical" => function ($column) {return "";},
47
-			"columns_vertical" =>
48
-			[
49
-				$table->columns_get()[0],
50
-			],
51
-			"label_horizontal" => function ($column, $value) {return $value;},
52
-			"columns_horizontal" =>
53
-			[
54
-				$table->columns_get()[1],
55
-			],
56
-			"columns_data" =>
57
-			[
58
-				$table->columns_get()[2],
59
-				$table->columns_get()[3],
60
-				$table->columns_get()[4],
61
-			],
62
-			"data_aggregator" => function ($values)
63
-			{
64
-				return $values;
65
-			},
66
-			"data_formatter" => function ($values)
67
-			{
68
-				if (count($values) == 1)
69
-				{
70
-					$phones = implode(
71
-						", ",
72
-						array_map
73
-						(
74
-							function ($phoneme) use (&$values)
75
-							{
76
-								return mark($phoneme, ["type_word", "lang_" . $values[0]["language_id"]]);
77
-							},
78
-							$values[0]["phones"]
79
-						)
80
-					);
81
-					$examples = implode
82
-					(
83
-						", ",
84
-						array_map
85
-						(
86
-							function ($word) use (&$values)
87
-							{
88
-								return mark($word, ["type_word", "lang_" . $values[0]["language_id"]]);
89
-							},
90
-							array_slice($values[0]["examples"], 0, 1)
91
-						)
92
-					);
93
-					$output = $phones;
94
-					if (count($values[0]["examples"]) > 0)
95
-					{
96
-						$break = true;
97
-						$breaker = $break ? "<br/>" : " ";
98
-						$output .= "${breaker}[${examples}]";
99
-					}
100
-					return $output;
101
-				}
102
-				else
103
-				{
104
-					return "?";
105
-				}
106
-			},
107
-		]
108
-	)->generate();
109
- ?>
6
+	{{fsdraft-table-2d:transitions.data:transition_id:language_id}}
110 7
 </section>
111 8
 
... ...
@@ -2,66 +2,16 @@
2 2
 	<header>Timeforms and modes</header>
3 3
 	{{call::_proposal.html.tpl}}
4 4
 	<p>The following table lists the basic timeforms found in Folksprak and how they are built in the <span class="grammarterm">indicative</span> mode.</p>
5
-<?php
6
-(new class_table
7
-(
8
-	[
9
-		new class_column
10
-		(
11
-			"Name",
12
-			"name_",
13
-			function ($value)
14
-			{
15
-				$output = $value["name"];
16
-				if ($value["remark"] != null)
17
-				{
18
-					$output .= (" " . "(" . $value["remark"] . ")");
19
-				}
20
-				return $output;
21
-			}
22
-		),
23
-		new class_column
24
-		(
25
-			"Description",
26
-			"description"
27
-		),
28
-		new class_column
29
-		(
30
-			"Scheme",
31
-			"scheme",
32
-			function ($value)
33
-			{
34
-				return format($value, ["type_word", "lang_flk"]);
35
-			}
36
-		),
37
-		new class_column
38
-		(
39
-			"Example",
40
-			"example_",
41
-			_bar("type_sentence")
42
-		),
43
-	],
44
-	sql_condense
45
-	(
46
-		array_slice(read_json("source/data/timeforms.json"), 0, 4),
47
-		["name","remark","example"],
48
-		["name_","example_"],
49
-		[
50
-			"name_" => function ($row) {return ["name" => $row["name"], "remark" => $row["remark"]];},
51
-			"example_" => function ($row) {global $configuration; return ["original" => [$row["example"]["original"]], "translated" => $row["example"]["translations"][$configuration["target"]]];},
52
-		]
53
-	)
54
-))->generate();
55
-?>
5
+	{{fsdraft-table-1d:timeforms:name/description/scheme/example}}
56 6
 	<p>These forms can be combined straightforward to form complex timeforms:</p>
57 7
 	<ul>
58
-		<li>{{fsdraft_format_correlation:section-tempora_and_modi.examples_complex.0:type_sentence}}</li>
59
-		<li>{{fsdraft_format_correlation:section-tempora_and_modi.examples_complex.1:type_sentence}}</li>
8
+		<li>{{fsdraft-correlation:section-tempora_and_modi.examples_complex.0:type_sentence}}</li>
9
+		<li>{{fsdraft-correlation:section-tempora_and_modi.examples_complex.1:type_sentence}}</li>
60 10
 		<!--
61
-		<li>{{fsdraft_format_correlation:section-tempora_and_modi.examples_complex_inactive.0:type_sentence}}</li>
11
+		<li>{{fsdraft-correlation:section-tempora_and_modi.examples_complex_inactive.0:type_sentence}}</li>
62 12
 		  -->
63 13
 	</ul>
64 14
 	<p>The <span class="grammarterm">imperative</span> only exists in the present (with future meaning) for the 2nd person singular and plural. It is formed by using the bare stem of the verb, optionally followed by the personal pronoun (i.e. either <span class="type_word lang_flk">du</span> or <span class="type_word lang_flk">je</span>) in order to specify or emphasize the numerus. Examples: <span class="type_sentence lang_flk">skriv!</span>, <span class="type_sentence lang_flk">skriv, je!</span>.</p>
65
-	<p>There are two ways to form the <span class="grammarterm">subjunctive</span>. One is to use the special modal verb <span class="type_word lang_flk">vöre</span> which can be understood as a wrapper for regular verbs. The other possibility is to use the adverbial particle <span class="type_word lang_flk">maglik</span>. Both can be applied to the indicative forms, e.g.: {{fsdraft_format_correlation:section-tempora_and_modi.example_subjunctive:type_sentence}}</p>
15
+	<p>There are two ways to form the <span class="grammarterm">subjunctive</span>. One is to use the special modal verb <span class="type_word lang_flk">vöre</span> which can be understood as a wrapper for regular verbs. The other possibility is to use the adverbial particle <span class="type_word lang_flk">maglik</span>. Both can be applied to the indicative forms, e.g.: {{fsdraft-correlation:section-tempora_and_modi.example_subjunctive:type_sentence}}</p>
66 16
 </section>
67 17
 
... ...
@@ -1 +1 @@
1
-<li>{{fsdraft_format_correlation::type_word}}</li>
1
+<li>{{fsdraft-correlation::type_word}}</li>
... ...
@@ -1,100 +1,10 @@
1
-<?php
2
-	global $configuration;
3
-	include_once("source/logic/server/misc.php");
4
-	include_once("source/logic/server/data.php");
5
-	include_once("source/logic/server/table.php");
6
- ?>
7 1
 <section class="section" id="word_functions">
8 2
 	<header>Word Functions</header>
9 3
 	{{call::_proposal.html.tpl}}
10
-<?php
11
-	$table = new class_table
12
-	(
13
-		[
14
-			new class_column
15
-			(
16
-				"Affix",
17
-				"affix",
18
-				function ($value)
19
-				{
20
-					return mark($value, ["type_word", "lang_flk"]);
21
-				}
22
-			),
23
-			new class_column
24
-			(
25
-				"Type",
26
-				"type_",
27
-				function ($value)
28
-				{
29
-					return (
30
-						implode
31
-						(
32
-							" → ",
33
-							array_map
34
-							(
35
-								function ($group)
36
-								{
37
-				 					return ("{" . implode(",", $group) . "}");
38
-								},
39
-								$value
40
-							)
41
-						)
42
-					);
43
-				}
44
-			),
45
-			new class_column
46
-			(
47
-				"Description",
48
-				"description_",
49
-				function ($value)
50
-				{
51
-					$output = "";
52
-					if ($value["name"] != null) $output .= (mark($value["name"], ["grammarterm"]) . ": ");
53
-					if ($value["description"] != null) $output .= ($value["description"]);
54
-					return $output;
55
-				}
56
-			),
57
-			/*
58
-			new class_column
59
-			(
60
-				"Cognates",
61
-				"cognates",
62
-				function ($value)
63
-				{
64
-					return implode(", ", array_map(function ($entry) {return ($entry["language"] . ": " . mark($entry["affix"], ["word", "lang_" . $entry["language"]]));}, $value));
65
-				}
66
-			),
67
-			 */
68
-			new class_column
69
-			(
70
-				"Example",
71
-				"example_",
72
-				_bar("word")
73
-				/*
74
-				function ($x)
75
-				{
76
-					return json_encode($x);
77
-				}
78
-				 */
79
-			),
80
-		],
81
-		sql_condense
82
-		(
83
-			read_json("source/data/word_functions.json"),
84
-			["type_from","type_to","name","description","example"],
85
-			["type_","description_","example_"],
86
-			[
87
-				"type_" => function ($values) {return [$values["type_from"], $values["type_to"]];},
88
-				"description_" => function ($values) {return ["name" => $values["name"], "description" => $values["description"]];},
89
-				"example_" => function ($values) {global $configuration; return ["original" => [$values["example"]["word"]], "translated" => $values["example"]["translations"][$configuration["target"]]];},
90
-			]
91
-		)
92
-	);
93
-	$table->generate();
94
- ?>
95
-<p>
96
-	Some complex examples:
97
-	<ul>{{list:section-word_functions.examples:word_functions-listentry.html.tpl}}</ul>
98
-</p>
4
+	{{fsdraft-table-1d:word_functions:affix/type_from/type_to/description/example}}
5
+	<p>
6
+		Some complex examples:
7
+		<ul>{{list:section-word_functions.examples:word_functions-listentry.html.tpl}}</ul>
8
+	</p>
99 9
 </section>
100 10
 
... ...
@@ -193,6 +193,7 @@ a
193 193
 		}
194 194
 	}
195 195
 	
196
+	&.lang_gem,
196 197
 	&.lang_eng,
197 198
 	&.lang_afr,
198 199
 	&.lang_nld,
... ...
@@ -231,6 +232,7 @@ a
231 232
 		}
232 233
 	}
233 234
 	
235
+	&.lang_gem,
234 236
 	&.lang_eng,
235 237
 	&.lang_afr,
236 238
 	&.lang_nld,
... ...
@@ -272,6 +274,7 @@ a
272 274
 		}
273 275
 	}
274 276
 	
277
+	&.lang_gem,
275 278
 	&.lang_eng,
276 279
 	&.lang_afr,
277 280
 	&.lang_nld,
... ...
@@ -313,6 +316,7 @@ a
313 316
 		}
314 317
 	}
315 318
 	
319
+	&.lang_gem,
316 320
 	&.lang_eng,
317 321
 	&.lang_afr,
318 322
 	&.lang_nld,
319 323
new file mode 100644
... ...
@@ -0,0 +1,655 @@
1
+
2
+type int = number;
3
+
4
+
5
+/**
6
+ * @author kcf
7
+ */
8
+const configuration = {
9
+	"replace_fs_umlauts": false,
10
+	"target": "eng",
11
+};
12
+
13
+
14
+/**
15
+ * @author kcf
16
+ */
17
+function mark(
18
+	core,
19
+	classes
20
+)
21
+{
22
+	const contains = ((list, entry) => (list.indexOf(entry) >= 0));
23
+	if (configuration["replace_fs_umlauts"]) {
24
+		if (
25
+			contains(classes, "lang_flk")
26
+			&&
27
+			! contains(classes, "type_letter")
28
+		) {
29
+			core = (
30
+				core
31
+				.replace(new RegExp("ö", "g"), "oy")
32
+				.replace(new RegExp("ü", "g"), "uy")
33
+			);
34
+		}
35
+	}
36
+	return ('<span class="' + classes.join(" ") + '">' + core + '</span>');
37
+}
38
+
39
+
40
+/**
41
+ * @author kcf
42
+ */
43
+function format_single(
44
+	type,
45
+	language
46
+)
47
+{
48
+	return (
49
+		function (piece) {
50
+			return mark(piece, [type, "lang_" + language]);
51
+		}
52
+	);
53
+}
54
+
55
+
56
+/**
57
+ * @author kcf
58
+ */
59
+function format_list(
60
+	type,
61
+	language
62
+)
63
+{
64
+	return (
65
+		function (pieces) {
66
+			return (
67
+				(pieces.length <= 0)
68
+				? "?"
69
+				: pieces.map(format_single(type, language)).join(", ")
70
+			);
71
+		}
72
+	);
73
+}
74
+
75
+
76
+/**
77
+ * @author kcf
78
+ */
79
+function format_correlation(
80
+	type,
81
+	language_from = "flk",
82
+	language_to = null
83
+)
84
+{
85
+	if (language_to === null) language_to = configuration["target"];
86
+	return (
87
+		function (source) {
88
+			let output = "";
89
+			output += format_list(type, language_from)(source[language_from]);
90
+			output += " ~ ";
91
+			output += format_list(type, language_to)(source[language_to]);
92
+			return output;
93
+		}
94
+	);
95
+}
96
+
97
+
98
+/**
99
+ * @author fenris
100
+ */
101
+function objvals(
102
+	objekt : {[key : string] : any}
103
+) : Array<any>
104
+{
105
+	return Object.keys(objekt).map(key => objekt[key]);
106
+}
107
+
108
+
109
+/**
110
+ * @author fenris
111
+ */
112
+function merge<typ_element>(
113
+	liste_x : Array<typ_element>,
114
+	liste_y : Array<typ_element>,
115
+	ordnung : (x : typ_element, y : typ_element)=>boolean
116
+) : Array<typ_element>
117
+{
118
+	if (liste_x.length <= 0) {
119
+		return liste_y;
120
+	}
121
+	else if (liste_y.length <= 0) {
122
+		return liste_x;
123
+	}
124
+	else {
125
+		return (
126
+			ordnung(liste_x[0], liste_y[0])
127
+			? ([liste_x[0]].concat(merge(liste_x.slice(1), liste_y, ordnung)))
128
+			: ([liste_y[0]].concat(merge(liste_x, liste_y.slice(1), ordnung)))
129
+		);
130
+	}
131
+}
132
+
133
+
134
+/**
135
+ * @author fenris
136
+ */
137
+function mergesort<typ_element>(
138
+	liste : Array<typ_element>,
139
+	ordnung : (x : typ_element, y : typ_element)=>boolean
140
+) : Array<typ_element>
141
+{
142
+	if (liste.length <= 1) {
143
+		return liste;
144
+	}
145
+	else {
146
+		let n : int = <int>(Math.floor(liste.length/2));
147
+		return merge(
148
+			mergesort(liste.slice(0, n), ordnung),
149
+			mergesort(liste.slice(n), ordnung),
150
+			ordnung
151
+		);
152
+	}
153
+}
154
+
155
+
156
+/**
157
+ * @author fenris
158
+ */
159
+function order_list<typ_element>(
160
+	liste : Array<typ_element>,
161
+	kollation : (x : typ_element, y : typ_element)=>boolean = ((x, y) => (x === y))
162
+) : (x : typ_element, y : typ_element)=>boolean
163
+{
164
+	return (
165
+		(x, y) => {
166
+			let i : int = liste["findIndex"]((element) => kollation(x, element));
167
+			let j : int = liste["findIndex"]((element) => kollation(y, element));
168
+			return (i <= j);
169
+		}
170
+	);
171
+}
172
+
173
+
174
+/**
175
+ * @author fenris
176
+ */
177
+function order_lex(
178
+	ordnungen : Array<(x : any, y : any)=>boolean>
179
+) : (x : Array<any>, y : Array<any>)=>boolean
180
+{
181
+	return (
182
+		(x, y) => {
183
+			if (
184
+				(ordnungen.length <= 0)
185
+				||
186
+				(x.length <= 0)
187
+				||
188
+				(y.length <= 0)
189
+			) {
190
+				return true;
191
+			}
192
+			else {
193
+				let le : boolean = ordnungen[0](x[0], y[0]);
194
+				let ge : boolean = ordnungen[0](y[0], x[0]);
195
+				if (le && !ge) {
196
+					return true;
197
+				}
198
+				else if (!le && ge) {
199
+					return false;
200
+				}
201
+				else {
202
+					return order_lex(ordnungen.slice(1))(x.slice(1), y.slice(1));
203
+				}
204
+			}
205
+		}
206
+	);
207
+}
208
+
209
+
210
+/**
211
+ * @author fenris
212
+ */
213
+function kollation_satz(
214
+	kollationen : {[name : string] : (x : any, y : any)=>boolean},
215
+	satz_x : {[namen : string] : any},
216
+	satz_y : {[namen : string] : any},
217
+	namen : Array<string>
218
+) : boolean
219
+{
220
+	return (
221
+		namen.every(
222
+			(name) => kollationen[name](satz_x[name], satz_y[name])
223
+		)
224
+	);
225
+}
226
+
227
+
228
+/**
229
+ * @author fenris
230
+ */
231
+function sammeln(
232
+	kollationen : {[name : string] : (x : any, y : any)=>boolean},
233
+	ordnungen : {[name : string] : (x : any, y : any)=>boolean},
234
+	daten : Array<{[name : string] : any}>,
235
+	namen : Array<string>
236
+) : Array<{[name : string] : any}>
237
+{
238
+	let liste : Array<{[name : string] : any}> = [];
239
+	// Heraussuchen
240
+	daten
241
+	.forEach(
242
+		(satz_urspruenglich) => {
243
+			let satz_neu : {[name : string] : any} = {};
244
+			namen.forEach(name => {satz_neu[name] = satz_urspruenglich[name];});
245
+			let vorhanden : boolean = liste.some((satz_alt) => kollation_satz(kollationen, satz_alt, satz_neu, namen));
246
+			if (! vorhanden) {
247
+				liste.push(satz_neu);
248
+			}
249
+		}
250
+	);
251
+	// Sortieren
252
+	liste = mergesort<{[name : string] : any}>(
253
+		liste,
254
+		(x, y) => {
255
+			let x_ : Array<any> = namen.map(name => x[name]);
256
+			let y_ : Array<any> = namen.map(name => y[name]);
257
+			let ordnung : (x : any, y : any)=>boolean = order_lex(namen.map((name) => ordnungen[name]));
258
+			return ordnung(x_, y_);
259
+		}
260
+	);
261
+	return liste;
262
+}
263
+
264
+
265
+/**
266
+ * @author fenris
267
+ */
268
+function anzeigen(
269
+	{
270
+		"daten": daten,
271
+		"spalten": namen,
272
+		"kollationen": kollationen = {},
273
+		"ordnungen": ordnungen = {},
274
+		"sortierung_propagieren": sortierung_propagieren = true,
275
+	}
276
+	: {
277
+		daten : Array<{[name : string] : any}>;
278
+		spalten : Array<string>;
279
+		kollationen ?: {[name : string] : (x : any, y : any)=>boolean};
280
+		ordnungen ?: {[name : string] : (x : any, y : any)=>boolean};
281
+		sortierung_propagieren ?: boolean;
282
+	}
283
+) : {meta : any; data : Array<{[name : string] : any}>;}
284
+{
285
+	// Kollationen und Ordnungen vervollständigen
286
+	{
287
+		namen
288
+		.forEach(
289
+			(name) => {
290
+				// Kollation ergänzen
291
+				if (! kollationen.hasOwnProperty(name)) {
292
+					kollationen[name] = ((x, y) => (x === y));
293
+				}
294
+				// Ordnung ergänzen
295
+				if (! ordnungen.hasOwnProperty(name)) {
296
+					ordnungen[name] = (sortierung_propagieren ? ((x, y) => false) : ((x, y) => (x <= y)));
297
+				}
298
+			}
299
+		);
300
+	}
301
+	const werte : Array<{[name : string] : any}> = sammeln(kollationen, ordnungen, daten, namen);
302
+	/*
303
+	let meta = {
304
+		"x": {},
305
+		"y": {},
306
+	};
307
+	werte.forEach((satz, nummer) => {let name : string = ("y" + nummer.toFixed(0)); meta.y[name] = satz;});
308
+	werte_waagerecht.forEach((satz, nummer) => {let name : string = ("x" + nummer.toFixed(0)); meta.x[name] = satz;});
309
+	 */
310
+	return {
311
+		"meta": null,
312
+		"data": werte,
313
+	};
314
+}
315
+
316
+
317
+/*
318
+	
319
+	+------+------+------+
320
+	|  xA  |  xB  |  xC  |
321
+	+------+------+------+
322
+	|  a2  |  b1  |  c3  |
323
+	|  a1  |  b1  |  c0  |
324
+	|  a1  |  b3  |  c2  |
325
+	|  a2  |  b2  |  c4  |
326
+	|  a1  |  b2  |  c1  |
327
+	|  a2  |  b4  |  c5  |
328
+	+------+------+------+
329
+	
330
+	+------+------+------+------+------+
331
+	|  xA  | xB:b1| xB:b2| xB:b3| xB:b4|
332
+	+------+------+------+------+------+
333
+	|  a1  |  c0  |  c1  |  c2  |  --  |
334
+	|  a2  |  c3  |  c4  |  --  |  c5  |
335
+	+------+------+------+------+------+
336
+	
337
+ */
338
+
339
+
340
+/**
341
+ * @author fenris
342
+ */
343
+function anordnen(
344
+	{
345
+		"daten": daten,
346
+		"senkrecht": namen_senkrecht,
347
+		"waagerecht": namen_waagerecht,
348
+		"kollationen": kollationen = {},
349
+		"ordnungen": ordnungen = {},
350
+		"feldsatz_kuerzen": feldsatz_kuerzen = true,
351
+		"sortierung_propagieren": sortierung_propagieren = true,
352
+	} 
353
+	: {
354
+		daten : Array<{[name : string] : any}>;
355
+		waagerecht : Array<string>;
356
+		senkrecht : Array<string>;
357
+		kollationen ?: {[name : string] : (x : any, y : any)=>boolean};
358
+		ordnungen ?: {[name : string] : (x : any, y : any)=>boolean};
359
+		feldsatz_kuerzen ?: boolean;
360
+		sortierung_propagieren ?: boolean;
361
+	}
362
+) : {meta : {x : {[name : string] : any}; y : {[name : string] : any};}; data : Array<{[name : string] : any}>;}
363
+{
364
+	// Kollationen und Ordnungen vervollständigen
365
+	{
366
+		([].concat(namen_senkrecht).concat(namen_waagerecht))
367
+		.forEach(
368
+			(name) => {
369
+				// Kollation ergänzen
370
+				if (! kollationen.hasOwnProperty(name)) {
371
+					kollationen[name] = ((x, y) => (x === y));
372
+				}
373
+				// Ordnung ergänzen
374
+				if (! ordnungen.hasOwnProperty(name)) {
375
+					ordnungen[name] = (sortierung_propagieren ? ((x, y) => false) : ((x, y) => (x <= y)));
376
+				}
377
+			}
378
+		);
379
+	}
380
+	const werte_senkrecht : Array<{[name : string] : any}> = sammeln(kollationen, ordnungen, daten, namen_senkrecht);
381
+	const werte_waagerecht : Array<{[name : string] : any}> = sammeln(kollationen, ordnungen, daten, namen_waagerecht);
382
+	let meta = {
383
+		"x": {},
384
+		"y": {},
385
+	};
386
+	werte_senkrecht.forEach((satz, nummer) => {let name : string = ("y" + nummer.toFixed(0)); meta.y[name] = satz;});
387
+	werte_waagerecht.forEach((satz, nummer) => {let name : string = ("x" + nummer.toFixed(0)); meta.x[name] = satz;});
388
+	let data : Array<{[name : string] : any}> = (
389
+		Object.keys(meta.y)
390
+		.map(
391
+			(label_senkrecht) => {
392
+				let satz_senkrecht : {[name : string] : any} = meta.y[label_senkrecht];
393
+				let satz_ergebnis : {[name : string] : any} = {};
394
+				// Kopf
395
+				{
396
+					let name : string = "_";
397
+					satz_ergebnis[name] = label_senkrecht;
398
+				}
399
+				// Rumpf
400
+				{
401
+					Object.keys(meta.x)
402
+					.forEach(
403
+						(label_waagerecht) => {
404
+							let satz_waagerecht : {[name : string] : any} = meta.x[label_waagerecht];
405
+							let saetze_feld : Array<{[name : string] : any}> = (
406
+								daten
407
+								.filter(
408
+									(satz_urspruenglich) => (
409
+										kollation_satz(kollationen, satz_urspruenglich, satz_senkrecht, namen_senkrecht)
410
+										&&
411
+										kollation_satz(kollationen, satz_urspruenglich, satz_waagerecht, namen_waagerecht)
412
+									)
413
+								)
414
+								.map(
415
+									(satz_urspruenglich) => {
416
+										let satz_neu : {[name : string] : any} = {};
417
+										Object.keys(satz_urspruenglich)
418
+										.forEach(
419
+											(name) => {
420
+												if (
421
+													! feldsatz_kuerzen
422
+													||
423
+													(
424
+														namen_senkrecht.every((name_) => (name !== name_))
425
+														&&
426
+														namen_waagerecht.every((name_) => (name !== name_))
427
+													)
428
+												) {
429
+													satz_neu[name] = satz_urspruenglich[name];
430
+												}
431
+											}
432
+										);
433
+										return satz_neu;
434
+									}
435
+								)
436
+							);
437
+							satz_ergebnis[label_waagerecht] = saetze_feld;
438
+						}
439
+					);
440
+				}
441
+				return satz_ergebnis;
442
+			}
443
+		)
444
+	);
445
+	return {
446
+		"meta": meta,
447
+		"data": data,
448
+	};
449
+}
450
+
451
+
452
+/**
453
+ * @author fenris
454
+ */
455
+function xmlwrap(
456
+	name : string,
457
+	kern : string
458
+) : string
459
+{
460
+	return (("<" + name + ">") + kern + ("</" + name + ">") + "\n");
461
+}
462
+
463
+
464
+/**
465
+ * @author fenris
466
+ */
467
+function htmltable(
468
+	titel : Array<string>,
469
+	daten : Array<Array<string>>,
470
+	_2d : boolean = false
471
+)
472
+: string
473
+{
474
+	return (
475
+		xmlwrap(
476
+			"table",
477
+			(
478
+				// kopf
479
+				xmlwrap(
480
+					"thead",
481
+					xmlwrap(
482
+						"tr",
483
+						(
484
+							titel
485
+							.map(
486
+								(titel_) => xmlwrap("th", titel_)
487
+							)
488
+							.join("")
489
+						)
490
+					)
491
+				)
492
+				+
493
+				// rumpf
494
+				xmlwrap(
495
+					"tbody",
496
+					(
497
+						daten
498
+						.map(
499
+							(satz) => xmlwrap(
500
+								"tr",
501
+								satz.map(
502
+									(feld, nummer) => (
503
+										(_2d && (nummer === 0))
504
+										? xmlwrap("th", feld)
505
+										: xmlwrap("td", feld)
506
+									)
507
+								)
508
+								.join("")
509
+							)
510
+						)
511
+						.join("")
512
+					)
513
+				)
514
+			)
515
+		)
516
+	);
517
+}
518
+
519
+
520
+/**
521
+ * @author kcf
522
+ */
523
+export function definieren(
524
+) : any
525
+{
526
+	return {
527
+		"name": "fsdraft",
528
+		"befehle": [
529
+			{
530
+				"name": "fsdraft-mark",
531
+				"funktion": (args) => (wert) => {
532
+					let classes = args;
533
+					return mark(wert, classes);
534
+				}
535
+			},
536
+			{
537
+				"name": "fsdraft-correlation",
538
+				"funktion": (args) => (wert) => {
539
+					let type = args.shift();
540
+					return format_correlation(type)(wert);
541
+				}
542
+			},
543
+			{
544
+				"name": "fsdraft-table-1d",
545
+				"funktion": (args) => (wert) => {
546
+					let namen_ : string = (
547
+						(args.length > 0)
548
+						? args.shift()
549
+						: null
550
+					);
551
+					let namen : Array<string> = namen_.split("/");
552
+					let tabelle : {meta : any; data : Array<{[name : string] : any}>;} = anzeigen(
553
+						{
554
+							"daten": wert,
555
+							"spalten": namen,
556
+						}
557
+					);
558
+					let tabelle_ : {kopf : Array<string>; rumpf : Array<Array<string>>;} = {
559
+						"kopf": (
560
+							namen
561
+						),
562
+						"rumpf": tabelle.data.map(
563
+							(satz) => (
564
+								Object.keys(satz).map(
565
+									(label) => (
566
+										JSON.stringify(satz[label])
567
+									)
568
+								)
569
+							)
570
+						),
571
+					};
572
+					let tabelle__ : string = htmltable(
573
+						tabelle_.kopf,
574
+						tabelle_.rumpf,
575
+						false
576
+					);
577
+					let style = xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
578
+					return (style + tabelle__);
579
+				},
580
+			},
581
+			{
582
+				"name": "fsdraft-table-2d",
583
+				"funktion": (args) => (wert) => {
584
+					let senkrecht_ : string = (
585
+						(args.length > 0)
586
+						? args.shift()
587
+						: null
588
+					);
589
+					let waagerecht_ : string = (
590
+						(args.length > 0)
591
+						? args.shift()
592
+						: null
593
+					);
594
+					let senkrecht : Array<string> = (
595
+						(senkrecht_ !== null)
596
+						? senkrecht_.split("/")
597
+						: []
598
+					);
599
+					let waagerecht : Array<string> = (
600
+						(waagerecht_ !== null)
601
+						? waagerecht_.split("/")
602
+						: []
603
+					);
604
+					let tabelle : {meta : any; data : any;} = anordnen(
605
+						{
606
+							"daten": wert,
607
+							"senkrecht": senkrecht,
608
+							"waagerecht": waagerecht,
609
+						}
610
+					);
611
+					let tabelle_ : {kopf : Array<string>; rumpf : Array<Array<string>>;} = {
612
+						"kopf": (
613
+							[""].concat(
614
+								Object.keys(tabelle.meta.x).map(
615
+									(label) => (
616
+										// JSON.stringify(tabelle.meta.x[label])
617
+										objvals(tabelle.meta.x[label]).join("/")
618
+									)
619
+								)
620
+							)
621
+						),
622
+						"rumpf": tabelle.data.map(
623
+							(satz) => (
624
+								Object.keys(satz).map(
625
+									(label) => (
626
+										(label === "_")
627
+										// ? JSON.stringify(tabelle.meta.y[satz[label]])
628
+										? objvals(tabelle.meta.y[satz[label]]).join("/")
629
+										: JSON.stringify(satz[label])
630
+										/*
631
+										: (
632
+											satz[label]
633
+											.filter(x => (x["language_id"] === "flk"))
634
+											.map(x => x["words"].join(", "))
635
+											.join("; ")
636
+										)
637
+										 */
638
+									)
639
+								)
640
+							)
641
+						),
642
+					};
643
+					let tabelle__ : string = htmltable(
644
+						tabelle_.kopf,
645
+						tabelle_.rumpf,
646
+						true
647
+					);
648
+					let style = xmlwrap("style", "th,td {font-family: monospace; font-size: 0.875em;}");
649
+					return (style + tabelle__);
650
+				}
651
+			},
652
+		],
653
+	};
654
+}
655
+
... ...
@@ -2,5 +2,5 @@
2 2
 
3 3
 shift
4 4
 output=$1 && shift
5
-nodejs tools/join.js | tools/vorlage/vorlage source/content/draft.html.tpl > ${output}
5
+nodejs tools/join.js source/data | tools/vorlage/vorlage --modul=${PWD}/build/vorlage-fsdraft.js source/content/draft.html.tpl > ${output}
6 6
 
7 7
new file mode 100755
... ...
@@ -0,0 +1,9 @@
1
+#!/usr/bin/env sh
2
+
3
+input=$1
4
+output=$2
5
+
6
+name=$(basename ${input} | cut -d '.' -f 1)
7
+tsc ${input} --module commonjs --outDir $(dirname ${output})
8
+mv $(dirname ${output})/${name}.js ${output}
9
+
... ...
@@ -1,7 +1,7 @@
1 1
 const _fs = require("fs");
2 2
 
3 3
 let data_master = {};
4
-const dir_source = "source/data";
4
+const dir_source = process.argv[2];
5 5
 _fs.readdir(
6 6
 	dir_source,
7 7
 	(error, names) => {
... ...
@@ -60,6 +60,7 @@
60 60
 						"source/content/word_functions.html.tpl",
61 61
 						"source/content/word_functions-listentry.html.tpl",
62 62
 						"source/content/adpositions.html.tpl",
63
+						"source/content/adpositions-example.html.tpl",
63 64
 						"source/content/pronouns.html.tpl",
64 65
 						"source/content/dictionary.html.tpl",
65 66
 						"source/content/examples.html.tpl",
... ...
@@ -72,7 +73,22 @@
72 73
 						"build/draft.html"
73 74
 					],
74 75
 					"path": "tools/coin.sh"
75
-				}
76
+				},
77
+				"sub": [
78
+					{
79
+						"name": "vorlage-fsdraft",
80
+						"type": "script",
81
+						"parameters": {
82
+							"inputs": [
83
+								"source/vorlage/fsdraft.ts"
84
+							],
85
+							"outputs": [
86
+								"build/vorlage-fsdraft.js"
87
+							],
88
+							"path": "tools/compile-vorlagemodul.sh"
89
+						}
90
+					}
91
+				]
76 92
 			},
77 93
 			{
78 94
 				"name": "logic",
79 95
deleted file mode 100644
... ...
@@ -1,262 +0,0 @@
1
-"use strict";
2
-exports.__esModule = true;
3
-/**
4
- * @author fenris
5
- */
6
-function objvals(objekt) {
7
-    return Object.keys(objekt).map(function (key) { return objekt[key]; });
8
-}
9
-/**
10