repaired tables in content
Christian Fraß

Christian Fraß commited on 2016-08-08 21:50:25
Zeige 9 geänderte Dateien mit 203 Einfügungen und 295 Löschungen.

... ...
@@ -121,7 +121,6 @@ def main():
121 121
 		os.path.join(dirs["source"],"data","timeforms.json"),
122 122
 		os.path.join(dirs["source"],"data","adpositions.json"),
123 123
 		os.path.join(dirs["source"],"data","correlatives.json"),
124
-		os.path.join(dirs["source"],"data","x.json"),
125 124
 	]
126 125
 	
127 126
 	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/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/content/draft.html.php source/content/meta.html.php source/content/introduction.html.php source/content/preface.html.php source/content/key_parameters.html.php source/content/toc.html.php source/content/basics.html.php source/content/phonology_and_orthography.html.php source/content/grammar.html.php source/content/personal_pronouns.html.php source/content/correlatives.html.php source/content/conjugation.html.php source/content/infinite_verbforms.html.php source/content/modal_verbs.html.php source/content/tempora_and_modi.html.php source/content/negation.html.php source/content/declension.html.php source/content/numeri.html.php source/content/cases.html.php source/content/definiteness.html.php source/content/attributes.html.php source/content/sentence_structure.html.php source/content/vocabulary.html.php source/content/principles.html.php source/content/word_functions.html.php source/content/adpositions.html.php source/content/pronouns.html.php source/content/dictionary.html.php source/content/examples.html.php source/content/example_sentences.html.php source/content/example_texts.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/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/content/draft.html.php source/content/meta.html.php source/content/introduction.html.php source/content/preface.html.php source/content/key_parameters.html.php source/content/toc.html.php source/content/basics.html.php source/content/phonology_and_orthography.html.php source/content/grammar.html.php source/content/personal_pronouns.html.php source/content/correlatives.html.php source/content/conjugation.html.php source/content/infinite_verbforms.html.php source/content/modal_verbs.html.php source/content/tempora_and_modi.html.php source/content/negation.html.php source/content/declension.html.php source/content/numeri.html.php source/content/cases.html.php source/content/definiteness.html.php source/content/attributes.html.php source/content/sentence_structure.html.php source/content/vocabulary.html.php source/content/principles.html.php source/content/word_functions.html.php source/content/adpositions.html.php source/content/pronouns.html.php source/content/dictionary.html.php source/content/examples.html.php source/content/example_sentences.html.php source/content/example_texts.html.php
13 13
 	@ echo -e '-- composing document ...'
14 14
 	@ mkdir --parents build
15 15
 	@ php source/content/draft.html.php > build/draft.html
... ...
@@ -10,51 +10,77 @@
10 10
 	<p>The following list gives an overview over prepositions:</p>
11 11
 	  -->
12 12
 <?php
13
+	$data_adpositions = read_json("source/data/adpositions.json");
14
+	$data = $data_adpositions["words"];
15
+	{
16
+		{
17
+			$data = sql_cross($data, $data_adpositions["situations"]);
18
+			$data = sql_select($data, function ($row) {return ($row["situation_id"] == $row["id"]);});
19
+			$data = sql_delete($data, ["situation_id", "id"]);
20
+			$data = sql_rename($data, "name", "situation_name");
21
+		}
22
+		{
23
+			$data = sql_cross($data, $data_adpositions["types"]);
24
+			$data = sql_select($data, function ($row) {return ($row["type_id"] == $row["id"]);});
25
+			$data = sql_delete($data, ["type_id", "id"]);
26
+			$data = sql_rename($data, "name", "type_name");
27
+		}
28
+		{
29
+			$data = sql_cross($data, $data_adpositions["kinds"]);
30
+			$data = sql_select($data, function ($row) {return ($row["kind_id"] == $row["id"]);});
31
+			$data = sql_delete($data, ["kind_id", "id"]);
32
+			$data = sql_rename($data, "name", "kind_name");
33
+		}
34
+	}
35
+	
13 36
 	$table = new class_table
