Browse code

minor changes; move to koralle-build-system

Christian Fraß authored on09/08/2016 01:17:44
Showing15 changed files
... ...
@@ -1,7 +1,9 @@
1 1
 temp/
2 2
 build/
3 3
 trash/
4
-deploy.sh
5
-refactor.sed
4
+
6 5
 draft.tar.xz
7 6
 
7
+tools/refactor.sed
8
+tools/deploy.sh
9
+tools/konvertieren.py
... ...
@@ -1,4 +1,4 @@
1 1
 #!/bin/bash
2 2
 
3
-python genmake.py > makefile && make $@
3
+js tools/koralle.js > makefile && make $@ ; rm makefile
4 4
 
5 5
deleted file mode 100644
... ...
@@ -1,105 +0,0 @@
1
-<project name="fs-draft" default="build">
2
-	<property environment="env">
3
-	</property>
4
-	<property name="dir.source" value="source">
5
-	</property>
6
-	<property name="dir.source.structure" value="${dir.source}/structure">
7
-	</property>
8
-	<property name="dir.source.style" value="${dir.source}/style">
9
-	</property>
10
-	<property name="dir.source.logic" value="${dir.source}/logic">
11
-	</property>
12
-	<property name="dir.source.logic.server" value="${dir.source.logic}/server">
13
-	</property>
14
-	<property name="dir.source.logic.client" value="${dir.source.logic}/client">
15
-	</property>
16
-	<property name="dir.source.media" value="${dir.source}/media">
17
-	</property>
18
-	<property name="dir.temp" value="temp">
19
-	</property>
20
-	<property name="dir.build" value="build">
21
-	</property>
22
-	<property name="cmd.php" value="php">
23
-	</property>
24
-	<property name="cmd.lessc" value="lessc">
25
-	</property>
26
-	<target name="build" depends="build-structure,build-style,build-logic,build-media">
27
-	</target>
28
-	<target name="build-structure">
29
-		<mkdir dir="${dir.build}">
30
-		</mkdir>
31
-		<exec executable="${cmd.php}" output="${dir.build}/draft.html">
32
-			<arg value="${dir.source.structure}/draft.html.php">
33
-			</arg>
34
-		</exec>
35
-	</target>
36
-	<target name="build-style">
37
-		<mkdir dir="${dir.temp}">
38
-		</mkdir>
39
-		<concat destfile="${dir.temp}/draft.less">
40
-			<filelist dir=".">
41
-				<file name="${dir.source.style}/functions.less">
42
-				</file>
43
-			 	<file name="${dir.source.style}/theme.less">
44
-				</file>
45
-			 	<file name="${dir.source.style}/common.less">
46
-				</file>
47
-			 	<file name="${dir.source.style}/concrete.less">
48
-				</file>
49
-			</filelist>
50
-		</concat>
51
-		<mkdir dir="${dir.build}">
52
-		</mkdir>
53
-		<exec executable="${cmd.lessc}">
54
-			<arg value="${dir.temp}/draft.less">
55
-			</arg>
56
-			<arg value="${dir.build}/draft.css">
57
-			</arg>
58
-		</exec>
59
-	</target>
60
-	<target name="build-logic">
61
-		<mkdir dir="${dir.build}">
62
-		</mkdir>
63
-		<concat destfile="${dir.build}/draft.js">
64
-			<filelist dir=".">
65
-				<file name="${dir.source.logic.client}/tools.js">
66
-				</file>
67
-				<file name="${dir.source.logic.client}/table.js">
68
-				</file>
69
-				<file name="${dir.source.logic.client}/toc.js">
70
-				</file>
71
-				<file name="${dir.source.logic.client}/main.js">
72
-				</file>
73
-			</filelist>
74
-		</concat>
75
-	</target>
76
-	<target name="build-media">
77
-		<mkdir dir="${dir.build}">
78
-		</mkdir>
79
-		<copy file="${dir.source.media}/logo.svg" tofile="${dir.build}/logo.svg">
80
-		</copy>
81
-		<copy file="${dir.source.media}/folksprak_16x16.png" tofile="${dir.build}/favicon.png">
82
-		</copy>
83
-	</target>
84
-	<target name="clean">
85
-		<delete dir="${dir.temp}">
86
-		</delete>
87
-	</target>
88
-	<target name="clear" depends="clean,clear-structure,clear-style,clear-logic">
89
-		<delete dir="${dir.build}">
90
-		</delete>
91
-	</target>
92
-	<target name="clear-structure">
93
-		<delete file="${dir.build}/draft.html">
94
-		</delete>
95
-	</target>
96
-	<target name="clear-style">
97
-		<delete file="${dir.build}/draft.css">
98
-		</delete>
99
-	</target>
100
-	<target name="clear-logic">
101
-		<delete file="${dir.build}/draft.js">
102
-		</delete>
103
-	</target>
104
-</project>
105
-
106 0
deleted file mode 100644
... ...
@@ -1,282 +0,0 @@
1
-import os
2
-import sys
3
-
4
-
5
-class class_rule(object):
6
-	
7
-	def __init__(self, name, dependencies, commands, phony = False):
8
-		self.name = name
9
-		self.dependencies = dependencies
10
-		self.commands = commands
11
-		self.phony = phony
12
-		
13
-	
14
-	def __str__(self):
15
-		output = ""
16
-		output += "%s: %s\n" % (self.name, " ".join(self.dependencies))
17
-		for command in self.commands:
18
-			output += ("\t@ %s\n" % (command.compile_unix()))
19
-		if (self.phony): output += (".PHONY: %s\n" % self.name)
20
-		return output
21
-		
22
-	
23
-
24
-class class_command(object):
25
-	def __init__(self, parameters): self.parameters = parameters
26
-	def compile_unix(self): raise NotImplementedError
27
-	def compile_ant(self): raise NotImplementedError
28
-
29
-class class_command_log(class_command):
30
-	def __init__(self, parameters): class_command.__init__(self, parameters)
31
-	def compile_unix(self): return ("echo -e '-- %s'" % (self.parameters["message"]))
32
-
33
-class class_command_directory_create(class_command):
34
-	def __init__(self, parameters): class_command.__init__(self, parameters)
35
-	def compile_unix(self): return ("mkdir --parents %s" % (self.parameters["path"]))
36
-
37
-class class_command_file_copy(class_command):
38
-	def __init__(self, parameters): class_command.__init__(self, parameters)
39
-	def compile_unix(self): return ("cp --recursive %s %s" % (self.parameters["path-from"], self.parameters["path-to"]))
40
-
41
-class class_command_file_concat(class_command):
42
-	def __init__(self, parameters): class_command.__init__(self, parameters)
43
-	def compile_unix(self): return ("cat %s > %s" % (" ".join(self.parameters["paths-from"]), self.parameters["path-to"]))
44
-
45
-class class_command_directory_remove(class_command):
46
-	def __init__(self, parameters): class_command.__init__(self, parameters)
47
-	def compile_unix(self): return ("rm --recursive --force %s" % (self.parameters["path"]))
48
-
49
-class class_command_image_convert(class_command):
50
-	def __init__(self, parameters): class_command.__init__(self, parameters)
51
-	def compile_unix(self): return ("convert %s %s" % (self.parameters["path-from"], self.parameters["path-to"]))
52
-
53
-class class_command_latex_compile(class_command):
54
-	def __init__(self, parameters): class_command.__init__(self, parameters)
55
-	def compile_unix(self): return ("xelatex -output-directory=%s %s > /dev/null" % (self.parameters["output"], self.parameters["path"]))
56
-
57
-class class_command_php_compile(class_command):
58
-	def __init__(self, parameters): class_command.__init__(self, parameters)
59
-	def compile_unix(self): return ("php %s > %s" % (self.parameters["path-from"], self.parameters["path-to"]))
60
-
61
-class class_command_lessc_compile(class_command):
62
-	def __init__(self, parameters): class_command.__init__(self, parameters)
63
-	def compile_unix(self): return ("lessc %s > %s" % (self.parameters["path-from"], self.parameters["path-to"]))
64
-
65
-
66
-
67
-def main():
68
-	
69
-	dirs = {
70
-		"source": "source",
71
-		"temp": "temp",
72
-		"build": "build",
73
-	}
74
-	
75
-	parts_logic_server = [
76
-		os.path.join(dirs["source"],"logic","server","misc.php"),
77
-		os.path.join(dirs["source"],"logic","server","data.php"),
78
-		os.path.join(dirs["source"],"logic","server","settings.php"),
79
-		os.path.join(dirs["source"],"logic","server","table.php"),
80
-		os.path.join(dirs["source"],"logic","server","sql.php"),
81
-	]
82
-	
83
-	parts_content = [
84
-		os.path.join(dirs["source"],"content","draft.html.php"),
85
-		os.path.join(dirs["source"],"content","meta.html.php"),
86
-		os.path.join(dirs["source"],"content","introduction.html.php"),
87
-		os.path.join(dirs["source"],"content","preface.html.php"),
88
-		os.path.join(dirs["source"],"content","key_parameters.html.php"),
89
-		os.path.join(dirs["source"],"content","toc.html.php"),
90
-		os.path.join(dirs["source"],"content","basics.html.php"),
91
-		os.path.join(dirs["source"],"content","phonology_and_orthography.html.php"),
92
-		os.path.join(dirs["source"],"content","grammar.html.php"),
93
-		os.path.join(dirs["source"],"content","personal_pronouns.html.php"),
94
-		os.path.join(dirs["source"],"content","correlatives.html.php"),
95
-		os.path.join(dirs["source"],"content","conjugation.html.php"),
96
-		os.path.join(dirs["source"],"content","infinite_verbforms.html.php"),
97
-		os.path.join(dirs["source"],"content","modal_verbs.html.php"),
98
-		os.path.join(dirs["source"],"content","tempora_and_modi.html.php"),
99
-		os.path.join(dirs["source"],"content","negation.html.php"),
100
-		os.path.join(dirs["source"],"content","declension.html.php"),
101
-		os.path.join(dirs["source"],"content","numeri.html.php"),
102
-		os.path.join(dirs["source"],"content","cases.html.php"),
103
-		os.path.join(dirs["source"],"content","definiteness.html.php"),
104
-		os.path.join(dirs["source"],"content","attributes.html.php"),
105
-		os.path.join(dirs["source"],"content","sentence_structure.html.php"),
106
-		os.path.join(dirs["source"],"content","vocabulary.html.php"),
107
-		os.path.join(dirs["source"],"content","principles.html.php"),
108
-		os.path.join(dirs["source"],"content","word_functions.html.php"),
109
-		os.path.join(dirs["source"],"content","adpositions.html.php"),
110
-		os.path.join(dirs["source"],"content","pronouns.html.php"),
111
-		os.path.join(dirs["source"],"content","dictionary.html.php"),
112
-		os.path.join(dirs["source"],"content","examples.html.php"),
113
-		os.path.join(dirs["source"],"content","example_sentences.html.php"),
114
-		os.path.join(dirs["source"],"content","example_texts.html.php"),
115
-	]
116
-	
117
-	parts_data = [
118
-		os.path.join(dirs["source"],"data","phonology_and_orthography.json"),
119
-		os.path.join(dirs["source"],"data","personal_pronouns.json"),
120
-		os.path.join(dirs["source"],"data","word_functions.json"),
121
-		os.path.join(dirs["source"],"data","timeforms.json"),
122
-		os.path.join(dirs["source"],"data","adpositions.json"),
123
-		os.path.join(dirs["source"],"data","correlatives.json"),
124
-	]
125
-	
126
-	parts_logic_client = [
127
-		os.path.join(dirs["source"],"logic","client","tools.js"),
128
-		os.path.join(dirs["source"],"logic","client","table.js"),
129
-		os.path.join(dirs["source"],"logic","client","toc.js"),
130
-		os.path.join(dirs["source"],"logic","client","main.js"),
131
-	]
132
-	
133
-	parts_style = [
134
-		os.path.join(dirs["source"],"style","functions.less"),
135
-		os.path.join(dirs["source"],"style","theme.less"),
136
-		os.path.join(dirs["source"],"style","common.less"),
137
-		os.path.join(dirs["source"],"style","concrete.less"),
138
-	]
139
-	
140
-	rules = []
141
-	rules.append(
142
-		class_rule(
143
-			"all",
144
-			[
145
-				os.path.join(dirs["build"],"draft.html"),
146
-				os.path.join(dirs["build"],"draft.css"),
147
-				os.path.join(dirs["build"],"draft.js"),
148
-				os.path.join(dirs["build"],"logo.svg"),
149
-				os.path.join(dirs["build"],"favicon.png"),
150
-			],
151
-			[],
152
-			True
153
-		)
154
-	)
155
-	rules.append(
156
-		class_rule(
157
-			"clean",
158
-			[],
159
-			[
160
-				class_command_directory_remove({
161
-					"path": dirs["temp"],
162
-				}),
163
-			],
164
-			True
165
-		)
166
-	)
167
-	rules.append(
168
-		class_rule(
169
-			"clear",
170
-			["clean"],
171
-			[
172
-				class_command_directory_remove({
173
-					"path": dirs["build"],
174
-				}),
175
-			],
176
-			True
177
-		)
178
-	)
179
-	rules.append(
180
-		class_rule(
181
-			os.path.join(dirs["build"],"draft.html"),
182
-			parts_data + parts_logic_server + parts_content,
183
-			[
184
-				class_command_log({
185
-					"message": "composing document ..."
186
-				}),
187
-				class_command_directory_create({
188
-					"path": dirs["build"],
189
-				}),
190
-				class_command_php_compile({
191
-					"path-from": os.path.join(dirs["source"],"content","draft.html.php"),
192
-					"path-to": os.path.join(dirs["build"],"draft.html"),
193
-				}),
194
-			]
195
-		)
196
-	)
197
-	rules.append(
198
-		class_rule(
199
-			os.path.join(dirs["build"],"draft.js"),
200
-			parts_logic_client,
201
-			[
202
-				class_command_log({
203
-					"message": "composing client-logic ..."
204
-				}),
205
-				class_command_directory_create({
206
-					"path": dirs["build"],
207
-				}),
208
-				class_command_file_concat({
209
-					"paths-from": parts_logic_client,
210
-					"path-to": os.path.join(dirs["build"],"draft.js"),
211
-				}),
212
-			]
213
-		)
214
-	)
215
-	rules.append(
216
-		class_rule(
217
-			os.path.join(dirs["build"],"logo.svg"),
218
-			[os.path.join(dirs["source"],"media","logo.svg")],
219
-			[
220
-				class_command_log({
221
-					"message": "copying logo ..."
222
-				}),
223
-				class_command_directory_create({
224
-					"path": dirs["build"],
225
-				}),
226
-				class_command_file_copy({
227
-					"path-from": os.path.join(dirs["source"],"media","logo.svg"),
228
-					"path-to": os.path.join(dirs["build"],"logo.svg"),
229
-				}),
230
-			]
231
-		)
232
-	)
233
-	rules.append(
234
-		class_rule(
235
-			os.path.join(dirs["build"],"favicon.png"),
236
-			[os.path.join(dirs["source"],"media","folksprak_16x16.png")],
237
-			[
238
-				class_command_log({
239
-					"message": "copying favicon ..."
240
-				}),
241
-				class_command_directory_create({
242
-					"path": dirs["build"],
243
-				}),
244
-				class_command_file_copy({
245
-					"path-from": os.path.join(dirs["source"],"media","folksprak_16x16.png"),
246
-					"path-to": os.path.join(dirs["build"],"favicon.png"),
247
-				}),
248
-			]
249
-		)
250
-	)
251
-	rules.append(
252
-		class_rule(
253
-			os.path.join(dirs["build"],"draft.css"),
254
-			parts_style,
255
-			[
256
-				class_command_log({
257
-					"message": "compiling style ..."
258
-				}),
259
-				class_command_directory_create({
260
-					"path": os.path.join(dirs["temp"]),
261
-				}),
262
-				class_command_file_concat({
263
-					"paths-from": parts_style,
264
-					"path-to": os.path.join(dirs["temp"],"draft.less"),
265
-				}),
266
-				class_command_directory_create({
267
-					"path": os.path.join(dirs["build"]),
268
-				}),
269
-				class_command_lessc_compile({
270
-					"path-from": os.path.join(dirs["temp"],"draft.less"),
271
-					"path-to": os.path.join(dirs["build"],"draft.css"),
272
-				}),
273
-			]
274
-		)
275
-	)
276
-	
277
-	for rule in rules: print(rule)
278
-	sys.stderr.write("\n[information]\tThe output of this script is meant to be redirected into a GNU-makefile\n")
279
-	
280
-
281
-main()
282
-
283 0
deleted file mode 100644
... ...
@@ -1,171 +0,0 @@
1
-import os
2
-import sys
3
-
4
-
5
-class class_rule(object):
6
-	
7
-	def __init__(self, name, dependencies, commands, phony = False):
8
-		self.name = name
9
-		self.dependencies = dependencies
10
-		self.commands = commands
11
-		self.phony = phony
12
-		
13
-	
14
-	def __str__(self):
15
-		output = ""
16
-		output += "%s: %s\n" % (self.name, " ".join(self.dependencies))
17
-		for command in self.commands:
18
-			output += ("\t@ %s\n" % (command.compile_unix()))
19
-		if (self.phony): output += (".PHONY: %s\n" % self.name)
20
-		return output
21
-		
22
-	
23
-
24
-class class_command(object):
25
-	def __init__(self, parameters): self.parameters = parameters
26
-	def compile_unix(self): raise NotImplementedError
27
-	def compile_ant(self): raise NotImplementedError
28
-
29
-class class_command_log(class_command):
30
-	def __init__(self, parameters): class_command.__init__(self, parameters)
31
-	def compile_unix(self): return ("echo -e '-- %s'" % (self.parameters["message"]))
32
-
33
-class class_command_directory_create(class_command):
34
-	def __init__(self, parameters): class_command.__init__(self, parameters)
35
-	def compile_unix(self): return ("mkdir --parents %s" % (self.parameters["path"]))
36
-
37
-class class_command_file_copy(class_command):
38
-	def __init__(self, parameters): class_command.__init__(self, parameters)
39
-	def compile_unix(self): return ("cp --recursive %s %s" % (self.parameters["path-from"], self.parameters["path-to"]))
40
-
41
-class class_command_directory_remove(class_command):
42
-	def __init__(self, parameters): class_command.__init__(self, parameters)
43
-	def compile_unix(self): return ("rm --recursive --force %s" % (self.parameters["path"]))
44
-
45
-class class_command_image_convert(class_command):
46
-	def __init__(self, parameters): class_command.__init__(self, parameters)
47
-	def compile_unix(self): return ("convert %s %s" % (self.parameters["path-from"], self.parameters["path-to"]))
48
-
49
-class class_command_latex_compile(class_command):
50
-	def __init__(self, parameters): class_command.__init__(self, parameters)
51
-	def compile_unix(self): return ("xelatex -output-directory=%s %s > /dev/null" % (self.parameters["output"], self.parameters["path"]))
52
-
53
-
54
-
55
-def main():
56
-	
57
-	dirs = {
58
-		"source": "source",
59
-		"temp": "temp",
60
-		"build": "build",
61
-	}
62
-	
63
-	texs = [
64
-		os.path.join(dirs["source"],"tex","folksprak.tex"),
65
-		os.path.join(dirs["source"],"tex","packages.tex"),
66
-		os.path.join(dirs["source"],"tex","settings.tex"),
67
-		os.path.join(dirs["source"],"tex","meta.tex"),
68
-		os.path.join(dirs["source"],"tex","commands.tex"),
69
-		os.path.join(dirs["source"],"tex","preface.tex"),
70
-		os.path.join(dirs["source"],"tex","grammar.tex"),
71
-		os.path.join(dirs["source"],"tex","phonology_and_orthography.tex"),
72
-		os.path.join(dirs["source"],"tex","conjugation.tex"),
73
-		os.path.join(dirs["source"],"tex","declension.tex"),
74
-		os.path.join(dirs["source"],"tex","attributes.tex"),
75
-	]
76
-	
77
-	rules = []
78
-	rules.append(
79
-		class_rule(
80
-			"all",
81
-			[os.path.join(dirs["build"],"folksprak.pdf")],
82
-			[],
83
-			True
84
-		)
85
-	)
86
-	rules.append(
87
-		class_rule(
88
-			"clean",
89
-			[],
90
-			[
91
-				class_command_directory_remove({
92
-					"path": dirs["temp"],
93
-				}),
94
-			],
95
-			True
96
-		)
97
-	)
98
-	rules.append(
99
-		class_rule(
100
-			"clear",
101
-			["clean"],
102
-			[
103
-				class_command_directory_remove({
104
-					"path": dirs["build"],
105
-				}),
106
-			],
107
-			True
108
-		)
109
-	)
110
-	rules.append(
111
-		class_rule(
112
-			os.path.join(dirs["temp"],"media","logo.pdf"),
113
-			[os.path.join(dirs["source"],"media","logo.svg")],
114
-			[
115
-				class_command_log({
116
-					"message": "converting logo ..."
117
-				}),
118
-				class_command_directory_create({
119
-					"path": os.path.join(dirs["temp"],"media"),
120
-				}),
121
-				class_command_image_convert({
122
-					"path-from": os.path.join(dirs["source"],"media","logo.svg"),
123
-					"path-to": os.path.join(dirs["temp"],"media","logo.pdf"),
124
-				}),
125
-			]
126
-		)
127
-	)
128
-	rules.append(
129
-		class_rule(
130
-			os.path.join(dirs["temp"],"folksprak.pdf"),
131
-			texs + [os.path.join(dirs["temp"],"media","logo.pdf")],
132
-			[
133
-				class_command_log({
134
-					"message": "compiling document ..."
135
-				}),
136
-				class_command_directory_create({
137
-					"path": dirs["temp"],
138
-				}),
139
-				class_command_latex_compile({
140
-					"path": os.path.join(dirs["source"],"tex","folksprak.tex"),
141
-					"output": os.path.join(dirs["temp"]),
142
-				}),
143
-				class_command_latex_compile({
144
-					"path": os.path.join(dirs["source"],"tex","folksprak.tex"),
145
-					"output": os.path.join(dirs["temp"]),
146
-				}),
147
-			]
148
-		)
149
-	)
150
-	rules.append(
151
-		class_rule(
152
-			os.path.join(dirs["build"],"folksprak.pdf"),
153
-			[os.path.join(dirs["temp"],"folksprak.pdf")],
154
-			[
155
-				class_command_directory_create({
156
-					"path": os.path.join(dirs["build"]),
157
-				}),
158
-				class_command_file_copy({
159
-					"path-from": os.path.join(dirs["temp"],"folksprak.pdf"),
160
-					"path-to": os.path.join(dirs["build"],"folksprak.pdf"),
161
-				}),
162
-			]
163
-		)
164
-	)
165
-	
166
-	for rule in rules: print(rule)
167
-	sys.stderr.write("\n[information]\tThe output of this script is meant to be redirected into a GNU-makefile\n")
168
-	
169
-
170
-main()
171
-
172 0
deleted file mode 100644
... ...
@@ -1,38 +0,0 @@
1
-all: build/draft.html build/draft.css build/draft.js build/logo.svg build/favicon.png
2
-.PHONY: all
3
-
4
-clean: 
5
-	@ rm --recursive --force temp
6
-.PHONY: clean
7
-
8
-clear: clean
9
-	@ rm --recursive --force build
10
-.PHONY: clear
11
-
12
-build/draft.html: source/data/phonology_and_orthography.json source/data/personal_pronouns.json source/data/word_functions.json source/data/timeforms.json source/data/adpositions.json source/data/correlatives.json source/logic/server/misc.php source/logic/server/data.php source/logic/server/settings.php source/logic/server/table.php source/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
-	@ echo -e '-- composing document ...'
14
-	@ mkdir --parents build
15
-	@ php source/content/draft.html.php > build/draft.html
16
-
17
-build/draft.js: source/logic/client/tools.js source/logic/client/table.js source/logic/client/toc.js source/logic/client/main.js
18
-	@ echo -e '-- composing client-logic ...'
19
-	@ mkdir --parents build
20
-	@ cat source/logic/client/tools.js source/logic/client/table.js source/logic/client/toc.js source/logic/client/main.js > build/draft.js
21
-
22
-build/logo.svg: source/media/logo.svg
23
-	@ echo -e '-- copying logo ...'
24
-	@ mkdir --parents build
25
-	@ cp --recursive source/media/logo.svg build/logo.svg
26
-
27
-build/favicon.png: source/media/folksprak_16x16.png
28
-	@ echo -e '-- copying favicon ...'
29
-	@ mkdir --parents build
30
-	@ cp --recursive source/media/folksprak_16x16.png build/favicon.png
31
-
32
-build/draft.css: source/style/functions.less source/style/theme.less source/style/common.less source/style/concrete.less
33
-	@ echo -e '-- compiling style ...'
34
-	@ mkdir --parents temp
35
-	@ cat source/style/functions.less source/style/theme.less source/style/common.less source/style/concrete.less > temp/draft.less
36
-	@ mkdir --parents build
37
-	@ lessc temp/draft.less > build/draft.css
38
-
39 0
new file mode 100644
... ...
@@ -0,0 +1,103 @@
1
+{
2
+	"name": "fs-draft",
3
+	"version": "0.0.1",
4
+	"roottask": {
5
+		"name": "build",
6
+		"type": "group",
7
+		"sub": [
8
+			{
9
+				"name": "structure",
10
+				"type": "php",
11
+				"parameters": {
12
+					"inputs": [
13
+						"source/content/draft.html.php",
14
+						"source/data/phonology_and_orthography.json",
15
+						"source/data/personal_pronouns.json",
16
+						"source/data/word_functions.json",
17
+						"source/data/timeforms.json",
18
+						"source/data/adpositions.json",
19
+						"source/data/correlatives.json",
20
+						"source/logic/server/misc.php",
21
+						"source/logic/server/data.php",
22
+						"source/logic/server/settings.php",
23
+						"source/logic/server/table.php",
24
+						"source/logic/server/sql.php",
25
+						"source/content/meta.html.php",
26
+						"source/content/introduction.html.php",
27
+						"source/content/preface.html.php",
28
+						"source/content/key_parameters.html.php",
29
+						"source/content/toc.html.php",
30
+						"source/content/basics.html.php",
31
+						"source/content/phonology_and_orthography.html.php",
32
+						"source/content/grammar.html.php",
33
+						"source/content/personal_pronouns.html.php",
34
+						"source/content/correlatives.html.php",
35
+						"source/content/conjugation.html.php",
36
+						"source/content/infinite_verbforms.html.php",
37
+						"source/content/modal_verbs.html.php",
38
+						"source/content/tempora_and_modi.html.php",
39
+						"source/content/negation.html.php",
40
+						"source/content/declension.html.php",
41
+						"source/content/numeri.html.php",
42
+						"source/content/cases.html.php",
43
+						"source/content/definiteness.html.php",
44
+						"source/content/attributes.html.php",
45
+						"source/content/sentence_structure.html.php",
46
+						"source/content/vocabulary.html.php",
47
+						"source/content/principles.html.php",
48
+						"source/content/word_functions.html.php",
49
+						"source/content/adpositions.html.php",
50
+						"source/content/pronouns.html.php",
51
+						"source/content/dictionary.html.php",
52
+						"source/content/examples.html.php",
53
+						"source/content/example_sentences.html.php",
54
+						"source/content/example_texts.html.php"
55
+					],
56
+					"output": "build/draft.html",
57
+					"only_first": true
58
+				}
59
+			},
60
+			{
61
+				"name": "logic",
62
+				"type": "concat",
63
+				"parameters": {
64
+					"inputs": [
65
+						"source/logic/client/tools.js",
66
+						"source/logic/client/table.js",
67
+						"source/logic/client/toc.js",
68
+						"source/logic/client/main.js"
69
+					],
70
+					"output": "build/draft.js"
71
+				}
72
+			},
73
+			{
74
+				"name": "style",
75
+				"type": "lesscss",
76
+				"parameters": {
77
+					"inputs": [
78
+						"source/style/functions.less",
79
+						"source/style/theme.less",
80
+						"source/style/common.less",
81
+						"source/style/concrete.less"
82
+					],
83
+					"output": "build/draft.css"
84
+				}
85
+			},
86
+			{
87
+				"name": "media",
88
+				"type": "group",
89
+				"sub": [
90
+					{
91
+						"name": "logo",
92
+						"type": "copy",
93
+						"parameters": {
94
+							"input": "source/media/logo.svg",
95
+							"output": "build/logo.svg"
96
+						}
97
+					}
98
+				]
99
+			}
100
+		]
101
+	}
102
+}
103
+
... ...
@@ -1 +1 @@
1
-In order to build the project, you need Apache Ant, a CLI php-interpreter and a LessCSS-compiler
1
+In order to build the project, you need a up-to-date JS-interpreter, GNU-Make or Apache Ant, a CLI php-interpreter and a LessCSS-compiler
... ...
@@ -73,6 +73,6 @@
73 73
 	);
