blob: d5b365ed46d052e83bc9c0a855d6f8933004c7ba [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([
Akron13448c22018-07-10 13:05:46 +020013 'buttongroup',
Akronbfe912c2018-07-17 19:30:52 +020014 'panel/match',
Akron8b592d42018-01-26 18:33:06 +010015 'util'
Akronbfe912c2018-07-17 19:30:52 +020016], function (buttonGroupClass,matchPanelClass) { //, refClass) {
Nils Diewald4f6521a2015-03-20 21:30:13 +000017
Nils Diewald6e43ffd2015-03-25 18:55:39 +000018 // Localization values
Akron0b489ad2018-02-02 16:49:32 +010019 const loc = KorAP.Locale;
Akronbfe912c2018-07-17 19:30:52 +020020 // loc.SHOWINFO = loc.SHOWINFO || 'Show information';
21 // loc.ADDTREE = loc.ADDTREE || 'Relations';
22 // loc.SHOWANNO = loc.SHOWANNO || 'Tokens';
Akron24866cf2018-01-23 20:22:01 +010023 loc.CLOSE = loc.CLOSE || 'Close';
Akronbfe912c2018-07-17 19:30:52 +020024 // loc.SHOW_META = loc.SHOW_META || 'Metadata';
Nils Diewald0e6992a2015-04-14 20:13:52 +000025
Akron0a6768f2016-07-13 18:00:43 +020026 // 'corpusID', 'docID', 'textID'
Akron0b489ad2018-02-02 16:49:32 +010027 const _matchTerms = ['textSigle', 'matchID', 'available'];
28
29 const d = document;
Nils Diewalda297f062015-04-02 00:23:46 +000030
31 /**
32 * Match object
33 */
Nils Diewald0e6992a2015-04-14 20:13:52 +000034 return {
Nils Diewalde8518f82015-03-18 22:41:49 +000035
36 /**
Akron7f9a6a32018-07-18 15:05:23 +020037 * Create a new match object.
38 * Expects an element with match descriptions.
Nils Diewalde8518f82015-03-18 22:41:49 +000039 */
Nils Diewalda297f062015-04-02 00:23:46 +000040 create : function (match) {
Nils Diewald0e6992a2015-04-14 20:13:52 +000041 return Object.create(this)._init(match);
Nils Diewalde8518f82015-03-18 22:41:49 +000042 },
43
Nils Diewald7c8ced22015-04-15 19:21:00 +000044
Nils Diewald6e43ffd2015-03-25 18:55:39 +000045 /**
Nils Diewalda297f062015-04-02 00:23:46 +000046 * Initialize match.
Nils Diewald6e43ffd2015-03-25 18:55:39 +000047 */
Nils Diewalda297f062015-04-02 00:23:46 +000048 _init : function (match) {
49 this._element = null;
Akronbfe912c2018-07-17 19:30:52 +020050 this._initialized = false;
Nils Diewald6e43ffd2015-03-25 18:55:39 +000051
Nils Diewalda297f062015-04-02 00:23:46 +000052 // No match defined
53 if (arguments.length < 1 ||
Akron19d97fe2016-09-06 20:47:05 +020054 match === null ||
55 match === undefined) {
56 throw new Error('Missing parameters');
Nils Diewalda297f062015-04-02 00:23:46 +000057 }
Nils Diewald6e43ffd2015-03-25 18:55:39 +000058
Nils Diewalda297f062015-04-02 00:23:46 +000059 // Match defined as a node
60 else if (match instanceof Node) {
Akron19d97fe2016-09-06 20:47:05 +020061 this._element = match;
Nils Diewald6e43ffd2015-03-25 18:55:39 +000062
Akron19d97fe2016-09-06 20:47:05 +020063 // Circular reference !!
64 match["_match"] = this;
Nils Diewalda297f062015-04-02 00:23:46 +000065
Akron19d97fe2016-09-06 20:47:05 +020066 /*
67 this.corpusID = match.getAttribute('data-corpus-id'),
68 this.docID = match.getAttribute('data-doc-id'),
69 this.textID = match.getAttribute('data-text-id'),
70 */
71 if (match.hasAttribute('data-text-sigle')) {
72 this.textSigle = match.getAttribute('data-text-sigle')
73 }
74 else {
75 this.textSigle = match.getAttribute('data-corpus-id') +
76 '/' +
77 match.getAttribute('data-doc-id') +
78 '/' +
79 match.getAttribute('data-text-id');
80 };
Akron0a6768f2016-07-13 18:00:43 +020081
Akron19d97fe2016-09-06 20:47:05 +020082 this.matchID = match.getAttribute('data-match-id');
Nils Diewalda297f062015-04-02 00:23:46 +000083
Akron19d97fe2016-09-06 20:47:05 +020084 // List of available annotations
85 this.available = match.getAttribute('data-available-info').split(' ');
Nils Diewalda297f062015-04-02 00:23:46 +000086 }
87
88 // Match as an object
89 else {
90
Akron19d97fe2016-09-06 20:47:05 +020091 // Iterate over allowed match terms
92 for (var i in _matchTerms) {
93 var term = _matchTerms[i];
94 this[term] = match[term] !== undefined ? match[term] : undefined;
95 };
Nils Diewalda297f062015-04-02 00:23:46 +000096 };
Nils Diewald0e6992a2015-04-14 20:13:52 +000097
Nils Diewald7c8ced22015-04-15 19:21:00 +000098 this._avail = {
Akron19d97fe2016-09-06 20:47:05 +020099 tokens : [],
100 spans : [],
101 rels : []
Nils Diewalde8518f82015-03-18 22:41:49 +0000102 };
Nils Diewalda297f062015-04-02 00:23:46 +0000103
104 // Iterate over info layers
105 for (var i = 0; i < this.available.length; i++) {
Akron19d97fe2016-09-06 20:47:05 +0200106 var term = this.available[i];
Nils Diewalda297f062015-04-02 00:23:46 +0000107
Akron19d97fe2016-09-06 20:47:05 +0200108 // Create info layer objects
109 try {
110 var layer = require('match/infolayer').create(term);
111 this._avail[layer.type].push(layer);
112 }
113 catch (e) {
114 continue;
115 };
Nils Diewalde8518f82015-03-18 22:41:49 +0000116 };
Akron3a4a08e2017-05-23 22:34:18 +0200117
Nils Diewalde8518f82015-03-18 22:41:49 +0000118 return this;
119 },
120
Nils Diewalde8518f82015-03-18 22:41:49 +0000121 /**
122 * Return a list of parseable tree annotations.
123 */
124 getSpans : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000125 return this._avail.spans;
Nils Diewalde8518f82015-03-18 22:41:49 +0000126 },
127
128
129 /**
130 * Return a list of parseable token annotations.
131 */
132 getTokens : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000133 return this._avail.tokens;
Nils Diewalde8518f82015-03-18 22:41:49 +0000134 },
135
136
137 /**
138 * Return a list of parseable relation annotations.
139 */
140 getRels : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000141 return this._avail.rels;
Nils Diewalde8518f82015-03-18 22:41:49 +0000142 },
143
Nils Diewald7c8ced22015-04-15 19:21:00 +0000144
Nils Diewalda297f062015-04-02 00:23:46 +0000145 /**
146 * Open match
147 */
148 open : function () {
Akron7f9a6a32018-07-18 15:05:23 +0200149
Nils Diewalda297f062015-04-02 00:23:46 +0000150 // Add actions unless it's already activated
151 var element = this._element;
152
153 // There is an element to open
Akron7f9a6a32018-07-18 15:05:23 +0200154 if (element === undefined || element === null)
Akron19d97fe2016-09-06 20:47:05 +0200155 return false;
Nils Diewalda297f062015-04-02 00:23:46 +0000156
157 // The element is already opened
158 if (element.classList.contains('active'))
Akron19d97fe2016-09-06 20:47:05 +0200159 return false;
Nils Diewalda297f062015-04-02 00:23:46 +0000160
161 // Add active class to element
162 element.classList.add('active');
163
Nils Diewald7c8ced22015-04-15 19:21:00 +0000164 // Already there
Akronbfe912c2018-07-17 19:30:52 +0200165 /*
166 if (element.classList.contains('action'))
Akron19d97fe2016-09-06 20:47:05 +0200167 return true;
Akronbfe912c2018-07-17 19:30:52 +0200168 */
169 if (this._initialized)
170 return true;
Nils Diewald0e6992a2015-04-14 20:13:52 +0000171
Akronbfe912c2018-07-17 19:30:52 +0200172 var btn = buttonGroupClass.create(
173 ['action','button-view']
174 );
175
Nils Diewalda297f062015-04-02 00:23:46 +0000176 var that = this;
Akronbfe912c2018-07-17 19:30:52 +0200177 btn.add(loc.CLOSE, ['button-icon','close'], function () {
178 that.close();
179 });
180 element.appendChild(btn.element());
Nils Diewalda297f062015-04-02 00:23:46 +0000181
Akron24866cf2018-01-23 20:22:01 +0100182 // Add meta button
183 var refLine = element.querySelector("p.ref");
184
Akron0b489ad2018-02-02 16:49:32 +0100185 // No reference found
Akron151bc872018-02-02 14:04:15 +0100186 if (!refLine)
187 return;
Akrone1c27f62018-07-20 11:42:59 +0200188
189 // Create panel
Akron7f9a6a32018-07-18 15:05:23 +0200190 this.panel = matchPanelClass.create(this);
Akronbfe912c2018-07-17 19:30:52 +0200191
192 this._element.insertBefore(
Akron7f9a6a32018-07-18 15:05:23 +0200193 this.panel.element(),
Akronbfe912c2018-07-17 19:30:52 +0200194 this._element.querySelector("p.ref")
195 );
196
Akron13448c22018-07-10 13:05:46 +0200197 // Insert before reference line
198 refLine.insertBefore(
Akron7f9a6a32018-07-18 15:05:23 +0200199 this.panel.actions.element(),
Akron13448c22018-07-10 13:05:46 +0200200 refLine.firstChild
201 );
202
Akronbfe912c2018-07-17 19:30:52 +0200203 this._initialized = true;
Akron13448c22018-07-10 13:05:46 +0200204
Nils Diewalda297f062015-04-02 00:23:46 +0000205 return true;
206 },
207
Akron8c468a12016-11-13 23:57:41 +0100208
Akron6a535d42015-08-26 20:16:58 +0200209 // Todo: Test toggle
210 toggle : function () {
211 if (this._element.classList.contains('active'))
Akron19d97fe2016-09-06 20:47:05 +0200212 this.close();
Akron6a535d42015-08-26 20:16:58 +0200213 else
Akron19d97fe2016-09-06 20:47:05 +0200214 this.open();
Akron6a535d42015-08-26 20:16:58 +0200215 },
216
Nils Diewald7c8ced22015-04-15 19:21:00 +0000217
Nils Diewald8bc7e412015-03-19 22:08:27 +0000218 /**
Nils Diewalda297f062015-04-02 00:23:46 +0000219 * Close info view
220 */
221 close : function () {
222 this._element.classList.remove('active');
Akron8b592d42018-01-26 18:33:06 +0100223 },
224
Nils Diewald7c8ced22015-04-15 19:21:00 +0000225
Nils Diewalda297f062015-04-02 00:23:46 +0000226 /**
227 * Get match element.
228 */
229 element : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000230 return this._element; // May be null
Nils Diewalda297f062015-04-02 00:23:46 +0000231 }
232 };
Nils Diewald0e6992a2015-04-14 20:13:52 +0000233});