blob: 6a781b66b339e63e289cdef1a70dd3867ab8314e [file] [log] [blame]
Akron7524be12016-06-01 17:31:33 +02001/*
Akron5cb9b2b2018-07-24 17:01:09 +02002 * Initialize The JS frontend part and decorate
3 * the static HTML data.
4 *
5 * @author Nils Diewald
6 *
Akron7524be12016-06-01 17:31:33 +02007 * TODO: Create lazy loading of objects including
8 * - obj.hint()
9 * - obj.alertify()
10 * - obj.session()
11 * - obj.tutorial()
12 * - obj.vc() // toggle
13 * - obj.matchCreate() (using webpack)
14 * - obj.koral() (show result, parse for errors ...)
15 * - obj.alignment() // toggle
16 */
17
Akrone51eaa32020-11-10 09:35:53 +010018"use strict";
Nils Diewald0e6992a2015-04-14 20:13:52 +000019define([
20 'match',
21 'hint',
22 'vc',
23 'tutorial',
24 'lib/domReady',
Akron27ae9ec2015-06-23 00:43:21 +020025 'vc/array',
Nils Diewald7148c6f2015-05-04 15:07:53 +000026 'lib/alertify',
Akron7716f012015-07-01 20:38:32 +020027 'session',
Akron6bb71582016-06-10 20:41:08 +020028 'selectMenu',
Akron5cb9b2b2018-07-24 17:01:09 +020029 'panel/result',
Akron2d0d96d2019-11-18 19:49:50 +010030 'panel/query',
hebasta75cfca52019-02-19 13:15:27 +010031 'tour/tours',
Akron24f48ea2020-07-01 09:37:19 +020032 'plugin/server',
33 'pipe',
Nils Diewald7148c6f2015-05-04 15:07:53 +000034 'api',
Nils Diewaldc46003b2015-05-07 15:55:35 +000035 'mailToChiffre',
Akron858cbc82019-12-05 16:53:13 +010036 'util',
37 'state'
Nils Diewald0e6992a2015-04-14 20:13:52 +000038], function (matchClass,
Akron19d97fe2016-09-06 20:47:05 +020039 hintClass,
40 vcClass,
41 tutClass,
42 domReady,
Akron19d97fe2016-09-06 20:47:05 +020043 vcArray,
44 alertifyClass,
45 sessionClass,
Akron4d926f12018-07-16 15:30:25 +020046 selectMenuClass,
hebasta75cfca52019-02-19 13:15:27 +010047 resultPanelClass,
Akron2d0d96d2019-11-18 19:49:50 +010048 queryPanelClass,
Akron24f48ea2020-07-01 09:37:19 +020049 tourClass,
50 pluginClass,
51 pipeClass) {
Nils Diewalda0defc42015-05-07 23:54:17 +000052
Akron0b489ad2018-02-02 16:49:32 +010053 const d = document;
Akron9cc3eaf2015-06-10 22:15:52 +020054
Akronbc6b3f22021-01-13 14:53:12 +010055 // Remove the no-js class from the body
56 d.body.classList.remove('no-js');
57
58 // Set base URL
59 KorAP.URL = d.body.getAttribute('data-korap-url') || "";
60
61 // Get koralQuery response
62 const kqe = d.getElementById('koralQuery');
63 if (kqe !== null) {
64 KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || "");
65 };
66
Akron0c4cd222019-07-19 16:33:34 +020067 // Create suffix if KorAP is run in a subfolder
68 KorAP.session = sessionClass.create(
69 KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'
70 );
Akronf8035592018-05-24 20:40:51 +020071
Nils Diewalda0defc42015-05-07 23:54:17 +000072 // Override KorAP.log
73 window.alertify = alertifyClass;
Akronc0a2da82018-07-04 15:27:37 +020074 KorAP.log = function (code, msg, src) {
75
76 if (src) {
77 msg += '<code class="src">'+src+'</code>';
78 };
Nils Diewalda0defc42015-05-07 23:54:17 +000079
80 // Use alertify to log errors
81 alertifyClass.log(
Akronf55504a2015-06-18 16:42:55 +020082 (code === 0 ? '' : code + ': ') +
Akron19d97fe2016-09-06 20:47:05 +020083 msg,
Nils Diewalda0defc42015-05-07 23:54:17 +000084 'error',
Akronf55504a2015-06-18 16:42:55 +020085 10000
Nils Diewalda0defc42015-05-07 23:54:17 +000086 );
87 };
88
hebasta2758b582018-11-19 15:59:42 +010089 KorAP.vc = vcClass.create(vcArray);
90
hebasta5df796f2019-05-21 15:27:12 +020091 KorAP.tourshow = function(){
92 tourClass.gTstartSearch().start();
93 };
94
95 KorAP.tourshowR = function(){
96 tourClass.gTshowResults().start();
97 };
98
Nils Diewald0e6992a2015-04-14 20:13:52 +000099 domReady(function (event) {
hebasta5df796f2019-05-21 15:27:12 +0200100
Nils Diewald0e6992a2015-04-14 20:13:52 +0000101 var obj = {};
Akron71b91e42016-06-01 22:12:43 +0200102
Akron4d926f12018-07-16 15:30:25 +0200103 // What should be visible in the beginning?
Akronf8035592018-05-24 20:40:51 +0200104 var show = KorAP.session.get('show') || {};
hebasta043e96f2019-11-28 12:33:00 +0100105
106 KorAP.Panel = KorAP.Panel || {}
Nils Diewalda297f062015-04-02 00:23:46 +0000107
108 /**
Akronf55504a2015-06-18 16:42:55 +0200109 * Release notifications
110 */
111 if (KorAP.Notifications !== undefined) {
Akronb50964a2020-10-12 11:44:37 +0200112 KorAP.Notifications.forEach(function(n) {
113 var msg = n[1];
114 if (n[2]) {
115 msg += '<code class="src">'+n[2]+'</code>';
Akron8ea84292018-10-24 13:41:52 +0200116 };
Akronb50964a2020-10-12 11:44:37 +0200117 alertifyClass.log(msg, n[0], 10000);
118 });
Akronf55504a2015-06-18 16:42:55 +0200119 };
120
121 /**
Akroncd42a142019-07-12 18:55:37 +0200122 * Replace Virtual Corpus field
Nils Diewald7148c6f2015-05-04 15:07:53 +0000123 */
Akron5c829e92017-05-12 18:10:00 +0200124 var vcname, vcchoose;
Akroncd42a142019-07-12 18:55:37 +0200125 var input = d.getElementById('cq');
Akron1f0521b2018-08-28 13:01:24 +0200126
hebasta2758b582018-11-19 15:59:42 +0100127 var vc = KorAP.vc;
hebasta48842cf2018-12-11 12:57:38 +0100128
Akron1f0521b2018-08-28 13:01:24 +0200129 // Add vc name object
Nils Diewald7148c6f2015-05-04 15:07:53 +0000130 if (input) {
131 input.style.display = 'none';
Akron0b489ad2018-02-02 16:49:32 +0100132 vcname = d.createElement('span');
Nils Diewald7148c6f2015-05-04 15:07:53 +0000133 vcname.setAttribute('id', 'vc-choose');
Akron6bb71582016-06-10 20:41:08 +0200134 vcname.classList.add('select');
Akron941551e2015-06-11 16:06:22 +0200135
Akron1f0521b2018-08-28 13:01:24 +0200136 // Load virtual corpus object
Akroncd42a142019-07-12 18:55:37 +0200137 // Supports "collection" for legacy reasons
138 if (KorAP.koralQuery !== undefined && (KorAP.koralQuery["collection"] || KorAP.koralQuery["corpus"])) {
Akron1f0521b2018-08-28 13:01:24 +0200139 try {
Akroncd42a142019-07-12 18:55:37 +0200140 vc.fromJson(KorAP.koralQuery["collection"] || KorAP.koralQuery["corpus"]);
Akron1f0521b2018-08-28 13:01:24 +0200141 }
142 catch (e) {
143 KorAP.log(0,e);
144 }
Akron27ae9ec2015-06-23 00:43:21 +0200145 };
146
Akron0b489ad2018-02-02 16:49:32 +0100147 vcchoose = vcname.addE('span');
Akronec6bb8e2018-08-29 13:07:56 +0200148 vcchoose.addT(vc.getName());
Akron27ae9ec2015-06-23 00:43:21 +0200149
Akron1f0521b2018-08-28 13:01:24 +0200150 if (vc.wasRewritten()) {
151 vcchoose.classList.add('rewritten');
152 };
153
Nils Diewald7148c6f2015-05-04 15:07:53 +0000154 input.parentNode.insertBefore(vcname, input);
155 };
156
Nils Diewald7148c6f2015-05-04 15:07:53 +0000157 /**
Nils Diewalda297f062015-04-02 00:23:46 +0000158 * Add actions to match entries
159 */
Akronb50964a2020-10-12 11:44:37 +0200160 var matchElements = d.querySelectorAll(
Akron3c390c42020-03-30 09:06:21 +0200161 '#search > ol > li'
Nils Diewald5c5a7472015-04-02 22:13:38 +0000162 );
Akron6a535d42015-08-26 20:16:58 +0200163
Akronb50964a2020-10-12 11:44:37 +0200164 matchElements.forEach(function(e) {
Akron3c390c42020-03-30 09:06:21 +0200165
166 // Define class for active elements
167 if (e.classList.contains('active')) {
168 if (this._match === undefined) {
Akron19d97fe2016-09-06 20:47:05 +0200169 // lazyLoad
Akron3c390c42020-03-30 09:06:21 +0200170 matchClass.create(e).init();
Akron19d97fe2016-09-06 20:47:05 +0200171 };
Akron3c390c42020-03-30 09:06:21 +0200172 }
173
174 // Define class for inactive elements
175 else {
176 e.addEventListener('click', function (e) {
Akron19d97fe2016-09-06 20:47:05 +0200177 if (this._match !== undefined)
Akron3c390c42020-03-30 09:06:21 +0200178 this._match.open();
Akron19d97fe2016-09-06 20:47:05 +0200179 else {
180 // lazyLoad
181 matchClass.create(this).open();
182 };
Akron3c390c42020-03-30 09:06:21 +0200183 // This would prevent the sidebar to go back
184 // e.halt();
185 });
186 e.addEventListener('keydown', function (e) {
187 var code = _codeFromEvent(e);
188
189 switch (code) {
190 case 32:
191 if (this._match !== undefined)
192 this._match.toggle();
193 else {
194 // lazyLoad
195 matchClass.create(this).open();
196 };
197 e.halt();
198 break;
199 };
200 });
201 };
Akronb50964a2020-10-12 11:44:37 +0200202 }, this);
Akron3c390c42020-03-30 09:06:21 +0200203
Akrone0c32c72017-04-25 22:38:23 +0200204 // Add focus listener to aside
Akron0b489ad2018-02-02 16:49:32 +0100205 var aside = d.getElementsByTagName('aside')[0];
Akrone0c32c72017-04-25 22:38:23 +0200206
207 if (aside && aside.classList.contains('active') == false) {
Akron1885ce92017-04-26 23:10:01 +0200208
Akron5258d462017-04-26 23:32:57 +0200209 // Horrible lock to deal with sidebar clicks
210 var asideClicked = false;
211
Akron1885ce92017-04-26 23:10:01 +0200212 // Make aside active on focus
213 aside.addEventListener('focus', function(e) {
Akrone0c32c72017-04-25 22:38:23 +0200214 this.classList.add('active');
215 });
216
Akron1885ce92017-04-26 23:10:01 +0200217 // Deactivate focus when clicking anywhere else
Akron0b489ad2018-02-02 16:49:32 +0100218 var body = d.getElementsByTagName('body')[0];
Akron1885ce92017-04-26 23:10:01 +0200219 if (body !== null) {
220 body.addEventListener('click', function() {
Akron5258d462017-04-26 23:32:57 +0200221 if (!asideClicked) {
222 aside.classList.remove('active');
223 }
224 else {
225 asideClicked = false;
226 };
Akron1885ce92017-04-26 23:10:01 +0200227 });
228 };
229
230 /* Stop click event on aside
231 * (to not trickle down to body)
232 */
233 aside.addEventListener('click', function(e) {
Akron5258d462017-04-26 23:32:57 +0200234 asideClicked = true;
Akrone0c32c72017-04-25 22:38:23 +0200235 });
236 };
Akronb9cdb102017-04-25 00:52:31 +0200237
238
Akron6bb71582016-06-10 20:41:08 +0200239 // Replace QL select menus with KorAP menus
Akron0b489ad2018-02-02 16:49:32 +0100240 var qlField = d.getElementById('ql-field');
Akronaba7a5a2016-08-15 21:58:33 +0200241 if (qlField !== null) {
Akron086fe5d2017-11-13 14:01:45 +0100242 KorAP.QLmenu = selectMenuClass.create(
Akron0b489ad2018-02-02 16:49:32 +0100243 d.getElementById('ql-field').parentNode
Akronaba7a5a2016-08-15 21:58:33 +0200244 ).limit(5);
245 };
Akron6bb71582016-06-10 20:41:08 +0200246
Akron4d926f12018-07-16 15:30:25 +0200247 var resultInfo = d.getElementById('resultinfo');
248
Akron4d926f12018-07-16 15:30:25 +0200249 /**
250 * Add result panel
251 */
Akron5cb9b2b2018-07-24 17:01:09 +0200252 var resultPanel = resultPanelClass.create(show);
253
Akron4d926f12018-07-16 15:30:25 +0200254 if (resultInfo != null) {
Akron4d926f12018-07-16 15:30:25 +0200255
256 // Move buttons to resultinfo
257 resultInfo.appendChild(resultPanel.actions.element());
258
Akrone6538cd2018-07-16 17:52:33 +0200259 // The views are at the top of the search results
Akron4d926f12018-07-16 15:30:25 +0200260 var sb = d.getElementById('search');
261 sb.insertBefore(resultPanel.element(), sb.firstChild);
Akron4d926f12018-07-16 15:30:25 +0200262 };
263
264
Akron179c8ac2015-06-30 19:30:50 +0200265 // There is a koralQuery
Akron4d926f12018-07-16 15:30:25 +0200266 if (KorAP.koralQuery !== undefined) {
Akron5cb9b2b2018-07-24 17:01:09 +0200267
268 // Add KoralQuery view to result panel
Akron4d926f12018-07-16 15:30:25 +0200269 if (resultInfo !== null) {
Akron5cb9b2b2018-07-24 17:01:09 +0200270 resultPanel.addKqAction()
Akron179c8ac2015-06-30 19:30:50 +0200271 };
Akron7716f012015-07-01 20:38:32 +0200272
Akron00cd4d12016-05-31 21:01:11 +0200273 if (KorAP.koralQuery["errors"]) {
Akron678c26f2020-10-09 08:52:50 +0200274 KorAP.koralQuery["errors"].forEach(function(e) {
Akronf0c31ed2016-06-11 11:27:01 +0200275
Akron19d97fe2016-09-06 20:47:05 +0200276 // Malformed query
Akron4a24b722020-10-13 12:44:25 +0200277 if (e[0] === 302 && e[2] !== undefined) {
Akron19d97fe2016-09-06 20:47:05 +0200278 obj.hint = hintClass.create();
Akron678c26f2020-10-09 08:52:50 +0200279 obj.hint.alert(e[2], e[1]);
Akron19d97fe2016-09-06 20:47:05 +0200280 }
Akronf0c31ed2016-06-11 11:27:01 +0200281
Akron19d97fe2016-09-06 20:47:05 +0200282 // no query
Akron678c26f2020-10-09 08:52:50 +0200283 else if (e[0] === 301) {
Akron19d97fe2016-09-06 20:47:05 +0200284 obj.hint = hintClass.create();
Akron678c26f2020-10-09 08:52:50 +0200285 obj.hint.alert(0, e[1]);
Akron19d97fe2016-09-06 20:47:05 +0200286 }
Akron678c26f2020-10-09 08:52:50 +0200287 });
Akron00cd4d12016-05-31 21:01:11 +0200288 };
Akron179c8ac2015-06-30 19:30:50 +0200289 };
290
Akron5cb9b2b2018-07-24 17:01:09 +0200291
292 /*
293 * There is more than 0 matches, so allow for
294 * alignment toggling (left <=> right)
295 */
Akronb50964a2020-10-12 11:44:37 +0200296 if (matchElements.length > 0)
Akron5cb9b2b2018-07-24 17:01:09 +0200297 resultPanel.addAlignAction();
Nils Diewald7148c6f2015-05-04 15:07:53 +0000298
hebasta043e96f2019-11-28 12:33:00 +0100299 KorAP.Panel['result'] = resultPanel;
Akron5cb9b2b2018-07-24 17:01:09 +0200300 /*
Akroncd42a142019-07-12 18:55:37 +0200301 * Toggle the Virtual Corpus builder
Nils Diewald7148c6f2015-05-04 15:07:53 +0000302 */
303 if (vcname) {
Akronec6bb8e2018-08-29 13:07:56 +0200304 vc.onMinimize = function () {
305 vcname.classList.remove('active');
Akroncd42a142019-07-12 18:55:37 +0200306 delete show['vc'];
Akronec6bb8e2018-08-29 13:07:56 +0200307 };
Nils Diewald6283d692015-04-23 20:32:53 +0000308
Akronec6bb8e2018-08-29 13:07:56 +0200309 vc.onOpen = function () {
310 vcname.classList.add('active');
Akroncfe8ecc2018-11-20 18:46:16 +0100311
312 var view = d.getElementById('vc-view');
313 if (!view.firstChild)
314 view.appendChild(this.element());
315
Akroncd42a142019-07-12 18:55:37 +0200316 show['vc'] = true;
Akronec6bb8e2018-08-29 13:07:56 +0200317 };
318
319 var vcclick = function () {
Akronec6bb8e2018-08-29 13:07:56 +0200320 if (vc.isOpen()) {
321 vc.minimize()
322 }
323 else {
Akronec6bb8e2018-08-29 13:07:56 +0200324 vc.open();
Akron19d97fe2016-09-06 20:47:05 +0200325 };
Nils Diewald58141332015-04-07 16:18:45 +0000326 };
Akron04671e72017-05-11 20:47:32 +0200327
Akron179c8ac2015-06-30 19:30:50 +0200328 vcname.onclick = vcclick;
Akron5c829e92017-05-12 18:10:00 +0200329
330 // Click, if the VC should be shown
Akroncd42a142019-07-12 18:55:37 +0200331 if (show['vc']) {
Akron19d97fe2016-09-06 20:47:05 +0200332 vcclick.apply();
Akron04671e72017-05-11 20:47:32 +0200333 };
Nils Diewald58141332015-04-07 16:18:45 +0000334 };
335
Akron19d97fe2016-09-06 20:47:05 +0200336
Nils Diewald58141332015-04-07 16:18:45 +0000337 /**
338 * Init Tutorial view
339 */
Akron0b489ad2018-02-02 16:49:32 +0100340 if (d.getElementById('view-tutorial')) {
Nils Diewaldfccfbcb2015-04-29 20:48:19 +0000341 window.tutorial = tutClass.create(
Akron0b489ad2018-02-02 16:49:32 +0100342 d.getElementById('view-tutorial'),
Akronf8035592018-05-24 20:40:51 +0200343 KorAP.session
Nils Diewaldfccfbcb2015-04-29 20:48:19 +0000344 );
345 obj.tutorial = window.tutorial;
346 }
Nils Diewald58141332015-04-07 16:18:45 +0000347
Nils Diewaldfccfbcb2015-04-29 20:48:19 +0000348 // Tutorial is in parent
349 else if (window.parent) {
350 obj.tutorial = window.parent.tutorial;
351 };
352
Akron0b489ad2018-02-02 16:49:32 +0100353 // Initialize queries for d
Akron6ed13992016-05-23 18:06:05 +0200354 if (obj.tutorial) {
Akron0b489ad2018-02-02 16:49:32 +0100355 obj.tutorial.initQueries(d);
Nils Diewaldfccfbcb2015-04-29 20:48:19 +0000356
Akron6ed13992016-05-23 18:06:05 +0200357 // Initialize documentation links
Akron0b489ad2018-02-02 16:49:32 +0100358 obj.tutorial.initDocLinks(d);
Akron6ed13992016-05-23 18:06:05 +0200359 };
Nils Diewald61e6ff52015-05-07 17:26:50 +0000360
Nils Diewald845282c2015-05-14 07:53:03 +0000361
Nils Diewald58141332015-04-07 16:18:45 +0000362 /**
Akronc1457bf2015-06-11 19:24:00 +0200363 * Add VC creation on submission.
364 */
Akron0b489ad2018-02-02 16:49:32 +0100365 var form = d.getElementById('searchform');
Akron792f58b2015-07-08 18:59:36 +0200366 if (form !== null) {
Akronc1457bf2015-06-11 19:24:00 +0200367 form.addEventListener('submit', function (e) {
Akron0b489ad2018-02-02 16:49:32 +0100368 var qf = d.getElementById('q-field');
Akron1be6c1c2020-01-07 15:29:58 +0100369
Akron19d97fe2016-09-06 20:47:05 +0200370 // No query was defined
371 if (qf.value === undefined || qf.value === '') {
372 qf.focus();
373 e.halt();
374 KorAP.log(700, "No query given");
375 return;
376 };
Akron1be6c1c2020-01-07 15:29:58 +0100377
Akron19d97fe2016-09-06 20:47:05 +0200378 // Store session information
Akronf8035592018-05-24 20:40:51 +0200379 KorAP.session.set("show", show);
Akron7716f012015-07-01 20:38:32 +0200380
Akron19d97fe2016-09-06 20:47:05 +0200381 if (vc !== undefined) {
382 input.value = vc.toQuery();
Akrond7ad9072019-12-09 07:08:20 +0100383 if (input.value == '')
384 input.removeAttribute('name');
Akron19d97fe2016-09-06 20:47:05 +0200385 }
386 else {
Akrond7ad9072019-12-09 07:08:20 +0100387 input.removeAttribute('value');
388 input.removeAttribute('name');
Akron19d97fe2016-09-06 20:47:05 +0200389 };
Akron1be6c1c2020-01-07 15:29:58 +0100390
391 // This would preferably set the query to be "disabled",
392 // but in that case the query wouldn't be submitted
393 // at all.
394 // Setting the cursor to "progress" fails in current versions
395 // of webkit.
396 qf.classList.add("loading");
397 d.getElementById('qsubmit').classList.add("loading");
Akronc1457bf2015-06-11 19:24:00 +0200398 });
399 };
hebasta5df796f2019-05-21 15:27:12 +0200400
401
402 //Starts the guided tour at the next page
403 if(KorAP.session.get("tour")){
404 tourClass.gTshowResults().start();
405 }
406
Akronc1457bf2015-06-11 19:24:00 +0200407 /**
Nils Diewald58141332015-04-07 16:18:45 +0000408 * Init hint helper
409 * has to be final because of
410 * reposition
411 */
Nils Diewald0e6992a2015-04-14 20:13:52 +0000412 // Todo: Pass an element, so this works with
413 // tutorial pages as well!
Akron00cd4d12016-05-31 21:01:11 +0200414 if (obj.hint === undefined)
415 obj.hint = hintClass.create();
Nils Diewald7148c6f2015-05-04 15:07:53 +0000416
Akron99713ef2017-06-28 18:19:28 +0200417 // Add the hinthelper to the KorAP object to make it manipulatable globally
Akron72f73572017-12-05 12:31:09 +0100418 KorAP.Hint = obj.hint;
Akron99713ef2017-06-28 18:19:28 +0200419
Akron2d0d96d2019-11-18 19:49:50 +0100420
421 /**
422 * Add query panel
423 */
424 var queryPanel = queryPanelClass.create();
425
426 // Get input field
427 var sform = d.getElementById("searchform");
428 var vcView = d.getElementById('vc-view')
429 if (sform && vcView) {
430 // The views are below the query bar
431 sform.insertBefore(queryPanel.element(), vcView);
Akron2d0d96d2019-11-18 19:49:50 +0100432 KorAP.Panel['query'] = queryPanel;
433 }
Akron24f48ea2020-07-01 09:37:19 +0200434
435 /**
436 * Initialize Plugin registry.
437 */
438 let p = KorAP.Plugins;
439 if (p && p.length > 0) {
440 // Load Plugin Server first
441 KorAP.Plugin = pluginClass.create();
442
443 // Add services container to head
444 d.head.appendChild(KorAP.Plugin.element());
445
446 // Add pipe form
447 KorAP.Pipe = pipeClass.create();
448 d.getElementById("searchform").appendChild(KorAP.Pipe.element());
449
450 try {
451
452 // Register all plugins
Akronb50964a2020-10-12 11:44:37 +0200453 p.forEach(i => KorAP.Plugin.register(i));
Akron24f48ea2020-07-01 09:37:19 +0200454 }
455 catch (e) {
456 KorAP.log(0, e);
457 }
458 };
459
Nils Diewald58141332015-04-07 16:18:45 +0000460 return obj;
Nils Diewald0e6992a2015-04-14 20:13:52 +0000461 });
hebasta75cfca52019-02-19 13:15:27 +0100462
Nils Diewald0e6992a2015-04-14 20:13:52 +0000463});