blob: f38a68ae69cb1ac1f84eaa76f10d66c00449d2c8 [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;
Akronec6bb8e2018-08-29 13:07:56 +020020 loc.MINIMIZE = loc.MINIMIZE || 'Minimize';
Nils Diewald0e6992a2015-04-14 20:13:52 +000021
Akron0a6768f2016-07-13 18:00:43 +020022 // 'corpusID', 'docID', 'textID'
Akron0b489ad2018-02-02 16:49:32 +010023 const _matchTerms = ['textSigle', 'matchID', 'available'];
24
25 const d = document;
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 /**
Akron7f9a6a32018-07-18 15:05:23 +020033 * Create a new match object.
34 * Expects an element with match descriptions.
Nils Diewalde8518f82015-03-18 22:41:49 +000035 */
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;
Akronbfe912c2018-07-17 19:30:52 +020046 this._initialized = false;
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 };
Akron3a4a08e2017-05-23 22:34:18 +0200113
Nils Diewalde8518f82015-03-18 22:41:49 +0000114 return this;
115 },
116
Nils Diewalde8518f82015-03-18 22:41:49 +0000117 /**
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
Akron3c390c42020-03-30 09:06:21 +0200140 /**
141 * Initialize match
142 */
143 init : function () {
144 if (this._initialized)
145 return this;
146
147 // Add actions unless it's already activated
148 var element = this._element;
149
150 // There is an element to open
151 if (element === undefined || element === null)
152 return undefined;
153
154 // Add meta button
155 var refLine = element.querySelector("p.ref");
156
157 // No reference found
158 if (!refLine)
159 return undefined;
160
161 // Create panel
162 this.panel = matchPanelClass.create(this);
163
164 this._element.insertBefore(
165 this.panel.element(),
166 this._element.querySelector("p.ref")
167 );
168
169 // Insert before reference line
170 refLine.insertBefore(
171 this.panel.actions.element(),
172 refLine.firstChild
173 );
174
175 this._initialized = true;
176 return this;
177 },
Nils Diewald7c8ced22015-04-15 19:21:00 +0000178
Nils Diewalda297f062015-04-02 00:23:46 +0000179 /**
180 * Open match
181 */
182 open : function () {
Akron7f9a6a32018-07-18 15:05:23 +0200183
Nils Diewalda297f062015-04-02 00:23:46 +0000184 // Add actions unless it's already activated
185 var element = this._element;
186
187 // There is an element to open
Akron7f9a6a32018-07-18 15:05:23 +0200188 if (element === undefined || element === null)
Akron19d97fe2016-09-06 20:47:05 +0200189 return false;
Nils Diewalda297f062015-04-02 00:23:46 +0000190
191 // The element is already opened
192 if (element.classList.contains('active'))
Akron19d97fe2016-09-06 20:47:05 +0200193 return false;
Nils Diewalda297f062015-04-02 00:23:46 +0000194
195 // Add active class to element
196 element.classList.add('active');
197
Akronbfe912c2018-07-17 19:30:52 +0200198 var btn = buttonGroupClass.create(
199 ['action','button-view']
200 );
201
Nils Diewalda297f062015-04-02 00:23:46 +0000202 var that = this;
Akronec6bb8e2018-08-29 13:07:56 +0200203 btn.add(loc.MINIMIZE, ['button-icon','minimize'], function () {
204 that.minimize();
Akronbfe912c2018-07-17 19:30:52 +0200205 });
206 element.appendChild(btn.element());
Akron3c390c42020-03-30 09:06:21 +0200207
208 if (this.init() == undefined) {
209 return false;
210 };
Akron13448c22018-07-10 13:05:46 +0200211
Nils Diewalda297f062015-04-02 00:23:46 +0000212 return true;
213 },
214
Akron8c468a12016-11-13 23:57:41 +0100215
Akron6a535d42015-08-26 20:16:58 +0200216 // Todo: Test toggle
217 toggle : function () {
218 if (this._element.classList.contains('active'))
Akronec6bb8e2018-08-29 13:07:56 +0200219 this.minimize();
Akron6a535d42015-08-26 20:16:58 +0200220 else
Akron19d97fe2016-09-06 20:47:05 +0200221 this.open();
Akron6a535d42015-08-26 20:16:58 +0200222 },
223
Nils Diewald7c8ced22015-04-15 19:21:00 +0000224
Nils Diewald8bc7e412015-03-19 22:08:27 +0000225 /**
Akronec6bb8e2018-08-29 13:07:56 +0200226 * Minimize info view
Nils Diewalda297f062015-04-02 00:23:46 +0000227 */
Akronec6bb8e2018-08-29 13:07:56 +0200228 minimize : function () {
Nils Diewalda297f062015-04-02 00:23:46 +0000229 this._element.classList.remove('active');
Akron8b592d42018-01-26 18:33:06 +0100230 },
231
Nils Diewald7c8ced22015-04-15 19:21:00 +0000232
Nils Diewalda297f062015-04-02 00:23:46 +0000233 /**
234 * Get match element.
235 */
236 element : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000237 return this._element; // May be null
Nils Diewalda297f062015-04-02 00:23:46 +0000238 }
239 };
Nils Diewald0e6992a2015-04-14 20:13:52 +0000240});