mirror of
https://github.com/qurator-spk/neat.git
synced 2025-06-11 20:59:54 +02:00
- I cannot reproduce bug #35 any more. - Added much more robust word numbering. - Added key combination d-l to delete current line. - Remove 0 key combination. Word numbering is now done automatically. Therefore this functionality is not required any more. - Fixed event listener accumulation bug (slowdown of app after some time). - Added sanitization code that removes any line breaks in tokens. - Code simplification applied.
This commit is contained in:
parent
374a607ea8
commit
a1bd8afc9d
2 changed files with 85 additions and 88 deletions
|
@ -95,8 +95,8 @@ We also provide some [Python tools](https://github.com/qurator-spk/neath/tree/ma
|
|||
|----------|--------------------------------------------|
|
||||
| s t | Start new sentence in current row |
|
||||
| m e | Merge current row with row above |
|
||||
| s p | Create copy of current row one row below |
|
||||
| 0 | Set POSITION of current row to zero |
|
||||
| s p | Create copy of current row |
|
||||
| d l | Delete current row |
|
||||
|----------|--------------------------------------------|
|
||||
| backspace| Set NE-TAG / NE-EMB to "O" |
|
||||
| b p | Set NE-TAG / NE-EMB to "B-PER" |
|
||||
|
|
169
neath.js
169
neath.js
|
@ -59,6 +59,8 @@ function setupInterface(data, file, urls) {
|
|||
|
||||
let save_timeout = null;
|
||||
|
||||
let listener_defaults = { prevent_repeat : true };
|
||||
|
||||
function notifyChange() {
|
||||
if (save_timeout != null) clearTimeout(save_timeout);
|
||||
has_changes = true;
|
||||
|
@ -184,10 +186,9 @@ function setupInterface(data, file, urls) {
|
|||
function makeTdEditable(td) {
|
||||
|
||||
editingTd = {
|
||||
elem: td,
|
||||
data: td.innerHTML,
|
||||
finish:
|
||||
function (td, isOk) {
|
||||
function (isOk) {
|
||||
|
||||
if (isOk) {
|
||||
|
||||
|
@ -199,16 +200,13 @@ function setupInterface(data, file, urls) {
|
|||
|
||||
data.data[tableInfo.nRow][tableInfo.column] = newValue;
|
||||
|
||||
sanitizeData();
|
||||
notifyChange();
|
||||
updateTable();
|
||||
}
|
||||
else {
|
||||
$(td).html(editingTd.data);
|
||||
}
|
||||
|
||||
let listener = new window.keypress.Listener(td);
|
||||
|
||||
listener.simple_combo("enter", function() { td.click(); });
|
||||
|
||||
editingTd = null;
|
||||
$(td).focus();
|
||||
}
|
||||
|
@ -225,7 +223,7 @@ function setupInterface(data, file, urls) {
|
|||
textArea.focus();
|
||||
|
||||
let edit_html =
|
||||
`<div class="edit-controls">
|
||||
`<div class="edit-controls" id="TdEdit">
|
||||
<button class="btn btn-secondary btn-sm" id="edit-ok">OK</button>
|
||||
<button class="btn btn-secondary btn-sm" id="edit-cancel">CANCEL</button>
|
||||
</div>`
|
||||
|
@ -234,96 +232,100 @@ function setupInterface(data, file, urls) {
|
|||
|
||||
$('#edit-ok').on('click',
|
||||
function(evt) {
|
||||
editingTd.finish(editingTd.elem, true);
|
||||
editingTd.finish(true);
|
||||
});
|
||||
|
||||
$('#edit-cancel').on('click',
|
||||
function(evt) {
|
||||
editingTd.finish(editingTd.elem, false);
|
||||
editingTd.finish(false);
|
||||
});
|
||||
|
||||
let listener = new window.keypress.Listener(td);
|
||||
let listener = new window.keypress.Listener($('#edit-area'), listener_defaults);
|
||||
|
||||
listener.simple_combo('enter', function() { $('#edit-ok').click(); } );
|
||||
listener.simple_combo('esc', function() { $('#edit-cancel').click(); } );
|
||||
}
|
||||
|
||||
function sanitizeData() {
|
||||
word_pos = 1;
|
||||
for(let i = 0; i < data.data.length; i++){
|
||||
if ((data.data[i]['TOKEN'] == null) || (data.data[i]['TOKEN'].toString().length == 0)){
|
||||
word_pos = 0;
|
||||
}
|
||||
data.data[i]['No.'] = word_pos;
|
||||
|
||||
if (data.data[i]['TOKEN'] == null) data.data[i]['TOKEN'] = '';
|
||||
if (data.data[i]['GND-ID'] == null) data.data[i]['GND-ID'] = '';
|
||||
if (data.data[i]['NE-TAG'] == null) data.data[i]['NE-TAG'] = '';
|
||||
if (data.data[i]['NE-EMB'] == null) data.data[i]['NE-EMB'] = '';
|
||||
|
||||
data.data[i]['TOKEN'] = data.data[i]['TOKEN'].toString().replace(/(\r\n|\n|\r)/gm, "");
|
||||
data.data[i]['GND-ID'] = data.data[i]['GND-ID'].toString().replace(/(\r\n|\n|\r)/gm, "");
|
||||
data.data[i]['NE-TAG'] = data.data[i]['NE-TAG'].toString().replace(/(\r\n|\n|\r)/gm, "");
|
||||
data.data[i]['NE-EMB'] = data.data[i]['NE-EMB'].toString().replace(/(\r\n|\n|\r)/gm, "");
|
||||
|
||||
word_pos++;
|
||||
}
|
||||
}
|
||||
|
||||
function tableEditAction(nRow, action) {
|
||||
|
||||
if (editingTd != null) return;
|
||||
|
||||
if (action == null) return;
|
||||
|
||||
if (data.data[nRow]['TOKEN'] == null) data.data[nRow]['TOKEN'] = '';
|
||||
|
||||
if (action.includes('merge')) {
|
||||
|
||||
if (nRow < 1) return;
|
||||
|
||||
let pos = nRow + 1;
|
||||
word_pos = data.data[nRow - 1]['No.'] + 1
|
||||
while((pos < data.data.length) && (data.data[pos]['No.'] > 1)) {
|
||||
data.data[pos]['No.'] = word_pos;
|
||||
pos++;
|
||||
word_pos++;
|
||||
}
|
||||
if (data.data[nRow - 1]['TOKEN'] == null) data.data[nRow - 1]['TOKEN'] = '';
|
||||
|
||||
data.data[nRow - 1]['TOKEN'] += data.data[nRow]['TOKEN'];
|
||||
data.data[nRow - 1]['TOKEN'] =
|
||||
data.data[nRow - 1]['TOKEN'].toString() + data.data[nRow]['TOKEN'].toString();
|
||||
|
||||
data.data.splice(nRow, 1);
|
||||
|
||||
notifyChange();
|
||||
}
|
||||
else if (action.includes('split')) {
|
||||
|
||||
data.data.splice(nRow, 0, JSON.parse(JSON.stringify(data.data[nRow])));
|
||||
data.data[nRow + 1]['No.'] += 1;
|
||||
|
||||
let pos = nRow + 2;
|
||||
while ((pos < data.data.length) && (data.data[pos]['No.'] > 1)) {
|
||||
data.data[pos]['No.']++;
|
||||
pos++;
|
||||
}
|
||||
|
||||
notifyChange();
|
||||
}
|
||||
else if (action.includes('delete')) {
|
||||
data.data.splice(nRow, 1);
|
||||
}
|
||||
else if (action.includes('sentence')) {
|
||||
|
||||
let pos = nRow;
|
||||
let new_line = JSON.parse(JSON.stringify(data.data[nRow]));
|
||||
new_line['TOKEN'] = '';
|
||||
new_line['NE-TAG'] = 'O';
|
||||
new_line['NE-EMB'] = 'O';
|
||||
new_line['GND-ID'] = '';
|
||||
|
||||
let new_row = JSON.parse(JSON.stringify(data.data[pos]))
|
||||
|
||||
console.log(new_row)
|
||||
|
||||
data.data.splice(pos, 0, new_row);
|
||||
data.data[pos]['No.'] = 0
|
||||
data.data[pos]['TOKEN'] = ''
|
||||
pos += 1
|
||||
|
||||
let word_pos = 1;
|
||||
while ((pos < data.data.length) && (data.data[pos]['No.'] != 1) && (data.data[pos]['TOKEN'] != '') ) {
|
||||
data.data[pos]['No.'] = word_pos;
|
||||
pos++;
|
||||
word_pos++;
|
||||
}
|
||||
|
||||
notifyChange();
|
||||
data.data.splice(nRow, 0, new_line);
|
||||
}
|
||||
|
||||
sanitizeData();
|
||||
notifyChange();
|
||||
updateTable();
|
||||
}
|
||||
|
||||
function makeLineSplitMerge(td) {
|
||||
|
||||
editingTd = {
|
||||
elem: td,
|
||||
data: td.innerHTML,
|
||||
tokenizer_action: null,
|
||||
finish: function(td, isOk) {
|
||||
finish: function(action, isOk) {
|
||||
|
||||
$(td).html(editingTd.data);
|
||||
$(td).addClass('editable');
|
||||
|
||||
let tableInfo = $(td).data('tableInfo');
|
||||
|
||||
tableEditAction(tableInfo.nRow, editingTd.tokenizer_action)
|
||||
|
||||
editingTd = null;
|
||||
|
||||
tableEditAction(tableInfo.nRow, action)
|
||||
|
||||
$(td).focus();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -337,23 +339,16 @@ function setupInterface(data, file, urls) {
|
|||
$(td).removeClass('editable');
|
||||
$(td).html(edit_html);
|
||||
|
||||
$('#tokenizer').mouseleave(
|
||||
function(event) {
|
||||
editingTd.finish(editingTd.elem, false);
|
||||
});
|
||||
$('#tokenizer').mouseleave( function(event) { editingTd.finish(null, false); });
|
||||
|
||||
$('.tokenizer-action').click(
|
||||
function(event) {
|
||||
editingTd.tokenizer_action = $(event.target).text();
|
||||
});
|
||||
$('.tokenizer-action').click(function(event) { editingTd.finish($(event.target).text(), true); });
|
||||
}
|
||||
|
||||
function makeTagEdit(td) {
|
||||
|
||||
editingTd = {
|
||||
elem: td,
|
||||
data: td.innerHTML,
|
||||
finish: function(td, isOk) {
|
||||
finish: function(isOk) {
|
||||
|
||||
let tableInfo = $(td).data('tableInfo');
|
||||
|
||||
|
@ -401,25 +396,22 @@ function setupInterface(data, file, urls) {
|
|||
|
||||
$(td).removeClass('editable');
|
||||
$(td).html(edit_html);
|
||||
$('#tagger').mouseleave(
|
||||
function(event) {
|
||||
editingTd.finish(editingTd.elem, false);
|
||||
});
|
||||
$('#tagger').mouseleave( function(event) { editingTd.finish(false); });
|
||||
|
||||
$('.type_select').click(
|
||||
function(event) {
|
||||
editingTd.data = $(event.target).text();
|
||||
|
||||
editingTd.finish(true);
|
||||
});
|
||||
}
|
||||
|
||||
function createTable() {
|
||||
|
||||
editingTd = null;
|
||||
sanitizeData();
|
||||
|
||||
let editable_html =`<td class="editable hover">`;
|
||||
|
||||
$('#table-body').empty();
|
||||
|
||||
$.each(data.data,
|
||||
function(nRow, el) {
|
||||
|
||||
|
@ -435,7 +427,7 @@ function setupInterface(data, file, urls) {
|
|||
data('tableInfo', { 'nRow': nRow })
|
||||
);
|
||||
|
||||
let row_listener = new window.keypress.Listener(row);
|
||||
let row_listener = new window.keypress.Listener(row, listener_defaults);
|
||||
|
||||
row_listener.sequence_combo('0',
|
||||
function() {
|
||||
|
@ -459,40 +451,45 @@ function setupInterface(data, file, urls) {
|
|||
tableEditAction(row.data('tableInfo').nRow, 'merge');
|
||||
});
|
||||
|
||||
row_listener.sequence_combo('d l', function() {
|
||||
tableEditAction(row.data('tableInfo').nRow, 'delete');
|
||||
});
|
||||
|
||||
|
||||
$.each(el,
|
||||
function(column, content) {
|
||||
|
||||
let td = $(editable_html)
|
||||
|
||||
let listener = new window.keypress.Listener(td);
|
||||
let listener = new window.keypress.Listener(td, listener_defaults);
|
||||
|
||||
if (do_not_display.has(column)) return
|
||||
|
||||
let clickAction = function() { console.log('Do something different');}
|
||||
|
||||
if (column == 'No.') {
|
||||
|
||||
clickAction = makeLineSplitMerge
|
||||
clickAction = makeLineSplitMerge;
|
||||
}
|
||||
|
||||
if ((column == 'TOKEN') || (column == 'GND-ID')) {
|
||||
clickAction = makeTdEditable
|
||||
if ((column == 'TOKEN') || (column == 'GND-ID')) {
|
||||
clickAction = makeTdEditable;
|
||||
|
||||
listener.simple_combo("enter", function() {
|
||||
td.click();
|
||||
});
|
||||
listener.simple_combo('enter', function() { $(td).click(); });
|
||||
}
|
||||
|
||||
if ((column == 'NE-TAG') || (column == 'NE-EMB')) {
|
||||
clickAction = makeTagEdit
|
||||
clickAction = makeTagEdit;
|
||||
|
||||
let tagAction = function(tag) {
|
||||
data.data[$(td).data('tableInfo').nRow][column] = tag;
|
||||
function tagAction(tag) {
|
||||
|
||||
$(td).html(tag);
|
||||
colorCode();
|
||||
notifyChange();
|
||||
};
|
||||
tableInfo = $(td).data('tableInfo');
|
||||
|
||||
data.data[tableInfo.nRow][tableInfo.column] = tag;
|
||||
|
||||
td.html(tag);
|
||||
colorCode();
|
||||
notifyChange();
|
||||
};
|
||||
|
||||
listener.sequence_combo('b p', function() { tagAction('B-PER'); });
|
||||
listener.sequence_combo('b l', function() { tagAction('B-LOC'); });
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue