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 <s7ep...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to