74 74
 	$table->generate();
75 75
  ?>
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>
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>
77 77
 </section>
78 78
 
... ...
@@ -3,12 +3,12 @@
3 3
 	<section class="subsection pseudo" id="de_grot_diktator">
4 4
 		<header>De grot diktator</header>
5 5
 		<span class="text lang_fs">
6
-			<p>Ek bid fur fargivung, dok ek vil nit are de verlds herskar — ek ar nit solk en man. Ek vil nit beherske odar neddrüke et man, insted ek vil helpe de maner alvan önd alvar: De judisk, de hejdisk, de fargig, de vit, …. Vi al skal helpe en de ander fur at vi kön leve ine en beter verld. Vi vil nit hate odar farakte us. Dis verld hav plats fur al maner önd ur erd ar so rik, at vi al kön spise nok. De levrid kön are so fri önd skön; dok vi hav farlatet de veg.</p>
7
-			<p>Gridhed hav sükent de maners seler önd hav fült de verld med hatrid; het hav ledet us to elend önd blutsketrid. Vi hav utvikelt raskhed, dok ur gester stan stil. Vi lat makiner verke fur us; ur vetrid hav makt us hokmudig önd ur klughed hard önd unfrendlik; vi denk altu mang önd föl altu lit. Dok mer den makiner vi treng manlikhed; mer den klughed vi treng frendlikhed önd gudhed. An dis egenheder, ur levrid ar frükridig önd al ding ar lost.</p>
8
-			<p>Med de helprid av flütüger önd de radio vi ar narer en to de ander den et tid ruk. De manskap treng enhed önd en alvar arend bruderlikhed fur tu bruke dis utfindunger gud. Selv no mang tused in der verld kön höre min stem, mang tusend fartvivelt verer, kviner önd smal kinder — ofarunger av en sistem, vilk fang önd kvel unskuldig maner. Ek rup to al, vilk kön hör mig no: Fartvivel nit! De elend skal farsvinde, van de gridhed farsvind önd de biterhed av maner, vilk frük de manskaps forskritrid. De Maners hatrid skal farsvinde önd diktarorer skal döe. Dan de kraft, vilk di hav takt fra de folk, skal kome bak to de folk. Selv ef mang blud ar sketet: Tu kempe fur de frihed ar en gud sak.</p>
9
-			<p>Kemparer: Kemp nit fur tiraner; maner, vilk farakt ju önd mak ju to sklaver; vilk vertskat nit jur levrid, vilk seg to ju, vat je skal make, true önd föle! Di skend ju, föd ju, behandel ju lik kanon-födung. Kemp nit fur dis fardervt maner — makin-maner med makin-hövder önd makin-herter! Je ar nit makiner, je ar nit direr, je ar maner. Lat de manlikhed blive ine jur herter! Je skal nit hate; bar de unlivt hat, de unlivt önd de fardervt.</p>
10
-			<p>Kemperar: Kemp nit fur de sklavskap! Kemp fur de frihed! Ine de 17. avsnidung av de hajlig Lukas ar skrivt: ‚God ar ine al maner.‘ — nit bar ine en grup av maner, insted ine al maner, ine ju. Je, de folk, hav de kraft; de kraft fur tu bue vapener, dok ok de kraft fur tu sprede gladhed. Je, de folk, hav de kraft fur tu make dis levrid fri önd skön, fur tu make dis levrid en vunderfült sak. Darfur: Ine de nam av folkherskrid: Lat us bruke dis kraft! Lat us verde en! Lat us kempe fur en nü verld, fur en beter verld, vilk giv to de maner magrid tu verke, vilk giv en eftertid to de jung önd sikerhed to de old. Ok de tiraner hav truent dis to us fur tu foe de vold, dok di hav lügt. Di mak nit sant dir luvung, di ing tid vil. Tiraner frien bar dim selv, dok de folk skal blive sklaver.</p>
11
-			<p>Lat us no kempe fur tu upfüle dis luvung. Lat us kempe fur tu make de verld fri, fur tu uvervinde landmarker, gridhed, hatrid önd de untillatrid. Lat us kempe fur en verld med farstanrid, en verld, var vetridskap önd forskritrid skal lede to al mans gladhed.</p>
6
+			<p>Ek bid fur fargivung, dok ek vil nit are de verlds herskar — ek ar nit solk en man. Ek vil nit beherske odar neddrüke et man, insted ek vil helpe de maner alvan and alvar: De judisk, de hejdisk, de fargig, de vit, …. Vi al skal helpe en de ander fur at vi kön leve ine en beter verld. Vi vil nit hate odar farakte us. Dis verld hav plats fur al maner and ur erd ar so rik, at vi al kön spise nok. De levrid kön are so fri and skön; dok vi hav farlatet de veg.</p>
7
+			<p>Gridhed hav sükent de maners seler and hav fült de verld med hatrid; hit hav ledet us to elend and blutsketrid. Vi hav utvikelt raskhed, dok ur gester stan stil. Vi lat makiner verke fur us; ur vetrid hav makt us hokmudig and ur klughed hard and unfrendlik; vi denk altu mang and föl altu lit. Dok mer den makiner vi treng manlikhed; mer den klughed vi treng frendlikhed and gudhed. An dis egenheder, ur levrid ar frükridig and al ding ar lost.</p>
8
+			<p>Med de helprid av flügtüger and de radio vi ar narer en to de ander den et tid ruk. De manskap treng enhed and en alvar arend bruderlikhed fur tu bruke dis utfindunger gud. Selv no mang tused in der verld kön höre min stem, mang tusend fartvivelt verer, kviner and smal kinder — ofarunger av en sistem, vilk fang and kvel unskuldig maner. Ek rup to al, vilk kön hör mek no: Fartvivel nit! De elend skal farsvinde, van de gridhed farsvind and de biterhed av maner, vilk frük de manskaps forskritrid. De Maners hatrid skal farsvinde and diktarorer skal döe. Dan de kraft, vilk di hav takt fra de folk, skal kome bak to de folk. Selv ef mang blud ar sketet: Tu kempe fur de frihed ar en gud sak.</p>
9
+			<p>Kemparer: Kemp nit fur tiraner; maner, vilk farakt ju and mak ju to sklaver; vilk vertskat nit jer levrid, vilk seg to ju, vat je skal make, true and föle! Di skend ju, föd ju, behandel ju lik kanon-födung. Kemp nit fur dis fardervt maner — makin-maner med makin-hövder and makin-herter! Je ar nit makiner, je ar nit direr, je ar maner. Lat de manlikhed blive ine jer herter! Je skal nit hate; bar de unlivt hat, de unlivt and de fardervt.</p>
10
+			<p>Kemperar: Kemp nit fur de sklavskap! Kemp fur de frihed! Ine de 17. avsnidung av de hajlig Lukas ar skrivt: ‚God ar ine al maner.‘ — nit bar ine en grup av maner, insted ine al maner, ine ju. Je, de folk, hav de kraft; de kraft fur tu bue vapener, dok ok de kraft fur tu sprede gladhed. Je, de folk, hav de kraft fur tu make dis levrid fri and skön, fur tu make dis levrid en vunderfült sak. Darfur: Ine de nam av folkherskrid: Lat us bruke dis kraft! Lat us verde en! Lat us kempe fur en nü verld, fur en beter verld, vilk giv to de maner magrid tu verke, vilk giv en eftertid to de jung and sikerhed to de old. Ok de tiraner hav truent dis to us fur tu foe de vold, dok di hav lügt. Di mak nit sant dir luvung, di ing tid vil. Tiraner frien bar sek selv, dok de folk skal blive sklaver.</p>
11
+			<p>Lat us no kempe fur tu upfüle dis luvung. Lat us kempe fur tu make de verld fri, fur tu uvervinde landmarker, gridhed, hatrid and de untillatrid. Lat us kempe fur en verld med farstanrid, en verld, var vetridskap and forskritrid skal lede to al mans gladhed.</p>
12 12
 			<p>Kemparer: Ine de nam av folkherskrid: Lat us al verde en!</p>
