aboutsummaryrefslogtreecommitdiffstats
path: root/yamlishwriter-php-v0.0.1/lib/yamlishwriter.php
diff options
context:
space:
mode:
Diffstat (limited to 'yamlishwriter-php-v0.0.1/lib/yamlishwriter.php')
-rw-r--r--yamlishwriter-php-v0.0.1/lib/yamlishwriter.php125
1 files changed, 125 insertions, 0 deletions
diff --git a/yamlishwriter-php-v0.0.1/lib/yamlishwriter.php b/yamlishwriter-php-v0.0.1/lib/yamlishwriter.php
new file mode 100644
index 0000000..62035a9
--- /dev/null
+++ b/yamlishwriter-php-v0.0.1/lib/yamlishwriter.php
@@ -0,0 +1,125 @@
+<?php
+
+ // Would be nice if this weren't a global function - but I can't find
+ // out how to make a class member work in preg_replace_callback
+ function __escape_unprintable($matched) {
+ $unprintable = array(
+ 'z', 'x01', 'x02', 'x03', 'x04', 'x05', 'x06', 'a',
+ 'x08', 't', 'n', 'v', 'f', 'r', 'x0e', 'x0f',
+ 'x10', 'x11', 'x12', 'x13', 'x14', 'x15', 'x16', 'x17',
+ 'x18', 'x19', 'x1a', 'e', 'x1c', 'x1d', 'x1e', 'x1f',
+ );
+
+ return '\\' . $unprintable[ ord( $matched[0] ) ];
+ }
+
+ class YAMLishWriter {
+ function YAMLishWriter() {
+
+ }
+
+ function write( $obj ) {
+ $out = array();
+
+ $this->_write_obj( $out, '---', $obj );
+ $out[] = '...';
+
+ return $out;
+ }
+
+ function _write_hash( &$out, $obj, $indent, $pad ) {
+ while ( list($k, $v) = each( $obj ) ) {
+ $this->_write_obj(
+ $out,
+ $pad . $this->_enc_scalar($k) . ':',
+ $v, $indent + 1
+ );
+ }
+ }
+
+ function _write_array( &$out, $obj, $indent ) {
+ $pad = '';
+ for ( $i = 0; $i < $indent; $i++ ) {
+ $pad .= ' ';
+ }
+
+ $nout = array();
+ $idx = 0;
+ while ( list($k, $v) = each( $obj ) ) {
+ if (gettype($k) != 'integer' || $k != $idx) {
+ # If we find it's not actually an array discard what we've done
+ # and write a hash instead. Usually we should find out pretty
+ # early.
+ $this->_write_hash( $out, $obj, $indent, $pad );
+ return;
+ }
+
+ $this->_write_obj( $nout, "$pad-", $v, $indent + 1);
+ $idx++;
+ }
+
+ array_splice( $out, count($out), 0, $nout );
+ }
+
+ function _enc_string ( $str ) {
+ if (preg_match('/[\x00-\x1f\"]/', $str)) {
+ $str = preg_replace('/\\\\/', '\\\\', $str);
+ $str = preg_replace('/"/', '\\"', $str);
+ $str = preg_replace_callback( '/([\x00-\x1f])/', '__escape_unprintable', $str );
+ return '"' . $str . '"';
+ }
+
+ if ( strlen($str) == 0 || preg_match( '/\s/', $str ) ) {
+ return "'" . preg_replace('/\'/', "''", $str) . "'";
+ }
+
+ return $str;
+ }
+
+ function _enc_scalar( $obj ) {
+ $type = gettype( $obj );
+ switch ($type) {
+ case 'boolean':
+ return $obj ? '1' : '0';
+
+ case 'double' :
+ case 'integer':
+ return "$obj";
+
+ case 'NULL':
+ return '~';
+
+ case 'string':
+ return $this->_enc_string( $obj );
+
+ default:
+ die('Unhandled scalar type ' . $type);
+ }
+ }
+
+ function _write_obj( &$out, $prefix, $obj, $indent = 0 ) {
+ $type = gettype( $obj );
+
+ switch ($type) {
+ case 'boolean':
+ case 'integer':
+ case 'double' :
+ case 'string':
+ case 'NULL':
+ $out[] = "$prefix " . $this->_enc_scalar( $obj );
+ break;
+
+ case 'array':
+ $out[] = $prefix;
+ $this->_write_array( $out, $obj, $indent );
+ break;
+
+ case 'object':
+ case 'resource':
+ default:
+ die('Unhandled type ' . $type);
+ }
+ }
+ }
+
+?>