blob: 6c9fe6ebbf412fa6d90721d489236c204b24c81c [file] [log] [blame]
/**
* Get information on matches,
* generate annotation tables and trees.
*
* @author Nils Diewald
*/
/*
* - Highlight (at least mark as bold) the match
* - Scroll to match vertically per default
* - A click on a table field and a tree node should at the field description to the fragments list.
*/
"use strict";
define([
'buttongroup',
'panel/match',
'util'
], function (buttonGroupClass,matchPanelClass) {
// Localization values
const loc = KorAP.Locale;
loc.MINIMIZE = loc.MINIMIZE || 'Minimize';
// 'corpusID', 'docID', 'textID'
const _matchTerms = ['textSigle', 'matchID', 'available'];
const d = document;
/**
* Match object
*/
return {
/**
* Create a new match object.
* Expects an element with match descriptions.
*/
create : function (match) {
return Object.create(this)._init(match);
},
/**
* Initialize match.
*/
_init : function (match) {
const t= this;
t._el = null;
t._initialized = false;
// No match defined
if (arguments.length < 1 ||
match === null ||
match === undefined) {
throw new Error('Missing parameters');
}
// Match defined as a node
else if (match instanceof Node) {
t._el = match;
// Circular reference !!
match["_match"] = t;
if (match.hasAttribute('data-text-sigle')) {
t.textSigle = match.getAttribute('data-text-sigle')
}
else {
t.textSigle = match.getAttribute('data-corpus-id') +
'/' +
match.getAttribute('data-doc-id') +
'/' +
match.getAttribute('data-text-id');
};
t.matchID = match.getAttribute('data-match-id');
// List of available annotations
t.available = match.getAttribute('data-available-info').split(' ');
}
// Match as an object
else {
// Iterate over allowed match terms
_matchTerms.forEach(function(term) {
this[term] = match[term] !== undefined ? match[term] : undefined;
}, t);
};
t._avail = {
tokens : [],
spans : [],
rels : []
};
// Iterate over info layers
let layer;
t.available.forEach(function(term){
// Create info layer objects
try {
layer = require('match/infolayer').create(term);
this._avail[layer.type].push(layer);
}
catch (e) {
return;
};
}, t);
return t;
},
/**
* Return a list of parseable tree annotations.
*/
getSpans : function () {
return this._avail.spans;
},
/**
* Return a list of parseable token annotations.
*/
getTokens : function () {
return this._avail.tokens;
},
/**
* Return a list of parseable relation annotations.
*/
getRels : function () {
return this._avail.rels;
},
/**
* Initialize match
*/
init : function () {
const t = this;
if (t._initialized)
return t;
// Add actions unless it's already activated
const element = t._el;
// There is an element to open
if (element === undefined || element === null)
return undefined;
// Add meta button
const refLine = element.querySelector("p.ref");
// No reference found
if (!refLine)
return undefined;
// Create panel
t.panel = matchPanelClass.create(t);
t._el.insertBefore(
t.panel.element(),
t._el.querySelector("p.ref")
);
// Insert before reference line
refLine.insertBefore(
t.panel.actions().element(),
refLine.firstChild
);
t._initialized = true;
return t;
},
/**
* Open match
*/
open : function () {
// Add actions unless it's already activated
const element = this._el;
// There is an element to open
if (element === undefined || element === null)
return false;
// The element is already opened
if (element.classList.contains('active'))
return false;
// Add active class to element
element.classList.add('active');
const btn = buttonGroupClass.create(
['action','button-view']
);
const that = this;
btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {
that.minimize();
});
element.appendChild(btn.element());
if (this.init() == undefined) {
return false;
};
return true;
},
/**
* Toggle match view
*/
toggle : function () {
if (this._el.classList.contains('active'))
this.minimize();
else
this.open();
},
/**
* Minimize info view
*/
minimize : function () {
this._el.classList.remove('active');
},
/**
* Get match element.
*/
element : function () {
return this._el; // May be null
}
};
});