Skip to content

Commit

Permalink
client: extract textanalyser_input component
Browse files Browse the repository at this point in the history
Killed some dead code in the process.
  • Loading branch information
alon committed Mar 2, 2015
1 parent 8bcb92c commit 17070ac
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 135 deletions.
169 changes: 34 additions & 135 deletions src/client/textanalysis.ui.js
@@ -1,22 +1,17 @@
"use strict"

define(['jquery', 'Bacon_wrapper', 'consts', 'rz_bus', 'rz_core', 'textanalysis', 'view/completer', 'util'],
function($, Bacon , consts , rz_bus , rz_core , textanalysis , completer , util) {

var text = "", // Last text of sentence
element_name = '#textanalyser',
element = $(element_name),
element_raw = element[0],
define(['jquery', 'Bacon_wrapper', 'consts', 'rz_bus', 'rz_core', 'textanalysis', 'util', 'view/textanalyser_input'],
function($, Bacon , consts , rz_bus , rz_core , textanalysis , util, textanalyser_input) {

var element_name = '#textanalyser',
input = textanalyser_input({
'element_name': element_name,
'completer_name': '#input-suggestion',
}),
plus_button = $('#btn_add'),
description = consts.description,
input = new Bacon.Bus(),
initial_width = element.width(),
plus_button_initial_offset = plus_button.offset(),
nbsp = String.fromCharCode(160),
// aliases
value = util.value,
selectionStart = util.selectionStart,
setSelection = util.setSelection;
input_bus = new Bacon.Bus(),
plus_button_initial_offset = plus_button.offset();

function get_svg__body_position(node_id)
{
Expand Down Expand Up @@ -76,15 +71,13 @@ var typeselection = function TypeSelectionDialog() {
return typeselection;
}();

var analysisCompleter = completer(element, $('#input-suggestion'), {hideOnTab: false});

function analyzeSentence(spec)
{
util.assert(spec.sentence !== undefined &&
spec.finalize !== undefined,
"bad input");

var sentence = nbsp_to_spaces(spec.sentence),
var sentence = spec.sentence,
finalize = spec.finalize,
ret = textanalysis.textAnalyser({'sentence': sentence, 'finalize': finalize}),
lastnode;
Expand All @@ -97,7 +90,7 @@ function analyzeSentence(spec)

switch (ret.state) {
case textanalysis.ANALYSIS_NODE_START:
lastnode = textanalysis.lastnode(rz_core.edit_graph, selectionStart(element_raw));
lastnode = textanalysis.lastnode(rz_core.edit_graph, input.selectionStart());
if (lastnode !== null) {
typeselection.analysisNodeStart(lastnode.id);
}
Expand All @@ -112,24 +105,11 @@ function analyzeSentence(spec)
} else {
rz_core.main_graph_view.nodes__user_visible(ret.existing_nodes(rz_core.main_graph));
}
}

function textSelect(inp, s, e) {
e = e || s;
if (inp.createTextRange) {
var r = inp.createTextRange();
r.collapse(true);
r.moveEnd('character', e);
r.moveStart('character', s);
r.select();
} else if (inp.setSelectionRange) {
inp.focus();
inp.setSelectionRange(s, e);
}
input_bus.push({where: consts.INPUT_WHERE_TEXTANALYSIS, input: sentence});
}

function changeType(arg) {
var lastnode = textanalysis.lastnode(rz_core.edit_graph, selectionStart(element_raw)),
var lastnode = textanalysis.lastnode(rz_core.edit_graph, input.selectionStart()),
nodetype,
id,
name;
Expand All @@ -149,55 +129,27 @@ function changeType(arg) {

var main = function ()
{
if (element.length != 1) {
return;
}

analysisCompleter.options.plug(textanalysis.suggestions_options);

var document_keydown = new Bacon.Bus();
rz_bus.ui_key.plug(document_keydown);

element.keydown(function(e) {
var ret = undefined;

switch (e.keyCode) {
case 13:
if (!analysisCompleter.handleEnter()) {
submitNewSentence();
} else {
analyzeSentence({
sentence: value(element_raw),
finalize: false,
});
}
ret = false;
break;
case 9: //TAB
if (textanalysis.lastnode(rz_core.edit_graph, selectionStart(element_raw))) {
input.on_sentence.onValue(submitNewSentence);
input.on_analysis.onValue(function (sentence) {
analyzeSentence({
sentence: sentence,
finalize: false,
});
});
input.on_tab.onValue(function (e) {
if (textanalysis.lastnode(rz_core.edit_graph, input.selectionStart())) {
e.preventDefault();
changeType(e.shiftKey ? "up" : "down");
ret = false;
}
break;
}
document_keydown.push({where: consts.KEYSTROKE_WHERE_TEXTANALYSIS, keys: [e.keyCode]});
return ret;
});
element.bind('input selectionchange click', function(e) {
analysisCompleter.oninput(value(element_raw), selectionStart(element_raw));
e.stopPropagation();
e.preventDefault();
});
});

function submitNewSentence() {
text = value(element_raw);
value(element_raw, "");
analyzeSentence({
sentence: text,
finalize: true,
function submitNewSentence(text) {
analyzeSentence(
{
sentence: text,
finalize: true,
});
text = "";
}

// Click is required to prevent the default action - this is a form so that's a post,
Expand All @@ -207,69 +159,16 @@ var main = function ()
// http://stackoverflow.com/questions/15786891/browser-sometimes-ignores-a-jquery-click-event-during-a-css3-transform
plus_button.bind("click mousedown", function(e) {
console.dir(e);
submitNewSentence();
submitNewSentence(input.value());
e.preventDefault();
});

rz_bus.ui_input.plug(input);
if ('oninput' in document.documentElement) {
element.on('input', function(e) {
analyze_element_text();
});
} else {
console.log('textanalysis.ui: fallback to polling');
window.setInterval(function() {
analyze_element_text();
}, 50);
}
};

function nbsp_to_spaces(str) {
return str.replace(new RegExp(nbsp, 'g'), ' ');
}

var analyze_element_text = function()
{
var current_text = value(element_raw),
parts,
base_parts,
selection_start,
spaced_text = nbsp_to_spaces(current_text);

if (current_text == text) {
return;
}
text = current_text;
analyzeSentence({
sentence: spaced_text,
finalize: false,
input.on_resize.onValue(function () {
plus_button.offset({'left': input.element.offset().left + input.element.width() - 18});
});
input.push({where: consts.INPUT_WHERE_TEXTANALYSIS, input: text});
selection_start = selectionStart(element_raw);
value(element_raw, ''); // this removes span elements as well
// here we stop treating the element as an input, this only works on a div/other "normal" element
base_parts = spaced_text.split(/ /)
parts = base_parts.slice(0, base_parts.length - 1).map(function (l) { return l + ' '; });
if (base_parts[base_parts.length - 1].length != 0) {
parts.push(base_parts[base_parts.length - 1]);
}
function span(text, color) {
return $('<span style="color: ' + color + '">' + text.replace(/ /g, nbsp) + '</span>');
}
parts.map(function (part, index) {
element.append(span(part, index % 2 == 0 ? 'blue' : 'red'));
});
setSelection(element_raw, selection_start, selection_start);
stretch_input_to_text_size();
}

function stretch_input_to_text_size()
{
var new_width = Math.min(Math.max(initial_width, text.length * 9 + 20), $(window).width() * 0.8);

element.width(new_width);
plus_button.offset({'left': element.offset().left + element.width() - 18});
}
rz_bus.ui_input.plug(input_bus);
};

return {
analyzeSentence: analyzeSentence,
Expand Down
116 changes: 116 additions & 0 deletions src/client/view/textanalyser_input.js
@@ -0,0 +1,116 @@
define(['jquery', 'Bacon_wrapper', 'util', 'view/completer', 'rz_bus', 'textanalysis', 'consts'],
function($, Bacon, util, completer, rz_bus, textanalysis, consts)
{
// Aliases
var value = util.value;

// Constants
var nbsp = String.fromCharCode(160);

function textanalyser_input(spec) {
var element_name = spec.element_name,
ta = {
spec: spec,
on_analysis: new Bacon.Bus(),
on_resize: new Bacon.Bus(),
element: $(element_name),
},
element = ta.element,
element_raw = element[0],
initial_width = element.width(),
analysisCompleter = completer(element, $(spec.completer_name), {hideOnTab: false}),
document_keydown = new Bacon.Bus(),
input_bus = new Bacon.Bus();

analysisCompleter.options.plug(textanalysis.suggestions_options);

util.assert(1 === element.length);

var selectionStart = function () {
return util.selectionStart(element_raw);
}
ta.selectionStart = selectionStart;

function key(val) {
return function (e) {
return e.keyCode == val;
};
};

function current_value() {
return nbsp_to_spaces(value(element_raw));
}
ta.value = current_value;

function nbsp_to_spaces(str) {
return str.replace(new RegExp(nbsp, 'g'), ' ');
}

function stretch_input_to_text_size(text)
{
var new_width = Math.min(Math.max(initial_width, text.length * 9 + 20), $(window).width() * 0.8);

element.width(new_width);
ta.on_resize.push();
}

function update_element(current_text)
{
var parts,
base_parts,
selection_start;

selection_start = selectionStart();
value(element_raw, ''); // this removes span elements as well
// here we stop treating the element as an input, this only works on a div/other "normal" element
base_parts = current_text.split(/ /)
parts = base_parts.slice(0, base_parts.length - 1).map(function (l) { return l + ' '; });
if (base_parts[base_parts.length - 1].length != 0) {
parts.push(base_parts[base_parts.length - 1]);
}
function span(text, color) {
return $('<span style="color: ' + color + '">' + text.replace(/ /g, nbsp) + '</span>');
}
parts.map(function (part, index) {
element.append(span(part, index % 2 == 0 ? 'blue' : 'red'));
});
util.setSelection(element_raw, selection_start, selection_start);
stretch_input_to_text_size(current_text);
return current_text;
}

var enters = element.asEventStream('keydown').filter(key(13))
.map(function (e) {
var text;

if (!analysisCompleter.handleEnter()) {
text = current_value();
value(element_raw, "");
return text;
} else {
return false;
}
});

rz_bus.ui_key.plug(document_keydown);

ta.on_sentence = enters.filter(function (v) { return v !== false; });
ta.on_analysis.plug(enters.filter(function (v) { return v === false; }).map(current_value));
ta.on_tab = element.asEventStream('keydown').filter(key(9));
element.asEventStream('keydown').onValue(function (e) {
document_keydown.push({where: consts.KEYSTROKE_WHERE_TEXTANALYSIS, keys: [e.keyCode]});
});
element.asEventStream('input selectionchange click').onValue(function (e) {
analysisCompleter.oninput(current_value(), selectionStart(element_raw));
e.stopPropagation();
e.preventDefault();
});

ta.on_analysis.plug(element.asEventStream('input').map(current_value).map(update_element));

return ta;
};

return textanalyser_input;
}
);

0 comments on commit 17070ac

Please sign in to comment.