The given code creates a mapping between PHP and JavaScript functions using two main objects, fromPhpToJavascript
and fromJavascriptToPhp
, which contain key-value pairs of function names and their corresponding implementations in the other language. The phpToJs
array maps PHP functions to their JavaScript equivalents, and the jsToPhp
array is created by reversing the elements of each inner array in phpToJs
for the inverse mapping.
// make sure this format works both directions
// from PHP to javascript
var fromPhpToJavascropt = {
'//CallExpression[@name="array_shift"]': {
}
}
var fromJavascriptToPhp = {
}
var phpToJs = [
[() => array_shift(arr), () => arr.shift()],
[() => strpos(str, match), () => { // has parameters so call this function instead?
var i = str.indexOf(match);
return i > -1 ? i : false}],
[() => substr(str, start, length), () => str.substr(start, length)],
[() => is_numeric(num), () => !isNaN(parseInt(num)) || !isNaN(parseFloat(num))],
[() => abs(), () => Math.abs()], // doesn't mess with parameters
// Call Identifier name match done automatically
//[['abs', 'sin', 'cos', 'pow', 'floor', 'ceil', 'round', 'max', 'min'], {
// `//*[contains(@type, "Call")`: (id) => Math.id(), // optional ()
//}]
// above is shorthand for this:
[(id = ['abs', 'sin', 'cos',
'pow', 'floor', 'ceil',
'round', 'max', 'min']) => id(), {
'//*[contains(@type, "Call")': (id) => Math.id(), // optional ()
}],
]
// this will work as long as PHP syntax is also called a Call or Member or Indentifier
var jsToPhp = phpToJs.map(d => [d[1], d[0]])
/**
* Mapping of PHP functions to JavaScript equivalents.
* @typedef {Object} PhpJsMapping
* @property {string} php - PHP function name
* @property {string} js - JavaScript equivalent
*/
/**
* Mapping of PHP functions to JavaScript equivalents.
* @type {PhpJsMapping[]}
*/
const phpToJs = [
{
php: '//CallExpression[@name="array_shift"]',
js: { name: 'arrayShift', fn: arr => arr.shift() }
},
{
php: '//CallExpression[@name="strpos"]',
js: { name:'strpos', fn: (str, match) => str.indexOf(match)!== -1? str.indexOf(match) : false }
},
{
php: '//CallExpression[@name="substr"]',
js: { name:'substr', fn: (str, start, length) => str.substr(start, length) }
},
{
php: '//CallExpression[@name="is_numeric"]',
js: { name: 'isNumeric', fn: num =>!isNaN(parseInt(num)) ||!isNaN(parseFloat(num)) }
},
{
php: '//CallExpression[@name="abs"]',
js: { name: 'abs', fn: () => Math.abs() }
}
];
/**
* Shorthand mapping for built-in math functions.
* @type {Object}
*/
const mathFunctions = {
['abs','sin', 'cos', 'pow', 'floor', 'ceil', 'round','max','min']: (id) => Math[id]()
};
// Combine PHP to JavaScript mapping with shorthand math functions.
const combinedPhpToJs = [...phpToJs,...Object.entries(mathFunctions).map(([id, fn]) => ({ php: `//CallExpression[@name="${id}"]`, js: { name: id, fn } }))];
// Reverse the mapping for JavaScript to PHP.
const jsToPhp = combinedPhpToJs.map(item => ({ js: item.php, php: item.js.name }));
// Output combined JavaScript to PHP mapping.
console.log(jsToPhp);
Code Breakdown
The code is a mapping between PHP and JavaScript functions. It consists of two main objects, fromPhpToJavascript
and fromJavascriptToPhp
, which contain key-value pairs of function names and their corresponding implementations in the other language.
fromPhpToJavascript
: An object that maps PHP function names to their JavaScript equivalents.fromJavascriptToPhp
: An empty object (no implementation provided).phpToJs
: An array of arrays, where each inner array contains two elements:
jsToPhp
: A new array created by mapping the phpToJs
array, but with the elements swapped (JavaScript function comes first, PHP function comes second).Some examples from the phpToJs
array:
array_shift(arr)
in PHP is equivalent to arr.shift()
in JavaScript.strpos(str, match)
in PHP is equivalent to str.indexOf(match) > -1? str.indexOf(match) : false
in JavaScript.abs()
in PHP is equivalent to Math.abs()
in JavaScript.jsToPhp
array is created by reversing the elements of each inner array in phpToJs
, so it's essentially the inverse mapping.