-
Notifications
You must be signed in to change notification settings - Fork 8
/
index.js
108 lines (77 loc) · 3.29 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* eslint no-console:0 */
var _ = require('lodash');
var renderFactory = require('./src/renderFactory');
var pipelineClient = require('./src/pipeline/pipelineClient');
var comparator = require('./src/pipeline/comparator');
var sampleData = require('./public/sample.json');
var clipboard = require('clipboard');
require('brat-client');
var getAvailableViews = function(jsonData) {
return _.map(jsonData.views, function (view) {
var requiredView = _.head(view.viewData);
return { name: view.viewName, type: requiredView.viewType };
});
};
var render = function (jsonData, domElement, spanInfo, options) {
var tokensList = jsonData.tokens;
var sentenceList = jsonData.sentences.sentenceEndPositions;
var tokensViewOuter = _.filter(jsonData.views, function (view) {
return view.viewName === "TOKENS";
});
var tokensView = _.head(_.head(tokensViewOuter).viewData);
var tokenConstituents = tokensView.constituents;
console.assert(tokenConstituents.length == tokensList.length);
var sentenceEndIterator = _(sentenceList);
var currentSentenceEnd = sentenceEndIterator.next();
var sentenceResults = _.reduce(_.zip(tokenConstituents, tokensList), function (result, value, index) {
var sentenceComponent = result.pop();
var lastToken = _.last(sentenceComponent);
if (_.isUndefined(lastToken)) {
// Get the last token from the previous sentence.
var prev = _.last(result) || [];
lastToken = _.last(prev) || {};
}
var lastTokenCharEnd = lastToken.charEnd || 0;
var constituent = _.head(value);
var token = _.tail(value);
var currentToken = { charStart: lastTokenCharEnd, start: constituent.start, end: constituent.end };
var separator = ' ';
if (constituent.end === currentSentenceEnd.value) {
separator = '\n';
}
currentToken.text = token + separator;
currentToken.charEnd = currentToken.charStart + currentToken.text.length;
sentenceComponent.push(currentToken);
result.push(sentenceComponent);
if (constituent.end === currentSentenceEnd.value) {
currentSentenceEnd = sentenceEndIterator.next();
result.push([]);
}
return result;
}, [[]]);
var tokenMap = _.keyBy(_.flatten(sentenceResults), 'start');
var rawText = _.join(_.map(_.flatten(sentenceResults), function (token) { return token.text; }), '');
var renderer = renderFactory.getRenderer(spanInfo.type);
options = options || {};
options['rawText'] = rawText;
options['tokenMap'] = tokenMap;
return Promise.resolve(renderer.render(spanInfo.name, spanInfo.type, jsonData, domElement, options));
};
var annotateAndRender = function (text, viewName, options) {
const pipelineConfiguration = {};
return pipelineClient.annotateText(pipelineConfiguration, text, [viewName])
.then(function (jsonData) {
return render(jsonData, {}, options);
});
};
module.exports = {
getAvailableViews: getAvailableViews,
annotateAndRender: annotateAndRender,
lodash: _,
pipelineClient: pipelineClient,
comparator: comparator,
render: render,
sampleData: sampleData,
supportedTypes: renderFactory.supportedTypes,
cb: clipboard
};