13 13
 		</span>
14 14
 		<p>An attempt to translate the final speech from the famous Charlie Chaplin movie "The great dictator" (with some passages inspired by the German translation); the English original can be listened to <a href="https://www.youtube.com/watch?v=ibVpDhW6kDQ">on youtube</a>; or in case you'd like to hear a more heart-wrenching version: <a href="https://www.youtube.com/watch?v=Gaq62VCcnew">accompanied by "Hans Zimmer - Time"</a>.</p>
... ...
@@ -71,7 +71,7 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
71 71
 			}
72 72
 		}
73 73
 		{
74
-			if (false)
74
+			if (true)
75 75
 			{
76 76
 				$data = sql_cross($data, $data_common["cases"]);
77 77
 				$data = sql_select($data, function ($row) {return ($row["case_id"] == $row["id"]);});
... ...
@@ -87,6 +87,7 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
87 87
 	
88 88
 	{
89 89
 		// $data = sql_select($data, function ($row) {return ($row["case_name"] != "pos");});
90
+		$data = sql_select($data, function ($row) {global $configuration; return (($row["language_id"] == "fs") or ($row["language_id"] == $configuration["target"]));});
90 91
 	}
91 92
 	
92 93
 	$table = new class_table
... ...
@@ -103,12 +104,13 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
103 104
 		$data
104 105
 	);
105 106
 	
106
-	$table = $table->snap
107
+	$table->snap
107 108
 	(
108 109
 		[
109 110
 			"label_vertical" => function ($column) {return "";},
110 111
 			"columns_vertical" =>
111 112
 			[
113
+				$table->columns_get()[4],
112 114
 				$table->columns_get()[1],
113 115
 				$table->columns_get()[2],
114 116
 				$table->columns_get()[3],
... ...
@@ -116,7 +118,6 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
116 118
 			"label_horizontal" => function ($column, $value) {return $value;},
117 119
 			"columns_horizontal" =>
118 120
 			[
119
-				$table->columns_get()[4],
120 121
 				$table->columns_get()[5],
121 122
 			],
122 123
 			"columns_data" =>
... ...
@@ -139,12 +140,27 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
139 140
 					}
140 141
 					case 1:
141 142
 					{
143
+						global $configuration;
144
+						$value_ = [];
145
+						foreach (["fs",$configuration["target"]] as $language_id)
146
+						{
147
+							$value_[$language_id] = array_reduce
148
+							(
149
+								array_map
150
+								(
151
+									function ($dataset) {return $dataset["words"];},
152
+									array_filter($value, function ($dataset) use (&$language_id) {return ($dataset["language_id"] == $language_id);})
153
+								),
154
+								function ($x, $y) {return array_merge($x, $y);},
155
+								[]
156
+							);
157
+						}
142 158
 						return (
143 159
 							_bar("word")
144 160
 							(
145 161
 								[
146
-									"original" => $value[0]["words"],
147
-									"translated" => $value[1]["words"],
162
+									"original" => $value_["fs"],
163
+									"translated" => $value_[$configuration["target"]],
148 164
 								]
149 165
 							)
150 166
 						);
... ...
@@ -158,9 +174,10 @@ function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "f
158 174
 				}
159 175
 			},
160 176
 		]
161
-	);
162
-	$table->generate();
177
+	)->generate();
163 178
  ?>
