summaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/client')
-rw-r--r--src/client/textanalysis.ui.js167
-rw-r--r--src/client/view/textanalyser_input.js116
2 files changed, 149 insertions, 134 deletions
diff --git a/src/client/textanalysis.ui.js b/src/client/textanalysis.ui.js
index 913395cc..33dafafe 100644
--- a/src/client/textanalysis.ui.js
+++ b/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) {
+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 text = "", // Last text of sentence
- element_name = '#textanalyser',
- element = $(element_name),
- element_raw = element[0],
+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)
{
@@ -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;
@@ -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);
}
@@ -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;
@@ -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,
@@ -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,
diff --git a/src/client/view/textanalyser_input.js b/src/client/view/textanalyser_input.js
new file mode 100644
index 00000000..c3f5b512
--- /dev/null
+++ b/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;
+}
+);