14 37
 	(
15 38
 		[
16
-			/*
17
-			new class_column
39
+			new class_column("Language", "language_id"),
40
+			new class_column("Situation", "situation_name"),
41
+			new class_column("Type", "type_name"),
42
+			new class_column("Kind", "kind_name"),
43
+			new class_column("Words", "words", function ($x) {return json_encode($x);}),
44
+		],
45
+		$data
46
+	);
47
+	$table = $table->snap
18 48
 	(
19
-				"Type",
20
-				function ($row)
49
+		[
50
+			"label_vertical" => function ($column) {return "";},
51
+			"columns_vertical" =>
52
+			[
53
+				$table->columns_get()[1],
54
+			],
55
+			"label_horizontal" => function ($column, $value) {return $value;},
56
+			"columns_horizontal" =>
57
+			[
58
+				$table->columns_get()[2],
59
+				$table->columns_get()[3],
60
+			],
61
+			"columns_data" =>
62
+			[
63
+				$table->columns_get()[0],
64
+				$table->columns_get()[4],
65
+			],
66
+			"data_aggregator" => function ($values)
21 67
 			{
22
-					return $row["type"];
23
-				}
24
-			),
25
-			 */
26
-			new class_column
27
-			(
28
-				"Positive absolute",
29
-				_foo("positive_absolute"),
30
-				_bar("word")
31
-			),
32
-			new class_column
33
-			(
34
-				"Positive relative",
35
-				_foo("positive_relative"),
36
-				_bar("word")
37
-			),
38
-			new class_column
39
-			(
40
-				"Positive attributive",
41
-				_foo("positive_attributive"),
42
-				_bar("word")
43
-			),
44
-			new class_column
45
-			(
46
-				"Directive absolute",
47
-				_foo("directive_absolute"),
68
+				return $values;
69
+			},
70
+			"data_formatter" => function ($value)
71
+			{
72
+				return (
48 73
 					_bar("word")
49
-			),
50
-			new class_column
51 74
 					(
52
-				"Directive relative",
53
-				_foo("directive_relative"),
54
-				_bar("word")
55
-			),
56
-		],
57
-		read_json("source/data/adpositions.json")
75
+						[
76
+							"original" => $value[0]["words"],
77
+							"translated" => $value[1]["words"],
78
+						]
79
+					)
80
+				);
81
+				return json_encode($value);
82
+			},
83
+		]
58 84
 	);
59 85
 	$table->generate();
60 86
  ?>
... ...
@@ -8,181 +8,70 @@
8 8
 	<header>Correlatives</header>
9 9
 	<?php proposal(); ?>
10 10
 <?php