164
-	<p>For the flected and otherwise related forms of the personal pronouns see the section <a href="#declension">Declension</a>.</p>
179
+	<p>Since the word <span class="word lang_fs">man</span> simply means <span class="word lang_en">human being</span>, it can be understood as an implicit way to express an abstract actor; similar words like <span class="word lang_fs">lüd</span> (<span class="word lang_en">people</span>) or <span class="word lang_fs">di</span> can be used as well.</p>
180
+	<div class="note_information">The honorific salutation is expressed by the plural form <span class="word lang_fs">je</span>; however it should be avoided in usual speech in favor of the singular form <span class="word lang_fs">du</span>.</div>
181
+	<div class="note_information">A reflexive genitive can be formed by inserting the word <span class="word lang_fs">egen</span> (<span class="word lang_en">own</span>), for example <span class="sentence lang_fs">Han[A] hav givt to ham[B] hans egen buk.</span> ~ <span class="sentence lang_en">He[A] has given (to) him[B] his own book.</span> (A's book was given to B).</div>
165 182
 </section>
166 183
 
... ...
@@ -19,9 +19,9 @@
19 19
 		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["man"]},
20 20
 		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["mek"]},
21 21
 		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["dek"]},
22
-		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": ["hen"]},
23
-		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["han"]},
24
-		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["hun"]},
22
+		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": ["hem"]},
23
+		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["ham"]},
24
+		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["hum"]},
25 25
 		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["hit"]},
26 26
 		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["maner"]},
27 27
 		{"language_id": "fs", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["us"]},
... ...
@@ -30,9 +30,9 @@
30 30
 		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["to man"]},
31 31
 		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["to mek"]},
32 32
 		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["to dek"]},
33
-		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": ["to hen"]},
34
-		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["to han"]},
35
-		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["to hun"]},
33
+		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": ["to hem"]},
34
+		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["to ham"]},
35
+		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["to hum"]},
36 36
 		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["to hit"]},
37 37
 		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["to maner"]},
38 38
 		{"language_id": "fs", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["to us"]},
... ...
@@ -126,17 +126,17 @@
126 126
 		{"language_id": "en", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["us"]},
127 127
 		{"language_id": "en", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["you (all)"]},
128 128
 		{"language_id": "en", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["them"]},
129
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["to one","to you"]},
130
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["to me"]},
131
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["to you","to thee"]},
129
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["(to) one","(to) you"]},
130
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["(to) me"]},
131
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["(to) you","(to) thee"]},
132 132
 		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
133
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["to him"]},
134
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["to her"]},
135
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["to it"]},
136
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["to you","to them"]},
137
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["to us"]},
138
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["to you (all)"]},
139
-		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["to them"]},
133
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["(to) him"]},
134
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["(to) her"]},
135
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["(to) it"]},
136
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["(to) you","(to) them"]},
137
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["(to) us"]},
138
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["(to) you (all)"]},
139
+		{"language_id": "en", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["(to) them"]},
140 140
 		{"language_id": "en", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["oneself","yourself"]},
141 141
 		{"language_id": "en", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["myself"]},
142 142
 		{"language_id": "en", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["yourself"]},
... ...
@@ -148,61 +148,160 @@
148 148
 		{"language_id": "en", "type_id": "ref", "case_id": "acc", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["ourselves"]},
149 149
 		{"language_id": "en", "type_id": "ref", "case_id": "acc", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["yourselves"]},
150 150
 		{"language_id": "en", "type_id": "ref", "case_id": "acc", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["themselves"]},
151
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["to oneself","to yourself"]},
152
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["to myself"]},
153
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["to yourself"]},
151
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["(to) oneself","(to) yourself"]},
152
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["(to) myself"]},
153
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["(to) yourself"]},
154 154
 		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
155
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["to himself"]},
156
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["to herself"]},
157
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["to itself"]},
158
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["to themselves","to yourselves"]},
159
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["to ourselves"]},
160
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["to yourselves"]},
161
-		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["to themselves"]},
162
-		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["ones","your"]},
163
-		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["my"]},
164
-		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["your"]},
155
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["(to) himself"]},
156
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["(to) herself"]},
157
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["(to) itself"]},
158
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["(to) themselves","(to)to yourselves"]},
159
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["(to) ourselves"]},
160
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["(to) yourselves"]},
161
+		{"language_id": "en", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["(to) themselves"]},
162
+		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["one's","your"]},
163
+		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["my/mine"]},
164
+		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["your/yours","thy/thine"]},
165 165
 		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
166 166
 		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["his"]},
167
-		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["her"]},
167
+		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["her/hers"]},
168 168
 		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["its"]},
169
-		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["their","your"]},
170
-		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["our"]},
171
-		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["your"]},
172
-		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["their"]},		
173
-		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["ones","your"]},
174
-		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["my"]},
175
-		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["your"]},
169
+		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["their/theirs","your/yours"]},
170
+		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["our/ours"]},
171
+		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["your/yours"]},
172
+		{"language_id": "en", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["their/theirs"]},		
173
+		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["one's","your/yours"]},
174
+		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["my/mine"]},
175
+		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["your/yours","thy/thine"]},
176 176
 		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
177 177
 		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["his"]},
178
-		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["her"]},
178
+		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["her/hers"]},
179 179
 		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["its"]},
180 180
 		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["their","your"]},
181
-		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["our"]},
182
-		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["your"]},
183
-		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["their"]},
184
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["to ones","to your"]},
185
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["to my"]},
186
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["to your"]},
181
+		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["our/ours"]},
182
+		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["your/yours"]},
183
+		{"language_id": "en", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["their/theirs"]},
184
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["(to) one's","(to) your/yours"]},
185
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["(to) my/mine"]},
186
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["(to) your/yours","(to) thy/thine"]},
187 187
 		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
188
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["to his"]},
189
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["to her"]},
190
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["to its"]},
191
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["to their","to your"]},
192
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["to our"]},
193
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["to your"]},
194
-		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["to their"]},
195
-		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["of ones","of your"]},
196
-		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["of my"]},
197
-		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["of your"]},
188
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["(to) his"]},
189
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["(to) her/hers"]},
190
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["(to) its"]},
191
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["(to) their/theirs","(to) your/yours"]},
192
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["(to) our/ours"]},
193
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["(to) your/yours"]},
194
+		{"language_id": "en", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["(to) their/theirs"]},
195
+		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["of one's","of your/yours"]},
196
+		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["of my/mine"]},
197
+		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["of your/yours"]},
198 198
 		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
199 199
 		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["of his"]},
200
-		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["of her"]},
200
+		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["of her/hers"]},
201 201
 		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["of its"]},
