blob: 629922078df173eafe9a2eb5476e576af2707e2f [file] [log] [blame]
Nils Diewalde8518f82015-03-18 22:41:49 +00001/**
Nils Diewalda297f062015-04-02 00:23:46 +00002 * Get information on matches,
3 * generate annotation tables and trees.
Nils Diewalde8518f82015-03-18 22:41:49 +00004 *
5 * @author Nils Diewald
6 */
7/*
Nils Diewald6e43ffd2015-03-25 18:55:39 +00008 * - Highlight (at least mark as bold) the match
9 * - Scroll to match vertically per default
Akron02360e42016-06-07 13:41:12 +020010 * - A click on a table field and a tree node should at the field description to the fragments list.
Nils Diewalde8518f82015-03-18 22:41:49 +000011 */
Nils Diewald0e6992a2015-04-14 20:13:52 +000012define([
Nils Diewald0e6992a2015-04-14 20:13:52 +000013 'match/info',
Akron30ee5142015-06-26 01:50:14 +020014 'match/reference',
Nils Diewald0e6992a2015-04-14 20:13:52 +000015 'util'
Akron30ee5142015-06-26 01:50:14 +020016], function (infoClass, refClass) {
Nils Diewald4f6521a2015-03-20 21:30:13 +000017
Nils Diewald6e43ffd2015-03-25 18:55:39 +000018 // Localization values
Nils Diewald0e6992a2015-04-14 20:13:52 +000019 var loc = KorAP.Locale;
Nils Diewalda297f062015-04-02 00:23:46 +000020 loc.ADDTREE = loc.ADDTREE || 'Add tree view';
21 loc.SHOWINFO = loc.SHOWINFO || 'Show information';
22 loc.CLOSE = loc.CLOSE || 'Close';
Nils Diewald0e6992a2015-04-14 20:13:52 +000023
Akron0a6768f2016-07-13 18:00:43 +020024 // 'corpusID', 'docID', 'textID'
25 var _matchTerms = ['textSigle', 'matchID', 'available'];
Nils Diewalda297f062015-04-02 00:23:46 +000026
27 /**
28 * Match object
29 */
Nils Diewald0e6992a2015-04-14 20:13:52 +000030 return {
Nils Diewalde8518f82015-03-18 22:41:49 +000031
32 /**
33 * Create a new annotation object.
34 * Expects an array of available foundry/layer=type terms.
35 * Supported types are 'spans', 'tokens' and 'rels'.
36 */
Nils Diewalda297f062015-04-02 00:23:46 +000037 create : function (match) {
Nils Diewald0e6992a2015-04-14 20:13:52 +000038 return Object.create(this)._init(match);
Nils Diewalde8518f82015-03-18 22:41:49 +000039 },
40
Nils Diewald7c8ced22015-04-15 19:21:00 +000041
Nils Diewald6e43ffd2015-03-25 18:55:39 +000042 /**
Nils Diewalda297f062015-04-02 00:23:46 +000043 * Initialize match.
Nils Diewald6e43ffd2015-03-25 18:55:39 +000044 */
Nils Diewalda297f062015-04-02 00:23:46 +000045 _init : function (match) {
46 this._element = null;
Nils Diewald6e43ffd2015-03-25 18:55:39 +000047
Nils Diewalda297f062015-04-02 00:23:46 +000048 // No match defined
49 if (arguments.length < 1 ||
Akron19d97fe2016-09-06 20:47:05 +020050 match === null ||
51 match === undefined) {
52 throw new Error('Missing parameters');
Nils Diewalda297f062015-04-02 00:23:46 +000053 }
Nils Diewald6e43ffd2015-03-25 18:55:39 +000054
Nils Diewalda297f062015-04-02 00:23:46 +000055 // Match defined as a node
56 else if (match instanceof Node) {
Akron19d97fe2016-09-06 20:47:05 +020057 this._element = match;
Nils Diewald6e43ffd2015-03-25 18:55:39 +000058
Akron19d97fe2016-09-06 20:47:05 +020059 // Circular reference !!
60 match["_match"] = this;
Nils Diewalda297f062015-04-02 00:23:46 +000061
Akron19d97fe2016-09-06 20:47:05 +020062 /*
63 this.corpusID = match.getAttribute('data-corpus-id'),
64 this.docID = match.getAttribute('data-doc-id'),
65 this.textID = match.getAttribute('data-text-id'),
66 */
67 if (match.hasAttribute('data-text-sigle')) {
68 this.textSigle = match.getAttribute('data-text-sigle')
69 }
70 else {
71 this.textSigle = match.getAttribute('data-corpus-id') +
72 '/' +
73 match.getAttribute('data-doc-id') +
74 '/' +
75 match.getAttribute('data-text-id');
76 };
Akron0a6768f2016-07-13 18:00:43 +020077
Akron19d97fe2016-09-06 20:47:05 +020078 this.matchID = match.getAttribute('data-match-id');
Nils Diewalda297f062015-04-02 00:23:46 +000079
Akron19d97fe2016-09-06 20:47:05 +020080 // List of available annotations
81 this.available = match.getAttribute('data-available-info').split(' ');
Nils Diewalda297f062015-04-02 00:23:46 +000082 }
83
84 // Match as an object
85 else {
86
Akron19d97fe2016-09-06 20:47:05 +020087 // Iterate over allowed match terms
88 for (var i in _matchTerms) {
89 var term = _matchTerms[i];
90 this[term] = match[term] !== undefined ? match[term] : undefined;
91 };
Nils Diewalda297f062015-04-02 00:23:46 +000092 };
Nils Diewald0e6992a2015-04-14 20:13:52 +000093
Nils Diewald7c8ced22015-04-15 19:21:00 +000094 this._avail = {
Akron19d97fe2016-09-06 20:47:05 +020095 tokens : [],
96 spans : [],
97 rels : []
Nils Diewalde8518f82015-03-18 22:41:49 +000098 };
Nils Diewalda297f062015-04-02 00:23:46 +000099
100 // Iterate over info layers
101 for (var i = 0; i < this.available.length; i++) {
Akron19d97fe2016-09-06 20:47:05 +0200102 var term = this.available[i];
Nils Diewalda297f062015-04-02 00:23:46 +0000103
Akron19d97fe2016-09-06 20:47:05 +0200104 // Create info layer objects
105 try {
106 var layer = require('match/infolayer').create(term);
107 this._avail[layer.type].push(layer);
108 }
109 catch (e) {
110 continue;
111 };
Nils Diewalde8518f82015-03-18 22:41:49 +0000112 };
Nils Diewalda297f062015-04-02 00:23:46 +0000113
Nils Diewalde8518f82015-03-18 22:41:49 +0000114 return this;
115 },
116
117
118 /**
119 * Return a list of parseable tree annotations.
120 */
121 getSpans : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000122 return this._avail.spans;
Nils Diewalde8518f82015-03-18 22:41:49 +0000123 },
124
125
126 /**
127 * Return a list of parseable token annotations.
128 */
129 getTokens : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000130 return this._avail.tokens;
Nils Diewalde8518f82015-03-18 22:41:49 +0000131 },
132
133
134 /**
135 * Return a list of parseable relation annotations.
136 */
137 getRels : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000138 return this._avail.rels;
Nils Diewalde8518f82015-03-18 22:41:49 +0000139 },
140
Nils Diewald7c8ced22015-04-15 19:21:00 +0000141
Nils Diewalda297f062015-04-02 00:23:46 +0000142 /**
143 * Open match
144 */
145 open : function () {
146
147 // Add actions unless it's already activated
148 var element = this._element;
149
150 // There is an element to open
151 if (this._element === undefined || this._element === null)
Akron19d97fe2016-09-06 20:47:05 +0200152 return false;
Nils Diewalda297f062015-04-02 00:23:46 +0000153
154 // The element is already opened
155 if (element.classList.contains('active'))
Akron19d97fe2016-09-06 20:47:05 +0200156 return false;
Nils Diewalda297f062015-04-02 00:23:46 +0000157
158 // Add active class to element
159 element.classList.add('active');
160
Nils Diewald7c8ced22015-04-15 19:21:00 +0000161 // Already there
162 if (element.classList.contains('action'))
Akron19d97fe2016-09-06 20:47:05 +0200163 return true;
Nils Diewald7c8ced22015-04-15 19:21:00 +0000164
Nils Diewalda297f062015-04-02 00:23:46 +0000165 // Create action buttons
166 var ul = document.createElement('ul');
167 ul.classList.add('action', 'right');
Nils Diewalda297f062015-04-02 00:23:46 +0000168
Nils Diewald7c8ced22015-04-15 19:21:00 +0000169 element.appendChild(ul);
170 element.classList.add('action');
171
172 // Todo: Open in new frame
Nils Diewalda297f062015-04-02 00:23:46 +0000173
174 // Add close button
175 var close = document.createElement('li');
176 close.appendChild(document.createElement('span'))
Akron19d97fe2016-09-06 20:47:05 +0200177 .appendChild(document.createTextNode(loc.CLOSE));
Nils Diewalda297f062015-04-02 00:23:46 +0000178 close.classList.add('close');
179 close.setAttribute('title', loc.CLOSE);
Nils Diewald0e6992a2015-04-14 20:13:52 +0000180
Nils Diewalda297f062015-04-02 00:23:46 +0000181 // Add info button
182 var info = document.createElement('li');
183 info.appendChild(document.createElement('span'))
Akron19d97fe2016-09-06 20:47:05 +0200184 .appendChild(document.createTextNode(loc.SHOWINFO));
Nils Diewalda297f062015-04-02 00:23:46 +0000185 info.classList.add('info');
186 info.setAttribute('title', loc.SHOWINFO);
187
188 var that = this;
189
190 // Close match
191 close.addEventListener('click', function (e) {
Akron19d97fe2016-09-06 20:47:05 +0200192 e.halt();
193 that.close()
Nils Diewalda297f062015-04-02 00:23:46 +0000194 });
195
196 // Add information, unless it already exists
197 info.addEventListener('click', function (e) {
Akron19d97fe2016-09-06 20:47:05 +0200198 e.halt();
199 that.info().toggle();
Nils Diewalda297f062015-04-02 00:23:46 +0000200 });
201
202 ul.appendChild(close);
203 ul.appendChild(info);
204
205 return true;
206 },
207
Akron6a535d42015-08-26 20:16:58 +0200208 // Todo: Test toggle
209 toggle : function () {
210 if (this._element.classList.contains('active'))
Akron19d97fe2016-09-06 20:47:05 +0200211 this.close();
Akron6a535d42015-08-26 20:16:58 +0200212 else
Akron19d97fe2016-09-06 20:47:05 +0200213 this.open();
Akron6a535d42015-08-26 20:16:58 +0200214 },
215
Nils Diewald7c8ced22015-04-15 19:21:00 +0000216
Nils Diewald8bc7e412015-03-19 22:08:27 +0000217 /**
Nils Diewalda297f062015-04-02 00:23:46 +0000218 * Close info view
219 */
220 close : function () {
221 this._element.classList.remove('active');
Nils Diewald7c8ced22015-04-15 19:21:00 +0000222 /* if (this._info !== undefined) {
223 * this._info.destroy();
224 * };
225 */
Nils Diewalda297f062015-04-02 00:23:46 +0000226 },
227
228
Nils Diewalda297f062015-04-02 00:23:46 +0000229 /**
230 * Get and open associated match info.
231 */
232 info : function () {
233
234 // Create match info
235 if (this._info === undefined)
Akron19d97fe2016-09-06 20:47:05 +0200236 this._info = infoClass.create(this);
Nils Diewalda297f062015-04-02 00:23:46 +0000237
238 // There is an element to append
239 if (this._element === undefined ||
Akron19d97fe2016-09-06 20:47:05 +0200240 this._element === null)
241 return this._info;
Nils Diewald7c8ced22015-04-15 19:21:00 +0000242
Nils Diewalda297f062015-04-02 00:23:46 +0000243 // Info is already activated
Nils Diewald5c5a7472015-04-02 22:13:38 +0000244 if (this._info._element !== undefined)
Akron19d97fe2016-09-06 20:47:05 +0200245 return this._info;
Nils Diewalda297f062015-04-02 00:23:46 +0000246
Nils Diewalda297f062015-04-02 00:23:46 +0000247 return this._info;
248 },
249
Nils Diewald7c8ced22015-04-15 19:21:00 +0000250
Nils Diewalda297f062015-04-02 00:23:46 +0000251 /**
252 * Get match element.
253 */
254 element : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000255 return this._element; // May be null
Nils Diewalda297f062015-04-02 00:23:46 +0000256 }
257 };
Nils Diewald0e6992a2015-04-14 20:13:52 +0000258});