Spaces:
Sleeping
Sleeping
window.jsel = JSONSelect; | |
$(document).ready(function() { | |
var theDoc = JSON.parse($("pre.doc").text()); | |
function highlightMatches(ar) { | |
// first calculate match offsets | |
var wrk = []; | |
var html = $.trim(JSON.stringify(theDoc, undefined, 4)); | |
var ss = "<span class=\"selected\">"; | |
var es = "</span>"; | |
for (var i = 0; i < ar.length; i++) { | |
var found = $.trim(JSON.stringify(ar[i], undefined, 4)); | |
// turn the string into a regex to handle indentation | |
found = found.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&").replace(/\s+/gm, "\\s*"); | |
var re = new RegExp(found, "m"); | |
var m = re.exec(html); | |
if (!m) continue; | |
wrk.push({ off: m.index, typ: "s" }); | |
wrk.push({ off: m[0].length+m.index, typ: "e" }); | |
} | |
// sort by offset | |
wrk = wrk.sort(function(a,b) { return a.off - b.off; }); | |
// now start injecting spans into the text | |
var cur = 0; | |
var cons = 0; | |
for (var i = 0; i < wrk.length; i++) { | |
var diff = wrk[i].off - cons; | |
cons = wrk[i].off; | |
var tag = (wrk[i].typ == 's' ? ss : es); | |
cur += diff; | |
html = html.substr(0, cur) + tag + html.substr(cur); | |
cur += tag.length; | |
} | |
return html; | |
} | |
// when a selector is chosen, update the text box | |
$(".selectors .selector").click(function() { | |
$(".current input").val($(this).text()).keyup(); | |
}); | |
var lastSel; | |
$(".current input").keyup(function () { | |
try { | |
var sel = $(".current input").val() | |
if (lastSel === $.trim(sel)) return; | |
lastSel = $.trim(sel); | |
var ar = jsel.match(sel, theDoc); | |
$(".current .results").text(ar.length + " match" + (ar.length == 1 ? "" : "es")) | |
.removeClass("error"); | |
$("pre.doc").html(highlightMatches(ar)); | |
$("pre.doc .selected").hide().fadeIn(700); | |
} catch(e) { | |
$(".current .results").text(e.toString()).addClass("error"); | |
$("pre.doc").text($.trim(JSON.stringify(theDoc, undefined, 4))); | |
} | |
$(".selectors .selector").removeClass("inuse"); | |
$(".selectors div.selector").each(function() { | |
if ($(this).text() === sel) $(this).addClass("inuse"); | |
}); | |
}); | |
}); | |