fenris authored on24/04/2016 18:00:07
Showing28 changed files
... ...
@@ -1,4 +1,5 @@
1
-temp
2
-build
3
-trash
1
+temp/
2
+build/
3
+trash/
4
+refactor.sed
4 5
 
... ...
@@ -75,11 +75,15 @@ def main():
75 75
 	parts_data = [
76 76
 		os.path.join(dirs["source"],"data","phonology_and_orthography.json"),
77 77
 		os.path.join(dirs["source"],"data","personal_pronouns.json"),
78
+		os.path.join(dirs["source"],"data","word_functions.json"),
79
+		os.path.join(dirs["source"],"data","timeforms.json"),
78 80
 	]
79 81
 	
80 82
 	parts_logic = [
83
+		os.path.join(dirs["source"],"logic","server","misc.php"),
81 84
 		os.path.join(dirs["source"],"logic","server","data.php"),
82 85
 		os.path.join(dirs["source"],"logic","server","settings.php"),
86
+		os.path.join(dirs["source"],"logic","server","table.php"),
83 87
 	]
84 88
 	
85 89
 	parts_structure = [
... ...
@@ -87,6 +91,8 @@ def main():
87 91
 		os.path.join(dirs["source"],"structure","meta.html.php"),
88 92
 		os.path.join(dirs["source"],"structure","introduction.html.php"),
89 93
 		os.path.join(dirs["source"],"structure","preface.html.php"),
94
+		os.path.join(dirs["source"],"structure","key_parameters.html.php"),
95
+		os.path.join(dirs["source"],"structure","toc.html.php"),
90 96
 		os.path.join(dirs["source"],"structure","grammar.html.php"),
91 97
 		os.path.join(dirs["source"],"structure","phonology_and_orthography.html.php"),
92 98
 		os.path.join(dirs["source"],"structure","pronouns.html.php"),
... ...
@@ -96,6 +102,7 @@ def main():
96 102
 		os.path.join(dirs["source"],"structure","declension.html.php"),
97 103
 		os.path.join(dirs["source"],"structure","attributes.html.php"),
98 104
 		os.path.join(dirs["source"],"structure","sentence_structure.html.php"),
105
+		os.path.join(dirs["source"],"structure","word_functions.html.php"),
99 106
 		os.path.join(dirs["source"],"structure","vocabulary.html.php"),
100 107
 	]
101 108
 	
... ...
@@ -108,6 +115,7 @@ def main():
108 115
 				os.path.join(dirs["build"],"draft.css"),
109 116
 				os.path.join(dirs["build"],"draft.js"),
110 117
 				os.path.join(dirs["build"],"logo.svg"),
118
+				os.path.join(dirs["build"],"favicon.png"),
111 119
 			],
112 120
 			[],
113 121
 			True
... ...
@@ -191,6 +199,24 @@ def main():
191 199
 			]
192 200
 		)
193 201
 	)
