Anomie has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/394369 )
Change subject: Cache processed stylesheets during the parse
......................................................................
Cache processed stylesheets during the parse
If we've already processed a stylesheet once, there's no point in
processing it again.
Change-Id: I83f7aab82cc7674037974b0de43ccae6c77ff39f
---
M TemplateStylesHooks.php
M extension.json
2 files changed, 37 insertions(+), 4 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/TemplateStyles
refs/changes/69/394369/1
diff --git a/TemplateStylesHooks.php b/TemplateStylesHooks.php
index 4742cab..5587a46 100644
--- a/TemplateStylesHooks.php
+++ b/TemplateStylesHooks.php
@@ -126,6 +126,7 @@
*/
public static function onParserFirstCallInit( &$parser ) {
$parser->setHook( 'templatestyles',
'TemplateStylesHooks::handleTag' );
+ $parser->extTemplateStylesCache = new MapCacheLRU( 100 ); //
100 is arbitrary
return true;
}
@@ -176,6 +177,14 @@
return false;
}
return true;
+ }
+
+ /**
+ * Clear our cache when the parser is reset
+ * @param Parser $parser
+ */
+ public static function onParserClearState( Parser $parser ) {
+ $parser->extTemplateStylesCache->clear();
}
/**
@@ -235,13 +244,32 @@
'</strong>';
}
- // For the moment just output the styles inline.
- // @todo: If T160563 happens, it would be good to convert this
to use that.
+ // If the revision actually has an ID, cache based on that.
+ // Otherwise, cache by hash.
+ if ( $rev->getId() ) {
+ $cacheKey = 'r' . $rev->getId();
+ } else {
+ $cacheKey = sha1( $content->getNativeData() );
+ }
+
+ // Include any non-default wrapper class in the cache key too
+ $wrapClass = $parser->getOptions()->getWrapOutputClass();
+ if ( $wrapClass === false ) {
+ $wrapClass = 'mw-parser-output';
+ }
+ if ( $wrapClass !== 'mw-parser-output' ) {
+ $cacheKey .= '/' . $wrapClass;
+ }
+
+ // Already cached?
+ if ( $parser->extTemplateStylesCache->has( $cacheKey ) ) {
+ return $parser->extTemplateStylesCache->get( $cacheKey
);
+ }
$status = $content->sanitize( [
'flip' => $parser->getTargetLanguage()->getDir() !==
$wgContLang->getDir(),
'minify' => !ResourceLoader::inDebugMode(),
- 'class' => $parser->getOptions()->getWrapOutputClass(),
+ 'class' => $wrapClass,
] );
$style = $status->isOk() ? $status->getValue() : '/* Fatal
error, no CSS will be output */';
@@ -270,7 +298,9 @@
// Return the inline <style>, which the Parser will wrap in a
'general'
// strip marker.
- return Html::inlineStyle( $marker );
+ $ret = Html::inlineStyle( $marker );
+ $parser->extTemplateStylesCache->set( $cacheKey, $ret );
+ return $ret;
}
}
diff --git a/extension.json b/extension.json
index 181d409..77f75f5 100644
--- a/extension.json
+++ b/extension.json
@@ -35,6 +35,9 @@
"ParserFirstCallInit": [
"TemplateStylesHooks::onParserFirstCallInit"
],
+ "ParserClearState": [
+ "TemplateStylesHooks::onParserClearState"
+ ],
"ParserAfterTidy": [
"TemplateStylesHooks::onParserAfterTidy"
],
--
To view, visit https://gerrit.wikimedia.org/r/394369
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I83f7aab82cc7674037974b0de43ccae6c77ff39f
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/TemplateStyles
Gerrit-Branch: master
Gerrit-Owner: Anomie <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits