phpjs
Version:
185 lines (166 loc) • 5.91 kB
Markdown
---
layout: page
title: "JavaScript var_export function"
comments: true
sharing: true
footer: true
alias:
- /functions/view/var_export:578
- /functions/view/var_export
- /functions/view/578
- /functions/var_export:578
- /functions/578
---
<!-- Generated by Rakefile:build -->
A JavaScript equivalent of PHP's var_export
{% codeblock var/var_export.js lang:js https://raw.github.com/kvz/phpjs/master/functions/var/var_export.js raw on github %}
function var_export (mixed_expression, bool_return) {
// From: http://phpjs.org/functions
// + original by: Philip Peterson
// + improved by: johnrembo
// + improved by: Brett Zamir (http://brett-zamir.me)
// + input by: Brian Tafoya (http://www.premasolutions.com/)
// + bugfixed by: Brett Zamir (http://brett-zamir.me)
// + bugfixed by: Brett Zamir (http://brett-zamir.me)
// + input by: Hans Henrik (http://hanshenrik.tk/)
// - depends on: echo
// * example 1: var_export(null);
// * returns 1: null
// * example 2: var_export({0: 'Kevin', 1: 'van', 2: 'Zonneveld'}, true);
// * returns 2: "array (\n 0 => 'Kevin',\n 1 => 'van',\n 2 => 'Zonneveld'\n)"
// * example 3: data = 'Kevin';
// * example 3: var_export(data, true);
// * returns 3: "'Kevin'"
var retstr = '',
iret = '',
value,
cnt = 0,
x = [],
i = 0,
funcParts = [],
// We use the last argument (not part of PHP) to pass in
// our indentation level
idtLevel = arguments[2] || 2,
innerIndent = '',
outerIndent = '',
getFuncName = function (fn) {
var name = (/\W*function\s+([\w\$]+)\s*\(/).exec(fn);
if (!name) {
return '(Anonymous)';
}
return name[1];
},
_makeIndent = function (idtLevel) {
return (new Array(idtLevel + 1)).join(' ');
},
__getType = function (inp) {
var i = 0, match, types, cons, type = typeof inp;
if (type === 'object' && (inp && inp.constructor) &&
getFuncName(inp.constructor) === 'PHPJS_Resource') {
return 'resource';
}
if (type === 'function') {
return 'function';
}
if (type === 'object' && !inp) {
return 'null'; // Should this be just null?
}
if (type === "object") {
if (!inp.constructor) {
return 'object';
}
cons = inp.constructor.toString();
match = cons.match(/(\w+)\(/);
if (match) {
cons = match[1].toLowerCase();
}
types = ["boolean", "number", "string", "array"];
for (i = 0; i < types.length; i++) {
if (cons === types[i]) {
type = types[i];
break;
}
}
}
return type;
},
type = __getType(mixed_expression);
if (type === null) {
retstr = "NULL";
} else if (type === 'array' || type === 'object') {
outerIndent = _makeIndent(idtLevel - 2);
innerIndent = _makeIndent(idtLevel);
for (i in mixed_expression) {
value = this.var_export(mixed_expression[i], 1, idtLevel + 2);
value = typeof value === 'string' ? value.replace(/</g, '<').
replace(/>/g, '>') : value;
x[cnt++] = innerIndent + i + ' => ' +
(__getType(mixed_expression[i]) === 'array' ?
'\n' : '') + value;
}
iret = x.join(',\n');
retstr = outerIndent + "array (\n" + iret + '\n' + outerIndent + ')';
} else if (type === 'function') {
funcParts = mixed_expression.toString().
match(/function .*?\((.*?)\) \{([\s\S]*)\}/);
// For lambda functions, var_export() outputs such as the following:
// '\000lambda_1'. Since it will probably not be a common use to
// expect this (unhelpful) form, we'll use another PHP-exportable
// construct, create_function() (though dollar signs must be on the
// variables in JavaScript); if using instead in JavaScript and you
// are using the namespaced version, note that create_function() will
// not be available as a global
retstr = "create_function ('" + funcParts[1] + "', '" +
funcParts[2].replace(new RegExp("'", 'g'), "\\'") + "')";
} else if (type === 'resource') {
retstr = 'NULL'; // Resources treated as null for var_export
} else {
retstr = typeof mixed_expression !== 'string' ? mixed_expression :
"'" + mixed_expression.replace(/(["'])/g, "\\$1").
replace(/\0/g, "\\0") + "'";
}
if (!bool_return) {
this.echo(retstr);
return null;
}
return retstr;
}
{% endcodeblock %}
- [Raw function on GitHub](https://github.com/kvz/phpjs/blob/master/functions/var/var_export.js)
Please note that php.js uses JavaScript objects as substitutes for PHP arrays, they are
the closest match to this hashtable-like data structure.
Please also note that php.js offers community built functions and goes by the
[McDonald's Theory](https://medium.com/what-i-learned-building/9216e1c9da7d). We'll put online
functions that are far from perfect, in the hopes to spark better contributions.
Do you have one? Then please just:
- [Edit on GitHub](https://github.com/kvz/phpjs/edit/master/functions/var/var_export.js)
### Example 1
This code
{% codeblock lang:js example %}
var_export(null);
{% endcodeblock %}
Should return
{% codeblock lang:js returns %}
null
{% endcodeblock %}
### Example 2
This code
{% codeblock lang:js example %}
var_export({0: 'Kevin', 1: 'van', 2: 'Zonneveld'}, true);
{% endcodeblock %}
Should return
{% codeblock lang:js returns %}
"array (\n 0 => 'Kevin',\n 1 => 'van',\n 2 => 'Zonneveld'\n)"
{% endcodeblock %}
### Example 3
This code
{% codeblock lang:js example %}
data = 'Kevin';
var_export(data, true);
{% endcodeblock %}
Should return
{% codeblock lang:js returns %}
"'Kevin'"
{% endcodeblock %}
### Other PHP functions in the var extension
{% render_partial _includes/custom/var.html %}