spyc.php

来自「QeePHP v2.1.2116 bulid 090120」· PHP 代码 · 共 742 行 · 第 1/2 页

PHP
742
字号
<?php/**   * Spyc -- A Simple PHP YAML Class   * @version 0.3   * @author Chris Wanstrath <chris@ozmm.org>   * @author Vlad Andersen <vlad@oneiros.ru>   * @link http://spyc.sourceforge.net/   * @copyright Copyright 2005-2006 Chris Wanstrath   * @license http://www.opensource.org/licenses/mit-license.php MIT License   * @package Spyc   *//**   * The Simple PHP YAML Class.   *   * This class can be used to read a YAML file and convert its contents   * into a PHP array.  It currently supports a very limited subsection of   * the YAML spec.   *   * Usage:   * <code>   *   $parser = new Spyc;   *   $array  = $parser->load($file);   * </code>   * @package Spyc   */class Spyc {  /**#@+  * @access private  * @var mixed  */  private $_haveRefs;  private $_allNodes;  private $_allParent;  private $_lastIndent;  private $_lastNode;  private $_inBlock;  private $_isInline;  private $_dumpIndent;  private $_dumpWordWrap;  private $_containsGroupAnchor = false;  private $_containsGroupAlias = false;  private $path;  private $result;  private $LiteralBlockMarkers = array ('>', '|');  private $LiteralPlaceHolder = '___YAML_Literal_Block___';  private $SavedGroups = array();  /**#@+  * @access public  * @var mixed  */  public $_nodeId;  /**     * Load YAML into a PHP array statically     *     * The load method, when supplied with a YAML stream (string or file),     * will do its best to convert YAML in a file into a PHP array.  Pretty     * simple.     *  Usage:     *  <code>     *   $array = Spyc::YAMLLoad('lucky.yaml');     *   print_r($array);     *  </code>     * @access public     * @return array     * @param string $input Path of YAML file or string containing YAML     */  public static function YAMLLoad($input) {    $Spyc = new Spyc;    return $Spyc->load($input);  }  /**     * Dump YAML from PHP array statically     *     * The dump method, when supplied with an array, will do its best     * to convert the array into friendly YAML.  Pretty simple.  Feel free to     * save the returned string as nothing.yaml and pass it around.     *     * Oh, and you can decide how big the indent is and what the wordwrap     * for folding is.  Pretty cool -- just pass in 'false' for either if     * you want to use the default.     *     * Indent's default is 2 spaces, wordwrap's default is 40 characters.  And     * you can turn off wordwrap by passing in 0.     *     * @access public     * @return string     * @param array $array PHP array     * @param int $indent Pass in false to use the default, which is 2     * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)     */  public static function YAMLDump($array,$indent = false,$wordwrap = false) {    $spyc = new Spyc;    return $spyc->dump($array,$indent,$wordwrap);  }  /**     * Dump PHP array to YAML     *     * The dump method, when supplied with an array, will do its best     * to convert the array into friendly YAML.  Pretty simple.  Feel free to     * save the returned string as tasteful.yaml and pass it around.     *     * Oh, and you can decide how big the indent is and what the wordwrap     * for folding is.  Pretty cool -- just pass in 'false' for either if     * you want to use the default.     *     * Indent's default is 2 spaces, wordwrap's default is 40 characters.  And     * you can turn off wordwrap by passing in 0.     *     * @access public     * @return string     * @param array $array PHP array     * @param int $indent Pass in false to use the default, which is 2     * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40)     */  public function dump($array,$indent = false,$wordwrap = false) {    // Dumps to some very clean YAML.  We'll have to add some more features    // and options soon.  And better support for folding.    // New features and options.    if ($indent === false or !is_numeric($indent)) {      $this->_dumpIndent = 2;    } else {      $this->_dumpIndent = $indent;    }    if ($wordwrap === false or !is_numeric($wordwrap)) {      $this->_dumpWordWrap = 40;    } else {      $this->_dumpWordWrap = $wordwrap;    }    // New YAML document    $string = "---\n";    // Start at the base of the array and move through it.    foreach ($array as $key => $value) {      $string .= $this->_yamlize($key,$value,0);    }    return $string;  }  /**     * Attempts to convert a key / value array item to YAML     * @access private     * @return string     * @param $key The name of the key     * @param $value The value of the item     * @param $indent The indent of the current node     */  private function _yamlize($key,$value,$indent) {    if (is_array($value)) {      // It has children.  What to do?      // Make it the right kind of item      $string = $this->_dumpNode($key,NULL,$indent);      // Add the indent      $indent += $this->_dumpIndent;      // Yamlize the array      $string .= $this->_yamlizeArray($value,$indent);    } elseif (!is_array($value)) {      // It doesn't have children.  Yip.      $string = $this->_dumpNode($key,$value,$indent);    }    return $string;  }  /**     * Attempts to convert an array to YAML     * @access private     * @return string     * @param $array The array you want to convert     * @param $indent The indent of the current level     */  private function _yamlizeArray($array,$indent) {    if (is_array($array)) {      $string = '';      foreach ($array as $key => $value) {        $string .= $this->_yamlize($key,$value,$indent);      }      return $string;    } else {      return false;    }  }  /**     * Returns YAML from a key and a value     * @access private     * @return string     * @param $key The name of the key     * @param $value The value of the item     * @param $indent The indent of the current node     */  private function _dumpNode($key,$value,$indent) {    // do some folding here, for blocks    if (strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false) {      $value = $this->_doLiteralBlock($value,$indent);    } else {      $value  = $this->_doFolding($value,$indent);    }    if (is_bool($value)) {      $value = ($value) ? "true" : "false";    }    $spaces = str_repeat(' ',$indent);    if (is_int($key)) {      // It's a sequence      $string = $spaces.'- '.$value."\n";    } else {      // It's mapped      $string = $spaces.$key.': '.$value."\n";    }    return $string;  }  /**     * Creates a literal block for dumping     * @access private     * @return string     * @param $value     * @param $indent int The value of the indent     */  private function _doLiteralBlock($value,$indent) {    $exploded = explode("\n",$value);    $newValue = '|';    $indent  += $this->_dumpIndent;    $spaces   = str_repeat(' ',$indent);    foreach ($exploded as $line) {      $newValue .= "\n" . $spaces . trim($line);    }    return $newValue;  }  /**     * Folds a string of text, if necessary     * @access private     * @return string     * @param $value The string you wish to fold     */  private function _doFolding($value,$indent) {    // Don't do anything if wordwrap is set to 0    if ($this->_dumpWordWrap === 0) {      return $value;    }    if (strlen($value) > $this->_dumpWordWrap) {      $indent += $this->_dumpIndent;      $indent = str_repeat(' ',$indent);      $wrapped = wordwrap($value,$this->_dumpWordWrap,"\n$indent");      $value   = ">\n".$indent.$wrapped;    }    return $value;  }/* LOADING FUNCTIONS */  private function load($input) {    $Source = $this->loadFromSource($input);    if (empty ($Source)) return array();    $this->path = array();    $this->result = array();    for ($i = 0; $i < count($Source); $i++) {      $line = $Source[$i];      $lineIndent = $this->_getIndent($line);      $this->path = $this->getParentPathByIndent($lineIndent);      $line = $this->stripIndent($line, $lineIndent);      if ($this->isComment($line)) continue;      if ($literalBlockStyle = $this->startsLiteralBlock($line)) {        $line = rtrim ($line, $literalBlockStyle . "\n");        $literalBlock = '';        $line .= $this->LiteralPlaceHolder;        while ($this->literalBlockContinues($Source[++$i], $lineIndent)) {          $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle);        }        $i--;      }      $lineArray = $this->_parseLine($line);      if ($literalBlockStyle)      $lineArray = $this->revertLiteralPlaceHolder ($lineArray, $literalBlock);      $this->addArray($lineArray, $lineIndent);    }    return $this->result;  }  private function loadFromSource ($input) {    if (!empty($input) && strpos($input, "\n") === false && file_exists($input))    return file($input);    $foo = explode("\n",$input);    foreach ($foo as $k => $_) {      $foo[$k] = trim ($_, "\r");    }    return $foo;  }  /**     * Finds and returns the indentation of a YAML line     * @access private     * @return int     * @param string $line A line from the YAML file     */  private function _getIndent($line) {    if (!preg_match('/^ +/',$line,$match)) return 0;    if (!empty($match[0])) return strlen ($match[0]);    return 0;  }  /**     * Parses YAML code and returns an array for a node     * @access private     * @return array     * @param string $line A line from the YAML file     */  private function _parseLine($line) {    if (!$line) return array();    $line = trim($line);    if (!$line) return array();    $array = array();    if ($group = $this->nodeContainsGroup($line)) {      $this->addGroup($line, $group);      $line = $this->stripGroup ($line, $group);    }    if ($this->startsMappedSequence($line))      return $this->returnMappedSequence($line);    if ($this->startsMappedValue($line))      return $this->returnMappedValue($line);    if ($this->isArrayElement($line))     return $this->returnArrayElement($line);    return $this->returnKeyValuePair($line);  }  /**     * Finds the type of the passed value, returns the value as the new type.     * @access private     * @param string $value     * @return mixed     */  private function _toType($value) {   if (strpos($value, '#') !== false)     $value = trim(preg_replace('/#(.+)$/','',$value));    if (preg_match('/^("(.*)"|\'(.*)\')/',$value,$matches)) {      $value = (string)preg_replace('/(\'\'|\\\\\')/',"'",end($matches));      $value = preg_replace('/\\\\"/','"',$value);    } elseif (preg_match('/^\\[(.+)\\]$/',$value,$matches)) {      // Inline Sequence      // Take out strings sequences and mappings      $explode = $this->_inlineEscape($matches[1]);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?