blob: 07a46ecced0bc651184884e5983f96640aa2e25b [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
Nils Diewalde8518f82015-03-18 22:41:49 +000010 */
Nils Diewald0e6992a2015-04-14 20:13:52 +000011define([
Nils Diewald0e6992a2015-04-14 20:13:52 +000012 'match/info',
Akron30ee5142015-06-26 01:50:14 +020013 'match/reference',
Nils Diewald0e6992a2015-04-14 20:13:52 +000014 'util'
Akron30ee5142015-06-26 01:50:14 +020015], function (infoClass, refClass) {
Nils Diewald4f6521a2015-03-20 21:30:13 +000016
Nils Diewald6e43ffd2015-03-25 18:55:39 +000017 // Localization values
Nils Diewald0e6992a2015-04-14 20:13:52 +000018 var loc = KorAP.Locale;
Nils Diewalda297f062015-04-02 00:23:46 +000019 loc.ADDTREE = loc.ADDTREE || 'Add tree view';
20 loc.SHOWINFO = loc.SHOWINFO || 'Show information';
21 loc.CLOSE = loc.CLOSE || 'Close';
Nils Diewald0e6992a2015-04-14 20:13:52 +000022
Akron0a6768f2016-07-13 18:00:43 +020023 // 'corpusID', 'docID', 'textID'
24 var _matchTerms = ['textSigle', 'matchID', 'available'];
Nils Diewalda297f062015-04-02 00:23:46 +000025
26 /**
27 * Match object
28 */
Nils Diewald0e6992a2015-04-14 20:13:52 +000029 return {
Nils Diewalde8518f82015-03-18 22:41:49 +000030
31 /**
32 * Create a new annotation object.
33 * Expects an array of available foundry/layer=type terms.
34 * Supported types are 'spans', 'tokens' and 'rels'.
35 */
Nils Diewalda297f062015-04-02 00:23:46 +000036 create : function (match) {
Nils Diewald0e6992a2015-04-14 20:13:52 +000037 return Object.create(this)._init(match);
Nils Diewalde8518f82015-03-18 22:41:49 +000038 },
39
Nils Diewald7c8ced22015-04-15 19:21:00 +000040
Nils Diewald6e43ffd2015-03-25 18:55:39 +000041 /**
Nils Diewalda297f062015-04-02 00:23:46 +000042 * Initialize match.
Nils Diewald6e43ffd2015-03-25 18:55:39 +000043 */
Nils Diewalda297f062015-04-02 00:23:46 +000044 _init : function (match) {
45 this._element = null;
Nils Diewald6e43ffd2015-03-25 18:55:39 +000046
Nils Diewalda297f062015-04-02 00:23:46 +000047 // No match defined
48 if (arguments.length < 1 ||
49 match === null ||
50 match === undefined) {
51 throw new Error('Missing parameters');
52 }
Nils Diewald6e43ffd2015-03-25 18:55:39 +000053
Nils Diewalda297f062015-04-02 00:23:46 +000054 // Match defined as a node
55 else if (match instanceof Node) {
56 this._element = match;
Nils Diewald6e43ffd2015-03-25 18:55:39 +000057
Nils Diewalda297f062015-04-02 00:23:46 +000058 // Circular reference !!
59 match["_match"] = this;
60
Akron0a6768f2016-07-13 18:00:43 +020061/*
Nils Diewalda297f062015-04-02 00:23:46 +000062 this.corpusID = match.getAttribute('data-corpus-id'),
63 this.docID = match.getAttribute('data-doc-id'),
64 this.textID = match.getAttribute('data-text-id'),
Akron0a6768f2016-07-13 18:00:43 +020065*/
66 if (match.hasAttribute('data-text-sigle')) {
67 this.textSigle = match.getAttribute('data-text-sigle')
68 }
69 else {
70 this.textSigle = match.getAttribute('data-corpus-id') +
71 '/' +
72 match.getAttribute('data-doc-id') +
73 '/' +
74 match.getAttribute('data-text-id');
75 };
76
77 this.matchID = match.getAttribute('data-match-id');
Nils Diewalda297f062015-04-02 00:23:46 +000078
79 // List of available annotations
80 this.available = match.getAttribute('data-available-info').split(' ');
81 }
82
83 // Match as an object
84 else {
85
86 // Iterate over allowed match terms
Nils Diewald0e6992a2015-04-14 20:13:52 +000087 for (var i in _matchTerms) {
88 var term = _matchTerms[i];
Nils Diewald7c8ced22015-04-15 19:21:00 +000089 this[term] = match[term] !== undefined ? match[term] : undefined;
Nils Diewalda297f062015-04-02 00:23:46 +000090 };
91 };
Nils Diewald0e6992a2015-04-14 20:13:52 +000092
Nils Diewald7c8ced22015-04-15 19:21:00 +000093 this._avail = {
Nils Diewalde8518f82015-03-18 22:41:49 +000094 tokens : [],
Nils Diewalda297f062015-04-02 00:23:46 +000095 spans : [],
96 rels : []
Nils Diewalde8518f82015-03-18 22:41:49 +000097 };
Nils Diewalda297f062015-04-02 00:23:46 +000098
99 // Iterate over info layers
100 for (var i = 0; i < this.available.length; i++) {
101 var term = this.available[i];
102
Nils Diewalde8518f82015-03-18 22:41:49 +0000103 // Create info layer objects
104 try {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000105 var layer = require('match/infolayer').create(term);
106 this._avail[layer.type].push(layer);
Nils Diewalde8518f82015-03-18 22:41:49 +0000107 }
108 catch (e) {
109 continue;
110 };
111 };
Nils Diewalda297f062015-04-02 00:23:46 +0000112
Nils Diewalde8518f82015-03-18 22:41:49 +0000113 return this;
114 },
115
116
117 /**
118 * Return a list of parseable tree annotations.
119 */
120 getSpans : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000121 return this._avail.spans;
Nils Diewalde8518f82015-03-18 22:41:49 +0000122 },
123
124
125 /**
126 * Return a list of parseable token annotations.
127 */
128 getTokens : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000129 return this._avail.tokens;
Nils Diewalde8518f82015-03-18 22:41:49 +0000130 },
131
132
133 /**
134 * Return a list of parseable relation annotations.
135 */
136 getRels : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000137 return this._avail.rels;
Nils Diewalde8518f82015-03-18 22:41:49 +0000138 },
139
Nils Diewald7c8ced22015-04-15 19:21:00 +0000140
Nils Diewalda297f062015-04-02 00:23:46 +0000141 /**
142 * Open match
143 */
144 open : function () {
145
146 // Add actions unless it's already activated
147 var element = this._element;
148
149 // There is an element to open
150 if (this._element === undefined || this._element === null)
151 return false;
152
153 // The element is already opened
154 if (element.classList.contains('active'))
155 return false;
156
157 // Add active class to element
158 element.classList.add('active');
159
Nils Diewald7c8ced22015-04-15 19:21:00 +0000160 // Already there
161 if (element.classList.contains('action'))
162 return true;
163
Nils Diewalda297f062015-04-02 00:23:46 +0000164 // Create action buttons
165 var ul = document.createElement('ul');
166 ul.classList.add('action', 'right');
Nils Diewalda297f062015-04-02 00:23:46 +0000167
Nils Diewald7c8ced22015-04-15 19:21:00 +0000168 element.appendChild(ul);
169 element.classList.add('action');
170
171 // Todo: Open in new frame
Nils Diewalda297f062015-04-02 00:23:46 +0000172
173 // Add close button
174 var close = document.createElement('li');
175 close.appendChild(document.createElement('span'))
176 .appendChild(document.createTextNode(loc.CLOSE));
177 close.classList.add('close');
178 close.setAttribute('title', loc.CLOSE);
Nils Diewald0e6992a2015-04-14 20:13:52 +0000179
Nils Diewalda297f062015-04-02 00:23:46 +0000180 // Add info button
181 var info = document.createElement('li');
182 info.appendChild(document.createElement('span'))
183 .appendChild(document.createTextNode(loc.SHOWINFO));
184 info.classList.add('info');
185 info.setAttribute('title', loc.SHOWINFO);
186
187 var that = this;
188
189 // Close match
190 close.addEventListener('click', function (e) {
191 e.halt();
192 that.close()
193 });
194
195 // Add information, unless it already exists
196 info.addEventListener('click', function (e) {
197 e.halt();
Nils Diewald5c5a7472015-04-02 22:13:38 +0000198 that.info().toggle();
Nils Diewalda297f062015-04-02 00:23:46 +0000199 });
200
201 ul.appendChild(close);
202 ul.appendChild(info);
203
204 return true;
205 },
206
Akron6a535d42015-08-26 20:16:58 +0200207 // Todo: Test toggle
208 toggle : function () {
209 if (this._element.classList.contains('active'))
210 this.close();
211 else
212 this.open();
213 },
214
Nils Diewald7c8ced22015-04-15 19:21:00 +0000215
Nils Diewald8bc7e412015-03-19 22:08:27 +0000216 /**
Nils Diewalda297f062015-04-02 00:23:46 +0000217 * Close info view
218 */
219 close : function () {
220 this._element.classList.remove('active');
Nils Diewald7c8ced22015-04-15 19:21:00 +0000221 /* if (this._info !== undefined) {
222 * this._info.destroy();
223 * };
224 */
Nils Diewalda297f062015-04-02 00:23:46 +0000225 },
226
227
Nils Diewalda297f062015-04-02 00:23:46 +0000228 /**
229 * Get and open associated match info.
230 */
231 info : function () {
232
233 // Create match info
234 if (this._info === undefined)
Nils Diewald0e6992a2015-04-14 20:13:52 +0000235 this._info = infoClass.create(this);
Nils Diewalda297f062015-04-02 00:23:46 +0000236
237 // There is an element to append
238 if (this._element === undefined ||
239 this._element === null)
240 return this._info;
Nils Diewald7c8ced22015-04-15 19:21:00 +0000241
Nils Diewalda297f062015-04-02 00:23:46 +0000242 // Info is already activated
Nils Diewald5c5a7472015-04-02 22:13:38 +0000243 if (this._info._element !== undefined)
Nils Diewalda297f062015-04-02 00:23:46 +0000244 return this._info;
245
Nils Diewalda297f062015-04-02 00:23:46 +0000246 return this._info;
247 },
248
Nils Diewald7c8ced22015-04-15 19:21:00 +0000249
Nils Diewalda297f062015-04-02 00:23:46 +0000250 /**
251 * Get match element.
252 */
253 element : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000254 return this._element; // May be null
Nils Diewalda297f062015-04-02 00:23:46 +0000255 }
256 };
Nils Diewald0e6992a2015-04-14 20:13:52 +0000257});