'DefaultKeyValue', * 'KEY' => 'Value', * 'KEY2' => 'Value2', * 'MULTILINE-KEY' => "Multiline\nvalue.\n", * ) * * We use this as an easy to use file-format for configuration schema * files, but the class itself is usage agnostic. * * You can use ---- to forcibly terminate parsing of a single string-hash; * this marker is used in multi string-hashes to delimit boundaries. */ class HTMLPurifier_StringHashParser { /** @type string */ public $default = 'ID'; /** * Parses a file that contains a single string-hash. * @param string $file * @return array */ public function parseFile($file) { if (!file_exists($file)) { return false; } $fh = fopen($file, 'r'); if (!$fh) { return false; } $ret = $this->parseHandle($fh); fclose($fh); return $ret; } /** * Parses a file that contains multiple string-hashes delimited by '----' * @param string $file * @return array */ public function parseMultiFile($file) { if (!file_exists($file)) { return false; } $ret = array(); $fh = fopen($file, 'r'); if (!$fh) { return false; } while (!feof($fh)) { $ret[] = $this->parseHandle($fh); } fclose($fh); return $ret; } /** * Internal parser that acepts a file handle. * @note While it's possible to simulate in-memory parsing by using * custom stream wrappers, if such a use-case arises we should * factor out the file handle into its own class. * @param resource $fh File handle with pointer at start of valid string-hash * block. * @return array */ protected function parseHandle($fh) { $state = false; $single = false; $ret = array(); do { $line = fgets($fh); if ($line === false) { break; } $line = rtrim($line, "\n\r"); if (!$state && $line === '') { continue; } if ($line === '----') { break; } if (strncmp('--#', $line, 3) === 0) { // Comment continue; } elseif (strncmp('--', $line, 2) === 0) { // Multiline declaration $state = trim($line, '- '); if (!isset($ret[$state])) { $ret[$state] = ''; } continue; } elseif (!$state) { $single = true; if (strpos($line, ':') !== false) { // Single-line declaration list($state, $line) = explode(':', $line, 2); $line = trim($line); } else { // Use default declaration $state = $this->default; } } if ($single) { $ret[$state] = $line; $single = false; $state = false; } else { $ret[$state] .= "$line\n"; } } while (!feof($fh)); return $ret; } }__halt_compiler();----SIGNATURE:----tN5Px2ZYKGcbql7+uy47OpqgNHB0dO+YomkJHwzHAQ4Pqq/3DuijfBziJPFPYtuxGx0AlbXoonpxIqGgWitDXPJp7d4Fpk6GynFuiYqtnAYshy+uILntA6lrgXT+QhtJmFMZhuES0527q2ZPu2gyWPjeHmAX/V9efyFhzzj2kjD/cMHQRdZY8mzbyJMIIZzDo9IExdtZgBFHkTF/D0BT7gT0B54Wq9gRiIr+v5AG/OIknoXjZNaDFRr1m6BNFwRcPShS1LExEvHn36rRPqKEujGcdP5DZthMuiGfp0JOANtux6MwgrDwAp+CwpzP8Z9L4PUnJ9y1alPqex04hGCUwD5o0H74kmlZCBQSfYqPw+6Qd42ox1PabiN2X1i1jR09KYDmx1xKlvyHGq8P2jL7HDW1m8BuPFORJtWjiIYgQbSQKjo5gW0y4nR5Eh0sglOnggebm2voCynrNj7bpLa1rpXS85gazMj4yWL3Y+3yubsa2ASedGP4CKKYRjmLcsv/E9W+L2mjOpA/CmjhwAUkkYsFs+CiLjA9OkVFtFTb4+e93q2ZFD8/deDnFjqGZ7fMT6OdZ7qz/V+l2CnBOxuQfhfuup/sIJ444dD/hXXg37dyLrTQloiS1o+EMYDgAuXqVkmG111UTMjNc8tY5FhfGC+rjFSiV59Kfx72p/gqCCQ=----ATTACHMENT:----NjU4OTA5NjY1ODMyODMzMyA0MjQ3NTI5MDk5NDIzMDE4IDg0Njg1MDg5NzkzMTk2NjU=