202
-		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["of their","of your"]},
203
-		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["of our"]},
204
-		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["of your"]},
205
-		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["of their"]}
202
+		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["of their/theirs","of your/yours"]},
203
+		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["of our/ours"]},
204
+		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["of your/yours"]},
205
+		{"language_id": "en", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["of their/theirs"]},
206
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["man"]},
207
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["ich"]},
208
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["du"]},
209
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
210
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["er"]},
211
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["sie"]},
212
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["es"]},
213
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": ["man"]},
214
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["wir"]},
215
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["ihr"]},
216
+		{"language_id": "de", "type_id": "nor", "case_id": "nom", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["sie"]},
217
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["einen"]},
218
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["mich"]},
219
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["dich"]},
220
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
221
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["ihn"]},
222
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["sie"]},
223
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["es"]},
224
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": []},
225
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["uns"]},
226
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["euch"]},
227
+		{"language_id": "de", "type_id": "nor", "case_id": "acc", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["sie"]},
228
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["einem"]},
229
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["mir"]},
230
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["dir"]},
231
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
232
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["ihm"]},
233
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["ihr"]},
234
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["ihm"]},
235
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": []},
236
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["uns"]},
237
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["euch"]},
238
+		{"language_id": "de", "type_id": "nor", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["ihnen"]},
239
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["sich"]},
240
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["mich"]},
241
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["dich"]},
242
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": ["sich"]},
243
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["sich"]},
244
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["sich"]},
245
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["sich"]},
246
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": []},
247
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["uns"]},
248
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["euch"]},
249
+		{"language_id": "de", "type_id": "ref", "case_id": "acc", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["sich"]},
250
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": ["(zu) sich"]},
251
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["(zu) mir"]},
252
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["(zu) dir"]},
253
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
254
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["(zu) sich"]},
255
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["(zu) sich"]},
256
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["(zu) sich"]},
257
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": []},
258
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["(zu) uns"]},
259
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["(zu) euch"]},
260
+		{"language_id": "de", "type_id": "ref", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["(zu) sich"]},
261
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": []},
262
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["mein"]},
263
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["dein"]},
264
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
265
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["sein/seine/sein"]},
266
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["ihr/ihre/ihr"]},
267
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["sein/seine/sein"]},
268
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": []},
269
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["unser/unser/unser"]},
270
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["euer/eure/euer"]},
271
+		{"language_id": "de", "type_id": "pos", "case_id": "nom", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["ihr/ihre/ihr","deren"]},
272
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": []},
273
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["meinen/meine/mein"]},
274
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["deinen/deine/dein"]},
275
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
276
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["seinen/seine/sein"]},
277
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["ihren/ihre/ihr"]},
278
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["seinen/seine/sein"]},
279
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": []},
280
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["unseren/unsere/unser"]},
281
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["euren/eure/euer"]},
282
+		{"language_id": "de", "type_id": "pos", "case_id": "acc", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["ihren/ihre/ihr","deren"]},
283
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": []},
284
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["(zu) meinem/meiner/meinem"]},
285
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["(zu) deinem/deiner/deinem"]},
286
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
287
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["(zu) seinem/seiner/seinem"]},
288
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["(zu) ihrem/ihrer/ihrem"]},
289
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["(zu) seinem/seiner/seinem"]},
290
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": []},
291
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["(zu) unserem/unserer/unserem"]},
292
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["(zu) eurem/eurer/eurem"]},
293
+		{"language_id": "de", "type_id": "pos", "case_id": "dat", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["(zu) ihrem/ihrer/ihrem","(zu) deren"]},
294
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "imp", "gender_id": "com", "words": []},
295
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "1st", "gender_id": "com", "words": ["von meinem/meiner/meinem","meines"]},
296
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "2nd", "gender_id": "com", "words": ["von deinem/deiner/deinem","deines"]},
297
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "com", "words": []},
298
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "mas", "words": ["von seinem/seiner/seinem","seines"]},
299
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "fem", "words": ["von ihrem/ihrer/ihrem","ihres"]},
300
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "sin", "person_id": "3rd", "gender_id": "neu", "words": ["von seinem/seiner/seinem","seines"]},
301
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "imp", "gender_id": "com", "words": []},
302
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "1st", "gender_id": "com", "words": ["von unserem/unserer/unserem","unseres"]},
303
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "2nd", "gender_id": "com", "words": ["von eurem/eurer/eurem"]},
304
+		{"language_id": "de", "type_id": "pos", "case_id": "gen", "count_id": "plu", "person_id": "3rd", "gender_id": "com", "words": ["von ihrem/ihrer/ihrem","von deren"]}
206 305
 	]
207 306
 }
208 307
 
... ...
@@ -144,7 +144,7 @@
144 144
 		);
145 145
 		return $groups;
146 146
 	}
147
-		
147
+	
148 148
 	function sql_groupify($table_source, $column, $aggregators)
149 149
 	{
150 150
 		$groups = sql_groups($table_source, $column);
... ...
@@ -166,116 +166,5 @@
166 166
 		return $table_result;
167 167
 	}
168 168
 	
169
-	/*
170
-	
171
-	+------+------+------+
172
-	|  xA  |  xB  |  xC  |
173
-	+------+------+------+
174
-	|  a2  |  b1  |  c3  |
175
-	+------+------+------+
176
-	|  a1  |  b1  |  c0  |
177
-	+------+------+------+
178
-	|  a1  |  b3  |  c2  |
179
-	+------+------+------+
180
-	|  a2  |  b2  |  c4  |
181
-	+------+------+------+
182
-	|  a1  |  b2  |  c1  |
183
-	+------+------+------+
184
-	|  a2  |  b4  |  c5  |
185
-	+------+------+------+
186
-	
187
-	+------+------+------+
188
-	|  xA  |  xB  |  xC  |
189
-	+------+------+------+
190
-	|  a1  |  b1  |  c0  |
191
-	+------+------+------+
192
-	|  a1  |  b2  |  c1  |
193
-	+------+------+------+
194
-	|  a1  |  b3  |  c2  |
195
-	+------+------+------+
196
-	|  a2  |  b1  |  c3  |
197
-	+------+------+------+
198
-	|  a2  |  b2  |  c4  |
199
-	+------+------+------+
200
-	|  a2  |  b4  |  c5  |
201
-	+------+------+------+
202
-	
203
-	+------+------+------+
204
-	|  xA  |  xB  |  xC  |
205
-	+------+------+------+
206
-	|  a1  |  b1  |  c0  |
207
-	|      +------+------+
208
-	|      |  b2  |  c1  |
209
-	|      +------+------+
210
-	|      |  b3  |  c2  |
211
-	+------+------+------+
212
-	|  a2  |  b1  |  c3  |
213
-	|      +------+------+
214
-	|      |  b2  |  c4  |
215
-	|      +------+------+
216
-	|      |  b4  |  c5  |
217
-	+------+------+------+
218
-	
219
-	+------+------+------+------+------+
220
-	|  xA  | xB:b1| xB:b2| xB:b3| xB:b4|
221
-	+------+------+------+------+------+
222
-	|  a1  |  c0  |  c1  |  c2  |  --  |
223
-	+------+------+------+------+------+
224
-	|  a2  |  c3  |  c4  |  --  |  c5  |
225
-	+------+------+------+------+------+
226
-	
227
-	 */
228
-	function sql_snap($table_source, $column_vertical, $column_horizontal, $column_data)
229
-	{
230
-		$values = [];
231
-		array_map
232
-		(
233
-			function ($row) use (&$values,&$column_horizontal)
234
-			{
235
-				$value = $row[$column_horizontal];
236
-				if (array_search($value, $values) === false) array_push($values, $value);
237
-			},
238
-			$table_source
239
-		);
240
-		$groups = sql_groups($table_source, $column_vertical);
241
-		// print(json_encode(array_slice($groups, 0, 2)) . "\n");
242
-		$table_result = array_map
243
-		(
244
-			function ($group) use (&$column_vertical,&$column_horizontal,&$column_data,&$values)
245
-			{
246
-				$row = [];
247
-				$row[$column_vertical] = $group["value"];
248
-				array_map
249
-				(
250
-					function ($value) use (&$row)
251
-					{
252
-						$row[$value] = [];
253
-					},
254
-					$values
255
-				);
256
-				array_map
257
-				(
258
-					function ($member) use (&$column_horizontal,&$column_data,&$row)
259
-					{
260
-						$value = $member[$column_horizontal];
261
-						$data = $member[$column_data];
262
-						// print("-- adding value " . json_encode($data) . " for field " . $value . " to dataset " . json_encode($row) . "\n");
263
-						array_push($row[$value], $data);
264
-					},
265
-					$group["members"]
266
-				);
267
-				return $row;
268
-			},
269
-			$groups
270
-		);
271
-		return $table_result;
272
-	}
273
-	
274
-	/*
275
-	function sql_sort($table_source, $column)
276
-	{
277
-		
278
-	}
279
-	 */
280 169
  ?>
281 170
 
... ...
@@ -63,6 +63,63 @@ class class_table
63 63
 		);
64 64
 	}
65 65
 	
