Foxtrott has uploaded a new change for review.
https://gerrit.wikimedia.org/r/275266
Change subject: Refactor LingoElement
......................................................................
Refactor LingoElement
Change-Id: I5679311e9ef0e0cc813d2aa6177cab08d1cbc46d
---
M src/LingoElement.php
1 file changed, 156 insertions(+), 149 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Lingo
refs/changes/66/275266/1
diff --git a/src/LingoElement.php b/src/LingoElement.php
index a5bf9c6..97aa9e6 100644
--- a/src/LingoElement.php
+++ b/src/LingoElement.php
@@ -49,13 +49,11 @@
const ELEMENT_STYLE = 4;
const ELEMENT_FIELDCOUNT = 5; // number of fields stored for each
element; (last field's index) + 1
-
+ static private $mLinkTemplate = null;
private $mFullDefinition = null;
private $mDefinitions = array();
private $mTerm = null;
private $mHasBeenDisplayed = false;
-
- static private $mLinkTemplate = null;
/**
* Extensions\Lingo\LingoElement constructor.
@@ -86,31 +84,174 @@
global $wgexLingoDisplayOnce;
- // return textnode if
if ( $wgexLingoDisplayOnce && $this->mHasBeenDisplayed ) {
return $doc->createTextNode( $this->mTerm );
}
+ $this->buildFullDefinition( $doc );
+ $this->mHasBeenDisplayed = true;
+
+ return $this->mFullDefinition->cloneNode( true );
+ }
+
+ /**
+ * @param DOMDocument $doc
+ * @return DOMDocument
+ */
+ private function buildFullDefinition( DOMDocument &$doc ) {
+
// only create if not yet created
if ( $this->mFullDefinition === null ||
$this->mFullDefinition->ownerDocument !== $doc ) {
- // if there is only one link available, just insert the
link
- if ( count( $this->mDefinitions ) === 1
- && !is_string( $this->mDefinitions[ 0 ][
self::ELEMENT_DEFINITION ] )
- && is_string( $this->mDefinitions[ 0 ][
self::ELEMENT_LINK ] )
- ) {
-
+ if ( $this->isSimpleLink() ) {
$this->mFullDefinition =
$this->getFullDefinitionAsLink( $doc );
-
- } else { // else insert the complete tooltip
-
+ } else {
$this->mFullDefinition =
$this->getFullDefinitionAsTooltip( $doc );
}
+ }
+ }
- $this->mHasBeenDisplayed = true;
+ /**
+ * @return bool
+ */
+ private function isSimpleLink() {
+ return count( $this->mDefinitions ) === 1 &&
+ !is_string( $this->mDefinitions[ 0 ][
self::ELEMENT_DEFINITION ] ) &&
+ is_string( $this->mDefinitions[ 0 ][ self::ELEMENT_LINK
] );
+ }
+
+ /**
+ * @param DOMDocument $doc
+ *
+ * @return DOMElement
+ * @throws MWException
+ */
+ protected function getFullDefinitionAsLink( DOMDocument &$doc ) {
+
+ // create Title object for target page
+ $target = Title::newFromText( $this->mDefinitions[ 0 ][
self::ELEMENT_LINK ] );
+
+ // create link element
+ $link = $doc->createElement( 'a', $this->mDefinitions[ 0 ][
self::ELEMENT_TERM ] );
+
+ // set the link target
+ $link->setAttribute( 'href', $target->getLinkUrl() );
+ $link = $this->addClassAttributeToLink( $target, $link );
+ $link = $this->addTitleAttributeToLink( $target, $link );
+
+ return $link;
+ }
+
+ /**
+ * @param $target
+ * @param $link
+ */
+ protected function &addClassAttributeToLink( $target, &$link ) {
+
+ // TODO: should this be more elaborate? See Linker::linkAttribs
+ // Cleanest would probably be to use Linker::link and parse it
+ // back into a DOMElement, but we are in a somewhat
time-critical
+ // part here.
+ $classes = '';
+
+ if ( !$target->isKnown() ) {
+ $classes .= 'new ';
}
- return $this->mFullDefinition->cloneNode( true );
+ if ( $target->isExternal() ) {
+ $classes .= 'extiw ';
+ }
+
+ // set style
+ $classes .= $this->mDefinitions[ 0 ][ self::ELEMENT_STYLE ];
+
+ if ( $classes !== '' ) {
+ $link->setAttribute( 'class', $classes );
+ }
+
+ return $link;
+ }
+
+ /**
+ * @param $target
+ * @param $link
+ */
+ protected function &addTitleAttributeToLink( $target, &$link ) {
+
+ if ( $target->getPrefixedText() === '' ) {
+ // A link like [[#Foo]]. This used to mean an empty
title
+ // attribute, but that's silly. Just don't output a
title.
+ } elseif ( $target->isKnown() ) {
+ $link->setAttribute( 'title',
$target->getPrefixedText() );
+ } else {
+ $link->setAttribute( 'title', wfMessage(
'red-link-title', $target->getPrefixedText() )->text() );
+ }
+
+ return $link;
+ }
+
+ /**
+ * @param DOMDocument $doc
+ *
+ * @return string
+ * @throws MWException
+ */
+ protected function getFullDefinitionAsTooltip( DOMDocument &$doc ) {
+
+ // Wrap term and definition in <span> tags
+ $span = $doc->createElement( 'span' );
+ $span->setAttribute( 'class', 'mw-lingo-tooltip ' .
$this->mDefinitions[ 0 ][ self::ELEMENT_STYLE ] );
+
+ // Wrap term in <span> tag, hidden
+ wfSuppressWarnings();
+ $spanTerm = $doc->createElement( 'span', htmlentities(
$this->mTerm, ENT_COMPAT, 'UTF-8' ) );
+
+ wfRestoreWarnings();
+ $spanTerm->setAttribute( 'class', 'mw-lingo-tooltip-abbr' );
+
+ // Wrap definition in a <span> tag
+ $spanDefinition = $doc->createElement( 'span' );
+ $spanDefinition->setAttribute( 'class', 'mw-lingo-tooltip-tip '
. $this->mDefinitions[ 0 ][ self::ELEMENT_STYLE ] );
+
+ foreach ( $this->mDefinitions as $definition ) {
+ wfSuppressWarnings();
+ $element = $doc->createElement( 'span', htmlentities(
$definition[ self::ELEMENT_DEFINITION ], ENT_COMPAT, 'UTF-8' ) );
+ $element->setAttribute( 'class',
'mw-lingo-tooltip-definition ' . $this->mDefinitions[ 0 ][ self::ELEMENT_STYLE
] );
+ wfRestoreWarnings();
+ if ( $definition[ self::ELEMENT_LINK ] ) {
+ $linkedTitle = Title::newFromText( $definition[
self::ELEMENT_LINK ] );
+ if ( $linkedTitle ) {
+ $link = $this->getLinkTemplate( $doc );
+ $link->setAttribute( 'href',
$linkedTitle->getFullURL() );
+ $element->appendChild( $link );
+ }
+ }
+ $spanDefinition->appendChild( $element );
+ }
+
+ // insert term and definition
+ $span->appendChild( $spanTerm );
+ $span->appendChild( $spanDefinition );
+ return $span;
+ }
+
+ /**
+ * @param DOMDocument $doc
+ * @return DOMNode
+ */
+ private function getLinkTemplate( DOMDocument &$doc ) {
+ // create template if it does not yet exist
+ if ( !self::$mLinkTemplate || (
self::$mLinkTemplate->ownerDocument !== $doc ) ) {
+ global $wgScriptPath;
+
+ $linkimage = $doc->createElement( 'img' );
+ $linkimage->setAttribute( 'src', $wgScriptPath .
'/extensions/Lingo/styles/linkicon.png' );
+
+ self::$mLinkTemplate = $doc->createElement( 'a' );
+ self::$mLinkTemplate->appendChild( $linkimage );
+ }
+
+ return self::$mLinkTemplate->cloneNode( true );
}
/**
@@ -162,140 +303,6 @@
public function next() {
next( $this->mDefinitions );
- }
-
- /**
- * @param DOMDocument $doc
- * @return DOMNode
- */
- private function getLinkTemplate( DOMDocument &$doc ) {
- // create template if it does not yet exist
- if ( !self::$mLinkTemplate || (
self::$mLinkTemplate->ownerDocument !== $doc ) ) {
- global $wgScriptPath;
-
- $linkimage = $doc->createElement( 'img' );
- $linkimage->setAttribute( 'src', $wgScriptPath .
'/extensions/Lingo/styles/linkicon.png' );
-
- self::$mLinkTemplate = $doc->createElement( 'a' );
- self::$mLinkTemplate->appendChild( $linkimage );
- }
-
- return self::$mLinkTemplate->cloneNode( true );
- }
-
- /**
- * @param DOMDocument $doc
- *
- * @return DOMElement
- * @throws MWException
- */
- protected function getFullDefinitionAsLink( DOMDocument &$doc ) {
-
- // create Title object for target page
- $target = Title::newFromText( $this->mDefinitions[ 0 ][
self::ELEMENT_LINK ] );
-
- // create link element
- $link = $doc->createElement( 'a', $this->mDefinitions[ 0 ][
self::ELEMENT_TERM ] );
-
- // set the link target
- $link->setAttribute( 'href', $target->getLinkUrl() );
- $link = $this->addClassAttributeToLink( $target, $link );
- $link = $this->addTitleAttributeToLink( $target, $link );
-
- return $link;
- }
-
- /**
- * @param DOMDocument $doc
- *
- * @return string
- * @throws MWException
- */
- protected function getFullDefinitionAsTooltip( DOMDocument &$doc ) {
-
- // Wrap term and definition in <span> tags
- $span = $doc->createElement( 'span' );
- $span->setAttribute( 'class', 'mw-lingo-tooltip ' .
$this->mDefinitions[ 0 ][ self::ELEMENT_STYLE ] );
-
- // Wrap term in <span> tag, hidden
- wfSuppressWarnings();
- $spanTerm = $doc->createElement( 'span', htmlentities(
$this->mTerm, ENT_COMPAT, 'UTF-8' ) );
-
- wfRestoreWarnings();
- $spanTerm->setAttribute( 'class', 'mw-lingo-tooltip-abbr' );
-
- // Wrap definition in a <span> tag
- $spanDefinition = $doc->createElement( 'span' );
- $spanDefinition->setAttribute( 'class', 'mw-lingo-tooltip-tip '
. $this->mDefinitions[ 0 ][ self::ELEMENT_STYLE ] );
-
- foreach ( $this->mDefinitions as $definition ) {
- wfSuppressWarnings();
- $element = $doc->createElement( 'span', htmlentities(
$definition[ self::ELEMENT_DEFINITION ], ENT_COMPAT, 'UTF-8' ) );
- $element->setAttribute( 'class',
'mw-lingo-tooltip-definition ' . $this->mDefinitions[ 0 ][ self::ELEMENT_STYLE
] );
- wfRestoreWarnings();
- if ( $definition[ self::ELEMENT_LINK ] ) {
- $linkedTitle = Title::newFromText( $definition[
self::ELEMENT_LINK ] );
- if ( $linkedTitle ) {
- $link = $this->getLinkTemplate( $doc );
- $link->setAttribute( 'href',
$linkedTitle->getFullURL() );
- $element->appendChild( $link );
- }
- }
- $spanDefinition->appendChild( $element );
- }
-
- // insert term and definition
- $span->appendChild( $spanTerm );
- $span->appendChild( $spanDefinition );
- return $span;
- }
-
- /**
- * @param $target
- * @param $link
- */
- protected function &addTitleAttributeToLink( $target, &$link ) {
-
- if ( $target->getPrefixedText() === '' ) {
- // A link like [[#Foo]]. This used to mean an empty
title
- // attribute, but that's silly. Just don't output a
title.
- } elseif ( $target->isKnown() ) {
- $link->setAttribute( 'title',
$target->getPrefixedText() );
- } else {
- $link->setAttribute( 'title', wfMessage(
'red-link-title', $target->getPrefixedText() )->text() );
- }
-
- return $link;
- }
-
- /**
- * @param $target
- * @param $link
- */
- protected function &addClassAttributeToLink( $target, &$link ) {
-
- // TODO: should this be more elaborate? See Linker::linkAttribs
- // Cleanest would probably be to use Linker::link and parse it
- // back into a DOMElement, but we are in a somewhat
time-critical
- // part here.
- $classes = '';
-
- if ( !$target->isKnown() ) {
- $classes .= 'new ';
- }
-
- if ( $target->isExternal() ) {
- $classes .= 'extiw ';
- }
-
- // set style
- $classes .= $this->mDefinitions[ 0 ][ self::ELEMENT_STYLE ];
-
- if ( $classes !== '' ) {
- $link->setAttribute( 'class', $classes );
- }
-
- return $link;
}
}
--
To view, visit https://gerrit.wikimedia.org/r/275266
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I5679311e9ef0e0cc813d2aa6177cab08d1cbc46d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Lingo
Gerrit-Branch: master
Gerrit-Owner: Foxtrott <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits