blob: 7ce2652df01953cb54d6ec9d68c16ad1c9db62d4 [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
Akron678c26f2020-10-09 08:52:50 +020088 _matchTerms.forEach(function(term) {
Akron19d97fe2016-09-06 20:47:05 +020089 this[term] = match[term] !== undefined ? match[term] : undefined;
Akron678c26f2020-10-09 08:52:50 +020090 }, this);
Nils Diewalda297f062015-04-02 00:23:46 +000091 };
Nils Diewald0e6992a2015-04-14 20:13:52 +000092
Nils Diewald7c8ced22015-04-15 19:21:00 +000093 this._avail = {
Akron19d97fe2016-09-06 20:47:05 +020094 tokens : [],
95 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++) {
Akron19d97fe2016-09-06 20:47:05 +0200101 var term = this.available[i];
Nils Diewalda297f062015-04-02 00:23:46 +0000102
Akron19d97fe2016-09-06 20:47:05 +0200103 // Create info layer objects
104 try {
105 var layer = require('match/infolayer').create(term);
106 this._avail[layer.type].push(layer);
107 }
108 catch (e) {
109 continue;
110 };
Nils Diewalde8518f82015-03-18 22:41:49 +0000111 };
Akron3a4a08e2017-05-23 22:34:18 +0200112
Nils Diewalde8518f82015-03-18 22:41:49 +0000113 return this;
114 },
115
Nils Diewalde8518f82015-03-18 22:41:49 +0000116 /**
117 * Return a list of parseable tree annotations.
118 */
119 getSpans : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000120 return this._avail.spans;
Nils Diewalde8518f82015-03-18 22:41:49 +0000121 },
122
123
124 /**
125 * Return a list of parseable token annotations.
126 */
127 getTokens : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000128 return this._avail.tokens;
Nils Diewalde8518f82015-03-18 22:41:49 +0000129 },
130
131
132 /**
133 * Return a list of parseable relation annotations.
134 */
135 getRels : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000136 return this._avail.rels;
Nils Diewalde8518f82015-03-18 22:41:49 +0000137 },
138
Akron3c390c42020-03-30 09:06:21 +0200139 /**
140 * Initialize match
141 */
142 init : function () {
143 if (this._initialized)
144 return this;
145
146 // Add actions unless it's already activated
147 var element = this._element;
148
149 // There is an element to open
150 if (element === undefined || element === null)
151 return undefined;
152
153 // Add meta button
154 var refLine = element.querySelector("p.ref");
155
156 // No reference found
157 if (!refLine)
158 return undefined;
159
160 // Create panel
161 this.panel = matchPanelClass.create(this);
162
163 this._element.insertBefore(
164 this.panel.element(),
165 this._element.querySelector("p.ref")
166 );
167
168 // Insert before reference line
169 refLine.insertBefore(
170 this.panel.actions.element(),
171 refLine.firstChild
172 );
173
174 this._initialized = true;
175 return this;
176 },
Nils Diewald7c8ced22015-04-15 19:21:00 +0000177
Nils Diewalda297f062015-04-02 00:23:46 +0000178 /**
179 * Open match
180 */
181 open : function () {
Akron7f9a6a32018-07-18 15:05:23 +0200182
Nils Diewalda297f062015-04-02 00:23:46 +0000183 // Add actions unless it's already activated
184 var element = this._element;
185
186 // There is an element to open
Akron7f9a6a32018-07-18 15:05:23 +0200187 if (element === undefined || element === null)
Akron19d97fe2016-09-06 20:47:05 +0200188 return false;
Nils Diewalda297f062015-04-02 00:23:46 +0000189
190 // The element is already opened
191 if (element.classList.contains('active'))
Akron19d97fe2016-09-06 20:47:05 +0200192 return false;
Nils Diewalda297f062015-04-02 00:23:46 +0000193
194 // Add active class to element
195 element.classList.add('active');
196
Akronbfe912c2018-07-17 19:30:52 +0200197 var btn = buttonGroupClass.create(
198 ['action','button-view']
199 );
200
Nils Diewalda297f062015-04-02 00:23:46 +0000201 var that = this;
Akron792b1a42020-09-14 18:56:38 +0200202 btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {
Akronec6bb8e2018-08-29 13:07:56 +0200203 that.minimize();
Akronbfe912c2018-07-17 19:30:52 +0200204 });
205 element.appendChild(btn.element());
Akron3c390c42020-03-30 09:06:21 +0200206
207 if (this.init() == undefined) {
208 return false;
209 };
Akron13448c22018-07-10 13:05:46 +0200210
Nils Diewalda297f062015-04-02 00:23:46 +0000211 return true;
212 },
213
Akron8c468a12016-11-13 23:57:41 +0100214
Akron6a535d42015-08-26 20:16:58 +0200215 // Todo: Test toggle
216 toggle : function () {
217 if (this._element.classList.contains('active'))
Akronec6bb8e2018-08-29 13:07:56 +0200218 this.minimize();
Akron6a535d42015-08-26 20:16:58 +0200219 else
Akron19d97fe2016-09-06 20:47:05 +0200220 this.open();
Akron6a535d42015-08-26 20:16:58 +0200221 },
222
Nils Diewald7c8ced22015-04-15 19:21:00 +0000223
Nils Diewald8bc7e412015-03-19 22:08:27 +0000224 /**
Akronec6bb8e2018-08-29 13:07:56 +0200225 * Minimize info view
Nils Diewalda297f062015-04-02 00:23:46 +0000226 */
Akronec6bb8e2018-08-29 13:07:56 +0200227 minimize : function () {
Nils Diewalda297f062015-04-02 00:23:46 +0000228 this._element.classList.remove('active');
Akron8b592d42018-01-26 18:33:06 +0100229 },
230
Nils Diewald7c8ced22015-04-15 19:21:00 +0000231
Nils Diewalda297f062015-04-02 00:23:46 +0000232 /**
233 * Get match element.
234 */
235 element : function () {
Nils Diewald7c8ced22015-04-15 19:21:00 +0000236 return this._element; // May be null
Nils Diewalda297f062015-04-02 00:23:46 +0000237 }
238 };
Nils Diewald0e6992a2015-04-14 20:13:52 +0000239});