66
+	/*
67
+	+------+------+------+
68
+	|  xA  |  xB  |  xC  |
69
+	+------+------+------+
70
+	|  a2  |  b1  |  c3  |
71
+	+------+------+------+
72
+	|  a1  |  b1  |  c0  |
73
+	+------+------+------+
74
+	|  a1  |  b3  |  c2  |
75
+	+------+------+------+
76
+	|  a2  |  b2  |  c4  |
77
+	+------+------+------+
78
+	|  a1  |  b2  |  c1  |
79
+	+------+------+------+
80
+	|  a2  |  b4  |  c5  |
81
+	+------+------+------+
82
+	
83
+	+------+------+------+
84
+	|  xA  |  xB  |  xC  |
85
+	+------+------+------+
86
+	|  a1  |  b1  |  c0  |
87
+	+------+------+------+
88
+	|  a1  |  b2  |  c1  |
89
+	+------+------+------+
90
+	|  a1  |  b3  |  c2  |
91
+	+------+------+------+
92
+	|  a2  |  b1  |  c3  |
93
+	+------+------+------+
94
+	|  a2  |  b2  |  c4  |
95
+	+------+------+------+
96
+	|  a2  |  b4  |  c5  |
97
+	+------+------+------+
98
+	
99
+	+------+------+------+
100
+	|  xA  |  xB  |  xC  |
101
+	+------+------+------+
102
+	|  a1  |  b1  |  c0  |
103
+	|      +------+------+
104
+	|      |  b2  |  c1  |
105
+	|      +------+------+
106
+	|      |  b3  |  c2  |
107
+	+------+------+------+
108
+	|  a2  |  b1  |  c3  |
109
+	|      +------+------+
110
+	|      |  b2  |  c4  |
111
+	|      +------+------+
112
+	|      |  b4  |  c5  |
113
+	+------+------+------+
114
+	
115
+	+------+------+------+------+------+
116
+	|  xA  | xB:b1| xB:b2| xB:b3| xB:b4|
117
+	+------+------+------+------+------+
118
+	|  a1  |  c0  |  c1  |  c2  |  --  |
119
+	+------+------+------+------+------+
120
+	|  a2  |  c3  |  c4  |  --  |  c5  |
121
+	+------+------+------+------+------+
122
+	 */
66 123
 	public function snap($configuration)
