Спасибо Матиасу за указание на то, что в этом случае я должен использовать парсер.
Я оставлю свой ответ как ссылку на любого, кто пытается найти аргументы функций в javascript. Я использовал библиотеки Esprima и Codegen для NodeJS для анализа моих JS файлов. Таким образом, я легко могу найти первые аргументы всех вызовов window.open()
. В моем случае я заменяю первый аргумент, который является URL-адресом, на его кодированную версию, используя функцию encodeURI()
:
// This script finds all the calls "window.open" in a javascript file and converts
// the first argument of it to an encoded version of it.
function isWindowOpenCall(node) {
if (node) {
return (node && (node.type === 'CallExpression') &&
(node.callee.type === 'MemberExpression') &&
(node.callee.object.type === 'Identifier') &&
(node.callee.object.name === 'window') &&
(node.callee.property.type === 'Identifier') &&
(node.callee.property.name === 'open'))
}
else return false;
}
// For JS Code Parsing
var esprima = require("esprima");
// For JS Code Regeneration
var escodegen = require("escodegen");
// For Reading File System
var fs = require("fs");
// For Reading the Lines
var readline = require('readline');
// Read File Name from Command Line
const fileNames = process.argv.splice(2);
// Read the file
var file = fileNames[0];
var sourceCode = fs.readFileSync(file, "utf-8");
// Parse the File
var parsedFile = esprima.parseScript(sourceCode, {}, function(node) {
if (isWindowOpenCall(node)) {
if(node){
var arguments_parsed = node.arguments;
var firstArgument_parsed = arguments_parsed[0];
var firstArgument_plain = escodegen.generate(firstArgument_parsed);
var firstArgumentModified_plain = "encodeURI(" + firstArgument_plain +")";
var firstArgumentModified_parsed = esprima.parse(firstArgumentModified_plain);
node.arguments[0] = firstArgumentModified_parsed;
}
}
});
// This is because the escodegen library automatically adds a ";" after changing
// the first argument, putting a syntax error in the script of the two forms:
// ");," in case `encodeURI` has multiple arguments or ";);" in case `encodeURI`
// has a single argument.
var result = escodegen.generate(parsedFile).replace(/;\),/g, '),');
var result = escodegen.generate(result).replace(/;\);/g, ');');
console.log(result);