11
-	$mode = 0;
12
-	switch ($mode)
11
+	$data_correlatives = read_json("source/data/correlatives.json");
12
+	$data = $data_correlatives["words"];
13 13
 	{
14
-		case 0:
15 14
 		{
16
-			$table = new class_table
17
-			(
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
74
-			(
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
-			
104
-			// get domain names
105
-			{
106
-				$data = sql_cross($data, $database["domains"]);
15
+			$data = sql_cross($data, $data_correlatives["domains"]);
16
+			$data = sql_select($data, function ($row) {return ($row["domain_id"] == $row["id"]);});
17
+			$data = sql_delete($data, ["domain_id", "id"]);
107 18
 			$data = sql_rename($data, "name", "domain_name");
108
-				$data = sql_select($data, function ($row) {return ($row["id"] == $row["domain_id"]);});
109
-				$data = sql_delete($data, ["id"]);
110 19
 		}
111
-			
112
-			// get type names
113 20
 		{
114
-				$data = sql_cross($data, $database["types"]);
21
+			$data = sql_cross($data, $data_correlatives["types"]);
22
+			$data = sql_select($data, function ($row) {return ($row["type_id"] == $row["id"]);});
23
+			$data = sql_delete($data, ["type_id", "id"]);
115 24
 			$data = sql_rename($data, "name", "type_name");
116
-				$data = sql_select($data, function ($row) {return ($row["id"] == $row["type_id"]);});
117
-				$data = sql_delete($data, ["id"]);
118
-			}
119
-			
120
-			// transform
121
-			{
122
-				$data = sql_select($data, function ($row) {global $configuration; return (($row["language"] == "fs") or ($row["language"] == $configuration["target"]));});
123
-				// $data = sql_group($data, "language");
124
-				$data = sql_add($data, ["type_name/words"], ["type_name/words" => function ($row) {return ["key" => $row["type_id"], "value" => [$row["language"] => $row["words"]]];}]);
125
-				$data = sql_project($data, ["domain_name", "type_name/words"]);
126
-				$data = sql_group
127
-				(
128
-					$data,
129
-					"domain_name",
130
-					[
131
-						"type_name/words" => function ($args)
132
-						{
133
-							$output = [];
134
-							foreach ($args as $arg)
135
-							{
136
-								if (! array_key_exists($arg["key"], $output)) $output[$arg["key"]] = [];
137
-								foreach ($arg["value"] as $key => $value)
138
-								{
139
-									$output[$arg["key"]][$key] = $value;
140 25
 		}
141 26
 	}
142
-							return $output;
143
-						},
144
-					]
145
-				);
146
-			}
147 27
 	
148 28
 	$table = new class_table
149
-			(
150
-				array_merge
151 29
 	(
152 30
 		[
153
-						new class_column("Domain", function ($row) {return $row["domain_name"];}),
154
-						// new class_column("type_name/words", function ($row) {return $row["type_name/words"];}, function ($value) {print_r($value);}),
31
+			new class_column("Language", "language_id"),
32
+			new class_column("Domain", "domain_name"),
33
+			new class_column("Type", "type_name"),
34
+			new class_column("Words", "words", function ($x) {return json_encode($x);}),
155 35
 		],
156
-					array_map
157
-					(
158
-						function ($type)
159
-						{
160
-							return (
161
-								new class_column
36
+		$data
37
+	);
38
+	$table = $table->snap
162 39
 	(
163
-									("Type: " . $type["name"]),
164
-									function ($row) use (&$type)
40
+		[
41
+			"label_vertical" => function ($column) {return "";},
42
+			"columns_vertical" =>
43
+			[
44
+				$table->columns_get()[1],
45
+			],
46
+			"label_horizontal" => function ($column, $value) {return $value;},
47
+			"columns_horizontal" =>
48
+			[
49
+				$table->columns_get()[2],
50
+			],
51
+			"columns_data" =>
52
+			[
53
+				$table->columns_get()[3],
54
+			],
55
+			"data_aggregator" => function ($values)
165 56
 			{
166
-										global $configuration;
167
-										return ["original" => $row["type_name/words"][$type["id"]]["fs"], "translated" => $row["type_name/words"][$type["id"]][$configuration["target"]]];
57
+				return $values;
168 58
 			},
59
+			"data_formatter" => function ($value)
60
+			{
61
+				return (
169 62
 					_bar("word")
63
+					(
64
+						[
65
+							"original" => $value[0]["words"],
66
+							"translated" => $value[1]["words"],
67
+						]
170 68
 					)
171 69
 				);
70
+				return json_encode($value);
172 71
 			},
173
-						array_filter($database["types"], function ($type) {return ($type["id"] != "relative");})
174
-					)
175
-				),
176
-				$data
72
+		]
177 73
 	);
178 74
 	$table->generate();
179
-			break;
180
-		}
181
-		default:
182
-		{
183
-			break;
184
-		}
185
-	}
186 75
  ?>
187 76
 <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>
188 77
 </section>
... ...
@@ -14,32 +14,32 @@
14 14
 <?php
15 15
 $data = [
16 16
 	[
17
-		"nominative",
18
-		["original" => ["en dag"], "translated" => ["a day"]],
19
-		["original" => ["de dag"], "translated" => ["the day"]],
20
-		["original" => ["dager"], "translated" => ["days"]],
21
-		["original" => ["de dager"], "translated" => ["the days"]],
17
+		"x0" => "nominative",
18
+		"x1" => ["original" => ["en dag"], "translated" => ["a day"]],
19
+		"x2" => ["original" => ["de dag"], "translated" => ["the day"]],
20
+		"x3" => ["original" => ["dager"], "translated" => ["days"]],
21
+		"x4" => ["original" => ["de dager"], "translated" => ["the days"]],
22 22
 	],
23 23
 	[
24
-		"accusative",
25
-		["original" => ["en dag"], "translated" => ["a day"]],
26
-		["original" => ["de dag"], "translated" => ["the day"]],
27
-		["original" => ["dager"], "translated" => ["days"]],
28
-		["original" => ["de dager"], "translated" => ["the days"]],
24
+		"x0" => "accusative",
25
+		"x1" => ["original" => ["en dag"], "translated" => ["a day"]],
26
+		"x2" => ["original" => ["de dag"], "translated" => ["the day"]],
27
+		"x3" => ["original" => ["dager"], "translated" => ["days"]],
28
+		"x4" => ["original" => ["de dager"], "translated" => ["the days"]],
29 29
 	],
30 30
 	[
31
-		"dative",
32
-		["original" => ["to en dag"], "translated" => ["(to) a day"]],
33
-		["original" => ["to de dag"], "translated" => ["(to) the day"]],
34
-		["original" => ["to dager"], "translated" => ["(to) days"]],
35
-		["original" => ["to de dager"], "translated" => ["(to) the days"]],
31
+		"x0" => "dative",
32
+		"x1" => ["original" => ["to en dag"], "translated" => ["(to) a day"]],
33
+		"x2" => ["original" => ["to de dag"], "translated" => ["(to) the day"]],
34
+		"x3" => ["original" => ["to dager"], "translated" => ["(to) days"]],
35
+		"x4" => ["original" => ["to de dager"], "translated" => ["(to) the days"]],
36 36
 	],
37 37
 	[
38
-		"genitive",
39
-		["original" => ["en dag(e)s","av en dag"], "translated" => ["a days","of a day"]],
40
-		["original" => ["de dag(e)s","av de dag"], "translated" => ["the days","of the day"]],
41
-		["original" => ["dager(e)s","av dager"], "translated" => ["days'","of days"]],
42
-		["original" => ["de dager(e)s","av de dager"], "translated" => ["the days'","of the days"]],
38
+		"x0" => "genitive",
39
+		"x1" => ["original" => ["en dag(e)s","av en dag"], "translated" => ["a days","of a day"]],
40
+		"x2" => ["original" => ["de dag(e)s","av de dag"], "translated" => ["the days","of the day"]],
41
+		"x3" => ["original" => ["dager(e)s","av dager"], "translated" => ["days'","of days"]],
42
+		"x4" => ["original" => ["de dager(e)s","av de dager"], "translated" => ["the days'","of the days"]],
43 43
 	],
44 44
 ];
45 45
 (new class_table
... ...
@@ -48,30 +48,30 @@ $data = [
48 48
 		new class_column
49 49
 		(
50 50
 			"Case",
51
-			function ($row) {return $row[0];}
51
+			"x0"
52 52
 		),
53 53
 		new class_column
54 54
 		(
55 55
 			"singular indefinite",
56
-			function ($row) {return $row[1];},
56
+			"x1",
57 57
 			_bar("word")
58 58
 		),
59 59
 		new class_column
60 60
 		(
61 61
 			"singular definite",
62
-			function ($row) {return $row[2];},
62
+			"x2",
63 63
 			_bar("word")
64 64
 		),
65 65
 		new class_column
66 66
 		(
67 67
 			"plural indefinite",
68
-			function ($row) {return $row[3];},
68
+			"x3",
69 69
 			_bar("word")
70 70
 		),
71 71
 		new class_column
72 72
 		(
73 73
 			"plural definite",
74
-			function ($row) {return $row[4];},
74
+			"x4",
75 75
 			_bar("word")
76 76
 		),
77 77
 	],
... ...
@@ -4,15 +4,17 @@ include_once("source/logic/server/data.php");
4 4
 include_once("source/logic/server/sql.php");
5 5
 include_once("source/logic/server/table.php");
6 6
 
7
+/*
7 8
 function convert_persona($persona) {return [0 => "impersonal", 1 => "1st person", 2 => "2nd person", 3 => "3rd person"][$persona];}
8 9
 function convert_numerus($numerus) {return [0 => null, 1 => "singular", 2 => "plural"][$numerus];}
9 10
 function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "feminine", 3 => "neuter"][$genus];}
11
+ */
10 12
  ?>
11 13
 <section class="subsection" id="personal_pronouns">
12 14
 	<header>Personal Pronouns</header>
13 15
 <?php
14
-	$data_common = read_json("../../data/common.json");
15
-	$data_pronouns = read_json("../../data/personal_pronouns.json");
16
+	$data_common = read_json("source/data/common.json");
17
+	$data_pronouns = read_json("source/data/personal_pronouns.json");
16 18
 	
17 19
 	$data = $data_pronouns["words"];
18 20
 	{
... ...
@@ -36,15 +38,21 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
36 38
 		}
37 39
 		{
38 40
 			$data = sql_cross($data, $data_pronouns["types"]);
41
+			/*
39 42
 			$data = sql_select($data, function ($row) {return ($row["type_id"] == $row["id"]);});
40 43
 			$data = sql_delete($data, ["type_id", "id"]);
41 44
 			$data = sql_rename($data, "name", "type_name");
45
+			 */
46
+			$data = sql_rename($data, "type_id", "type_name");
42 47
 		}
43 48
 		{
44 49
 			$data = sql_cross($data, $data_common["cases"]);
50
+			/*
45 51
 			$data = sql_select($data, function ($row) {return ($row["case_id"] == $row["id"]);});
46 52
 			$data = sql_delete($data, ["case_id", "id"]);
47 53
 			$data = sql_rename($data, "name", "case_name");
54
+			 */
55
+			$data = sql_rename($data, "case_id", "case_name");
48 56
 		}
49 57
 	}
50 58
 	
... ...
@@ -68,15 +76,15 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
68 76
 			"label_vertical" => function ($column) {return "";},
69 77
 			"columns_vertical" =>
70 78
 			[
71
-				$table->columns_get()[4],
72
-				$table->columns_get()[5],
79
+				$table->columns_get()[1],
80
+				$table->columns_get()[2],
81
+				$table->columns_get()[3],
73 82
 			],
74 83
 			"label_horizontal" => function ($column, $value) {return $value;},
75 84
 			"columns_horizontal" =>
76 85
 			[
77
-				$table->columns_get()[1],
78
-				$table->columns_get()[2],
79
-				$table->columns_get()[3],
86
+				$table->columns_get()[4],
87
+				$table->columns_get()[5],
80 88
 			],
81 89
 			"columns_data" =>
82 90
 			[
... ...
@@ -88,9 +96,18 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
88 96
 				return $values;
89 97
 			},
90 98
 			"data_formatter" => function ($value)
99
+			{
100
+				switch (-1)
101
+				{
102
+					case 0:
103
+					{
104
+						return _baz($value[0]["words"], "word", "fs");
105
+						// break;
106
+					}
107
+					case 1:
91 108
 					{
92 109
 						return (
93
-					_bar("words")
110
+							_bar("word")
94 111
 							(
95 112
 								[
96 113
 									"original" => $value[0]["words"],
... ...
@@ -98,7 +115,14 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
98 115
 								]
99 116
 							)
100 117
 						);
118
+						// break;
119
+					}
120
+					default:
121
+					{
101 122
 						return json_encode($value);
123
+						// break;
124
+					}
125
+				}
102 126
 			},
103 127
 		]
104 128
 	);
... ...
@@ -19,10 +19,7 @@
19 19
 			new class_column
20 20
 			(
21 21
 				"IPA-sound",
22
-				function ($row)
23
-				{
24
-					return $row["ipa"];
25
-				},
22
+				"ipa",
26 23
 				function ($value)
27 24
 				{
28 25
 					return format($value);
... ...
@@ -32,19 +29,14 @@
32 29
 			new class_column
33 30
 			(
34 31
 				"Type",
35
-				function ($row)
36
-				{
37
-					return $row["type"];
32
+				"type"];
38 33
 				}
39 34
 			),
40 35
 			 */
41 36
 			new class_column
42 37
 			(
43 38
 				"Latin letter Representation",
44
-				function ($row)
45
-				{
46
-					return $row["latin"];
47
-				},
39
+				"latin",
48 40
 				function ($value)
49 41
 				{
50 42
 					return format($value, ["letter", "lang_fs"]);
... ...
@@ -53,10 +45,7 @@
53 45
 			new class_column
54 46
 			(
55 47
 				"Runic Representation",
56
-				function ($row)
57
-				{
58
-					return $row["runic"];
59
-				},
48
+				"runic",
60 49
 				function ($value)
61 50
 				{
62 51
 					return format($value, ["letter", "lang_fs", "runic"]);
... ...
@@ -65,35 +54,26 @@
65 54
 			new class_column
66 55
 			(
67 56
 				$configuration["languagemap"]["fs"] . " Example",
68
-				function ($row)
69
-				{
70
-					return $row["examples"]["fs"];
71
-				},
57
+				"examples",
72 58
 				function ($value)
73 59
 				{
74
-					return format($value, ["word", "lang_fs"]);
60
+					return format($value["fs"], ["word", "lang_fs"]);
75 61
 				}
76 62
 			),
77 63
 			new class_column
78 64
 			(
79 65
 				$configuration["languagemap"][$configuration["target"]] . " Example",
80
-				function ($row) use (&$configuration)
81
-				{
82
-					return $row["examples"][$configuration["target"]];
83
-				},
66
+				"examples",
84 67
 				function ($value) use (&$configuration)
85 68
 				{
86
-					return format($value, ["word", "lang_" . $configuration["target"]]);
69
+					return format($value[$configuration["target"]], ["word", "lang_" . $configuration["target"]]);
87 70
 				}
88 71
 			),
89 72
 			/*
90 73
 			new class_column
91 74
 			(
92 75
 				"Remark",
93
-				function ($row)
94
-				{
95
-					return $row["remark"];
96
-				},
76
+				"remark",
97 77
 				function ($value)
98 78
 				{
99 79
 					return format($value);
... ...
@@ -9,10 +9,7 @@
9 9
 		new class_column
10 10
 		(
11 11
 			"Name",
12
-			function ($row)
13
-			{
14
-				return ["name" => $row["name"], "remark" => $row["remark"]];
15
-			},
12
+			"name_",
16 13
 			function ($value)
17 14
 			{
18 15
 				$output = $value["name"];
... ...
@@ -26,18 +23,12 @@
26 23
 		new class_column
27 24
 		(
28 25
 			"Description",
29
-			function ($row)
30
-			{
31
-				return $row["description"];
32
-			}
26
+			"description"
33 27
 		),
34 28
 		new class_column
35 29
 		(
36 30
 			"Scheme",
37
-			function ($row)
38
-			{
39
-				return $row["scheme"];
40
-			},
31
+			"scheme",
41 32
 			function ($value)
42 33
 			{
43 34
 				return format($value, ["word", "lang_fs"]);
... ...
@@ -46,15 +37,20 @@
46 37
 		new class_column
47 38
 		(
48 39
 			"Example",
49
-			function ($row)
50
-			{
51
-				global $configuration;
52
-				return ["original" => [$row["example"]["original"]], "translated" => $row["example"]["translations"][$configuration["target"]]];
53
-			},
40
+			"example_",
54 41
 			_bar("sentence")
55 42
 		),
56 43
 	],
57
-	array_slice(read_json("source/data/timeforms.json"), 0, 3)
44
+	sql_condense
45
+	(
46
+		array_slice(read_json("source/data/timeforms.json"), 0, 3),
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
+	)
58 54
 ))->generate();
59 55
 ?>
60 56
 	<p>Since these forms are built with auxiliary verbs, they can be combined straightforward to form complex expressions, e.g. <?php echo(call_user_func(_bar("sentence"), ["original" => ["Ek skal have skrivt."], "translated" => ["I will have written."]])); ?><!-- or <?php echo(call_user_func(_bar("sentence"), ["original" => ["Ek hav skalt skrive."], "translated" => ["I was going to write."]])); ?> -->.</p>
... ...
@@ -14,10 +14,7 @@
14 14
 			new class_column
15 15
 			(
16 16
 				"Affix",
17
-				function ($row)
18
-				{
19
-					return $row["affix"];
20
-				},
17
+				"affix",
21 18
 				function ($value)
22 19
 				{
23 20
 					return mark($value, ["word", "lang_fs"]);
... ...
@@ -26,10 +23,7 @@
26 23
 			new class_column
27 24
 			(
28 25
 				"Type",
29
-				function ($row)
30
-				{
31
-					return [$row["type_from"], $row["type_to"]];
32
-				},
26
+				"type_",
33 27
 				function ($value)
34 28
 				{
35 29
 					return (
... ...
@@ -51,10 +45,7 @@
51 45
 			new class_column
52 46
 			(
53 47
 				"Description",
54
-				function ($row)
55
-				{
56
-					return ["name" => $row["name"], "description" => $row["description"]];
57
-				},
48
+				"description_",
58 49
 				function ($value)
59 50
 				{
60 51
 					$output = "";
... ...
@@ -67,10 +58,7 @@
67 58
 			new class_column
68 59
 			(
69 60
 				"Cognates",
70
-				function ($row)
71
-				{
72
-					return $row["cognates"];
73
-				},
61
+				"cognates",
74 62
 				function ($value)
75 63
 				{
76 64
 					return implode(", ", array_map(function ($entry) {return ($entry["language"] . ": " . mark($entry["affix"], ["word", "lang_" . $entry["language"]]));}, $value));
... ...
@@ -80,15 +68,21 @@
80 68
 			new class_column
81 69
 			(
82 70
 				"Example",
83
-				function ($row)
84
-				{
85
-					global $configuration;
86
-					return ["original" => [$row["example"]["word"]], "translated" => $row["example"]["translations"][$configuration["target"]]];
87
-				},
71
+				"example_",
88 72
 				_bar("word")
89 73
 			),
90 74
 		],
91
-		read_json("source/data/word_functions.json")
75
+		sql_condense
76
+		(
77
+			read_json("source/data/word_functions.json"),
78
+			["type_from","type_to","name","description","example"],
79
+			["type_","description_","example_"],
80
+			[
81
+				"type_" => function ($values) {return [$values["type_from"], $values["type_to"]];},
82
+				"description_" => function ($values) {return ["name" => $values["name"], "description" => $values["description"]];},
83
+				"example_" => function ($values) {global $configuration; return ["original" => [$values["example"]["word"]], "translated" => $values["example"]["translations"][$configuration["target"]]];},
84
+			]
85
+		)
92 86
 	);
93 87
 	$table->generate();
94 88
  ?>
95 89