X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fparser%2FPreprocessor.php;h=368d79ef4993ca245a1e072500c1f0cc6887ccae;hb=f0a28890a000b2c3259438a6b733ed46749c6e2a;hp=b32593c9f7ed085f55f0fdc47213a482d47c1e3f;hpb=31d0a18d3efd13f025633df1cc5a5be7b058f9a3;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/parser/Preprocessor.php b/includes/parser/Preprocessor.php index b32593c9f7..368d79ef49 100644 --- a/includes/parser/Preprocessor.php +++ b/includes/parser/Preprocessor.php @@ -21,23 +21,108 @@ * @ingroup Parser */ +use MediaWiki\Logger\LoggerFactory; + /** * @ingroup Parser */ -interface Preprocessor { +abstract class Preprocessor { + + const CACHE_VERSION = 1; + /** - * Create a new preprocessor object based on an initialised Parser object + * @var array Brace matching rules. + */ + protected $rules = [ + '{' => [ + 'end' => '}', + 'names' => [ + 2 => 'template', + 3 => 'tplarg', + ], + 'min' => 2, + 'max' => 3, + ], + '[' => [ + 'end' => ']', + 'names' => [ 2 => null ], + 'min' => 2, + 'max' => 2, + ] + ]; + + /** + * Store a document tree in the cache. * - * @param Parser $parser + * @param string $text + * @param int $flags */ - public function __construct( $parser ); + protected function cacheSetTree( $text, $flags, $tree ) { + $config = RequestContext::getMain()->getConfig(); + + $length = strlen( $text ); + $threshold = $config->get( 'PreprocessorCacheThreshold' ); + if ( $threshold === false || $length < $threshold || $length > 1e6 ) { + return false; + } + + $key = wfMemcKey( + defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : static::class, + md5( $text ), $flags ); + $value = sprintf( "%08d", static::CACHE_VERSION ) . $tree; + + $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) ); + $cache->set( $key, $value, 86400 ); + + LoggerFactory::getInstance( 'Preprocessor' ) + ->info( "Cached preprocessor output (key: $key)" ); + } + + /** + * Attempt to load a precomputed document tree for some given wikitext + * from the cache. + * + * @param string $text + * @param int $flags + * @return PPNode_Hash_Tree|bool + */ + protected function cacheGetTree( $text, $flags ) { + $config = RequestContext::getMain()->getConfig(); + + $length = strlen( $text ); + $threshold = $config->get( 'PreprocessorCacheThreshold' ); + if ( $threshold === false || $length < $threshold || $length > 1e6 ) { + return false; + } + + $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) ); + + $key = wfMemcKey( + defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : static::class, + md5( $text ), $flags ); + + $value = $cache->get( $key ); + if ( !$value ) { + return false; + } + + $version = intval( substr( $value, 0, 8 ) ); + if ( $version !== static::CACHE_VERSION ) { + return false; + } + + LoggerFactory::getInstance( 'Preprocessor' ) + ->info( "Loaded preprocessor output from cache (key: $key)" ); + + return substr( $value, 8 ); + } /** * Create a new top-level frame for expansion of a page * * @return PPFrame */ - public function newFrame(); + abstract public function newFrame(); /** * Create a new custom frame for programmatic use of parameter replacement @@ -47,7 +132,7 @@ interface Preprocessor { * * @return PPFrame */ - public function newCustomFrame( $args ); + abstract public function newCustomFrame( $args ); /** * Create a new custom node for programmatic use of parameter replacement @@ -55,7 +140,7 @@ interface Preprocessor { * * @param array $values */ - public function newPartNodeArray( $values ); + abstract public function newPartNodeArray( $values ); /** * Preprocess text to a PPNode @@ -65,7 +150,7 @@ interface Preprocessor { * * @return PPNode */ - public function preprocessToObj( $text, $flags = 0 ); + abstract public function preprocessToObj( $text, $flags = 0 ); } /**