summaryrefslogtreecommitdiff
path: root/src/client/textanalysis.js
diff options
context:
space:
mode:
authorAlon Levy <alon@pobox.com>2015-01-04 16:44:38 +0200
committerAlon Levy <alon@pobox.com>2015-01-05 13:23:57 +0200
commitff5c984089c19467304dbec0b87b2aa019717b13 (patch)
tree91a10398f03988516f44672078e3705b8d2555cb /src/client/textanalysis.js
parentd50ec127af2fe7c7276380e10fce00496580fd58 (diff)
initial graph_view introduction - mixing circle & force layouts
Diffstat (limited to 'src/client/textanalysis.js')
-rw-r--r--src/client/textanalysis.js217
1 files changed, 66 insertions, 151 deletions
diff --git a/src/client/textanalysis.js b/src/client/textanalysis.js
index ebfd3007..a34aac7f 100644
--- a/src/client/textanalysis.js
+++ b/src/client/textanalysis.js
@@ -70,7 +70,10 @@ var lastnode;
var sugg_name = {},
id_to_name_map = {},
- suggestions_options = new Bacon.Bus(); // TODO: Property: same as bus, but with initial value
+ suggestions_bus = new Bacon.Bus(),
+ suggestions_options = suggestions_bus.toProperty();
+
+suggestions_bus.push([]);
var ANALYSIS_NODE_START = 'ANALYSIS_NODE_START';
var ANALYSIS_NODE = 'ANALYSIS_NODE'
@@ -88,80 +91,24 @@ function selectedType()
function auto_suggest__update_name(name, id)
{
if (id !== undefined && id_to_name_map[id] !== undefined) {
- delete sugg[id_to_name_map[id]];
+ delete sugg_name[id_to_name_map[id]];
id_to_name_map[id] = name;
}
/* note that name can contain spaces - this is ok. We might want to limit this though? */
- sugg[name] = 1;
- suggestions_options.push(sugg);
+ sugg_name[name] = 1;
+ suggestions_bus.push(sugg_name);
}
function auto_suggest_remove_name(name, id)
{
- delete sugg[name];
- if (id !== undefined) {
- delete sugg[id];
- }
- suggestions_options.push(sugg);
-}
-
-/* up_to_two_renames:
- *
- * allow one letter or 'new node' to anything changes */
-function up_to_two_renames(graph, old_name, new_name, link_set_add)
-{
- var not_one_letter = false;
- var k;
- /* Allowed renames:
- * no change
- * s1 is substring of s2
- * older (s1) node being 'new node'
- */
- function allowed_rename(s1, s2)
- {
- return (s1 == s2 ||
- s1 == 'new node' ||
- s1.substr(0, s2.length) == s2 ||
- s2.substr(0, s1.length) == s1);
- }
-
- if (old_name.length != new_name.length) {
- console.log('bug: up_to_two_renames: not equal inputs');
- return;
+ if (name !== undefined) {
+ delete sugg_name[name];
}
- if (old_name.length > 2) {
- console.log('bug: up_to_two_renames: input length 2 < ' + old_name.length);
- return;
- }
- if (old_name.length == 2) {
- if (allowed_rename(old_name[0], new_name[1]) &&
- allowed_rename(old_name[1], new_name[0])) {
- old_name = [old_name[1], old_name[0]];
- } else {
- if (!allowed_rename(old_name[0], new_name[0]) ||
- !allowed_rename(old_name[1], new_name[1])) {
- not_one_letter = true;
- }
- }
- }
- if (not_one_letter) {
- console.log('bug: up_to_two_renames: not one letter changes');
- console.log(old_name);
- console.log(new_name);
- return;
- }
- for (k = 0 ; k < old_name.length ; ++k) {
- graph.editNameByName(old_name[k], new_name[k]);
- // very disappointing. suicide threats are ok?
- link_set_add.forEach(function (link) {
- if (link.__src.name == old_name[k]) {
- link.__src.name = new_name[k];
- }
- if (link.__dst.name == old_name[k]) {
- link.__dst.name = new_name[k];
- }
- });
+ if (id !== undefined) {
+ delete sugg_name[id_to_name_map[id]];
+ delete id_to_name_map[id];
}
+ suggestions_bus.push(sugg_name);
}
// TODO: add escape char, i.e. r"bla\"bla" -> ['bla"bla']
@@ -233,7 +180,7 @@ var textAnalyser = function (newtext, finalize) {
word,
completeSentence,
completeSentenceParts,
- typesetter, starGraph,
+ starGraph,
n,
link_hash = {},
yell_bug = false, // TODO: fix both issues
@@ -242,14 +189,14 @@ var textAnalyser = function (newtext, finalize) {
START = "START",
ret = model_diff.new_topo_diff();
- function __addNode(name, type, state) {
+ function __addNode(name, type) {
if (type === undefined) {
console.log('bug: textanalyser.addNode of type undefined');
}
- var node = model_core.create_node_from_spec(
- {'name':name,
- 'type':type,
- 'state':state});
+ var node = model_core.create_node_from_spec({
+ 'name':name,
+ 'type':type,
+ });
ret.node_set_add.push(node);
}
@@ -264,7 +211,7 @@ var textAnalyser = function (newtext, finalize) {
return {'existing': name};
};
- function __addLink(src_name, dst_name, name, state) {
+ function __addLink(src_name, dst_name, name) {
if (!src_name || !dst_name) {
if (yell_bug) {
console.log('bug - adding link (' + src_name + ', ' + dst_name + ')');
@@ -287,7 +234,6 @@ var textAnalyser = function (newtext, finalize) {
'__src': src_name,
'__dst': dst_name,
'name':name,
- 'state':state
};
ret.link_set_add.push(link);
}
@@ -376,19 +322,10 @@ var textAnalyser = function (newtext, finalize) {
nodeindex = 0;
//CHANGE TO PERMANENT STATE AND UPDATE SUGGESTIONLIST
- typesetter = "";
if (finalize === true) {
- typesetter = "perm";
for (n = 0; n < token_set_new_node_names.length; n++) {
auto_suggest__update_name(token_set_new_node_names[n]);
}
- } else {
- typesetter = "temp";
- }
-
- //ADD SURROUNDING BUBBLE
- if (orderStack.length > 0) {
- __addNode("", "bubble","temp");
}
//0-N ORDER STACK
@@ -400,11 +337,11 @@ var textAnalyser = function (newtext, finalize) {
}
break;
case NODE:
- __addNode(token_set_new_node_names[nodeindex], typeStack[nodeindex], typesetter);
+ __addNode(token_set_new_node_names[nodeindex], typeStack[nodeindex]);
if (!starGraph && nodeindex > 0 && token_set_new_link_names[linkindex] !== undefined) {
__addLink(token_set_new_node_names[nodeindex - 1],
token_set_new_node_names[nodeindex],
- token_set_new_link_names[linkindex], typesetter);
+ token_set_new_link_names[linkindex]);
}
nodeindex++;
break;
@@ -428,11 +365,11 @@ var textAnalyser = function (newtext, finalize) {
break;
case NODE:
typeStack[nodeindex] = selectedType();
- __addNode(token_set_new_node_names[nodeindex], typeStack[nodeindex], typesetter);
+ __addNode(token_set_new_node_names[nodeindex], typeStack[nodeindex]);
if (!starGraph && nodeindex > 0 && token_set_new_link_names[linkindex] !== undefined) {
__addLink(token_set_new_node_names[nodeindex - 1],
token_set_new_node_names[nodeindex],
- token_set_new_link_names[linkindex], typesetter);
+ token_set_new_link_names[linkindex]);
and_connect(token_set_new_node_names[nodeindex]);
}
ret.state = ANALYSIS_NODE_START;
@@ -455,9 +392,10 @@ var textAnalyser = function (newtext, finalize) {
if(token_set_new_link_names[x])if(token_set_new_link_names[x].replace(/ /g,"")!=="and"){
verb = token_set_new_link_names[x];
for(var y=0; y<x ;y++){
- __addLink(token_set_new_node_names[y], node, verb, typesetter);
+ __addLink(token_set_new_node_names[y], node, verb);
for(var z=x; z<token_set_new_node_names.length ;z++){
- __addLink(token_set_new_node_names[y], token_set_new_node_names[z], verb, typesetter);
+ __addLink(token_set_new_node_names[y],
+ token_set_new_node_names[z], verb);
}
}
}
@@ -466,81 +404,57 @@ var textAnalyser = function (newtext, finalize) {
//STAR CASE
if (starGraph) {
- __addNode(completeSentence, "chainlink", typesetter);
+ __addNode(completeSentence, "chainlink");
for (n = 0; n < token_set_new_node_names.length; n++) {
- __addLink(token_set_new_node_names[n], completeSentence, "chained", typesetter);
+ __addLink(token_set_new_node_names[n], completeSentence, "chained");
}
}
ret.drop_conjugator_links = and_count < linkindex;
- ret.applyToGraph = function(graph, backend_commit) {
- window.ret = ret;
+ ret.applyToGraph = function(spec) {
+ var main_graph = spec.main_graph,
+ edit_graph = spec.edit_graph,
+ backend_commit = spec.backend_commit;
- ret.link_set_add.forEach(function (link) {
- if (ret.drop_conjugator_links && (link.name.replace(/ /g,"") === "and")) {
- link.state = "temp";
- }
- link.__src = graph.find_node__by_name(link.__src) || __sourceNodeFromName(link.__src);
- link.__dst = graph.find_node__by_name(link.__dst) || __sourceNodeFromName(link.__dst);
- if (link.__src.id !== undefined) {
- link.__src_id = link.__src.id;
- }
- if (link.__dst.id !== undefined) {
- link.__dst_id = link.__dst.id;
- }
- });
+ util.assert(main_graph !== undefined &&
+ edit_graph !== undefined &&
+ backend_commit !== undefined, "missing inputs");
+ window.ret = ret;
- /*
- * generate fitered node set who:
- * - are not name-present in graph
- * - are not of type 'bubble'
- */
- var n_set = ret.node_set_add.filter(function(node) {
- return false == graph.hasNodeByNameAndNotState(node.name, "temp")
- && node.type !== 'bubble';
- }),
- link_set = ret.link_set_add.map(
- function (link) {
- return [link.__src.name, link.__dst.name];
- }),
- comp = graph.compareSubset('temp', n_set, link_set);
+ ret.link_set_add = ret.link_set_add
+ .filter(function (link) {
+ return !finalize ||
+ (ret.drop_conjugator_links &&
+ (link.name.replace(/ /g,"") === "and"));
+ })
+ .map(function (link) {
+ link.__src = edit_graph.find_node__by_name(link.__src) ||
+ __sourceNodeFromName(link.__src);
+ link.__dst = edit_graph.find_node__by_name(link.__dst) ||
+ __sourceNodeFromName(link.__dst);
+ if (link.__src.id !== undefined) {
+ link.__src_id = link.__src.id;
+ }
+ if (link.__dst.id !== undefined) {
+ link.__dst_id = link.__dst.id;
+ }
+ return link;
+ });
- if (false == finalize && comp.graph_same) {
- console.log('close enough');
- if (comp.old_name && comp.new_name) {
- up_to_two_renames(graph, comp.old_name, comp.new_name, ret.link_set_add);
- }
- } else {
- console.log('not close enough (or finalize)');
- // REINITIALISE GRAPH (DUMB BUT IT WORKS)
- //
- // FIXME: have temp nodes on a separete graph
- // finalize - take temp graph and create a single topo_diff
- // else - update temp graph with this topodiff, first clear it every time.
- graph.removeNodes("temp");
- graph.removeLinks("temp");
- }
+ // REINITIALISE GRAPH (DUMB BUT IT WORKS)
+ edit_graph.clear();
if (!finalize) {
- graph.markRelated(token_set_new_node_names);
+ main_graph.markRelated(token_set_new_node_names);
} else {
- graph.removeRelated();
+ main_graph.removeRelated();
}
if (finalize && backend_commit) {
- // broadcast diff:
- // - finalize?
- // - broadcast_diff requested by caller
- // drop bubble node
- ret.node_set_add = ret.node_set_add.filter(function(n) { return n.type != 'bubble'; });
- // drop and links
- ret.link_set_add = ret.link_set_add.filter(function(l) { return l.name !== 'and'; });
- graph.commit_and_tx_diff__topo(ret);
+ main_graph.commit_and_tx_diff__topo(ret);
} else {
- if (!comp.graph_same) {
- graph.commit_diff__topo(ret);
- }
+ edit_graph.commit_diff__topo(ret);
}
};
@@ -551,10 +465,10 @@ var textAnalyser = function (newtext, finalize) {
return ret;
};
-function init(graph)
+function init(main_graph)
{
// deal with new nodes
- graph.diffBus
+ main_graph.diffBus
.filter(function (diff) {
return diff.node_set_add && diff.node_set_add.length > 0;
})
@@ -562,12 +476,13 @@ function init(graph)
.flatMap(Bacon.fromArray)
.map(".name")
.map(function (name) { return name.toLowerCase(); })
+ // FIXME - should be removal of existing name via id, we know the id too.
.onValue(auto_suggest__update_name);
// deal with renamed links
/*
// TODO renamed links - broken in server, DBO_attr_diff_commit doesn't return an Attr_Diff
- graph.diffBus
+ main_graph.diffBus
.filter(function (diff) {
return diff && diff.link_set_rm && diff.link_set_rm.length > 0;
})