diff options
| author | Alon Levy <alon@pobox.com> | 2014-12-30 19:19:04 +0200 |
|---|---|---|
| committer | Alon Levy <alon@pobox.com> | 2015-01-05 13:23:57 +0200 |
| commit | d50ec127af2fe7c7276380e10fce00496580fd58 (patch) | |
| tree | d8178438c8f463b50201895a12dbf57733e28ed5 /src/client | |
| parent | e31860843d2838a1a6c42c8545f497e9f4577ba2 (diff) | |
wip textanalysis broken. it creates extra nodes. state variable overloading for nodes/links not helping. thinking of graph trees
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/model/core.js | 7 | ||||
| -rw-r--r-- | src/client/model/graph.js | 31 | ||||
| -rw-r--r-- | src/client/rz_core.js | 2 | ||||
| -rw-r--r-- | src/client/textanalysis.js | 114 |
4 files changed, 85 insertions, 69 deletions
diff --git a/src/client/model/core.js b/src/client/model/core.js index d0674bd8..18aa2507 100644 --- a/src/client/model/core.js +++ b/src/client/model/core.js @@ -137,7 +137,8 @@ define(['util'], function(util) { } function create_link_from_spec(src, dst, link_spec) { - var ret = new Link(); + var ret = new Link(), + temp = link_spec.state === 'temp'; if (undefined != link_spec.id) { // reuse id if present @@ -146,8 +147,8 @@ define(['util'], function(util) { util.assert(undefined != src, 'create_link_from_spec: src missing'); util.assert(undefined != dst, 'create_link_from_spec: dst missing'); - util.assert(undefined != src.id, 'create_link_from_spec: src missing id'); - util.assert(undefined != dst.id, 'create_link_from_spec: dst missing id'); + util.assert(temp || undefined != src.id, 'create_link_from_spec: non temp src missing id'); + util.assert(temp || undefined != dst.id, 'create_link_from_spec: non temp dst missing id'); util.assert(undefined != link_spec.name, 'create_link_from_spec: name missing, unable to deduce type'); ret.__src = src; diff --git a/src/client/model/graph.js b/src/client/model/graph.js index c244356f..46b0359b 100644 --- a/src/client/model/graph.js +++ b/src/client/model/graph.js @@ -72,7 +72,7 @@ function Graph() { $.merge(topo_diff.link_set_rm, nodes_to_touched_links(topo_diff.node_set_rm)); topo_diff.node_set_add = topo_diff.node_set_add.map(function(n) { if (n.id === undefined) { - var existing = findNodeByName(n.name); + var existing = find_node__by_name(n.name); if (existing) { n = existing; } else { @@ -135,7 +135,7 @@ function Graph() { node; if (undefined == spec.id) { - existing_node = findNodeByName(spec.name) + existing_node = find_node__by_name(spec.name) if (existing_node){ return existing_node; } else { @@ -377,8 +377,8 @@ function Graph() { this.addLinkByName = function(src_name, dst_name, name, state, drop_conjugator_links) { - var src = findNodeByName(src_name), - dst = findNodeByName(dst_name), + var src = find_node__by_name(src_name), + dst = find_node__by_name(dst_name), src_id = src ? src.id : null, dst_id = dst ? dst.id : null; @@ -479,7 +479,7 @@ function Graph() { /* * handle name update collision: suggest removal first */ - var n_eq_name = findNodeByName(new_node_spec.name); + var n_eq_name = find_node__by_name(new_node_spec.name); if (undefined != n_eq_name) { // delete colliding node on rename console.warn('update_node: name collision blocked due to node rename'); @@ -521,7 +521,7 @@ function Graph() { } this.editNameByName = function(old_name, new_name) { - var node = findNodeByName(old_name); + var node = find_node__by_name(old_name); if (node === undefined) { console.log('editNameByName: error: cannot find node with name ' + old_name); @@ -531,7 +531,7 @@ function Graph() { } this.editName = function(id, new_name) { - var n_eq_name = findNodeByName(new_name); + var n_eq_name = find_node__by_name(new_name); var n_eq_id = find_node__by_id(id); var acceptReplace=true; @@ -623,16 +623,8 @@ function Graph() { } this.removeLinks = function(state) { - var id = null; var ls = findLinks(state); - for (var j = 0; j < ls.length; j++) { - var l = ls[j]; - var i = 0; - while (i < links.length) { - if (links[i] === l) links.splice(i, 1); - else i++; - } - } + ls.map(_link_remove_helper); } var findLink = function(src_id, dst_id, name) { @@ -668,6 +660,7 @@ function Graph() { this.hasNodeByName = hasNodeByName; var hasNodeByNameAndNotState = function(name, state) { + util.assert(state === 'temp', "this is deprecated and to be removed but anyway just for temp"); return get_nodes().filter(function(n) { return compareNames(n.name, name) && n.state !== state; }).length > 0; @@ -694,13 +687,14 @@ function Graph() { return ret; } - var findNodeByName = function(name) { + var find_node__by_name = function(name) { for (var k in node_map) { if (compareNames(node_map[k].name, name)) { return node_map[k]; } } } + this.find_node__by_name = find_node__by_name; var findNodes = function(id, state) { // id=id.toLowerCase(); @@ -763,6 +757,7 @@ function Graph() { } function commit_diff__topo(diff) { + console.dir(diff); // done under protest diff.node_set_add.map(function (node_spec) { __addNode(node_spec); @@ -770,7 +765,7 @@ function Graph() { diff.link_set_add.map(function (link_spec) { // resolve link ptr var src = find_node__by_id(link_spec.__src_id), - dst = find_node__by_id(link_spec.__dst_id), + dst = find_node__by_id(link_spec.__dst_id) || find_node__by_name(link_spec.__dst.name), link = model_core.create_link_from_spec(src, dst, link_spec); __addLink(link); diff --git a/src/client/rz_core.js b/src/client/rz_core.js index 85a58e93..36d8058e 100644 --- a/src/client/rz_core.js +++ b/src/client/rz_core.js @@ -378,6 +378,8 @@ function update_view__graph(relayout) { selected_link_group = document.querySelector('#selected-link-group'), relayout = relayout || true; + //return; + link = vis.selectAll("g.link") .data(graph.links(), function(d) { return d.id; }); diff --git a/src/client/textanalysis.js b/src/client/textanalysis.js index 9850e627..ebfd3007 100644 --- a/src/client/textanalysis.js +++ b/src/client/textanalysis.js @@ -59,8 +59,8 @@ function new_tokenize(text, node_token, quote) return tokens; } -define(['rz_core', 'model/core', 'model/util', 'model/diff', 'consts'], -function(rz_core, model_core, model_util, model_diff, consts) { +define(['rz_core', 'model/core', 'model/util', 'model/diff', 'consts', 'util'], +function(rz_core, model_core, model_util, model_diff, consts, util) { var typeindex = 0; var nodetypes = consts.nodetypes; @@ -108,7 +108,7 @@ function auto_suggest_remove_name(name, id) /* up_to_two_renames: * * allow one letter or 'new node' to anything changes */ -function up_to_two_renames(graph, old_name, new_name) +function up_to_two_renames(graph, old_name, new_name, link_set_add) { var not_one_letter = false; var k; @@ -152,6 +152,15 @@ function up_to_two_renames(graph, old_name, new_name) } 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]; + } + }); } } @@ -245,34 +254,44 @@ var textAnalyser = function (newtext, finalize) { ret.node_set_add.push(node); } - function __addLink(src, dst, name, state) { - if (!src || !dst) { + var __sourceNodeFromName = function (name) { + for (var key in ret.node_set_add) { + var node = ret.node_set_add[key]; + if (node.name == name) { + return node; + } + } + return {'existing': name}; + }; + + function __addLink(src_name, dst_name, name, state) { + if (!src_name || !dst_name) { if (yell_bug) { - console.log('bug - adding link (' + src + ', ' + dst + ')'); + console.log('bug - adding link (' + src_name + ', ' + dst_name + ')'); } return; } - if (link_hash[src] && link_hash[src][dst]) { + name = name || 'is'; + if (link_hash[src_name] && link_hash[src_name][dst_name]) { if (yell_bug) { - console.log('bug - adding link twice (' + src + ', ' + dst + ')'); + console.log('bug - adding link twice (' + src_name + ', ' + dst_name + ')'); } return; } - if (!link_hash[src]) { - link_hash[src] = {}; + if (!link_hash[src_name]) { + link_hash[src_name] = {}; } - link_hash[src][dst] = 1; + link_hash[src_name][dst_name] = 1; - var link = {'__src': src, '__dst':dst, 'name':name, 'state':state}; // can't use model_core.create_link_from_spec as src,dst are only names + var link = { + '__src': src_name, + '__dst': dst_name, + 'name':name, + 'state':state + }; ret.link_set_add.push(link); } - function apply_conjugator_link_logic(link, drop_conjugator_links){ - if (drop_conjugator_links && link.name && (link.name.replace(/ /g,"") === "and")) { - link.state = "temp"; - } - } - if (newtext.indexOf('#') == -1 || finalize) { lastnode = null; } @@ -458,6 +477,20 @@ var textAnalyser = function (newtext, finalize) { ret.applyToGraph = function(graph, backend_commit) { window.ret = ret; + 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; + } + }); + /* * generate fitered node set who: * - are not name-present in graph @@ -469,42 +502,25 @@ var textAnalyser = function (newtext, finalize) { }), link_set = ret.link_set_add.map( function (link) { - return [link.__src, link.__dst]; + return [link.__src.name, link.__dst.name]; }), comp = graph.compareSubset('temp', n_set, link_set); 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); + 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"); - - if (!finalize) { // finalize done via topo diff below - ret.for_each_node_add(function (node_spec) { - var new_node; - if (true == finalize && node.state == 'temp') { - console.log('bug: temp node creation on finalize'); - } else { - new_node = graph.addTempNode(node_spec); - if (!finalize) { - lastnode = new_node; - } - } - }); - } } - ret.for_each_link_add(function (link) { - if (false == finalize || link.name !== 'and') { - apply_conjugator_link_logic(link, ret.drop_conjugator_links); - graph.addLinkByName(link.__src, - link.__dst, - link.name || 'is', - link.state); - } - }); if (!finalize) { graph.markRelated(token_set_new_node_names); @@ -512,17 +528,19 @@ var textAnalyser = function (newtext, finalize) { graph.removeRelated(); } - // 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'; }); 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); } else { - graph.commit_diff__topo(ret); + if (!comp.graph_same) { + graph.commit_diff__topo(ret); + } } }; |
