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.
typesetting/pitfall/pdfkit/node_modules/lexical-scope/mine.js

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;
}