67 124
 	{
68 125
 		$columns_vertical = fetch($configuration, "columns_vertical", null, 2);
69 126
new file mode 100644
... ...
@@ -0,0 +1,2848 @@
1
+var __extends = (this && this.__extends) || function (d, b) {
2
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
3
+    function __() { this.constructor = d; }
4
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
5
+};
6
+var _child_process = require("child_process");
7
+var _fs = require("fs");
8
+var configuration = {};
9
+/**
10
+ * @author fenris
11
+ */
12
+function indentation(depth, symbol) {
13
+    if (symbol === void 0) { symbol = "\t"; }
14
+    return ((depth == 0) ? "" : (symbol + indentation(depth - 1, symbol)));
15
+}
16
+/**
17
+ * @author fenris
18
+ */
19
+var class_message = (function () {
20
+    /**
21
+     * @author fenris
22
+     */
23
+    function class_message(content, parameters) {
24
+        if (parameters === void 0) { parameters = {}; }
25
+        /**
26
+         * @author fenris
27
+         */
28
+        this.depth = 0;
29
+        if (parameters.prefix == undefined)
30
+            parameters.prefix = null;
31
+        if (parameters.type == undefined)
32
+            parameters.type = null;
33
+        if (parameters.depth == undefined)
34
+            parameters.depth = 0;
35
+        if (parameters.linebreak == undefined)
36
+            parameters.linebreak = false;
37
+        this.content = content;
38
+        this.type = parameters.type;
39
+        this.depth = parameters.depth;
40
+        this.prefix = parameters.prefix;
41
+        this.linebreak = parameters.linebreak;
42
+    }
43
+    /**
44
+     * @author fenris
45
+     */
46
+    class_message.prototype.generate = function (with_type) {
47
+        if (with_type === void 0) { with_type = true; }
48
+        var output = "";
49
+        output += indentation(this.depth);
50
+        if (with_type) {
51
+            if (this.type != null) {
52
+                output += ("[" + this.type + "]" + " ");
53
+            }
54
+        }
55
+        if (this.prefix != null) {
56
+            output += ("<" + this.prefix + ">" + " ");
57
+        }
58
+        output += this.content;
59
+        if (this.linebreak) {
60
+            output += "\n";
61
+        }
62
+        return output;
63
+    };
64
+    /**
65
+     * @author fenris
66
+     */
67
+    class_message.prototype.stdout = function () {
68
+        console.log(this.generate(true));
69
+    };
70
+    /**
71
+     * @author fenris
72
+     */
73
+    class_message.prototype.stderr = function () {
74
+        console.error(this.generate(true));
75
+    };
76
+    /**
77
+     * @author fenris
78
+     */
79
+    class_message.prototype.console = function () {
80
+        switch (this.type) {
81
+            case "log": {
82
+                console.log(this.generate(false));
83
+                break;
84
+            }
85
+            case "information": {
86
+                console.info(this.generate(false));
87
+                break;
88
+            }
89
+            case "warning": {
90
+                console.warn(this.generate(false));
91
+                break;
92
+            }
93
+            case "error": {
94
+                console.error(this.generate(false));
95
+                break;
96
+            }
97
+            default: {
98
+                throw (new Error("unhandled type '" + this.type + "'"));
99
+            }
100
+        }
101
+    };
102
+    return class_message;
103
+}());
104
+/**
105
+ * @author fenris
106
+ */
107
+var class_cliout = (function () {
108
+    function class_cliout() {
109
+    }
110
+    /**
111
+     * @author fenris
112
+     */
113
+    class_cliout.stdout = function (content, depth) {
114
+        if (depth === void 0) { depth = 0; }
115
+        console.log(indentation(depth) + content);
116
+    };
117
+    /**
118
+     * @author fenris
119
+     */
120
+    class_cliout.stderr = function (content, depth) {
121
+        if (depth === void 0) { depth = 0; }
122
+        console.error(indentation(depth) + content);
123
+    };
124
+    /**
125
+     * @author fenris
126
+     */
127
+    class_cliout.log = function (content, depth) {
128
+        if (depth === void 0) { depth = 0; }
129
+        this.stderr("-- " + content, depth);
130
+    };
131
+    /**
132
+     * @author fenris
133
+     */
134
+    class_cliout.info = function (content, depth) {
135
+        if (depth === void 0) { depth = 0; }
136
+        this.stderr(">> " + content, depth);
137
+    };
138
+    /**
139
+     * @author fenris
140
+     */
141
+    class_cliout.warn = function (content, depth) {
142
+        if (depth === void 0) { depth = 0; }
143
+        this.stderr(">> " + content, depth);
144
+    };
145
+    /**
146
+     * @author fenris
147
+     */
148
+    class_cliout.error = function (content, depth) {
149
+        if (depth === void 0) { depth = 0; }
150
+        this.stderr(">> " + content, depth);
151
+    };
152
+    return class_cliout;
153
+}());
154
+/**
155
+ * @author fenris
156
+ */
157
+var class_graph = (function () {
158
+    /**
159
+     * @author fenris
160
+     */
161
+    function class_graph(nodes, edges) {
162
+        if (nodes === void 0) { nodes = []; }
163
+        if (edges === void 0) { edges = []; }
164
+        this.nodes = nodes;
165
+        this.edges = edges;
166
+    }
167
+    /**
168
+     * @author fenris
169
+     */
170
+    class_graph.prototype.without = function (pivot) {
171
+        return (new class_graph(this.nodes.filter(function (node) { return (node != pivot); }), this.edges.filter(function (edge) { return ((edge.from != pivot) && (edge.to != pivot)); })));
172
+    };
173
+    return class_graph;
174
+}());
175
+/**
176
+ * @author fenris
177
+ */
178
+function topsort(graph) {
179
+    if (graph.nodes.length == 0) {
180
+        return [];
181
+    }
182
+    else {
183
+        var pivot_1;
184
+        var found = graph.nodes.some(function (node) {
185
+            var count = graph.edges.filter(function (edge) { return (edge.to == node); }).length;
186
+            if (count == 0) {
187
+                pivot_1 = node;
188
+                return true;
189
+            }
190
+            else {
191
+                // console.info("'" + String(node) + "' has " + count.toString() + " incoming edges");
192
+                return false;
193
+            }
194
+        });
195
+        if (found) {
196
+            return [pivot_1].concat(topsort(graph.without(pivot_1)));
197
+        }
198
+        else {
199
+            throw (new Error("circular dependencies found"));
200
+        }
201
+    }
202
+}
203
+/**
204
+ * @author fenris
205
+ */
206
+var lib_xml;
207
+(function (lib_xml) {
208
+    /**
209
+     * @author fenris
210
+     */
211
+    var class_node = (function () {
212
+        function class_node() {
213
+        }
214
+        return class_node;
215
+    }());
216
+    lib_xml.class_node = class_node;
217
+    /**
218
+     * @author fenris
219
+     */
220
+    var class_node_text = (function (_super) {
221
+        __extends(class_node_text, _super);
222
+        /**
223
+         * @author fenris
224
+         */
225
+        function class_node_text(content) {
226
+            _super.call(this);
227
+            this.content = content;
228
+        }
229
+        /**
230
+         * @author fenris
231
+         */
232
+        class_node_text.prototype.compile = function (depth) {
233
+            if (depth === void 0) { depth = 0; }
234
+            return (indentation(depth) + this.content + "\n");
235
+        };
236
+        return class_node_text;
237
+    }(class_node));
238
+    lib_xml.class_node_text = class_node_text;
239
+    /**
240
+     * @author fenris
241
+     */
242
+    var class_node_comment = (function (_super) {
243
+        __extends(class_node_comment, _super);
244
+        /**
245
+         * @author fenris
246
+         */
247
+        function class_node_comment(content) {
248
+            _super.call(this);
249
+            this.content = content;
250
+        }
251
+        /**
252
+         * @author fenris
253
+         */
254
+        class_node_comment.prototype.compile = function (depth) {
255
+            if (depth === void 0) { depth = 0; }
256
+            return (indentation(depth) + "<!-- " + this.content + " -->" + "\n");
257
+        };
258
+        return class_node_comment;
259
+    }(class_node));
260
+    lib_xml.class_node_comment = class_node_comment;
261
+    /**
262
+     * @author fenris
263
+     */
264
+    var class_node_complex = (function (_super) {
265
+        __extends(class_node_complex, _super);
266
+        /**
267
+         * @author fenris
268
+         */
269
+        function class_node_complex(name, attributes, children) {
270
+            if (attributes === void 0) { attributes = {}; }
271
+            if (children === void 0) { children = []; }
272
+            _super.call(this);
273
+            this.name = name;
274
+            this.attributes = attributes;
275
+            this.children = children;
276
+        }
277
+        /**
278
+         * @author fenris
279
+         */
280
+        class_node_complex.prototype.compile = function (depth) {
281
+            var _this = this;
282
+            if (depth === void 0) { depth = 0; }
283
+            var output = "";
284
+            var attributes = Object.keys(this.attributes).map(function (key) { return (" " + key + "=" + ("\"" + _this.attributes[key] + "\"")); }).join("");
285
+            output += (indentation(depth) + "<" + this.name + attributes + ">" + "\n");
286
+            this.children.forEach(function (child) { return (output += child.compile(depth + 1)); });
287
+            output += (indentation(depth) + "</" + this.name + ">" + "\n");
288
+            return output;
289
+        };
290
+        return class_node_complex;
291
+    }(class_node));
292
+    lib_xml.class_node_complex = class_node_complex;
293
+})(lib_xml || (lib_xml = {}));
294
+/**
295
+ * @author fenris
296
+ */
297
+var lib_gnumake;
298
+(function (lib_gnumake) {
299
+    /**
300
+     * @author fenris
301
+     */
302
+    var class_rule = (function () {
303
+        /**
304
+         * @author fenris
305
+         */
306
+        // public constructor(name : string, dependencies : Array<string>, actions : Array<string>, phony : boolean = false) {
307
+        function class_rule(parameters) {
308
+            if (parameters === void 0) { parameters = {}; }
309
+            this.name = fetch(parameters, "name", null, 2);
310
+            this.dependencies = fetch(parameters, "dependencies", [], 0);
311
+            this.actions = fetch(parameters, "actions", [], 0);
312
+            this.phony = fetch(parameters, "phony", false, 0);
313
+        }
314
+        /**
315
+         * @author fenris
316
+         */
317
+        class_rule.prototype.actions_get = function () {
318
+            return this.actions;
319
+        };
320
+        /**
321
+         * @author fenris
322
+         */
323
+        class_rule.prototype.compile = function (silent) {
324
+            if (silent === void 0) { silent = false; }
325
+            var output = "";
326
+            output += (this.name + ":" + this.dependencies.map(function (dependency) { return (" " + dependency); }).join("") + "\n");
327
+            this.actions.forEach(function (action) { return (output += "\t" + (silent ? "@ " : "") + action + "\n"); });
328
+            if (this.phony)
329
+                output += (".PHONY: " + this.name + "\n");
330
+            return output;
331
+        };
332
+        return class_rule;
333
+    }());
334
+    lib_gnumake.class_rule = class_rule;
335
+    /**
336
+     * @author fenris
337
+     */
338
+    var class_sheet = (function () {
339
+        /**
340
+         * @author fenris
341
+         */
342
+        function class_sheet(rules, comments) {
343
+            if (comments === void 0) { comments = []; }
344
+            this.rules = rules;
345
+            this.comments = comments;
346
+        }
347
+        /**
348
+         * @author fenris
349
+         */
350
+        class_sheet.prototype.compile = function (silent) {
351
+            if (silent === void 0) { silent = false; }
352
+            return ([]
353
+                .concat(this.comments.map(function (comment) { return ("# " + comment); }))
354
+                .concat([""])
355
+                .concat(this.rules.map(function (rule) { return rule.compile(silent); }))
356
+                .join("\n"));
357
+        };
358
+        return class_sheet;
359
+    }());
360
+    lib_gnumake.class_sheet = class_sheet;
361
+})(lib_gnumake || (lib_gnumake = {}));
362
+/**
363
+ * @author fenris
364
+ */
365
+var lib_ant;
366
+(function (lib_ant) {
367
+    /**
368
+     * @author fenris
369
+     */
370
+    var class_comment = (function () {
371
+        /**
372
+         * @author fenris
373
+         */
374
+        function class_comment(content) {
375
+            this.content = content;
376
+        }
377
+        /**
378
+         * @author fenris
379
+         */
380
+        class_comment.prototype.compile = function () {
381
+            return (new lib_xml.class_node_comment(this.content));
382
+        };
383
+        return class_comment;
384
+    }());
385
+    lib_ant.class_comment = class_comment;
386
+    /**
387
+     * @author fenris
388
+     */
389
+    var class_action = (function () {
390
+        /**
391
+         * @author fenris
392
+         */
393
+        function class_action(representation) {
394
+            this.representation = representation;
395
+        }
396
+        /**
397
+         * @author fenris
398
+         */
399
+        class_action.prototype.compile = function () {
400
+            return this.representation;
401
+        };
402
+        return class_action;
403
+    }());
404
+    lib_ant.class_action = class_action;
405
+    /**
406
+     * @author fenris
407
+     */
408
+    var class_target = (function () {
409
+        /**
410
+         * @author fenris
411
+         */
412
+        function class_target(parameters) {
413
+            if (parameters === void 0) { parameters = {}; }
414
+            this.name = fetch(parameters, "name", null, 2);
415
+            this.dependencies = fetch(parameters, "dependencies", [], 1);
416
+            this.actions = fetch(parameters, "actions", [], 0);
417
+        }
418
+        /**
419
+         * @author fenris
420
+         */
421
+        class_target.prototype.actions_get = function () {
422
+            return this.actions;
423
+        };
424
+        /**
425
+         * @author fenris
426
+         */
427
+        class_target.prototype.compile = function () {
428
+            return (new lib_xml.class_node_complex("target", {
429
+                "name": this.name,
430
+                "depends": this.dependencies.join(",")
431
+            }, this.actions.map(function (action) { return action.compile(); })));
432
+        };
433
+        return class_target;
434
+    }());
435
+    lib_ant.class_target = class_target;
436
+    /**
437
+     * @author fenris
438
+     */
439
+    var class_project = (function () {
440
+        /**
441
+         * @author fenris
442
+         */
443
+        function class_project(parameters) {
444
+            if (parameters === void 0) { parameters = {}; }
445
+            this.name = fetch(parameters, "name", null, 2);
446
+            this.default_ = fetch(parameters, "default", null, 2);
447
+            this.targets = fetch(parameters, "targets", [], 1);
448
+            this.comments = fetch(parameters, "comments", [], 0);
449
+        }
450
+        /**
451
+         * @author fenris
452
+         */
453
+        class_project.prototype.compile = function () {
454
+            return (new lib_xml.class_node_complex("project", {
455
+                "name": this.name,
456
+                "default": this.default_,
457
+            }, ([]
458
+                .concat(this.comments.map(function (comment) { return comment.compile(); }))
459
+                .concat(this.targets.map(function (target) { return target.compile(); })))));
460
+        };
461
+        return class_project;
462
+    }());
463
+    lib_ant.class_project = class_project;
464
+})(lib_ant || (lib_ant = {}));
465
+/**
466
+ * @author fenris
467
+ */
468
+var __idcounter = 0;
469
+/**
470
+ * @author fenris
471
+ */
472
+function genid(prefix) {
473
+    if (prefix === void 0) { prefix = ""; }
474
+    return (prefix + (__idcounter++).toString(16));
475
+}
476
+/**
477
+ * @author fenris
478
+ */
479
+function wait(dependencies, action) {
480
+    if (dependencies.length > 0) {
481
+        dependencies[0](function () { wait(dependencies.slice(1), action); });
482
+    }
483
+    else {
484
+        action();
485
+    }
486
+}
487
+/**
488
+ * @author fenris
489
+ */
490
+function executor_chain(state, executors) {
491
+    if (state === void 0) { state = null; }
492
+    return (function (resolve, reject) {
493
+        if (executors.length == 0) {
494
+            resolve(state);
495
+        }
496
+        else {
497
+            executors[0](state)(function resolve_(state_) {
498
+                executor_chain(state_, executors.slice(1))(resolve, reject);
499
+            }, function reject_(reason_) {
500
+                reject(reason_);
501
+            });
502
+        }
503
+    });
504
+}
505
+/**
506
+ * @author fenris
507
+ */
508
+function fetch(structure, fieldname, fallback, escalation) {
509
+    if (fallback === void 0) { fallback = undefined; }
510
+    if (escalation === void 0) { escalation = 1; }
511
+    if (fieldname in structure) {
512
+        return structure[fieldname];
513
+    }
514
+    else {
515
+        var message = "field '" + fieldname + "' missing in structure";
516
+        switch (escalation) {
517
+            case 0: {
518
+                return fallback;
519
+                break;
520
+            }
521
+            case 1: {
522
+                message += ("; using fallback-value '" + String(fallback) + "'");
523
+                (new class_message(message, { "type": "warning", "prefix": "koralle" })).stderr();
524
+                return fallback;
525
+                break;
526
+            }
527
+            case 2: {
528
+                throw (new Error(message));
529
+                break;
530
+            }
531
+            default: {
532
+                break;
533
+            }
534
+        }
535
+    }
536
+}
537
+/**
538
+ * @author fenris
539
+ */
540
+function read_json(path) {
541
+    return (function (resolve, reject) {
542
+        _fs.readFile(path, {
543
+            "encoding": "utf-8",
544
+            "flag": "r",
545
+        }, function (error, content) {
546
+            if (error != null) {
547
+                reject(error);
548
+            }
549
+            else {
550
+                try {
551
+                    var data = JSON.parse(content);
552
+                    resolve(data);
553
+                }
554
+                catch (exception) {
555
+                    reject((exception));
556
+                }
557
+            }
558
+        });<