mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
56fee39c39
Move the Journey code underneath the ActionDispatch namespace so that we don't pollute the global namespace with names that may be used for models. Fixes rails/journey#49.
134 lines
3.2 KiB
JavaScript
134 lines
3.2 KiB
JavaScript
function tokenize(input, callback) {
|
|
while(input.length > 0) {
|
|
callback(input.match(/^[\/\.\?]|[^\/\.\?]+/)[0]);
|
|
input = input.replace(/^[\/\.\?]|[^\/\.\?]+/, '');
|
|
}
|
|
}
|
|
|
|
var graph = d3.select("#chart-2 svg");
|
|
var svg_edges = {};
|
|
var svg_nodes = {};
|
|
|
|
graph.selectAll("g.edge").each(function() {
|
|
var node = d3.select(this);
|
|
var index = node.select("title").text().split("->");
|
|
var left = parseInt(index[0]);
|
|
var right = parseInt(index[1]);
|
|
|
|
if(!svg_edges[left]) { svg_edges[left] = {} }
|
|
svg_edges[left][right] = node;
|
|
});
|
|
|
|
graph.selectAll("g.node").each(function() {
|
|
var node = d3.select(this);
|
|
var index = parseInt(node.select("title").text());
|
|
svg_nodes[index] = node;
|
|
});
|
|
|
|
function reset_graph() {
|
|
for(var key in svg_edges) {
|
|
for(var mkey in svg_edges[key]) {
|
|
var node = svg_edges[key][mkey];
|
|
var path = node.select("path");
|
|
var arrow = node.select("polygon");
|
|
path.style("stroke", "black");
|
|
arrow.style("stroke", "black").style("fill", "black");
|
|
}
|
|
}
|
|
|
|
for(var key in svg_nodes) {
|
|
var node = svg_nodes[key];
|
|
node.select('ellipse').style("fill", "white");
|
|
node.select('polygon').style("fill", "white");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function highlight_edge(from, to) {
|
|
var node = svg_edges[from][to];
|
|
var path = node.select("path");
|
|
var arrow = node.select("polygon");
|
|
|
|
path
|
|
.transition().duration(500)
|
|
.style("stroke", "green");
|
|
|
|
arrow
|
|
.transition().duration(500)
|
|
.style("stroke", "green").style("fill", "green");
|
|
}
|
|
|
|
function highlight_state(index, color) {
|
|
if(!color) { color = "green"; }
|
|
|
|
svg_nodes[index].select('ellipse')
|
|
.style("fill", "white")
|
|
.transition().duration(500)
|
|
.style("fill", color);
|
|
}
|
|
|
|
function highlight_finish(index) {
|
|
svg_nodes[index].select('polygon')
|
|
.style("fill", "while")
|
|
.transition().duration(500)
|
|
.style("fill", "blue");
|
|
}
|
|
|
|
function match(input) {
|
|
reset_graph();
|
|
var table = tt();
|
|
var states = [0];
|
|
var regexp_states = table['regexp_states'];
|
|
var string_states = table['string_states'];
|
|
var accepting = table['accepting'];
|
|
|
|
highlight_state(0);
|
|
|
|
tokenize(input, function(token) {
|
|
var new_states = [];
|
|
for(var key in states) {
|
|
var state = states[key];
|
|
|
|
if(string_states[state] && string_states[state][token]) {
|
|
var new_state = string_states[state][token];
|
|
highlight_edge(state, new_state);
|
|
highlight_state(new_state);
|
|
new_states.push(new_state);
|
|
}
|
|
|
|
if(regexp_states[state]) {
|
|
for(var key in regexp_states[state]) {
|
|
var re = new RegExp("^" + key + "$");
|
|
if(re.test(token)) {
|
|
var new_state = regexp_states[state][key];
|
|
highlight_edge(state, new_state);
|
|
highlight_state(new_state);
|
|
new_states.push(new_state);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(new_states.length == 0) {
|
|
return;
|
|
}
|
|
states = new_states;
|
|
});
|
|
|
|
for(var key in states) {
|
|
var state = states[key];
|
|
if(accepting[state]) {
|
|
for(var mkey in svg_edges[state]) {
|
|
if(!regexp_states[mkey] && !string_states[mkey]) {
|
|
highlight_edge(state, mkey);
|
|
highlight_finish(mkey);
|
|
}
|
|
}
|
|
} else {
|
|
highlight_state(state, "red");
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|