Since you accepted my (wrong) answer in a different thread, I feel like I have a duty to post the proper solution. It won't be quick and short, but hopefully helps a bit.
, , , c- , .
<script>
function replaceAll(str, regexp, repl) {
str = str.toString();
while(str.match(regexp))
str = str.replace(regexp, repl);
return str;
}
function isolate(type, str, regexp, buf) {
return replaceAll(str, regexp, function($0) {
buf.push($0);
return "<<" + type + (buf.length - 1) + ">>";
});
}
function restore(str, buf) {
return replaceAll(str, /<<[a-z]+(\d+)>>/g, function($0, $1) {
return buf[parseInt($1)];
});
}
var grammar = {
$nothing: "",
$space: "\\s",
$access: "public $space+ | private $space+ | $nothing",
$ident: "[a-z_]\\w*",
$args: "[^()]*",
$string: "<<string [0-9]+>>",
$block: "<<block [0-9]+>>",
$fun: "($access) function $space* ($ident) $space* \\( ($args) \\) $space* ($block)"
}
function compile(grammar) {
var re = {};
for(var p in grammar)
re[p] = new RegExp(
replaceAll(grammar[p], /\$\w+/g,
function($0) { return grammar[$0] }).
replace(/\s+/g, ""),
"gi");
return re;
}
function findFunctions(code, callback) {
var buf = [];
code = isolate("string", code, /"(\\.|[^\"])*"/g, buf);
code = isolate("block", code, /{[^{}]*}/g, buf);
var re = compile(grammar);
code.replace(re.$fun, function() {
var p = [];
for(var i = 1; i < arguments.length; i++)
p.push(restore(arguments[i], buf));
return callback.apply(this, p)
});
}
</script>
. .
<code>
public function blah(arg1, arg2) {
if("some string" == "public function") {
callAnother("{hello}")
while(something) {
alert("escaped \" string");
}
}
}
function yetAnother() { alert("blah") }
</code>
<script>
window.onload = function() {
var code = document.getElementsByTagName("code")[0].innerHTML;
findFunctions(code, function(access, name, args, body) {
document.write(
"<br>" +
"<br> access= " + access +
"<br> name= " + name +
"<br> args= " + args +
"<br> body= " + body
)
});
}
</script>