Browse code

advanced

bfadmin-master authored on25/04/2016 20:27:11
Showing30 changed files
... ...
@@ -81,13 +81,20 @@ def main():
81 81
 		os.path.join(dirs["source"],"data","correlatives.json"),
82 82
 	]
83 83
 	
84
-	parts_logic = [
84
+	parts_logic_server = [
85 85
 		os.path.join(dirs["source"],"logic","server","misc.php"),
86 86
 		os.path.join(dirs["source"],"logic","server","data.php"),
87 87
 		os.path.join(dirs["source"],"logic","server","settings.php"),
88 88
 		os.path.join(dirs["source"],"logic","server","table.php"),
89 89
 	]
90 90
 	
91
+	parts_logic_client = [
92
+		os.path.join(dirs["source"],"logic","client","tools.js"),
93
+		os.path.join(dirs["source"],"logic","client","table.js"),
94
+		os.path.join(dirs["source"],"logic","client","toc.js"),
95
+		os.path.join(dirs["source"],"logic","client","main.js"),
96
+	]
97
+	
91 98
 	parts_structure = [
92 99
 		os.path.join(dirs["source"],"structure","draft.html.php"),
93 100
 		os.path.join(dirs["source"],"structure","meta.html.php"),
... ...
@@ -101,6 +108,8 @@ def main():
101 108
 		os.path.join(dirs["source"],"structure","personal_pronouns.html.php"),
102 109
 		os.path.join(dirs["source"],"structure","correlatives.html.php"),
103 110
 		os.path.join(dirs["source"],"structure","conjugation.html.php"),
111
+		os.path.join(dirs["source"],"structure","infinite_verbforms.html.php"),
112
+		os.path.join(dirs["source"],"structure","tempora_and_modi.html.php"),
104 113
 		os.path.join(dirs["source"],"structure","declension.html.php"),
105 114
 		os.path.join(dirs["source"],"structure","attributes.html.php"),
106 115
 		os.path.join(dirs["source"],"structure","sentence_structure.html.php"),
... ...
@@ -160,10 +169,10 @@ def main():
160 169
 	rules.append(
161 170
 		class_rule(
162 171
 			os.path.join(dirs["build"],"draft.html"),
163
-			parts_data + parts_logic + parts_structure,
172
+			parts_data + parts_logic_server + parts_structure,
164 173
 			[
165 174
 				class_command_log({
166
-					"message": "compiling document ..."
175
+					"message": "composing document ..."
167 176
 				}),
168 177
 				class_command_directory_create({
169 178
 					"path": dirs["build"],
... ...
@@ -178,16 +187,16 @@ def main():
178 187
 	rules.append(
179 188
 		class_rule(
180 189
 			os.path.join(dirs["build"],"draft.js"),
181
-			[os.path.join(dirs["source"],"logic","client","draft.js")],
190
+			parts_logic_client,
182 191
 			[
183 192
 				class_command_log({
184
-					"message": "copying client-logic ..."
193
+					"message": "composing client-logic ..."
185 194
 				}),
186 195
 				class_command_directory_create({
187 196
 					"path": dirs["build"],
188 197
 				}),
189
-				class_command_file_copy({
190
-					"path-from": os.path.join(dirs["source"],"logic","client","draft.js"),
198
+				class_command_file_concat({
199
+					"paths-from": parts_logic_client,
191 200
 					"path-to": os.path.join(dirs["build"],"draft.js"),
192 201
 				}),
193 202
 			]
... ...
@@ -9,15 +9,15 @@ clear: clean
9 9
 	@ rm --recursive --force build
10 10
 .PHONY: clear
11 11
 
12
-build/draft.html: source/data/phonology_and_orthography.json source/data/personal_pronouns.json source/data/word_functions.json source/data/timeforms.json source/data/adpositions.json source/data/correlatives.json source/logic/server/misc.php source/logic/server/data.php source/logic/server/settings.php source/logic/server/table.php source/structure/draft.html.php source/structure/meta.html.php source/structure/introduction.html.php source/structure/preface.html.php source/structure/key_parameters.html.php source/structure/toc.html.php source/structure/basics.html.php source/structure/phonology_and_orthography.html.php source/structure/grammar.html.php source/structure/personal_pronouns.html.php source/structure/correlatives.html.php source/structure/conjugation.html.php source/structure/declension.html.php source/structure/attributes.html.php source/structure/sentence_structure.html.php source/structure/vocabulary.html.php source/structure/principles.html.php source/structure/word_functions.html.php source/structure/adpositions.html.php source/structure/pronouns.html.php source/structure/dictionary.html.php
13
-	@ echo -e '-- compiling document ...'
12
+build/draft.html: source/data/phonology_and_orthography.json source/data/personal_pronouns.json source/data/word_functions.json source/data/timeforms.json source/data/adpositions.json source/data/correlatives.json source/logic/server/misc.php source/logic/server/data.php source/logic/server/settings.php source/logic/server/table.php source/structure/draft.html.php source/structure/meta.html.php source/structure/introduction.html.php source/structure/preface.html.php source/structure/key_parameters.html.php source/structure/toc.html.php source/structure/basics.html.php source/structure/phonology_and_orthography.html.php source/structure/grammar.html.php source/structure/personal_pronouns.html.php source/structure/correlatives.html.php source/structure/conjugation.html.php source/structure/infinite_verbforms.html.php source/structure/tempora_and_modi.html.php source/structure/declension.html.php source/structure/attributes.html.php source/structure/sentence_structure.html.php source/structure/vocabulary.html.php source/structure/principles.html.php source/structure/word_functions.html.php source/structure/adpositions.html.php source/structure/pronouns.html.php source/structure/dictionary.html.php
13
+	@ echo -e '-- composing document ...'
14 14
 	@ mkdir --parents build
15 15
 	@ php source/structure/draft.html.php > build/draft.html
16 16
 
17
-build/draft.js: source/logic/client/draft.js
18
-	@ echo -e '-- copying client-logic ...'
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 19
 	@ mkdir --parents build
20
-	@ cp --recursive source/logic/client/draft.js build/draft.js
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 21
 
22 22
 build/logo.svg: source/media/logo.svg
23 23
 	@ echo -e '-- copying logo ...'
... ...
@@ -164,6 +164,17 @@
164 164
 			"en": null
165 165
 		}
166 166
 	},
167
+	{
168
+		"type": "tap/flap",
169
+		"ipa": "x",
170
+		"latin": "X/x or H/h ?",
171
+		"runic": null,
172
+		"remark": null,
173
+		"examples": {
174
+			"fs": "na_x_t",
175
+			"en": null
176
+		}
177
+	},
167 178
 	{
168 179
 		"type": "halfvowel",
169 180
 		"ipa": "j",
170 181
new file mode 100644
... ...
@@ -0,0 +1,36 @@
1
+"use strict";
2
+
3
+function add_tooltips()
4
+{
5
+	for (let dom_node of document.querySelectorAll(".word_fs"))
6
+	{
7
+		let url = "http://folksprak.org/munin.php?query=translation_fs_" + dom_node.textContent + "_en";
8
+		load_file
9
+		(
10
+			url,
11
+			function (error, content)
12
+			{
13
+				try
14
+				{
15
+					let object = JSON.parse(content);
16
+					dom_node.setAttribute("title", object.map(entry => entry.to.stem).join(", "));
17
+				}
18
+				catch (exception)
19
+				{
20
+					console.warn("couldn't parse ", content);
21
+				}
22
+			}
23
+		)
24
+	}
25
+}
26
+
27
+function main()
28
+{
29
+	let contentnode = class_contentnode.read();
30
+	document.querySelector("#toc").appendChild(contentnode.generate());
31
+	contentnode.adjust();
32
+	// add_tooltips();
33
+}
34
+
35
+document.addEventListener("DOMContentLoaded", function (event) {main();});
36
+
0 37
similarity index 59%
1 38
rename from source/logic/client/draft.js
2 39
rename to source/logic/client/toc.js
... ...
@@ -1,47 +1,5 @@
1 1
 "use strict";
2 2
 
3
-function load_file(url, usage)
4
-{
5
-	let request = new XMLHttpRequest();
6
-	request.open("GET", url, true);
7
-	request.send(null);
8
-	request.onreadystatechange = function ()
9
-	{
10
-		usage(null, request.responseText);
11
-	};
12
-}
13
-
14
-function add_tooltips()
15
-{
16
-	for (let dom_node of document.querySelectorAll(".word_fs"))
17
-	{
18
-		let url = "http://folksprak.org/munin.php?query=translation_fs_" + dom_node.textContent + "_en";
19
-		load_file
20
-		(
21
-			url,
22
-			function (error, content)
23
-			{
24
-				try
25
-				{
26
-					let object = JSON.parse(content);
27
-					dom_node.setAttribute("title", object.map(entry => entry.to.stem).join(", "));
28
-				}
29
-				catch (exception)
30
-				{
31
-					console.warn("couldn't parse ", content);
32
-				}
33
-			}
34
-		)
35
-	}
36
-}
37
-
38
-function convert_to_list(structure)
39
-{
40
-	let list = [];
41
-	for (let index = 0; index < structure.length; index += 1) list.push(structure[index]);
42
-	return list;
43
-}
44
-
45 3
 class class_contentnode
46 4
 {
47 5
 	constructor(id, title, children)
... ...
@@ -83,6 +41,17 @@ class class_contentnode
83 41
 		return dom_fragment;
84 42
 	}
85 43
 	
44
+	adjust(path = [])
45
+	{
46
+		if (this.id != null)
47
+		{
48
+			let selector = ("#" + this.id + " > header");
49
+			let dom_header = document.querySelector(selector);
50
+			dom_header.textContent = path.map(x => (x+1).toString()).join(".") + " " + this.title;
51
+		}
52
+		this.children.forEach((child, index) => child.adjust(path.concat([index])));
53
+	}
54
+	
86 55
 	static read(dom_context = document, classes = ["chapter","section","subsection"], id = null, title = null)
87 56
 	{
88 57
 		return (
... ...
@@ -110,11 +79,3 @@ class class_contentnode
110 79
 	}
111 80
 }
112 81
 
113
-function main()
114
-{
115
-	document.querySelector("#toc").appendChild(class_contentnode.read().generate());
116
-	// add_tooltips();
117
-}
118
-
119
-document.addEventListener("DOMContentLoaded", function (event) {main();});
120
-
121 82
new file mode 100644
... ...
@@ -0,0 +1,20 @@
1
+"use strict";
2
+
3
+function load_file(url, usage)
4
+{
5
+	let request = new XMLHttpRequest();
6
+	request.open("GET", url, true);
7
+	request.send(null);
8
+	request.onreadystatechange = function ()
9
+	{
10
+		usage(null, request.responseText);
11
+	};
12
+}
13
+
14
+function convert_to_list(structure)
15
+{
16
+	let list = [];
17
+	for (let index = 0; index < structure.length; index += 1) list.push(structure[index]);
18
+	return list;
19
+}
20
+
... ...
@@ -1,4 +1,15 @@
1 1
 <?php
2
+	function compose($names)
3
+	{
4
+		array_map(
5
+			function ($name)
6
+			{
7
+				include("source/structure/" . $name . ".html.php");
8
+			},
9
+			$names
10
+		);
11
+	}
12
+	
2 13
 	function mark($core, $classes)
3 14
 	{
4 15
 		return ('<span class="' . implode(" ", $classes) . '">' . $core . '</span>');
... ...
@@ -3,8 +3,9 @@
3 3
 	include_once("source/logic/server/table.php");
4 4
 	include_once("source/logic/server/misc.php");
5 5
  ?>
6
-<section class="section" id="vocabulary/adpositions">
6
+<section class="section" id="adpositions">
7 7
 	<header>Adpositions</header>
8
+	<div class="note_error">This section is only a proposal yet; not part of the draft.</div>
8 9
 <?php
9 10
 	$table = new class_table
10 11
 	(
... ...
@@ -1,4 +1,4 @@
1
-<section class="section" id="grammar/attributes">
1
+<section class="section" id="attributes">
2 2
 	<header>Attributes</header>
3 3
 	<span class="todo">all</span>
4 4
 </section>
... ...
@@ -1,11 +1,8 @@
1 1
 <section class="chapter" id="basics">
2 2
 	<header>Basics</header>
3 3
 <?php
4
-	array_map(
5
-		function ($name)
6
-		{
7
-			include("source/structure/" . $name . ".html.php");
8
-		},
4
+	compose
5
+	(
9 6
 		[
10 7
 			"phonology_and_orthography",
11 8
 		]
... ...
@@ -4,77 +4,18 @@
4 4
 	include_once("source/logic/server/data.php");
5 5
 	include_once("source/logic/server/misc.php");
6 6
  ?>
7
-<section class="section" id="grammar/conjugation">
7
+<section class="section" id="conjugation">
8 8
 	<header>Conjugation</header>
9
+	<div class="note_error">This section is only a proposal yet; not part of the draft.</div>
9 10
 	<p>In Folksprak verbs are not conjugated for different <span class="grammarterm">personae</span> (participants), <span class="grammarterm">numeri</span> (number of actors) or <span class="grammarterm">genera</span> (grammatical genders).</p>
10
-	<section class="subsection" id="conjugation/infinite_verbforms">
11
-		<header>Infinite Verbforms</header>
12
-		<p>The <span class="grammarterm">infinitive</span> is formed by appending <span class="word lang_fs">-a</span> to the verb stem, e.g. <span class="word lang_fs">skriva</span> ~ <span class="word lang_en">to write</span>.</p>
13
-		<p>The <span class="grammarterm">active participle</span> is formed by appending <span class="word lang_fs">-end</span> to the verb stem, e.g. <span class="word lang_fs">skrivend</span> ~ <span class="word lang_en">writing</span>.</p>
14
-		<p>The <span class="grammarterm">passive participle</span> is formed by appending <span class="word lang_fs">-et</span> to the verb stem, e.g. <span class="word lang_fs">skrivet</span> ~ <span class="word lang_en">written</span>. If speakable the <span class="word lang_fs">e</span> in the ending can be omitted, e.g. <span class="word lang_fs">skrivt</span>.</p>
15
-	</section>
16
-	<section class="subsection" id="conjugation/tempora">
17
-		<header>Tempora and Modi</header>
18
-		<p>The following table lists the timeforms found in Folksprak and how they are built in the <span class="grammarterm">indicative</span> mode.</p>
19 11
 <?php
20
-	$table = new class_table
12
+	compose
21 13
 	(
22 14
 		[
23
-			new class_column
24
-			(
25
-				"Name",
26
-				function ($row)
27
-				{
28
-					return ["name" => $row["name"], "remark" => $row["remark"]];
29
-				},
30
-				function ($value)
31
-				{
32
-					$output = $value["name"];
33
-					if ($value["remark"] != null)
34
-					{
35
-						$output .= (" " . "(" . $value["remark"] . ")");
36
-					}
37
-					return $output;
38
-				}
39
-			),
40
-			new class_column
41
-			(
42
-				"Description",
43
-				function ($row)
44
-				{
45
-					return $row["description"];
46
-				}
47
-			),
48
-			new class_column
49
-			(
50
-				"Scheme",
51
-				function ($row)
52
-				{
53
-					return $row["scheme"];
54
-				},
55
-				function ($value)
56
-				{
57
-					return format($value, ["word", "lang_fs"]);
58
-				}
59
-			),
60
-			new class_column
61
-			(
62
-				"Example",
63
-				function ($row)
64
-				{
65
-					global $configuration;
66
-					return ["original" => [$row["example"]["original"]], "translated" => $row["example"]["translations"][$configuration["target"]]];
67
-				},
68
-				_bar("sentence")
69
-			),
70
-		],
71
-		array_slice(read_json("source/data/timeforms.json"), 0, 3)
15
+			"infinite_verbforms",
16
+			"tempora_and_modi",
17
+		]
72 18
 	);
73
-	$table->generate();
74 19
  ?>
75
-		<p>Since these forms are built with auxiliary verbs, they can be combined straight forward to form complex expressions. For example <span class="sentence lang_fs">ek skal hava skrivt.</span> means <span class="sentence lang_en">i will have written.</span> and <span class="sentence lang_fs">ek hav skalt skriva.</span> means sth. like <span class="sentence lang_en">i was going to write.</span>.</p>
76
-		<p>The <span class="grammarterm">imperative</span> only exists in the present (with future meaning) for the 2nd person singular and plural. It is formed by using the bare stem of the verb, optionally followed by the personal pronoun (i.e. either <span class="word lang_fs">du</span> or <span class="word lang_fs">je</span>) in order to specify or emphasize the numerus. Examples: <span class="sentence lang_fs">skriv!</span>, <span class="sentence lang_fs">skriv, je!</span>.</p>
77
-		<span class="todo">conjunctive</span>
78
-	</section>
79 20
 </section>
80 21
 
... ...
@@ -3,8 +3,9 @@
3 3
 	include_once("source/logic/server/table.php");
4 4
 	include_once("source/logic/server/misc.php");
5 5
  ?>
6
-<section class="subsection" id="vocabulary/pronouns/correlatives">
6
+<section class="subsection" id="correlatives">
7 7
 	<header>Correlatives</header>
8
+	<div class="note_error">This section is only a proposal yet; not part of the draft.</div>
8 9
 <?php
9 10
 	/*
10 11
 	function foobar($value)
... ...
@@ -1,4 +1,4 @@
1
-<section class="section" id="grammar/declension">
1
+<section class="section" id="declension">
2 2
 	<header>Declension</header>
3 3
 	<span class="todo">all</span>
4 4
 </section>
... ...
@@ -1,4 +1,4 @@
1
-<section class="section" id="vocabulary/dictionary">
1
+<section class="section" id="dictionary">
2 2
 	<header>Dictionary</header>
3 3
 	See <a href="http://folksprak.org/?target=dictionary">Munin-Dictionary</a>
4 4
 </section>
... ...
@@ -1,5 +1,6 @@
1 1
 <!DOCTYPE HTML>
2 2
 <?php include_once("source/logic/server/settings.php"); ?>
3
+<?php include_once("source/logic/server/misc.php"); ?>
3 4
 <html>
4 5
 	<head>
5 6
 		<title>Folksprak -- Draft</title>
... ...
@@ -20,11 +21,8 @@
20 21
 			titlepage
21 22
 			  -->
22 23
 <?php
23
-	array_map(
24
-		function ($name)
25
-		{
26
-			include("source/structure/" . $name . ".html.php");
27
-		},
24
+	compose
25
+	(
28 26
 		[
29 27
 			"introduction",
30 28
 			"basics",
... ...
@@ -1,11 +1,8 @@
1 1
 <section class="chapter" id="grammar">
2 2
 	<header>Grammar</header>
3 3
 <?php
4
-	array_map(
5
-		function ($name)
6
-		{
7
-			include("source/structure/" . $name . ".html.php");
8
-		},
4
+	compose
5
+	(
9 6
 		[
10 7
 			"conjugation",
11 8
 			"declension",
12 9
new file mode 100644
... ...
@@ -0,0 +1,7 @@
1
+<section class="subsection" id="infinite_verbforms">
2
+	<header>Infinite Verbforms</header>
3
+	<p>The <span class="grammarterm">infinitive</span> is formed by appending <span class="word lang_fs">-a</span> to the verb stem, e.g. <span class="word lang_fs">skriva</span> ~ <span class="word lang_en">to write</span>.</p>
4
+	<p>The <span class="grammarterm">active participle</span> is formed by appending <span class="word lang_fs">-end</span> to the verb stem, e.g. <span class="word lang_fs">skrivend</span> ~ <span class="word lang_en">writing</span>.</p>
5
+	<p>The <span class="grammarterm">passive participle</span> is formed by appending <span class="word lang_fs">-et</span> to the verb stem, e.g. <span class="word lang_fs">skrivet</span> ~ <span class="word lang_en">written</span>. If speakable the <span class="word lang_fs">e</span> in the ending can be omitted, e.g. <span class="word lang_fs">skrivt</span>.</p>
6
+</section>
7
+
... ...
@@ -1,7 +1,15 @@
1
-<section class="chapter pseudo hidden" id="introduction">
1
+<?php include_once("source/logic/server/misc.php"); ?>
2
+<section class="chapter hidden" id="introduction">
2 3
 	<header>Introduction</header>
3
-	<?php include("source/structure/preface.html.php"); ?>
4
-	<?php include("source/structure/key_parameters.html.php"); ?>
5
-	<?php include("source/structure/toc.html.php"); ?>
4
+<?php
5
+	compose
6
+	(
7
+		[
8
+			"toc",
9
+			"preface",
10
+			"key_parameters",
11
+		]
12
+	);
13
+ ?>
6 14
 </section>
7 15
 
... ...
@@ -1,4 +1,4 @@
1
-<section class="section pseudo" id="introduction/key_parameters">
1
+<section class="section" id="key_parameters">
2 2
 	<header>Basic Points</header>
3 3
 	<p>Folksprak shall be constructed as a language that is:</p>
4 4
 	<ol>
... ...
@@ -7,8 +7,9 @@ function convert_persona($persona) {return [0 => "impersonal", 1 => "1st person"
7 7
 function convert_numerus($numerus) {return [0 => null, 1 => "singular", 2 => "plural"][$numerus];}
8 8
 function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "feminine", 3 => "neuter"][$genus];}
9 9
  ?>
10
-<section class="subsection" id="vocabulary/pronouns/personal_pronouns">
10
+<section class="subsection" id="personal_pronouns">
11 11
 	<header>Personal Pronouns</header>
12
+	<div class="note_error">This section is only a proposal yet; not part of the draft.</div>
12 13
 <?php
13 14
 	$table = new class_table
14 15
 	(
... ...
@@ -4,7 +4,7 @@
4 4
 	include_once("source/logic/server/table.php");
5 5
 	include_once("source/logic/server/misc.php");
6 6
  ?>
7
-<section class="section" id="basics/phonology_and_orthography">
7
+<section class="section" id="phonology_and_orthography">
8 8
 	<header>Phonology and Orthography</header>
9 9
 	<!--
10 10
 	<p>Folksprak uses the following characters as letters:</pa>
... ...
@@ -1,4 +1,4 @@
1
-<section class="section pseudo" id="introduction/preface">
1
+<section class="section" id="preface">
2 2
 	<header>Preface</header>
3 3
 	<p>Folksprak is the name of a project that aims to construct an inter-Germanic zonal auxiliary language, which means a language that can be easily understood by any speaker of a Germanic language (a group numbering over 465 million native speakers with an additional 300 to 900 million speaking English as a second language) without ever having learned it.</p>
4 4
 	<p>Folksprak is not meant to be designed by any one individual, but rather a collective work created by all interested parties; so you're welcome to participate.</p>
... ...
@@ -1,4 +1,4 @@
1
-<section class="section" id="vocabulary/principles">
1
+<section class="section" id="principles">
2 2
 	<header>Principles</header>
3 3
 	<span class="todo">all</span>
4 4
 </section>
... ...
@@ -1,6 +1,13 @@
1
-<section class="section" id="vocabulary/pronouns">
1
+<section class="section" id="pronouns">
2 2
 	<header>Pronouns</header>
3
-	<?php include("source/structure/personal_pronouns.html.php"); ?>
4
-	<?php include("source/structure/correlatives.html.php"); ?>
3
+<?php
4
+	compose
5
+	(
6
+		[
7
+			"personal_pronouns",
8
+			"correlatives",
9
+		]
10
+	);
11
+ ?>
5 12
 </section>
6 13
 
... ...
@@ -1,4 +1,4 @@
1
-<section class="section" id="grammar/sentence_structure">
1
+<section class="section" id="sentence_structure">
2 2
 	<header>Sentence Structure</header>
3 3
 	<span class="todo">all</span>
4 4
 </section>
5 5
new file mode 100644
... ...
@@ -0,0 +1,64 @@
1
+<section class="subsection" id="tempora_and_modi">
2
+	<header>Tempora and Modi</header>
3
+	<p>The following table lists the timeforms found in Folksprak and how they are built in the <span class="grammarterm">indicative</span> mode.</p>
4
+<?php
5
+$table = new class_table
6
+(
7
+	[
8
+		new class_column
9
+		(
10
+			"Name",
11
+			function ($row)
12
+			{
13
+				return ["name" => $row["name"], "remark" => $row["remark"]];
14
+			},
15
+			function ($value)
16
+			{
17
+				$output = $value["name"];
18
+				if ($value["remark"] != null)
19
+				{
20
+					$output .= (" " . "(" . $value["remark"] . ")");
21
+				}
22
+				return $output;
23
+			}
24
+		),
25
+		new class_column
26
+		(
27
+			"Description",
28
+			function ($row)
29
+			{
30
+				return $row["description"];
31
+			}
32
+		),
33
+		new class_column
34
+		(
35
+			"Scheme",
36
+			function ($row)
37
+			{
38
+				return $row["scheme"];
39
+			},
40
+			function ($value)
41
+			{
42
+				return format($value, ["word", "lang_fs"]);
43
+			}
44
+		),
45
+		new class_column
46
+		(
47
+			"Example",
48
+			function ($row)
49
+			{
50
+				global $configuration;
51
+				return ["original" => [$row["example"]["original"]], "translated" => $row["example"]["translations"][$configuration["target"]]];
52
+			},
53
+			_bar("sentence")
54
+		),
55
+	],
56
+	array_slice(read_json("source/data/timeforms.json"), 0, 3)
57
+);
58
+$table->generate();
59
+?>
60
+	<p>Since these forms are built with auxiliary verbs, they can be combined straight forward to form complex expressions. For example <span class="sentence lang_fs">ek skal hava skrivt.</span> means <span class="sentence lang_en">i will have written.</span> and <span class="sentence lang_fs">ek hav skalt skriva.</span> means sth. like <span class="sentence lang_en">i was going to write.</span>.</p>
61
+	<p>The <span class="grammarterm">imperative</span> only exists in the present (with future meaning) for the 2nd person singular and plural. It is formed by using the bare stem of the verb, optionally followed by the personal pronoun (i.e. either <span class="word lang_fs">du</span> or <span class="word lang_fs">je</span>) in order to specify or emphasize the numerus. Examples: <span class="sentence lang_fs">skriv!</span>, <span class="sentence lang_fs">skriv, je!</span>.</p>
62
+	<span class="todo">conjunctive</span>
63
+</section>
64
+
... ...
@@ -1,4 +1,4 @@
1
-<section class="section pseudo" id="introduction/toc">
1
+<section class="section pseudo" id="toc">
2 2
 	<header>Table of Contents</header>
3 3
 	<div id="toc">
4 4
 	</div>
... ...
@@ -1,11 +1,8 @@
1 1
 <section class="chapter" id="vocabulary">
2 2
 	<header>Vocabulary</header>
3 3
 <?php
4
-	array_map(
5
-		function ($name)
6
-		{
7
-			include("source/structure/" . $name . ".html.php");
8
-		},
4
+	compose
5
+	(
9 6
 		[
10 7
 			"principles",
11 8
 			"pronouns",
... ...
@@ -4,8 +4,9 @@
4 4
 	include_once("source/logic/server/data.php");
5 5
 	include_once("source/logic/server/table.php");
6 6
  ?>
7
-<section class="section" id="vocabulary/word_functions">
7
+<section class="section" id="word_functions">
8 8
 	<header>Word Functions</header>
9
+	<div class="note_error">This section is only a proposal yet; not part of the draft.</div>
9 10
 <?php
10 11
 	$table = new class_table
11 12
 	(
... ...
@@ -54,7 +54,7 @@ a
54 54
 .note_information
55 55
 {
56 56
 	&:extend(.note);
57
-	background-color: hsv(120, 40%, (0.8 * hsvvalue(@color-bg)) + (0.2 * 50%));
57
+	background-color: hsv(240, 40%, (0.8 * hsvvalue(@color-bg)) + (0.2 * 50%));
58 58
 	&:before {font-weight: bold; content: "[i] ";}
59 59
 }
60 60