diff options
| author | Alon Levy <alon@pobox.com> | 2015-03-02 20:16:45 +0200 |
|---|---|---|
| committer | Alon Levy <alon@pobox.com> | 2015-03-02 20:16:51 +0200 |
| commit | 17070acb91aa22605f5ad9de60b3cb58171bce50 (patch) | |
| tree | 99775d6307f94ff245c7d2a855bf88da1605ac34 /src | |
| parent | 8bcb92cf1a80692413c74c1f73e373141a975188 (diff) | |
client: extract textanalyser_input component
Killed some dead code in the process.
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/textanalysis.ui.js | 167 | ||||
| -rw-r--r-- | src/client/view/textanalyser_input.js | 116 |
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; +} +); |