202
+	rules.append(
203
+		class_rule(
204
+			os.path.join(dirs["build"],"favicon.png"),
205
+			[os.path.join(dirs["source"],"media","folksprak_16x16.png")],
206
+			[
207
+				class_command_log({
208
+					"message": "copying favicon ..."
209
+				}),
210
+				class_command_directory_create({
211
+					"path": dirs["build"],
212
+				}),
213
+				class_command_file_copy({
214
+					"path-from": os.path.join(dirs["source"],"media","folksprak_16x16.png"),
215
+					"path-to": os.path.join(dirs["build"],"favicon.png"),
216
+				}),
217
+			]
218
+		)
219
+	)
194 220
 	rules.append(
195 221
 		class_rule(
196 222
 			os.path.join(dirs["build"],"draft.css"),
... ...
@@ -1,4 +1,4 @@
1
-all: build/draft.html build/draft.css build/draft.js build/logo.svg
1
+all: build/draft.html build/draft.css build/draft.js build/logo.svg build/favicon.png
2 2
 .PHONY: all
3 3
 
4 4
 clean: 
... ...
@@ -9,7 +9,7 @@ clear: clean
9 9
 	@ rm --recursive --force build
10 10
 .PHONY: clear
11 11
 
12
-build/draft.html: source/data/phonology_and_orthography.json source/data/personal_pronouns.json source/logic/server/data.php source/logic/server/settings.php source/structure/draft.html.php source/structure/meta.html.php source/structure/introduction.html.php source/structure/preface.html.php source/structure/grammar.html.php source/structure/phonology_and_orthography.html.php source/structure/pronouns.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
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/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/grammar.html.php source/structure/phonology_and_orthography.html.php source/structure/pronouns.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/word_functions.html.php source/structure/vocabulary.html.php
13 13
 	@ echo -e '-- compiling document ...'
14 14
 	@ mkdir --parents build
15 15
 	@ php source/structure/draft.html.php > build/draft.html
... ...
@@ -24,6 +24,11 @@ build/logo.svg: source/media/logo.svg
24 24
 	@ mkdir --parents build
25 25
 	@ cp --recursive source/media/logo.svg build/logo.svg
26 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
+
27 32
 build/draft.css: source/style/common.less source/style/concrete.less
28 33
 	@ echo -e '-- compiling style ...'
29 34
 	@ mkdir --parents temp
30 35
new file mode 100644
... ...
@@ -0,0 +1,113 @@
1
+[
2
+	{
3
+		"domain": "Concrete",
4
+		"interrogative": ["vilk"],
5
+		"relative": ["vilk"],
6
+		"demonstrative_far": ["jen"],
7
+		"demonstrative_near": ["dis"],
8
+		"universal": ["al"],
9
+		"undefined": ["et"],
10
+		"negative": ["ing"]
11
+	},
12
+	{
13
+		"domain": "Person",
14
+		"interrogative": ["vilk man", "ve"],
15
+		"relative": ["vilk man", "ve"],
16
+		"demonstrative_far": ["jen man"],
17
+		"demonstrative_near": ["dis man"],
18
+		"universal": ["al man", "alve"],
19
+		"undefined": ["et man", "etve"],
20
+		"negative": ["ing man", "ingve"]
21
+	},
22
+	{
23
+		"domain": "Thing",
24
+		"interrogative": ["vilk ding", "vat"],
25
+		"relative": ["vilk ding", "vat"],
26
+		"demonstrative_far": ["jen ding", "dat"],
27
+		"demonstrative_near": ["dis ding"],
28
+		"universal": ["al ding", "alvat"],
29
+		"undefined": ["et ding", "etvat"],
30
+		"negative": ["ing ding", "ingvat"]
31
+	},
32
+	{
33
+		"domain": "Posession",
34
+		"interrogative": ["av vilk man", "ves"],
35
+		"relative": ["av vilk man", "ves"],
36
+		"demonstrative_far": ["av jen man"],
37
+		"demonstrative_near": ["av dis man"],
38
+		"universal": ["av al man", "alves"],
39
+		"undefined": ["av et man", "etves"],
40
+		"negative": ["av ing man", "ingves"]
41
+	},
42
+	{
43
+		"domain": "Time",
44
+		"interrogative": ["vilk tid", "van"],
45
+		"relative": ["vilk tid", "van"],
46
+		"demonstrative_far": ["jen tid", "dan"],
47
+		"demonstrative_near": ["dis tid", "no"],
48
+		"universal": ["al tid", "alvan"],
49
+		"undefined": ["et tid", "etvan"],
50
+		"negative": ["ing tid", "ingvan"]
51
+	},
52
+	{
53
+		"domain": "Location",
54
+		"interrogative": ["vilk sted", "var"],
55
+		"relative": ["vilk sted", "var"],
56
+		"demonstrative_far": ["jen sted", "dar"],
57
+		"demonstrative_near": ["dis sted", "har"],
58
+		"universal": ["al sted", "alvar"],
59
+		"undefined": ["et sted", "etvar"],
60
+		"negative": ["ing sted", "ingvar"]
61
+	},
62
+	{
63
+		"domain": "Direction",
64
+		"interrogative": ["to vilk sted", "varto"],
65
+		"relative": ["to vilk sted", "varto"],
66
+		"demonstrative_far": ["to jen sted", "darto"],
67
+		"demonstrative_near": ["to dis sted", "harto"],
68
+		"universal": ["to al sted", "alto"],
69
+		"undefined": ["to et sted", "etto"],
70
+		"negative": ["to ing sted", "ingto"]
71
+	},
72
+	{
73
+		"domain": "Cause",
74
+		"interrogative": ["fur vilk grund", "varfur"],
75
+		"relative": ["fur vilk grund", "varfur"],
76
+		"demonstrative_far": ["fur jen grund", "darfur"],
77
+		"demonstrative_near": ["fur dis grund", "harfur"],
78
+		"universal": ["fur al grund", "alfur"],
79
+		"undefined": ["fur et grund", "etfur"],
80
+		"negative": ["fur ing grund", "ingfur"]
81
+	},
82
+	{
83
+		"domain": "Manner",
84
+		"interrogative": ["vilk mot", "hur"],
85
+		"relative": ["vilk mot", "hur"],
86
+		"demonstrative_far": ["jen mot", "so"],
87
+		"demonstrative_near": ["dis mot", "so"],
88
+		"universal": ["al mot"],
89
+		"undefined": ["et mot"],
90
+		"negative": ["ing mot"]
91
+	},
92
+	{
93
+		"domain": "Type",
94
+		"interrogative": ["vilk slag"],
95
+		"relative": ["vilk slag"],
96
+		"demonstrative_far": ["jen slag", "solk"],
97
+		"demonstrative_near": ["dis slag"],
98
+		"universal": ["al slag"],
99
+		"undefined": ["et slag"],
100
+		"negative": ["ing slag"]
101
+	},
102
+	{
103
+		"domain": "Ammount",
104
+		"interrogative": ["vilk mang"],
105
+		"relative": ["vilk mang"],
106
+		"demonstrative_far": ["jen mang"],
107
+		"demonstrative_near": ["dis mang"],
108
+		"universal": ["al mang"],
109
+		"undefined": ["et mang"],
110
+		"negative": ["ing mang"]
111
+	}
112
+]
113
+
... ...
@@ -4,6 +4,7 @@
4 4
 		"ipa": "l",
5 5
 		"latin": "L/l",
6 6
 		"runic": "ᛚ",
7
+		"remark": null,
7 8
 		"examples": {
8 9
 			"fs": "_l_eva",
9 10
 			"en": "_l_ive"
... ...
@@ -14,6 +15,7 @@
14 15
 		"ipa": "m",
15 16
 		"latin": "M/m",
16 17
 		"runic": "ᛗ",
18
+		"remark": null,
17 19
 		"examples": {
18 20
 			"fs": "_m_an",
19 21
 			"en": "_m_an"
... ...
@@ -24,6 +26,7 @@
24 26
 		"ipa": "n",
25 27
 		"latin": "N/n",
26 28
 		"runic": "ᚾ",
29
+		"remark": null,
27 30
 		"examples": {
28 31
 			"fs": "_n_it",
29 32
 			"en": "_n_ot"
... ...
@@ -34,6 +37,7 @@
34 37
 		"ipa": "ŋ",
35 38
 		"latin": "Ng/ng",
36 39
 		"runic": "ᛜ",
40
+		"remark": null,
37 41
 		"examples": {
38 42
 			"fs": "ri_ng_",
39 43
 			"en": "ri_ng_"
... ...
@@ -44,6 +48,7 @@
44 48
 		"ipa": "g",
45 49
 		"latin": "G/g",
46 50
 		"runic": "ᚷ",
51
+		"remark": null,
47 52
 		"examples": {
48 53
 			"fs": "_g_oa",
49 54
 			"en": "_g_o"
... ...
@@ -54,6 +59,7 @@
54 59
 		"ipa": "k",
55 60
 		"latin": "K/k",
56 61
 		"runic": "ᚲ",
62
+		"remark": null,
57 63
 		"examples": {
58 64
 			"fs": "bu_k_",
59 65
 			"en": "boo_k_"
... ...
@@ -64,6 +70,7 @@
64 70
 		"ipa": "b",
65 71
 		"latin": "B/b",
66 72
 		"runic": "ᛒ",
73
+		"remark": null,
67 74
 		"examples": {
68 75
 			"fs": "_b_ua",
69 76
 			"en": "_b_uild"
... ...
@@ -74,6 +81,7 @@
74 81
 		"ipa": "p",
75 82
 		"latin": "P/p",
76 83
 		"runic": "ᛈ",
84
+		"remark": null,
77 85
 		"examples": {
78 86
 			"fs": "di_p_",
79 87
 			"en": "dee_p_"
... ...
@@ -84,6 +92,7 @@
84 92
 		"ipa": "d",
85 93
 		"latin": "D/d",
86 94
 		"runic": "ᛞ",
95
+		"remark": null,
87 96
 		"examples": {
88 97
 			"fs": "gu_d_",
89 98
 			"en": "goo_d_"
... ...
@@ -94,6 +103,7 @@
94 103
 		"ipa": "t",
95 104
 		"latin": "T/t",
96 105
 		"runic": "ᛏ",
106
+		"remark": null,
97 107
 		"examples": {
98 108
 			"fs": "_t_id",
99 109
 			"en": "_t_ime"
... ...
@@ -104,6 +114,7 @@
104 114
 		"ipa": "v",
105 115
 		"latin": "V/v",
106 116
 		"runic": "ᚹ",
117
+		"remark": null,
107 118
 		"examples": {
108 119
 			"fs": "gi_v_a",
109 120
 			"en": "gi_v_e"
... ...
@@ -114,6 +125,7 @@
114 125
 		"ipa": "f",
115 126
 		"latin": "F/f",
116 127
 		"runic": "ᚠ",
128
+		"remark": null,
117 129
 		"examples": {
118 130
 			"fs": "_f_ut",
119 131
 			"en": "_f_oot"
... ...
@@ -124,6 +136,7 @@
124 136
 		"ipa": "s",
125 137
 		"latin": "S/s",
126 138
 		"runic": "ᛋ",
139
+		"remark": null,
127 140
 		"examples": {
128 141
 			"fs": "_s_mal",
129 142
 			"en": "_s_mall"
... ...
@@ -134,6 +147,7 @@
134 147
 		"ipa": "h",
135 148
 		"latin": "H/h",
136 149
 		"runic": "ᚺ",
150
+		"remark": null,
137 151
 		"examples": {
138 152
 			"fs": "_h_us",
139 153
 			"en": "_h_ouse"
... ...
@@ -144,6 +158,7 @@
144 158
 		"ipa": "ɾ",
145 159
 		"latin": "R/r",
146 160
 		"runic": "ᚱ",
161
+		"remark": null,
147 162
 		"examples": {
148 163
 			"fs": "_r_od",
149 164
 			"en": null
... ...
@@ -154,6 +169,7 @@
154 169
 		"ipa": "j",
155 170
 		"latin": "J/j",
156 171
 		"runic": "ᛃ",
172
+		"remark": null,
157 173
 		"examples": {
158 174
 			"fs": "_j_ar",
159 175
 			"en": "_y_ear"
... ...
@@ -164,6 +180,7 @@
164 180
 		"ipa": "i",
165 181
 		"latin": "I/i",
166 182
 		"runic": "ᛁ",
183
+		"remark": null,
167 184
 		"examples": {
168 185
 			"fs": "gr_i_d",
169 186
 			"en": "gr_ee_dy"
... ...
@@ -174,6 +191,7 @@
174 191
 		"ipa": "e",
175 192
 		"latin": "E/e",
176 193
 		"runic": "ᛖ",
194
+		"remark": "only a few variations of English have that sound; it is somehow similar to the vowel in 'air'",
177 195
 		"examples": {
178 196
 			"fs": "inst_e_d",
179 197
 			"en": "~ inst_ea_d"
... ...
@@ -184,6 +202,7 @@
184 202
 		"ipa": "a",
185 203
 		"latin": "A/a",
186 204
 		"runic": "ᚨ",
205
+		"remark": null,
187 206
 		"examples": {
188 207
 			"fs": "f_a_der",
189 208
 			"en": "~ f_a_ther"
... ...
@@ -194,6 +213,7 @@
194 213
 		"ipa": "o",
195 214
 		"latin": "O/o",
196 215
 		"runic": "ᛟ",
216
+		"remark": null,
197 217
 		"examples": {
198 218
 			"fs": "_o_ld",
199 219
 			"en": "~ _o_ld"
... ...
@@ -204,6 +224,7 @@
204 224
 		"ipa": "u",
205 225
 		"latin": "U/u",
206 226
 		"runic": "ᚢ",
227
+		"remark": null,
207 228
 		"examples": {
208 229
 			"fs": "bl_u_",
209 230
 			"en": "bl_ue_"
... ...
@@ -214,6 +235,7 @@
214 235
 		"ipa": "ø",
215 236
 		"latin": "Oy/oy",
216 237
 		"runic": "ᛟᛇ",
238
+		"remark": "similar to vowels used in words like 'earl', 'worry', 'hurt'",
217 239
 		"examples": {
218 240
 			"fs": "sk_oy_n",
219 241
 			"en": null
... ...
@@ -224,6 +246,7 @@
224 246
 		"ipa": "y",
225 247
 		"latin": "Uy/uy",
226 248
 		"runic": "ᚢᛇ",
249
+		"remark": "hardly any variation of English has that sound, but it can be learned easily by interpolating between /u/ and /i/",
227 250
 		"examples": {
228 251
 			"fs": "s_uy_d",
229 252
 			"en": null
230 253
new file mode 100644
... ...
@@ -0,0 +1,63 @@
1
+[
2
+	{
3
+		"name": "Notid",
4
+		"name_en": "Present",
5
+		"scheme": "[mainverb:stem]",
6
+		"description": "For expressing an action in the present",
7
+		"remark": null,
8
+		"example": {
9
+			"original": "Ek skriv.",
10
+			"translations": {
11
+				"en": ["I write."],
12
+				"de": ["Ich schreibe."],
13
+				"nb": ["Jeg skriver."]
14
+			}
15
+		}
16
+	},
17
+	{
18
+		"name": "Fortid",
19
+		"name_en": "Perfect",
20
+		"scheme": "['hav':flected] + [mainverb:passive participle]",
21
+		"description": "For expressing an action in the past",
22
+		"remark": null,
23
+		"example": {
24
+			"original": "Ek hav skrivt.",
25
+			"translations": {
26
+				"en": ["I have written.", "I wrote."],
27
+				"de": ["Ich habe geschrieben.", "Ich schrieb."],
28
+				"nb": ["Jeg skrev.", "Jeg har skrevet."]
29
+			}
30
+		}
31
+	},
32
+	{
33
+		"name": "Eftertid",
34
+		"name_en": "Future",
35
+		"scheme": "['skal'/'vil'/'kom':flected] + [mainverb:infinitive]",
36
+		"description": "For expressing an action in the future",
37
+		"remark": "implicit",
38
+		"example": {
39
+			"original": "Ek skal skriva.",
40
+			"translations": {
41
+				"en": ["I will write.", "I am going to write."],
42
+				"de": ["Ich werde schreiben."],
43
+				"nb": ["Jeg skal skrive.", "Jeg vil skrive."]
44
+			}
45
+		}
46
+	},
47
+	{
48
+		"name": "Eftertid",
49
+		"name_en": "Future",
50
+		"scheme": "['verd':flected] + [mainverb:active participle]",
51
+		"description": "For expressing an action in the future",
52
+		"remark": "explicit",
53
+		"example": {
54
+			"original": "Ek verd skrivend.",
55
+			"translations": {
56
+				"en": ["I will write.", "I am going to write."],
57
+				"de": ["Ich werde schreiben."],
58
+				"nb": ["Jeg skal skrive.", "Jeg vil skrive."]
59
+			}
60
+		}
61
+	}
62
+]
63
+
0 64
new file mode 100644
... ...
@@ -0,0 +1,300 @@
1
+[
2
+	{
3
+		"affix": "-ar",
4
+		"type_from": ["verb"],
5
+		"type_to": ["noun"],
6
+		"name": null,
7
+		"description": "A person, that does what is described in the referred verb",
8
+		"cognates": [
9
+			{
10
+				"language": "en",
11
+				"affix": "-er"
12
+			},
13
+			{
14
+				"language": "nn",
15
+				"affix": "-ar"
16
+			},
17
+			{
18
+				"language": "sv",
19
+				"affix": "-ar"
20
+			},
21
+			{
22
+				"language": "de",
23
+				"affix": "-er"
24
+			}
25
+		],
26
+		"example": {
27
+			"word": "sprekar",
28
+			"translations": {
29
+				"en": ["speaker"]
30
+			}
31
+		}
32
+	},
33
+	{
34
+		"affix": "-ung",
35
+		"type_from": ["verb"],
36
+		"type_to": ["noun"],
37
+		"name": null,
38
+		"description": "Something that arises from the referred verb",
39
+		"cognates": [
40
+			{
41
+				"language": "en",
42
+				"affix": "-ing"
43
+			},
44
+			{
45
+				"language": "nb",
46
+				"affix": "-ing"
47
+			},
48
+			{
49
+				"language": "de",
50
+				"affix": "-ing"
51
+			}
52
+		],
53
+		"example": {
54
+			"word": "givung",
55
+			"translations": {
56
+				"en": ["gift"]
57
+			}
58
+		}
59
+	},
60
+	{
61
+		"affix": "-rid",
62
+		"type_from": ["verb"],
63
+		"type_to": ["noun"],
64
+		"name": "Durative",
65
+		"description": "The act described by the referred verb",
66
+		"cognates": [
67
+			{
68
+				"language": "en",
69
+				"affix": "-red"
70
+			},
71
+			{
72
+				"language": "is",
73
+				"affix": "-ri"
74
+			}
75
+		],
76
+		"example": {
77
+			"word": "hatrid",
78
+			"translations": {
79
+				"en": ["hatred", "hating"]
80
+			}
81
+		}
82
+	},
83
+	{
84
+		"affix": "-(e)t",
85
+		"type_from": ["verb"],
86
+		"type_to": ["attribute"],
87
+		"name": "Passive participle",
88
+		"description": "The attribute to have done a certain action",
89
+		"cognates": [
90
+			{
91
+				"language": "en",
92
+				"affix": "-d"
93
+			},
94
+			{
95
+				"language": "de",
96
+				"affix": "-t"
97
+			}
98
+		],
99
+		"example": {
100
+			"word": "hoyrt",
101
+			"translations": {
102
+				"en": ["heard"]
103
+			}
104
+		}
105
+	},
106
+	{
107
+		"affix": "-end",
108
+		"type_from": ["verb"],
109
+		"type_to": ["attribute"],
110
+		"name": "Active participle",
111
+		"description": "The attribute to be doing a certain action",
112
+		"cognates": [
113
+			{
114
+				"language": "de",
115
+				"affix": "-end"
116
+			}
117
+		],
118
+		"example": {
119
+			"word": "singend",
120
+			"translations": {
121
+				"en": ["singing"]
122
+			}
123
+		}
124
+	},
125
+	{
126
+		"affix": "-ber",
127
+		"type_from": ["verb"],
128
+		"type_to": ["attribute"],
129
+		"name": null,
130
+		"description": "The possibility to do, what the referred verb describes",
131
+		"cognates": [
132
+			{
133
+				"language": "de",
134
+				"affix": "-bar"
135
+			},
136
+			{
137
+				"language": "nb",
138
+				"affix": "-bar"
139
+			}
140
+		],
141
+		"example": {
142
+			"word": "denkber",
143
+			"translations": {
144
+				"en": ["thinkable"]
145
+			}
146
+		}
147
+	},
148
+	{
149
+		"affix": "-isk",
150
+		"type_from": ["noun"],
151
+		"type_to": ["attribute"],
152
+		"name": null,
153
+		"description": "Belonging to the referred object",
154
+		"cognates": [
155
+			{
156
+				"language": "en",
157
+				"affix": "-ish"
158
+			},
159
+			{
160
+				"language": "de",
161
+				"affix": "-isch"
162
+			},
163
+			{
164
+				"language": "nb",
165
+				"affix": "-isk"
166
+			}
167
+		],
168
+		"example": {
169
+			"word": "svedisk",
170
+			"translations": {
171
+				"en": ["swedish"]
172
+			}
173
+		}
174
+	},
175
+	{
176
+		"affix": "-ig",
177
+		"type_from": ["noun"],
178
+		"type_to": ["attribute"],
179
+		"name": null,
180
+		"description": "With the referred object",
181
+		"cognates": [
182
+			{
183
+				"language": "en",
184
+				"affix": "-y"
185
+			},
186
+			{
187
+				"language": "de",
188
+				"affix": "-ig"
189
+			}
190
+		],
191
+		"example": {
192
+			"word": "bludig",
193
+			"translations": {
194
+				"en": ["bloody"]
195
+			}
196
+		}
197
+	},
198
+	{
199
+		"affix": "-lik",
200
+		"type_from": ["noun"],
201
+		"type_to": ["attribute"],
202
+		"name": null,
203
+		"description": "Having the abilities of the referred object",
204
+		"cognates": [
205
+			{
206
+				"language": "en",
207
+				"affix": "-ly"
208
+			},
209
+			{
210
+				"language": "de",
211
+				"affix": "-lich"
212
+			},
213
+			{
214
+				"language": "nb",
215
+				"affix": "-lig"
216
+			}
217
+		],
218
+		"example": {
219
+			"word": "bruderlik",
220
+			"translations": {
221
+				"en": ["brotherly"]
222
+			}
223
+		}
224
+	},
225
+	{
226
+		"affix": "-en",
227
+		"type_from": ["attribute"],
228
+		"type_to": ["verb"],
229
+		"name": null,
230
+		"description": "To make something have the referred ability",
231
+		"cognates": [
232
+			{
233
+				"language": "en",
234
+				"affix": "-en"
235
+			},
236
+			{
237
+				"language": "de",
238
+				"affix": "-en"
239
+			}
240
+		],
241
+		"example": {
242
+			"word": "harden",
243
+			"translations": {
244
+				"en": ["harden", "make hard"]
245
+			}
246
+		}
247
+	},
248
+	{
249
+		"affix": "-hed",
250
+		"type_from": ["attribute"],
251
+		"type_to": ["noun"],
252
+		"name": null,
253
+		"description": "The abstract attribute described by the referred property",
254
+		"cognates": [
255
+			{
256
+				"language": "de",
257
+				"affix": "-heit"
258
+			},
259
+			{
260
+				"language": "nb",
261
+				"affix": "-het"
262
+			}
263
+		],
264
+		"example": {
265
+			"word": "frihed",
266
+			"translations": {
267
+				"en": ["freedom"]
268
+			}
269
+		}
270
+	},
271
+	{
272
+		"affix": "un-",
273
+		"type_from": ["attribute"],
274
+		"type_to": ["attribute"],
275
+		"name": null,
276
+		"description": "Negation of the referred attribute",
277
+		"cognates": [
278
+			{
279
+				"language": "en",
280
+				"affix": "un-"
281
+			},
282
+			{
283
+				"language": "de",
284
+				"affix": "un-"
285
+			},
286
+			{
287
+				"language": "nb",
288
+				"affix": "u-"
289
+			}
290
+		],
291
+		"example": {
292
+			"word": "unfri",
293
+			"translations": {
294
+				"en": ["unfree"]
295
+			}
296
+		}
297
+	}
298
+]
299
+
300
+
... ...
@@ -35,8 +35,84 @@ function add_tooltips()
35 35
 	}
36 36
 }
37 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
+class class_contentnode
46
+{
47
+	constructor(id, title, children)
48
+	{
49
+		this.id = id;
50
+		this.title = title;
51
+		this.children = children;
52
+	}
53
+	
54
+	generate(path = [])
55
+	{
56
+		let that = this;
57
+		let dom_fragment = document.createDocumentFragment();
58
+		{
59
+			if (this.title != null)
60
+			{
61
+				let dom_link = document.createElement("a");
62
+				dom_link.setAttribute("href", "#" + that.id);
63
+				dom_link.textContent = path.map(x => (x+1).toString()).join(".") + " " + this.title;
64
+				dom_fragment.appendChild(dom_link);
65
+			}
66
+		}
67
+		{
68
+			let dom_list = document.createElement("ul");
69
+			this.children.forEach
70
+			(
71
+				function (child, index)
72
+				{
73
+					if (child != null)
74
+					{
75
+						let dom_element = document.createElement("li");
76
+						dom_element.appendChild(child.generate(path.concat(index)));
77
+						dom_list.appendChild(dom_element);
78
+					}
79
+				}
80
+			);
81
+			dom_fragment.appendChild(dom_list);
82
+		}
83
+		return dom_fragment;
84
+	}
85
+	
86
+	static read(dom_context = document, classes = ["chapter","section","subsection"], id = null, title = null)
87
+	{
88
+		return (
89
+			new class_contentnode
90
+			(
91
+				id,
92
+				title,
93
+				(classes.length == 0) ? [] : convert_to_list(dom_context.querySelectorAll("section" + ("." + classes[0]) + ":not(.pseudo)")).map
94
+				(
95
+					function (dom_context_)
96
+					{
97
+						return (
98
+							class_contentnode.read
99
+							(
100
+								dom_context_,
101
+								classes.slice(1),
102
+								dom_context_.getAttribute("id"),
103
+								dom_context_.querySelector("header").textContent
104
+							)
105
+						);
106
+					}
107
+				)
108
+			)
109
+		);
110
+	}
111
+}
112
+
38 113
 function main()
39 114
 {
115
+	document.querySelector("#toc").appendChild(class_contentnode.read().generate());
40 116
 	// add_tooltips();
41 117
 }
42 118
 
43 119
new file mode 100644
... ...
@@ -0,0 +1,79 @@
1
+"use strict";
2
+
3
+class class_format
4
+{
5
+	constructor(title, extract, format = function (x) {return x;})
6
+	{
7
+		this.title = title;
8
+		this.extract = extract;
9
+		this.format = tormat;
10
+	}
11
+}
12
+
13
+class class_table
14
+{
15
+	constructor(columns, rows = [])
16
+	{
17
+		this.columns = columns;
18
+		this.rows = rows;
19
+	}
20
+	
21
+	add(row)
22
+	{
23
+		this.rows.push(row);
24
+	}
25
+	
26
+	fill(rows)
27
+	{
28
+		rows.forEach(row => this.add(row));
29
+	}
30
+	
31
+	generate()
32
+	{
33
+		let dom_table = document.createElement("table");
34
+		{
35
+			let dom_thead = document.createElement("thead");
36
+			[null].forEach
37
+			(
38
+				function (dummy)
39
+				{
40
+					let dom_row = document.createElement("tr");
41
+					this.columns.forEach
42
+					(
43
+						function (column)
44
+						{
45
+							let dom_cell = document.createElement("th");
46
+							dom_cell.textContent = column.title;
47
+							dom_row.appendChild(dom_cell);
48
+						}
49
+					);
50
+					dom_thead.appendChild(dom_row);
51
+				}
52
+			);
53
+			dom_table.appendChild(dom_thead);
54
+		}
55
+		{
56
+			let dom_thead = document.createElement("tbody");
57
+			this.rows.forEach
58
+			(
59
+				function (row)
60
+				{
61
+					let dom_row = document.createElement("tr");
62
+					this.columns.forEach
63
+					(
64
+						function (column)
65
+						{
66
+							let dom_cell = document.createElement("td");
67
+							dom_cell.textContent = column.format(column.extract(row));
68
+							dom_row.appendChild(dom_cell);
69
+						}
70
+					);
71
+					dom_thead.appendChild(dom_row);
72
+				}
73
+			);
74
+			dom_table.appendChild(dom_tbody);
75
+		}
76
+		return dom_table;
77
+	}
78
+}
79
+
0 80
new file mode 100644
... ...
@@ -0,0 +1,22 @@
1
+<?php
2
+	function mark($core, $classes)
3
+	{
4
+		return ('<span class="' . implode(" ", $classes) . '">' . $core . '</span>');
5
+	}
6
+	
7
+	function format($string, $classes = ["word", "lang_fs"])
8
+	{
9
+		if ($string == NULL)
10
+		{
11
+			$string = "--";
12
+		}
13
+		else
14
+		{
15
+			$string = preg_replace("/\/([^\/]*)\//", mark("$1", ["ipa"]), $string);
16
+			$string = preg_replace("/_([^_]*)_/", "<u>$1</u>", $string);
17
+			$string = preg_replace("/\'([^\']*)\'/", mark("$1", $classes), $string);
18
+		}
19
+		return $string;
20
+	}
21
+ ?>
22
+
0 23
new file mode 100644
... ...
@@ -0,0 +1,118 @@
1
+<?php
2
+class class_column
3
+{
4
+	public $title;
5
+	
6
+	public $extract_;
7
+	
8
+	public $format_;
9
+	
10
+	public function __construct($title, $extract_, $format_ = null)
11
+	{
12
+		if ($format_ == null) $format_ = function ($x) {return $x;};
13
+		$this->title = $title;
14
+		$this->extract_ = $extract_;
15
+		$this->format_ = $format_;
16
+	}
17
+	
18
+	public function extract($row)
19
+	{
20
+		return call_user_func($this->extract_, $row);
21
+		// return $this->extract_($row);
22
+	}
23
+	
24
+	public function format($value)
25
+	{
26
+		return call_user_func($this->format_, $value);
27
+		// return $this->format_($value);
28
+	}
29
+}
30
+
31
+class class_table
32
+{
33
+	private $columns;
34
+	
35
+	private $rows;
36
+	
37
+	public function __construct($columns, $rows = [])
38
+	{
39
+		$this->columns = $columns;
40
+		$this->rows = [];
41
+		$this->fill($rows);
42
+	}
43
+	
44
+	private function add($row)
45
+	{
46
+		array_push($this->rows, $row);
47
+	}
48
+	
49
+	private function fill($rows)
50
+	{
51
+		array_map
52
+		(
53
+			function ($row) {$this->add($row);},
54
+			$rows
55
+		);
56
+	}
57
+	
58
+	public function generate()
59
+	{
60
+ ?>
61
+<table>
62
+	<thead>
63
+		<tr>
64
+<?php
65
+	array_map
66
+	(
67
+		function ($column)
68
+		{
69
+ ?>
70
+ 			<th>
71
+<?php
72
+			echo($column->title);
73
+ ?>
74
+			</th>
75
+<?php
76
+		},
77
+		$this->columns
78
+	);
79
+ ?>
80
+		</tr>
81
+	</thead>
82
+	<tbody>
83
+<?php
84
+	array_map
85
+	(
86
+		function ($row)
87
+		{
88
+ ?>
89
+		<tr>
90
+<?php
91
+			array_map
92
+			(
93
+				function ($column) use (&$row)
94
+				{
95
+ ?>
96
+		 			<td>
97
+<?php
98
+					echo($column->format($column->extract($row)));
99
+ ?>
100
+		 			</td>
101
+<?php
102
+				},
103
+				$this->columns
104
+			);
105
+ ?>
106
+		</tr>
107
+<?php
108
+		},
109
+		$this->rows
110
+	);
111
+ ?>
112
+	</tbody>
113
+</table>
114
+<?php
115
+	}
116
+}
117
+ ?>
118
+
0 119
new file mode 100644
1 120
Binary files /dev/null and b/source/media/folksprak_16x16.png differ
... ...
@@ -1,17 +1,22 @@
1 1
 <?php
2 2
 	global $configuration;
3
+	include_once("source/logic/server/table.php");
4
+	include_once("source/logic/server/data.php");
5
+	include_once("source/logic/server/misc.php");
3 6
  ?>
4 7
 <section class="section" id="grammar/conjugation">
5
-	<header>Conjugation</header>
8
+	<header>Verbs</header>
9
+	<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>
6 10
 	<section class="subsection" id="conjugation/infinite_verbforms">
7 11
 		<header>Infinite Verbforms</header>
8
-		<p>The <span class="grammarterm">infinitive</span> is formed by appending <span class="word_fs">-a</span> to the verb-stem, e.g. <span class="word_fs">skriva</span> ~ <span class="word_otherlanguage">to write</span>.</p>
9
-		<p>The <span class="grammarterm">active participle</span> is formed by appending <span class="word_fs">-end</span> to the verb-stem, e.g. <span class="word_fs">skrivend</span> ~ <span class="word_otherlanguage">writing</span>.</p>
10
-		<p>The <span class="grammarterm">passive participle</span> is formed by appending <span class="word_fs">-et</span> to the verb-stem, e.g. <span class="word_fs">skrivet</span> ~ <span class="word_otherlanguage">written</span>. If speakable the <span class="word_fs">e</span> in the ending can be elluded, e.g. <span class="word_fs">skrivt</span>.</p>
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>
11 15
 	</section>
12 16
 	<section class="subsection" id="conjugation/tempora">
13 17
 		<header>Tempora and Modi</header>
14
-		<p>The following table lists the timeforms found in Folksprak and how they are built in the indicative-mode.</p>
18
+		<p>The following table lists the timeforms found in Folksprak and how they are built in the indicative mode.</p>
19
+ 		<!--
15 20
 		<table>
16 21
 			<thead>
17 22
 				<tr>
... ...
@@ -25,38 +30,108 @@
25 30
 				<tr>
26 31
 					<td>Present</td>
27 32
 					<td>[verb:stem]</td>
28
-					<td><span class="sentence_fs">ek skriv</span></td>
29
-					<td><span class="sentence_otherlanguage">i write</span></td>
33
+					<td><span class="sentence lang_fs">ek skriv</span></td>
34
+					<td><span class="sentence lang_en">i write</span></td>
30 35
 				</tr>
31 36
 				<tr>
32 37
 					<td>Perfect</td>
33
-					<td>[flected <span class="word_fs">hav</span>] + [verb:passive participle]</td>
34
-					<td><span class="sentence_fs">ek hav skrivt</span></td>
35
-					<td><span class="sentence_otherlanguage">i have written</span></td>
38
+					<td>[flected <span class="word lang_fs">hav</span>] + [verb:passive participle]</td>
39
+					<td><span class="sentence lang_fs">ek hav skrivt</span></td>
40
+					<td><span class="sentence lang_en">i have written</span></td>
36 41
 				</tr>
37 42
 				<tr>
38 43
 					<td>Future</td>
39
-					<td>[flected <span class="word_fs">skal</span>/<span class="word_fs">vil</span>/<span class="word_fs">kom</span>] + [verb:infinitive]</td>
40
-					<td><span class="sentence_fs">ek skal skriva</span></td>
41
-					<td><span class="sentence_otherlanguage">i will write</span></td>
44
+					<td>[flected <span class="word lang_fs">skal</span>/<span class="word lang_fs">vil</span>/<span class="word lang_fs">kom</span>] + [verb:infinitive]</td>
45
+					<td><span class="sentence lang_fs">ek skal skriva</span></td>
46
+					<td><span class="sentence lang_en">i will write</span></td>
42 47
 				</tr>
43
-				<!--
44 48
 				<tr>
45 49
 					<td>Explicite Future</td>
46
-					<td>[flected <span class="word_fs">verd</span>] + [verb:active participle]</td>
47
-					<td><span class="sentence_fs">ek verd skrivend</span></td>
48
-					<td><span class="sentence_otherlanguage">i will write.</span> (literally: <span class="sentence_otherlanguage">i become writing.</span>)</td>
50
+					<td>[flected <span class="word lang_fs">verd</span>] + [verb:active participle]</td>
51
+					<td><span class="sentence lang_fs">ek verd skrivend</span></td>
52
+					<td><span class="sentence lang_en">i will write.</span> (literally: <span class="sentence lang_en">i become writing.</span>)</td>
49 53
 				</tr>
50
-				  -->
51 54
 			</tbody>
52 55
 		</table>
53
-		<p>The <span class="grammarterm">imperative</span> only exists in the present tense 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_fs">du</span> or <span class="word_fs">je</span>) in order to specify or emphasize the numerus. Examples: <span class="sentence_fs">skriv!</span>, <span class="sentence_fs">skriv, je!</span>.</p>
56
+ 		  -->
57
+<?php
58
+	$table = new class_table
59
+	(
60
+		[
61
+			new class_column
62
+			(
63
+				"Name",
64
+				function ($row)
65
+				{
66
+					return ["name" => $row["name"], "remark" => $row["remark"]];
67
+				},
68
+				function ($value)
69
+				{
70
+					$output = $value["name"];
71
+					if ($value["remark"] != null)
72
+					{
73
+						$output .= (" " . "(" . $value["remark"] . ")");
74
+					}
75
+					return $output;
76
+				}
77
+			),
78
+			new class_column
79
+			(
80
+				"Description",
81
+				function ($row)
82
+				{
83
+					return $row["description"];
84
+				}
85
+			),
86
+			new class_column
87
+			(
88
+				"Scheme",
89
+				function ($row)
90
+				{
91
+					return $row["scheme"];
92
+				},
93
+				function ($value)
94
+				{
95
+					return format($value, ["word", "lang_fs"]);
96
+				}
97
+			),
98
+			new class_column
99
+			(
100
+				"Example",
101
+				function ($row)
102
+				{
103
+					global $configuration;
104
+					return ["original" => $row["example"]["original"], "translated" => $row["example"]["translations"][$configuration["target"]]];
105
+				},
106
+				function ($value)
107
+				{
108
+					$output = "";
109
+					$output .= mark($value["original"], ["sentence", "lang_fs"]);
110
+					$output .= " ~ ";
111
+					$output .= implode
112
+					(
113
+						", ",
114
+						array_map
115
+						(
116
+							function ($word)
117
+							{
118
+								global $configuration;
119
+								return mark($word, ["sentence", "lang_" . $configuration["target"]]);
120
+							},
121
+							$value["translated"]
122
+						)
123
+					);
124
+					return $output;
125
+				}
126
+			),
127
+		],
128
+		read_json("source/data/timeforms.json")
129
+	);
130
+	$table->generate();
131
+ ?>
132
+		<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>
133
+		<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>
54 134
 		<span class="todo">conjunctive</span>
55 135
 	</section>
56
-	<section class="subsection" id="conjugation/personae_numeri">
57
-		<header>Personae and Numeri</header>
58
-		<p>There is no change in the verb for conjugating according to person and count.</p>
59
-		<p>Examples: <span class="sentence_fs">ek skriv</span> ~ <span class="sentence_otherlanguage">i write</span>, <span class="sentence_fs">du skriv</span> ~ <span class="sentence_otherlanguage">you write</span>, <span class="sentence_fs">hin skriv</span> ~ <span class="sentence_otherlanguage">he writes</span>, <span class="sentence_fs">vi skriv</span> ~ <span class="sentence_otherlanguage">we write</span></p>
60
-	</section>
61 136
 </section>
62 137
 
... ...
@@ -1,5 +1,112 @@
1
+<?php
2
+	include_once("source/logic/server/data.php");
3
+	include_once("source/logic/server/table.php");
4
+ ?>
1 5
 <section class="subsection" id="grammar/pronouns/correlatives">
2 6
 	<header>Correlatives</header>
3
-	<span class="todo">all</span>
7
+<?php
8
+	$table = new class_table
9
+	(
10
+		[
11
+			new class_column
12
+			(
13
+				"Domain",
14
+				function ($row)
15
+				{
16
+					return $row["domain"];
17
+				}
18
+			),
19
+			new class_column
20
+			(
21
+				"Interrogative/Relative",
22
+				function ($row)
23
+				{
24
+					return $row["interrogative"];
25
+				},
26
+				function ($value)
27
+				{
28
+					return implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value));
29
+				}
30
+			),
31
+			/*
32
+			new class_column
33
+			(
34
+				"Relative",
35
+				function ($row)
36
+				{
37
+					return $row["relative"];
38
+				},
39
+				function ($value)
40
+				{
41
+					return implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value));
42
+				}
43
+			),
44
+			 */
45
+			new class_column
46
+			(
47
+				"Demonstrative far",
48
+				function ($row)
49
+				{
50
+					return $row["demonstrative_far"];
51
+				},
52
+				function ($value)
53
+				{
54
+					return implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value));
55
+				}
56
+			),
57
+			new class_column
58
+			(
59
+				"Demonstrative near",
60
+				function ($row)
61
+				{
62
+					return $row["demonstrative_near"];
63
+				},
64
+				function ($value)
65
+				{
66
+					return implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value));
67
+				}
68
+			),
69
+			new class_column
70
+			(
71
+				"Universal",
72
+				function ($row)
73
+				{
74
+					return $row["universal"];
75
+				},
76
+				function ($value)
77
+				{
78
+					return implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value));
79
+				}
80
+			),
81
+			new class_column
82
+			(
83
+				"Undefined",
84
+				function ($row)
85
+				{
86
+					return $row["undefined"];
87
+				},
88
+				function ($value)
89
+				{
90
+					return implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value));
91
+				}
92
+			),
93
+			new class_column
94
+			(
95
+				"Negative",
96
+				function ($row)
97
+				{
98
+					return $row["negative"];
99
+				},
100
+				function ($value)
101
+				{
102
+					return implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value));
103
+				}
104
+			),
105
+		],
106
+		read_json("source/data/correlatives.json")
107
+	);
108
+	$table->generate();
109
+ ?>
110
+<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>
4 111
 </section>
5 112
 
... ...
@@ -1,5 +1,5 @@
1 1
 <section class="section" id="grammar/declension">
2
-	<header>Declension</header>
2
+	<header>Nouns</header>
3 3
 	<span class="todo">all</span>
4 4
 </section>
5 5
 
... ...
@@ -2,8 +2,9 @@
2 2
 <?php include_once("source/logic/server/settings.php"); ?>
3 3
 <html>
4 4
 	<head>
5
-		<meta charset="utf-8"/>
5
+		<title>Folksprak -- Draft</title>
6 6
 		<?php include("source/structure/meta.html.php"); ?>
7
+		<link rel="shortcut icon" type="image/png" href="favicon.png"/>
7 8
 		<link rel="stylesheet" type="text/css" href="draft.css"/>
8 9
 		<script type="text/javascript" src="draft.js"></script>
9 10
 	</head>
... ...
@@ -19,9 +20,6 @@
19 20
 			titlepage
20 21
 			  -->
21 22
 			<?php include("source/structure/introduction.html.php"); ?>
22
-			<!--
23
-			toc
24
-			  -->
25 23
 			<?php include("source/structure/grammar.html.php"); ?>
26 24
 			<?php include("source/structure/vocabulary.html.php"); ?>
27 25
 		</div>
... ...
@@ -13,6 +13,7 @@
13 13
 			"declension",
14 14
 			"attributes",
15 15
 			"sentence_structure",
16
+			"word_functions",
16 17
 		]
17 18
 	);
18 19
  ?>
... ...
@@ -1,5 +1,7 @@
1
-<section class="chapter pseudo" id="introduction">
1
+<section class="chapter pseudo hidden" id="introduction">
2 2
 	<header>Introduction</header>
3 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 6
 </section>
5 7
 
6 8
new file mode 100644
... ...
@@ -0,0 +1,13 @@
1
+<section class="section pseudo" id="introduction/key_parameters">
2
+	<header>Basic Points</header>
3
+	<p>Folksprak shall be constructed as a language that is:</p>
4
+	<ol>
5
+		<li>Intelligible with little or no training to Germanic speakers</li>
6
+		<li>Simple enough for ease of learning to write or speak about normal topics</li>
7
+		<li>Precise enough to deal with more complex topics (e.g. science, maybe philosophy)</li>
8
+	</ol>
9
+	<p>where the importance descends from first to last.</p>
10
+	<p>During the attempt to find solutions for different grammar features such that they fulfil these goals, often the solution seemed to be what is called <span class="buzzword">KISS</span> in software technology (however orignally coined by the U.S. Navy), short for <span class="slogan">"keep it simple, stupid!"</span>, i.e. to desist from complexity unless it is truly necessary. Therefore many of the grammar features specified in this draft appear to be shaped more plainly than in most of the natural Germanic languages. For example the grammatical genders are planned to emerge only rudimentary in Folksprak, since they don't implement a crucial purpose in any natural Germanic language. The comparison between existing languages (not only Germanic ones) can reveal easy ways to solve certain issues, which seem to be problematic at first sight, but occasionally turn out to be a non-issue at second sight. However the opposite case does not occur seldomly. That's why for certain questions pleasing answers are yet to be found.</p>
11
+	<p>The language specified in the draft at hand can be classified as language with a half isolating and half agglutinating morphology. It has a <span class="buzzword">a-posteriori</span> vocabulary (with some minor exceptions), i.e. its words are taken/derived from existing languages, vid. mainly the natural Germanic ones.</p>
12
+</section>
13
+
... ...
@@ -1,3 +1,6 @@
1
-<title>Folksprak -- Draft</title>
2
-
1
+<meta charset="utf-8"/>
2
+<meta name="author" content="Fenris Wolf"/>
3
+<meta name="description" content="draft for the constructed germanic zonal auxlang 'Folksprak'"/>
4
+<meta name="language" content="english"/>
5
+<meta name="keywords" content="language,germanic,constructed"/>
3 6
 
... ...
@@ -1,134 +1,66 @@
1 1
 <?php
2 2
 global $configuration;
3 3
 include_once("source/logic/server/data.php");
4
+include_once("source/logic/server/table.php");
4 5
 
5
-function convert_numerus($numerus)
6
-{
7
-	switch ($numerus)
8
-	{
9
-		case 0:
10
-		{
11
-			return NULL;
12
-			break;
13
-		}
14
-		case 1:
15
-		{
16
-			return "singular";
17
-			break;
18
-		}
19
-		case 2:
20
-		{
21
-			return "plural";
22
-			break;
23
-		}
24
-		default:
25
-		{
26
-			throw ("invalid");
27
-			break;
28
-		}
29
-	}
30
-}
31
-
32
-function convert_persona($persona)
33
-{
34
-	switch ($persona)
35
-	{
36
-		case 0:
37
-		{
38
-			return "impersonal";
39
-			break;
40
-		}
41
-		case 1:
42
-		{
43
-			return "1st person";
44
-			break;
45
-		}
46
-		case 2:
47
-		{
48
-			return "2nd person";
49
-			break;
50
-		}
51
-		case 3:
52
-		{
53
-			return "3rd person";
54
-			break;
55
-		}
56
-		default:
57
-		{
58
-			throw ("invalid");
59
-			break;
60
-		}
61
-	}
62
-}
63
-
64
-function convert_genus($genus)
65
-{
66
-	switch ($genus)
67
-	{
68
-		case 0:
69
-		{
70
-			return "common";
71
-			break;
72
-		}
73
-		case 1:
74
-		{
75
-			return "masculine";
76
-			break;
77
-		}
78
-		case 2:
79
-		{
80
-			return "feminine";
81
-			break;
82
-		}
83
-		case 3:
84
-		{
85
-			return "neuter";
86
-			break;
87
-		}
88
-		default:
89
-		{
90
-			throw ("invalid");
91
-			break;
92
-		}
93
-	}
94
-}
6
+function convert_persona($persona) {return [0 => "impersonal", 1 => "1st person", 2 => "2nd person", 3 => "3rd person"][$persona];}
7
+function convert_numerus($numerus) {return [0 => null, 1 => "singular", 2 => "plural"][$numerus];}
8
+function convert_genus($genus) {return [0 => "common", 1 => "masculine", 2 => "feminine", 3 => "neuter"][$genus];}
95 9
  ?>
96 10
 <section class="subsection" id="grammar/pronouns/personal_pronouns">
97 11
 	<header>Personal Pronouns</header>
98
-	<table>
99
-		<thead>
100
-			<tr>
101
-				<th>Case</th>
102
-				<th><?php echo($configuration["languagemap"]["fs"]); ?></th>
103
-				<th><?php echo($configuration["languagemap"][$configuration["target"]]); ?></th>
104
-			</tr>
105
-		</thead>
106
-		<tbody>
107
-<?php
108
-	$data_personal_pronouns = read_json("source/data/personal_pronouns.json");
109
-	foreach ($data_personal_pronouns as $entry)
110
-	{
111
-		$entry_desc = implode(
112
-			" / ",
113
-			[
114
-				convert_persona($entry["persona"]),
115
-				convert_numerus($entry["numerus"]),
116
-				convert_genus($entry["genus"]),
117
-			]
118
-		);
119
-		$entry_fs = implode(", ", array_map(function ($word) {return ('<span class="word_fs">' . $word . '</span>');}, $entry["fs"]));
120
-		$entry_en = implode(", ", array_map(function ($word) {return ('<span class="word_otherlanguage">' . $word . '</span>');}, $entry["en"]));
121
- ?>
122
-			<tr>
123
-				<td><?php echo($entry_desc); ?></td>
124
-				<td><?php echo($entry_fs); ?></td>
125
-				<td><?php echo($entry_en); ?></td>
126
-			</tr>
127 12
 <?php
128
-	}
13
+	$table = new class_table
14
+	(
15
+		[
16
+			new class_column
17
+			(
18
+				"Case",
19
+				function ($row)
20
+				{
21
+					return [
22
+						convert_persona($row["persona"]),
23
+						convert_numerus($row["numerus"]),
24
+						convert_genus($row["genus"]),
25
+					];
26
+				},
27
+				function ($value)
28
+				{
29
+					return implode(" / ", $value);
30
+				}
31
+			),
32
+			/*
33
+			 */
34
+			new class_column
35
+			(
36
+				$configuration["languagemap"]["fs"],
37
+				function ($row)
38
+				{
39
+					return $row["fs"];
40
+				},
41
+				function ($value)
42
+				{
43
+					return implode(", ", array_map(function ($word) {return mark($word, ["word", "lang_fs"]);}, $value));
44
+				}
45
+			),
46
+			new class_column
47
+			(
48
+				$configuration["languagemap"][$configuration["target"]],
49
+				function ($row)
50
+				{
51
+					global $configuration;
52
+					return $row[$configuration["target"]];
53
+				},
54
+				function ($value)
55
+				{
56
+					return ((count($value) == 0) ? "--" : implode(", ", array_map(function ($word) {global $configuration; return mark($word, ["word", "lang_" . $configuration["target"]]);}, $value)));
57
+				}
58
+			),
59
+		],
60
+		read_json("source/data/personal_pronouns.json")
61
+	);
62
+	$table->generate();
129 63
  ?>
130
-		</tbody>
131
-	</table>
132
-	<p>For the flected and otherwise related forms of the personal pronouns see the section <a href="#grammar/declension">Declension</a></p>
64
+	<p>For the flected and otherwise related forms of the personal pronouns see the section <a href="#grammar/declension">Declension</a>.</p>
133 65
 </section>
134 66
 
... ...
@@ -1,47 +1,109 @@
1 1
 <?php
2 2
 	global $configuration;
3 3
 	include_once("source/logic/server/data.php");
4
-	
5
-	function format($string)
6
-	{
7
-		return (($string == NULL) ? "--" : preg_replace("/_([^_]*)_/", "<u>$1</u>", $string));
8
-	}
4
+	include_once("source/logic/server/table.php");
5
+	include_once("source/logic/server/misc.php");
9 6
  ?>
10 7
 <section class="section" id="grammar/phonology_and_orthography">
11 8
 	<header>Phonology and Orthography</header>
12 9
 	<!--
13 10
 	<p>Folksprak uses the following characters as letters:</pa>
14 11
 	  -->
15
-	<table>
16
-		<thead>
17
-			<tr>
18
-				<th>IPA-sound</th>
19
-				<th>Type</th>
20
-				<th>Latin letter Representation</th>
21
-				<th>Runic Representation</th>
22
-				<th><?php echo($configuration["languagemap"]["fs"]); ?> Example</th>
23
-				<th><?php echo($configuration["languagemap"][$configuration["target"]]); ?> Example</th>
24
-			</tr>
25
-		</thead>
26
-		<tbody>
27
-<?php
28
-	$data_phonology_and_orthography = read_json("source/data/phonology_and_orthography.json");
29
-	foreach ($data_phonology_and_orthography as $entry)
30
-	{
31
- ?>
32
-	<tr>
33
-		<td><span class="ipa"><?php echo($entry["ipa"]); ?></span></td>
34
-		<td><?php echo($entry["type"]); ?></td>
35
-		<td><span class="word_fs"><?php echo($entry["latin"]); ?></span></td>
36
-		<td><span class="word_fs runic"><?php echo($entry["runic"]); ?></span></td>
37
-		<td><span class="word_fs"><?php echo(format($entry["examples"]["fs"])); ?></span></td>
38
-		<td><span class="word_otherlanguage"><?php echo(format($entry["examples"][$configuration["target"]])); ?></span></td>
39
-	</tr>
12
+	<!--
13
+	<div class="note_information">It was not easy to find a phonology system for Folksprak.</div>
14
+	  -->
40 15
 <?php
41
-	}
16
+	$table = new class_table
17
+	(
18
+		[
19
+			new class_column
20
+			(
21
+				"IPA-sound",
22
+				function ($row)
23
+				{
24
+					return $row["ipa"];
25
+				},
26
+				function ($value)
27
+				{
28
+					return mark($value, ["ipa"]);
29
+				}
30
+			),
31
+			/*
32
+			new class_column
33
+			(
34
+				"Type",
35
+				function ($row)
36
+				{
37
+					return $row["type"];
38
+				}
39
+			),
40
+			 */
41
+			new class_column
42
+			(
43
+				"Latin letter Representation",
44
+				function ($row)
45
+				{
46
+					return $row["latin"];
47
+				},
48
+				function ($value)
49
+				{
50
+					return mark($value, ["letter", "lang_fs"]);
51
+				}
52
+			),
53
+			new class_column
54
+			(
55
+				"Runic Representation",
56
+				function ($row)
57
+				{
58
+					return $row["runic"];
59
+				},
60
+				function ($value)
61
+				{
62
+					return mark($value, ["letter", "lang_fs", "runic"]);
63
+				}
64
+			),
65
+			new class_column
66
+			(
67
+				$configuration["languagemap"]["fs"] . " Example",
68
+				function ($row)
69
+				{
70
+					return $row["examples"]["fs"];
71
+				},
72
+				function ($value)
73
+				{
74
+					return mark(format($value), ["word", "lang_fs"]);
75
+				}
76
+			),
77
+			new class_column
78
+			(
79
+				$configuration["languagemap"][$configuration["target"]] . " Example",
80
+				function ($row) use (&$configuration)
81
+				{
82
+					return $row["examples"][$configuration["target"]];
83
+				},
84
+				function ($value) use (&$configuration)
85
+				{
86
+					return mark(format($value), ["word", "lang_" . $configuration["target"]]);
87
+				}
88
+			),
89
+			new class_column
90
+			(
91
+				"Remark",
92
+				function ($row)
93
+				{
94
+					return $row["remark"];
95
+				},
96
+				function ($value)
97
+				{
98
+					return format($value);
99
+				}
100
+			),
101
+		],
102
+		read_json("source/data/phonology_and_orthography.json")
103
+	);
104
+	$table->generate();
42 105
  ?>
43
-		</tbody>
44
-	</table>
45
-	<span class="note_warning">The runic writing is not meant to be used in regular texts. Use it only for purposes like art, etc.!</span>
106
+ 	<div class="note_information">It is admitted to pronounce the sounds a little different, for example <span class="letter lang_fs">v</span> as <span class="ipa">ʋ</span> or <span class="letter lang_fs">s</span> as <span class="ipa">z</span>, whilst the sounds from the table above are the default.</div>
107
+	<div class="note_warning">The runic writing is not meant to be used in regular texts. Use it only for purposes like art, etc.!</div>
46 108
 </section>
47 109
 
... ...
@@ -1,10 +1,7 @@
1
-<section class="section pseudo" id="intro/preface">
1
+<section class="section pseudo" id="introduction/preface">
2 2
 	<header>Preface</header>
3
-	<section class="subsection pseudo" id="introduction/preface/what_is_it_about">
4
-		<header>What is it about?</header>
5
-		<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>
6
-		<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>
7
-		<p>The content of this document is the result of a collaboration between people from different parts on earth, connected by the internet. Its not a final specification for Folksprak, but a draft as a base to work on. Please let us know what you think about it and how you would improve it! You can find us in the IRC-Channel <span class="code">##folksprak</span> on <a href="irc://irc.freenode.net">irc.freenode.net</a>. You can also write an E-Mail to <a href="mailto:admin@folksprak.org">admin@folksprak.org</a>.</p>
8
-	</section>
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
+	<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>
5
+	<p>The content of this document is the result of a collaboration between people from different parts on earth, connected by the internet. Its not a final specification for Folksprak, but a draft as a base to work on. Please let us know what you think about it and how you would improve it! You can find us in the IRC-Channel <span class="code">##folksprak</span> on <a href="irc://irc.freenode.net">irc.freenode.net</a>. You can also write an E-Mail to <a href="mailto:admin@folksprak.org">admin@folksprak.org</a>.</p>
9 6
 </section>
10 7
 
11 8
new file mode 100644
... ...
@@ -0,0 +1,6 @@
1
+<section class="section pseudo" id="introduction/toc">
2
+	<header>Table of Contents</header>
3
+	<div id="toc">
4
+	</div>
5
+</section>
6
+
... ...
@@ -1,5 +1,12 @@
1 1
 <section class="chapter" id="vocabulary">
2 2
 	<header>Vocabulary</header>
3
-	See <a href="http://folksprak.org/?target=dictionary">Munin-Dictionary</a>
3
+	<section class="section" id="vocabulary/principles">
4
+		<header>Principles</header>
5
+		<span class="todo">all</span>
6
+	</section>
7
+	<section class="section" id="vocabulary/dictionary">
8
+		<header>Dictionary</header>
9
+		See <a href="http://folksprak.org/?target=dictionary">Munin-Dictionary</a>
10
+	</section>
4 11
 </section>
5 12
 
6 13
new file mode 100644
... ...
@@ -0,0 +1,119 @@
1
+<?php
2
+	global $configuration;
3
+	include_once("source/logic/server/data.php");
4
+	include_once("source/logic/server/table.php");
5
+ ?>
6
+<section class="section" id="grammar/word_functions">
7
+	<header>Word Functions</header>
8
+<?php
9
+	$table = new class_table
10
+	(
11
+		[
12
+			new class_column
13
+			(
14
+				"Affix",
15
+				function ($row)
16
+				{
17
+					return $row["affix"];
18
+				},
19
+				function ($value)
20
+				{
21
+					return mark($value, ["word", "lang_fs"]);
22
+				}
23
+			),
24
+			new class_column
25
+			(
26
+				"Type",
27
+				function ($row)
28
+				{
29
+					return [$row["type_from"], $row["type_to"]];
30
+				},
31
+				function ($value)
32
+				{
33
+					return (
34
+						implode
35
+						(
36
+							" → ",
37
+							array_map
38
+							(
39
+								function ($group)
40
+								{
41
+				 					return ("{" . implode(",", $group) . "}");
42
+								},
43
+								$value
44
+							)
45
+						)
46
+					);
47
+				}
48
+			),
49
+			new class_column
50
+			(
51
+				"Description",
52
+				function ($row)
53
+				{
54
+					return ["name" => $row["name"], "description" => $row["description"]];
55
+				},
56
+				function ($value)
57
+				{
58
+					$output = "";
59
+					if ($value["name"] != null) $output .= (mark($value["name"], ["grammarterm"]) . ": ");
60
+					if ($value["description"] != null) $output .= ($value["description"]);
61
+					return $output;
62
+				}
63
+			),
64
+			/*
65
+			new class_column
66
+			(
67
+				"Cognates",
68
+				function ($row)
69
+				{
70
+					return $row["cognates"];
71
+				},
72
+				function ($value)
73
+				{
74
+					return implode(", ", array_map(function ($entry) {return ($entry["language"] . ": " . mark($entry["affix"], ["word", "lang_" . $entry["language"]]));}, $value));
75
+				}
76
+			),
77
+			 */
78
+			new class_column
79
+			(
80
+				"Example",
81
+				function ($row)
82
+				{
83
+					return $row["example"];
84
+				},
85
+				function ($value)
86
+				{
87
+					global $configuration;
88
+					$from = mark($value["word"], ["word", "lang_fs"]);
89
+					$to = implode
90
+					(
91
+						", ",
92
+						array_map
93
+						(
94
+							function ($word)
95
+							{
96
+								global $configuration;
97
+								return mark($word, ["word", "lang_" . $configuration["target"]]);
98
+							},
99
+							$value["translations"][$configuration["target"]]
100
+						)
101
+					);
102
+					return ($from . " ~ " . $to);
103
+				}
104
+			),
105
+		],
106
+		read_json("source/data/word_functions.json")
107
+	);
108
+	$table->generate();
109
+ ?>
110
+<p>
111
+	Some complex examples:
112
+	<ul>
113
+		<li><span class="word lang_fs">unmanlikhed</span> ~ <span class="word lang_en">inhumanity</span></li>
114
+		<li><span class="word lang_fs">seberenung</span> ~ <span class="word lang_en">visualization</span></li>
115
+		<li><span class="word lang_fs">kraftigenar</span> ~ <span class="word lang_en">fortifier</span></li>
116
+	</ul>
117
+</p>
118
+</section>
119
+
... ...
@@ -1,33 +1,67 @@
1
-.node
1
+table
2
+{
3
+	border-collapse: collapse;
4
+	
5
+	& tr
6
+	{
7
+		th,td
8
+		{
9
+			border: 1px solid hsv(hsvhue(@color-fg), hsvsaturation(@color-fg), (0.8 * hsvvalue(@color-fg)) + (0.2 * hsvvalue(@color-bg)));
10
+		}
11
+	}
12
+	
13
+	& tr.splitter
14
+	{
15
+		height: 1px;
16
+	}
17
+
18
+	& tr:not(.splitter)
19
+	{
20
+		th,td
21
+		{
22
+			font-size: 0.8em;
23
+			padding: 4px;
24
+		}
25
+	}
26
+}
27
+
28
+a
29
+{
30
+	color: @color-x1;
31
+	text-decoration: none;
32
+	font-weight: bold;
33
+	/*
34
+	font-family: monospace;
35
+	 */
36
+}
37
+
38
+.note
2 39
 {
3 40
 	padding: 16px;
4
-	margin: 8px;
41
+	margin: 16px;
5 42
 	border-radius: 4px;
6
-	box-shadow: 4px 4px 4px hsv(0, 0%, 0%);
7
-	color: black;
43
+	box-shadow: 4px 4px 4px black;
44
+	color: @color-fg;
8 45
 }
9 46
 
10 47
 .note_information
11 48
 {
12
-	&:extend(.node);
13
-	background-color: hsv(120, 20%, 100%);
49
+	&:extend(.note);
50
+	background-color: hsv(120, 40%, (0.5 * hsvvalue(@color-bg)) + (0.5 * 50%));
14 51
 	&:before {font-weight: bold; content: "[i] ";}
15 52
 }
16 53
 
17 54
 .note_warning
18 55
 {
19
-	/*
20
-	&:extend(.node);
21
-	background-color: hsv( 60, 20%, 100%);
56
+	&:extend(.note);
57
+	background-color: hsv( 60, 40%, (0.5 * hsvvalue(@color-bg)) + (0.5 * 50%));
22 58
 	&:before {font-weight: bold; content: "[!] ";}
23
-	 */
24
-	&:before {font-weight: bold; content: "Note: ";}
25 59
 }
26 60
 
27 61
 .note_error
28 62
 {
29
-	&:extend(.node);
30