* @file
*/
+use Wikimedia\StaticArrayWriter;
+
/**
* @since 1.26
*/
public function __construct( $conf = [] ) {
global $wgCacheDirectory;
- if ( isset( $conf['directory'] ) ) {
- $this->directory = $conf['directory'];
- } else {
- $this->directory = $wgCacheDirectory;
- }
+ $this->directory = $conf['directory'] ?? $wgCacheDirectory;
}
public function startWrite( $code ) {
+ if ( !file_exists( $this->directory ) ) {
+ if ( !wfMkdirParents( $this->directory, null, __METHOD__ ) ) {
+ throw new MWException( "Unable to create the localisation store " .
+ "directory \"{$this->directory}\"" );
+ }
+ }
+
$this->currentLang = $code;
$this->fname = $this->directory . '/' . $code . '.l10n.php';
$this->data[$code] = [];
* Encodes a value into an array format
*
* @param mixed $value
- * @return array
+ * @return array|mixed
* @throws RuntimeException
*/
public static function encode( $value ) {
- if ( is_scalar( $value ) || $value === null ) {
- // [V]alue
- return [ 'v', $value ];
+ if ( is_array( $value ) ) {
+ // [a]rray
+ return [ 'a', array_map( 'LCStoreStaticArray::encode', $value ) ];
}
if ( is_object( $value ) ) {
- // [S]erialized
+ // [s]erialized
return [ 's', serialize( $value ) ];
}
- if ( is_array( $value ) ) {
- // [A]rray
- return [ 'a', array_map( function ( $v ) {
- return LCStoreStaticArray::encode( $v );
- }, $value ) ];
+ if ( is_scalar( $value ) || $value === null ) {
+ // Scalar value, written directly without array
+ return $value;
}
throw new RuntimeException( 'Cannot encode ' . var_export( $value, true ) );
/**
* Decode something that was encoded with encode
*
- * @param array $encoded
+ * @param mixed $encoded
* @return array|mixed
* @throws RuntimeException
*/
- public static function decode( array $encoded ) {
+ public static function decode( $encoded ) {
+ if ( !is_array( $encoded ) ) {
+ // Scalar values are written directly without array
+ return $encoded;
+ }
+
$type = $encoded[0];
$data = $encoded[1];
switch ( $type ) {
- case 'v':
- return $data;
+ case 'a':
+ return array_map( 'LCStoreStaticArray::decode', $data );
case 's':
return unserialize( $data );
- case 'a':
- return array_map( function ( $v ) {
- return LCStoreStaticArray::decode( $v );
- }, $data );
+ case 'v':
+ // Support: MediaWiki 1.32 and earlier
+ // Backward compatibility with older file format
+ return $data;
default:
throw new RuntimeException(
'Unable to decode ' . var_export( $encoded, true ) );
}
public function finishWrite() {
- file_put_contents(
- $this->fname,
- "<?php\n" .
- "// Generated by LCStoreStaticArray.php -- do not edit!\n" .
- "return " .
- var_export( $this->data[$this->currentLang], true ) . ';'
+ $writer = new StaticArrayWriter();
+ $out = $writer->create(
+ $this->data[$this->currentLang],
+ 'Generated by LCStoreStaticArray.php -- do not edit!'
);
+ file_put_contents( $this->fname, $out );
$this->currentLang = null;
$this->fname = null;
}