You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.7 KiB
JavaScript
120 lines
2.7 KiB
JavaScript
module.exports = mine;
|
|
|
|
function mine (js) {
|
|
js = String(js);
|
|
var names = [];
|
|
var state = 0;
|
|
var ident;
|
|
var quote;
|
|
var name;
|
|
var start;
|
|
|
|
var isIdent = /[a-z0-9_.]/i;
|
|
var isWhitespace = /[ \r\n\t]/;
|
|
|
|
function $start (char) {
|
|
if (char === "/") {
|
|
return $slash;
|
|
}
|
|
if (char === "'" || char === '"') {
|
|
quote = char;
|
|
return $string;
|
|
}
|
|
if (isIdent.test(char)) {
|
|
ident = char;
|
|
return $ident;
|
|
}
|
|
return $start;
|
|
}
|
|
|
|
function $ident (char) {
|
|
if (isIdent.test(char)) {
|
|
ident += char;
|
|
return $ident;
|
|
}
|
|
if (char === "(" && ident === "require") {
|
|
ident = undefined;
|
|
return $call;
|
|
}
|
|
else if (isWhitespace.test(char)){
|
|
if (ident !== 'yield' && ident !== 'return'){
|
|
return $ident;
|
|
}
|
|
}
|
|
return $start(char);
|
|
}
|
|
|
|
function $call (char) {
|
|
if (isWhitespace.test(char)) return $call;
|
|
if (char === "'" || char === '"') {
|
|
quote = char;
|
|
name = "";
|
|
start = i + 1;
|
|
return $name;
|
|
}
|
|
return $start(char);
|
|
}
|
|
|
|
function $name (char) {
|
|
if (char === quote) {
|
|
return $close;
|
|
}
|
|
name += char;
|
|
return $name;
|
|
}
|
|
|
|
function $close (char) {
|
|
if (isWhitespace.test(char)) return $close;
|
|
if (char === ")" || char === ',') {
|
|
names.push({
|
|
name: name,
|
|
offset: start
|
|
});
|
|
}
|
|
name = undefined;
|
|
return $start(char);
|
|
}
|
|
|
|
function $string (char) {
|
|
if (char === "\\") {
|
|
return $escape;
|
|
}
|
|
if (char === quote) {
|
|
return $start;
|
|
}
|
|
return $string;
|
|
}
|
|
|
|
function $escape (char) {
|
|
return $string;
|
|
}
|
|
|
|
function $slash (char) {
|
|
if (char === "/") return $lineComment;
|
|
if (char === "*") return $multilineComment;
|
|
return $start(char);
|
|
}
|
|
|
|
function $lineComment (char) {
|
|
if (char === "\r" || char === "\n") return $start;
|
|
return $lineComment;
|
|
}
|
|
|
|
function $multilineComment (char) {
|
|
if (char === "*") return $multilineEnding;
|
|
return $multilineComment;
|
|
}
|
|
|
|
function $multilineEnding (char) {
|
|
if (char === "/") return $start;
|
|
if (char === "*") return $multilineEnding;
|
|
return $multilineComment;
|
|
}
|
|
|
|
var state = $start;
|
|
for (var i = 0, l = js.length; i < l; i++) {
|
|
state = state(js[i]);
|
|
}
|
|
return names;
|
|
}
|