X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/includes/cache/localisation/LCStoreStaticArray.php diff --git a/includes/cache/localisation/LCStoreStaticArray.php b/includes/cache/localisation/LCStoreStaticArray.php new file mode 100644 index 00000000..1e20082f --- /dev/null +++ b/includes/cache/localisation/LCStoreStaticArray.php @@ -0,0 +1,140 @@ +directory = $conf['directory']; + } else { + $this->directory = $wgCacheDirectory; + } + } + + public function startWrite( $code ) { + $this->currentLang = $code; + $this->fname = $this->directory . '/' . $code . '.l10n.php'; + $this->data[$code] = []; + if ( file_exists( $this->fname ) ) { + $this->data[$code] = require $this->fname; + } + } + + public function set( $key, $value ) { + $this->data[$this->currentLang][$key] = self::encode( $value ); + } + + /** + * Encodes a value into an array format + * + * @param mixed $value + * @return array + * @throws RuntimeException + */ + public static function encode( $value ) { + if ( is_scalar( $value ) || $value === null ) { + // [V]alue + return [ 'v', $value ]; + } + if ( is_object( $value ) ) { + // [S]erialized + return [ 's', serialize( $value ) ]; + } + if ( is_array( $value ) ) { + // [A]rray + return [ 'a', array_map( function ( $v ) { + return LCStoreStaticArray::encode( $v ); + }, $value ) ]; + } + + throw new RuntimeException( 'Cannot encode ' . var_export( $value, true ) ); + } + + /** + * Decode something that was encoded with encode + * + * @param array $encoded + * @return array|mixed + * @throws RuntimeException + */ + public static function decode( array $encoded ) { + $type = $encoded[0]; + $data = $encoded[1]; + + switch ( $type ) { + case 'v': + return $data; + case 's': + return unserialize( $data ); + case 'a': + return array_map( function ( $v ) { + return LCStoreStaticArray::decode( $v ); + }, $data ); + default: + throw new RuntimeException( + 'Unable to decode ' . var_export( $encoded, true ) ); + } + } + + public function finishWrite() { + file_put_contents( + $this->fname, + "data[$this->currentLang], true ) . ';' + ); + $this->currentLang = null; + $this->fname = null; + } + + public function get( $code, $key ) { + if ( !array_key_exists( $code, $this->data ) ) { + $fname = $this->directory . '/' . $code . '.l10n.php'; + if ( !file_exists( $fname ) ) { + return null; + } + $this->data[$code] = require $fname; + } + $data = $this->data[$code]; + if ( array_key_exists( $key, $data ) ) { + return self::decode( $data[$key] ); + } + return null; + } +}