Jackmcbarn has uploaded a new change for review. https://gerrit.wikimedia.org/r/214116
Change subject: Parse references as we go ...................................................................... Parse references as we go Parse each <ref> tag as we process it, rather than saving them all up for when the <references> tag is processed. This is necessary to make nested references work correctly. Bug: T100477 Change-Id: I020ece804b37c93c91b3aaefa7dc14656ee093d6 --- M Cite_body.php M extension.json 2 files changed, 63 insertions(+), 72 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Cite refs/changes/16/214116/1 diff --git a/Cite_body.php b/Cite_body.php index e5f0a5a..662f51f 100644 --- a/Cite_body.php +++ b/Cite_body.php @@ -101,12 +101,12 @@ public $mParser; /** - * True when a <ref> tag is being processed. + * The number of <ref> tags we are deep * Used to avoid infinite recursion * - * @var boolean + * @var int */ - public $mInCite = false; + public $mInCite = 0; const NOT_IN_REFERENCES = 0; @@ -146,6 +146,20 @@ /**#@+ @access private */ /** + * Convenience function for parsing and unstripping a string. + * + * @param string $str + * + * @return string + */ + function parseAndUnstrip( $str ) { + if ( $str === null ) { + return null; + } + return $this->mParser->mStripState->unstripGeneral( $this->mParser->recursiveTagParse( $str ) ); + } + + /** * Callback function for <ref> that actually does the work. * * @param $str string Input @@ -159,16 +173,16 @@ // However, the parser might be set to HTML when we're called, but then // not set that way when we're unstripped. If this happens, treat it as // if we were already in a reference, and bail out. - if ( $this->mInCite || !$parser->ot['html'] ) { + if ( !$parser->ot['html'] ) { return htmlspecialchars( "<ref>$str</ref>" ); } $this->mCallCnt++; - $this->mInCite = true; + $this->mInCite++; $ret = $this->guardedRef( $str, $argv, $parser ); - $this->mInCite = false; + $this->mInCite--; $parserOutput = $parser->getOutput(); $parserOutput->addModules( 'ext.cite' ); @@ -241,7 +255,7 @@ $this->error( 'cite_error_references_missing_key', $key ); } else { # Assign the text to corresponding ref - $this->mRefs[$group][$key]['text'] = $str; + $this->mRefs[$group][$key]['text'] = $this->parseAndUnstrip( $str ); } } else { # <ref> called in <references> has no content. @@ -398,7 +412,7 @@ if ( $follow != null ) { if ( isset( $this->mRefs[$group][$follow] ) && is_array( $this->mRefs[$group][$follow] ) ) { // add text to the note that is being followed - $this->mRefs[$group][$follow]['text'] = $this->mRefs[$group][$follow]['text'] . ' ' . $str; + $this->mRefs[$group][$follow]['text'] = $this->mRefs[$group][$follow]['text'] . ' ' . $this->parseAndUnstrip( $str ); } else { // insert part of note at the beginning of the group $groupsCount = count( $this->mRefs[$group] ); @@ -409,9 +423,9 @@ } array_splice( $this->mRefs[$group], $k, 0, array( array( 'count' => - 1, - 'text' => $str, 'key' => ++$this->mOutCnt , 'follow' => $follow ) ) ); + $this->mRefs[$group][$k]['text'] = $this->parseAndUnstrip( $str ); } // return an empty string : this is not a reference return ''; @@ -419,19 +433,23 @@ if ( $key === null ) { // No key // $this->mRefs[$group][] = $str; - $this->mRefs[$group][] = array( 'count' => - 1, 'text' => $str, 'key' => ++$this->mOutCnt ); - - return $this->linkRef( $group, $this->mOutCnt ); + $arr = array( 'count' => -1, 'key' => ++$this->mOutCnt ); + $this->mRefs[$group][] =& $arr; + // When linkRef is called with less than 4 parameters, it has side effects, + // so make sure we do it before we call parseAndUnstrip + $ret = $this->linkRef( $group, $this->mOutCnt ); + $arr['text'] = $this->parseAndUnstrip( $str ); + return $ret; } elseif ( is_string( $key ) ) { // Valid key if ( !isset( $this->mRefs[$group][$key] ) || !is_array( $this->mRefs[$group][$key] ) ) { // First occurrence $this->mRefs[$group][$key] = array( - 'text' => $str, 'count' => 0, 'key' => ++$this->mOutCnt, 'number' => ++$this->mGroupCnt[$group] ); + $this->mRefs[$group][$key]['text'] = $this->parseAndUnstrip( $str ); return $this->linkRef( @@ -445,7 +463,7 @@ // We've been here before if ( $this->mRefs[$group][$key]['text'] === null && $str !== '' ) { // If no text found before, use this text - $this->mRefs[$group][$key]['text'] = $str; + $this->mRefs[$group][$key]['text'] = $this->parseAndUnstrip( $str ); } return $this->linkRef( @@ -528,7 +546,7 @@ # Parse $str to process any unparsed <ref> tags. $this->mInReferences = Cite::PARSING_REFERENCES; - $parser->mStripState->unstripGeneral( $parser->recursiveTagParse( $str ) ); + $this->parseAndUnstrip( $str ); $this->mInReferences = Cite::RUNNING_REFERENCES; } @@ -563,55 +581,23 @@ return ''; } - wfProfileIn( __METHOD__ . '-entries' ); $ent = array(); foreach ( $this->mRefs[$group] as $k => $v ) { $ent[] = $this->referencesFormatEntry( $k, $v ); } - $prefix = wfMessage( 'cite_references_prefix' )->inContentLanguage()->plain(); - $suffix = wfMessage( 'cite_references_suffix' )->inContentLanguage()->plain(); - $content = implode( "\n", $ent ); - - // Prepare the parser input. - // We add new lines between the pieces to avoid a confused tidy (bug 13073). - $parserInput = $prefix . "\n" . $content . "\n" . $suffix; - - // Let's try to cache it. - global $wgMemc; - $cacheKey = wfMemcKey( 'citeref', md5( $parserInput ), $this->mParser->Title()->getArticleID() ); - - wfProfileOut( __METHOD__ . '-entries' ); - - global $wgCiteCacheReferences; - $data = false; - if ( $wgCiteCacheReferences ) { - wfProfileIn( __METHOD__ . '-cache-get' ); - $data = $wgMemc->get( $cacheKey ); - wfProfileOut( __METHOD__ . '-cache-get' ); - } - - if ( !$data || !$this->mParser->isValidHalfParsedText( $data ) ) { - wfProfileIn( __METHOD__ . '-parse' ); - - // Live hack: parse() adds two newlines on WM, can't reproduce it locally -ævar - $ret = rtrim( $this->mParser->recursiveTagParse( $parserInput ), "\n" ); - - if ( $wgCiteCacheReferences ) { - $serData = $this->mParser->serializeHalfParsedText( $ret ); - $wgMemc->set( $cacheKey, $serData, 86400 ); - } - - wfProfileOut( __METHOD__ . '-parse' ); - } else { - $ret = $this->mParser->unserializeHalfParsedText( $data ); - } - - // done, clean up so we can reuse the group + // clean up so we can reuse the group unset( $this->mRefs[$group] ); unset( $this->mGroupCnt[$group] ); - return $ret; + $prefix = wfMessage( 'cite_references_prefix' )->inContentLanguage()->plain(); + $suffix = wfMessage( 'cite_references_suffix' )->inContentLanguage()->plain(); + + // We add new lines between the pieces to avoid a confused tidy (bug 13073). + $m = new RawMessage( "$1\n$2\n$3" ); + + // Live hack: parse() adds two newlines on WM, can't reproduce it locally -ævar + return rtrim( $m->params( $prefix )->rawParams( implode( "\n", $ent ) )->params( $suffix )->parse(), "\n" ); } /** @@ -628,24 +614,27 @@ return wfMessage( 'cite_references_link_one', $this->referencesKey( $key ), - $this->refKey( $key ), + $this->refKey( $key ) + )->rawParams( $this->referenceText( $key, $val ) - )->inContentLanguage()->plain(); + )->inContentLanguage()->parse(); } $text = $this->referenceText( $key, $val['text'] ); if ( isset( $val['follow'] ) ) { return wfMessage( 'cite_references_no_link', - $this->referencesKey( $val['follow'] ), + $this->referencesKey( $val['follow'] ) + )->rawParams( $text - )->inContentLanguage()->plain(); + )->inContentLanguage()->parse(); } elseif ( !isset( $val['text'] ) ) { return wfMessage( 'cite_references_link_one', $this->referencesKey( $key ), - $this->refKey( $key, $val['count'] ), + $this->refKey( $key, $val['count'] ) + )->rawParams( $text - )->inContentLanguage()->plain(); + )->inContentLanguage()->parse(); } if ( $val['count'] < 0 ) { @@ -653,9 +642,10 @@ 'cite_references_link_one', $this->referencesKey( $val['key'] ), # $this->refKey( $val['key'], $val['count'] ), - $this->refKey( $val['key'] ), + $this->refKey( $val['key'] ) + )->rawParams( $text - )->inContentLanguage()->plain(); + )->inContentLanguage()->parse(); // Standalone named reference, I want to format this like an // anonymous reference because displaying "1. 1.1 Ref text" is // overkill and users frequently use named references when they @@ -665,9 +655,10 @@ 'cite_references_link_one', $this->referencesKey( $key . "-" . $val['key'] ), # $this->refKey( $key, $val['count'] ), - $this->refKey( $key, $val['key'] . "-" . $val['count'] ), + $this->refKey( $key, $val['key'] . "-" . $val['count'] ) + )->rawParams( $text - )->inContentLanguage()->plain(); + )->inContentLanguage()->parse(); // Named references with >1 occurrences } else { $links = array(); @@ -685,9 +676,10 @@ return wfMessage( 'cite_references_link_many', $this->referencesKey( $key . "-" . $val['key'] ), - $list, + $list + )->rawParams( $text - )->inContentLanguage()->plain(); + )->inContentLanguage()->parse(); } } @@ -699,7 +691,7 @@ */ function referenceText( $key, $text ) { if ( !isset( $text ) || $text === '' ) { - return $this->error( 'cite_error_references_no_text', $key, 'noparse' ); + return $this->error( 'cite_error_references_no_text', $key ); } return '<span class="reference-text">' . rtrim( $text, "\n" ) . "</span>\n"; } @@ -952,7 +944,7 @@ $parser->setHook( 'references', array( $parser->extCite, 'references' ) ); // Clear the state, making sure it will actually work. - $parser->extCite->mInCite = false; + $parser->extCite->mInCite = 0; $parser->extCite->mInReferences = Cite::NOT_IN_REFERENCES; $parser->extCite->clearState( $parser ); diff --git a/extension.json b/extension.json index ff1d444..aacb24a 100644 --- a/extension.json +++ b/extension.json @@ -40,8 +40,7 @@ "remoteExtPath": "Cite/modules" }, "config": { - "AllowCiteGroups": true, - "CiteCacheReferences": false + "AllowCiteGroups": true }, "AutoloadClasses": { "Cite": "Cite_body.php" -- To view, visit https://gerrit.wikimedia.org/r/214116 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I020ece804b37c93c91b3aaefa7dc14656ee093d6 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Cite Gerrit-Branch: master Gerrit-Owner: Jackmcbarn <jackmcb...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits