diff --git a/library/Unl/Plist.php b/library/Unl/Plist.php index 5ea98afb66b06e95cab4b59f8c25ca3a6c157ee0..0a7e33bf778c0e4f74aece70053600233efd5704 100644 --- a/library/Unl/Plist.php +++ b/library/Unl/Plist.php @@ -5,13 +5,28 @@ class Unl_Plist static public function plistToArray($xml) { $dom = DOMDocument::loadXML($xml); - $xPath = new DOMXPath($dom); - - $root = $xPath->query('plist/*')->item(0); + $plist = $dom->documentElement; + if ($plist->nodeName == 'plist') { + $root = $plist->childNodes->item(0); + } else { + $xPath = new DOMXPath($dom); + $root = $xPath->query('plist/*')->item(0); + } return self::_parseNode($root); } + static public function arrayToPlist($array) + { + $dom = new DOMDocument('1.0', 'UTF-8'); + $root = $dom->createElement('plist'); + $root->setAttribute('version', '1.0'); + $dom->appendChild($root); + + self::_generateNode($dom, $root, $array); + return $dom->saveXML(); + } + static protected function _parseNode($node) { switch ($node->nodeName) { @@ -84,4 +99,69 @@ class Unl_Plist } return $array; } + + + + + static protected function _generateNode(DOMDocument $dom, DOMNode $parentNode, $node) + { + if (is_array($node)) { + $type = 'array'; + $keys = array_keys($node); + for($i = 0; $i < count($keys); $i++) { + if ($i !== $keys[$i]) { + $type = 'dict'; + } + } + if ($type == 'array') { + self::_generateArray($dom, $parentNode, $node); + } else { + self::_generateDict($dom, $parentNode, $node); + } + } else if (is_string($node)) { + self::_generateString($dom, $parentNode, $node); + } else if (is_int($node)) { + self::_generateInt($dom, $parentNode, $node); + } else if (is_bool($node)) { + self::_generateBool($dom, $parentNode, $node); + } + } + + static protected function _generateArray(DOMDocument $dom, DOMNode $parentNode, $node) + { + $array = $dom->createElement('array'); + $parentNode->appendChild($array); + foreach ($node as $aNode) { + self::_generateNode($dom, $array, $aNode); + } + } + + static protected function _generateDict(DOMDocument $dom, DOMNode $parentNode, $node) + { + $dict = $dom->createElement('dict'); + $parentNode->appendChild($dict); + foreach ($node as $key => $aNode) { + $dict->appendChild($dom->createElement('key', $key)); + self::_generateNode($dom, $dict, $aNode); + } + } + + static protected function _generateInt(DOMDocument $dom, DOMNode $parentNode, $node) + { + $parentNode->appendChild($dom->createElement('integer', $node)); + } + + static protected function _generateString(DOMDocument $dom, DOMNode $parentNode, $node) + { + $parentNode->appendChild($dom->createElement('string', $node)); + } + + static protected function _generateBool(DOMDocument $dom, DOMNode $parentNode, $node) + { + if ($node) { + $parentNode->appendChild($dom->createElement('true')); + } else { + $parentNode->appendChild($dom->createElement('false')); + } + } }