Foxtrott has submitted this change and it was merged.
Change subject: Refactoring of the file layout
......................................................................
Refactoring of the file layout
Change-Id: I16cb0b2b8613b2333778633afca94c64cd8d4cfe
---
M Lingo.php
D LingoElement.php
R src/LingoBackend.php
R src/LingoBasicBackend.php
A src/LingoElement.php
R src/LingoHooks.php
R src/LingoMessageLog.php
R src/LingoParser.php
R src/LingoTree.php
R styles/Lingo.css
R styles/jquery.qtip.css
R styles/linkicon.png
12 files changed, 253 insertions(+), 214 deletions(-)
Approvals:
Foxtrott: Verified; Looks good to me, approved
jenkins-bot: Checked
diff --git a/Lingo.php b/Lingo.php
index 6ec670f..f6465b0 100644
--- a/Lingo.php
+++ b/Lingo.php
@@ -69,13 +69,13 @@
// register class files with the Autoloader
$autoloadClasses = array(
- 'LingoHooks' => $dir . '/LingoHooks.php',
- 'LingoParser' => $dir . '/LingoParser.php',
- 'LingoTree' => $dir . '/LingoTree.php',
- 'LingoElement' => $dir . '/LingoElement.php',
- 'LingoBackend' => $dir . '/LingoBackend.php',
- 'LingoBasicBackend' => $dir . '/LingoBasicBackend.php',
- 'LingoMessageLog' => $dir . '/LingoMessageLog.php',
+ 'LingoHooks' => $dir . '/src/LingoHooks.php',
+ 'LingoParser' => $dir . '/src/LingoParser.php',
+ 'LingoTree' => $dir . '/src/LingoTree.php',
+ 'LingoElement' => $dir . '/src/LingoElement.php',
+ 'LingoBackend' => $dir . '/src/LingoBackend.php',
+ 'LingoBasicBackend' => $dir .
'/src/LingoBasicBackend.php',
+ 'LingoMessageLog' => $dir .
'/src/LingoMessageLog.php',
);
$GLOBALS[ 'wgAutoloadClasses' ] = array_merge( $GLOBALS[
'wgAutoloadClasses' ], $autoloadClasses );
@@ -96,7 +96,7 @@
'ext.Lingo.Styles' => array(
'localBasePath' => $dir,
'remoteExtPath' => 'Lingo',
- 'styles' => 'skins/Lingo.css',
+ 'styles' => 'styles/Lingo.css',
),
'ext.Lingo.Scripts' => array(
@@ -110,7 +110,7 @@
'localBasePath' => $dir,
'remoteExtPath' => 'Lingo',
'scripts' =>
'libs/jquery.qtip.js',
- 'styles' =>
'skins/jquery.qtip.css',
+ 'styles' =>
'styles/jquery.qtip.css',
),
);
diff --git a/LingoElement.php b/LingoElement.php
deleted file mode 100644
index 3b48311..0000000
--- a/LingoElement.php
+++ /dev/null
@@ -1,203 +0,0 @@
-<?php
-
-/**
- * File holding the LingoElement class.
- *
- * @author Stephan Gambke
- *
- * @file
- * @ingroup Lingo
- */
-if ( !defined( 'LINGO_VERSION' ) ) {
- die( 'This file is part of the Lingo extension, it is not a valid entry
point.' );
-}
-
-/**
- * This class represents a term-definition pair.
- * One term may be related to several definitions.
- *
- * @ingroup Lingo
- */
-class LingoElement {
- const ELEMENT_TERM = 0;
- const ELEMENT_DEFINITION = 1;
- const ELEMENT_SOURCE = 2;
- const ELEMENT_LINK = 3;
- const ELEMENT_STYLE = 4;
-
- const ELEMENT_FIELDCOUNT = 5; // number of fields stored for each
element; (last field's index) + 1
-
- private $mFullDefinition = null;
- private $mDefinitions = array();
- private $mTerm = null;
- private $mHasBeenDisplayed = false;
-
- static private $mLinkTemplate = null;
-
- public function __construct( &$term, &$definition = null ) {
-
- $this->mTerm = $term;
-
- if ( $definition ) {
- $this->addDefinition( $definition );
- }
- }
-
- public function addDefinition( &$definition ) {
- $this->mDefinitions[] = array_pad( $definition,
self::ELEMENT_FIELDCOUNT, null );
- }
-
- public function getFullDefinition( DOMDocument &$doc ) {
-
- global $wgexLingoDisplayOnce;
-
- wfProfileIn( __METHOD__ );
-
- // return textnode if
- if ( $wgexLingoDisplayOnce && $this->mHasBeenDisplayed ) {
- return $doc->createTextNode($this->mTerm);
- }
-
- // 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] ) ) {
-
- // 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() );
-
- // figure out the classes for the 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
);
- }
-
- // Get a title attribute
- 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() );
- }
-
- $this->mFullDefinition = $link;
-
- } else { // else insert the complete tooltip
-
- // 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 );
-
- $this->mFullDefinition = $span;
- }
-
- $this->mHasBeenDisplayed = true;
- }
-
- wfProfileOut( __METHOD__ );
-
- return $this->mFullDefinition->cloneNode( true );
- }
-
- public function getCurrentKey() {
- return key( $this->mDefinitions );
- }
-
- public function getTerm( $key ) {
- return $this->mDefinitions[$key][self::ELEMENT_TERM];
- }
-
- public function getSource( &$key ) {
- return $this->mDefinitions[$key][self::ELEMENT_SOURCE];
- }
-
- public function getDefinition( &$key ) {
- return $this->mDefinitions[$key][self::ELEMENT_DEFINITION];
- }
-
- public function getLink( &$key ) {
- return $this->mDefinitions[$key][self::ELEMENT_LINK];
- }
-
- public function getStyle( &$key ) {
- return $this->mDefinitions[$key][self::ELEMENT_STYLE];
- }
-
- public function next() {
- next( $this->mDefinitions );
- }
-
- 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/skins/linkicon.png' );
-
- self::$mLinkTemplate = $doc->createElement( 'a' );
- self::$mLinkTemplate->appendChild( $linkimage );
- }
-
- return self::$mLinkTemplate->cloneNode( true );
- }
-
-}
diff --git a/LingoBackend.php b/src/LingoBackend.php
similarity index 100%
rename from LingoBackend.php
rename to src/LingoBackend.php
diff --git a/LingoBasicBackend.php b/src/LingoBasicBackend.php
similarity index 100%
rename from LingoBasicBackend.php
rename to src/LingoBasicBackend.php
diff --git a/src/LingoElement.php b/src/LingoElement.php
new file mode 100644
index 0000000..f45486b
--- /dev/null
+++ b/src/LingoElement.php
@@ -0,0 +1,242 @@
+<?php
+
+/**
+ * File holding the LingoElement class.
+ *
+ * @author Stephan Gambke
+ *
+ * @file
+ * @ingroup Lingo
+ */
+if ( !defined( 'LINGO_VERSION' ) ) {
+ die( 'This file is part of the Lingo extension, it is not a valid entry
point.' );
+}
+
+/**
+ * This class represents a term-definition pair.
+ * One term may be related to several definitions.
+ *
+ * @ingroup Lingo
+ */
+class LingoElement {
+ const ELEMENT_TERM = 0;
+ const ELEMENT_DEFINITION = 1;
+ const ELEMENT_SOURCE = 2;
+ const ELEMENT_LINK = 3;
+ const ELEMENT_STYLE = 4;
+
+ const ELEMENT_FIELDCOUNT = 5; // number of fields stored for each
element; (last field's index) + 1
+
+ private $mFullDefinition = null;
+ private $mDefinitions = array();
+ private $mTerm = null;
+ private $mHasBeenDisplayed = false;
+
+ static private $mLinkTemplate = null;
+
+ public function __construct( &$term, &$definition = null ) {
+
+ $this->mTerm = $term;
+
+ if ( $definition ) {
+ $this->addDefinition( $definition );
+ }
+ }
+
+ public function addDefinition( &$definition ) {
+ $this->mDefinitions[] = array_pad( $definition,
self::ELEMENT_FIELDCOUNT, null );
+ }
+
+ public function getFullDefinition( DOMDocument &$doc ) {
+
+ global $wgexLingoDisplayOnce;
+
+ wfProfileIn( __METHOD__ );
+
+ // return textnode if
+ if ( $wgexLingoDisplayOnce && $this->mHasBeenDisplayed ) {
+ return $doc->createTextNode($this->mTerm);
+ }
+
+ // 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] ) ) {
+
+ $this->mFullDefinition =
$this->getFullDefinitionAsLink( $doc );
+
+ } else { // else insert the complete tooltip
+
+ $this->mFullDefinition =
$this->getFullDefinitionAsTooltip( $doc );
+ }
+
+ $this->mHasBeenDisplayed = true;
+ }
+
+ wfProfileOut( __METHOD__ );
+
+ return $this->mFullDefinition->cloneNode( true );
+ }
+
+ public function getCurrentKey() {
+ return key( $this->mDefinitions );
+ }
+
+ public function getTerm( $key ) {
+ return $this->mDefinitions[$key][self::ELEMENT_TERM];
+ }
+
+ public function getSource( &$key ) {
+ return $this->mDefinitions[$key][self::ELEMENT_SOURCE];
+ }
+
+ public function getDefinition( &$key ) {
+ return $this->mDefinitions[$key][self::ELEMENT_DEFINITION];
+ }
+
+ public function getLink( &$key ) {
+ return $this->mDefinitions[$key][self::ELEMENT_LINK];
+ }
+
+ public function getStyle( &$key ) {
+ return $this->mDefinitions[$key][self::ELEMENT_STYLE];
+ }
+
+ public function next() {
+ next( $this->mDefinitions );
+ }
+
+ 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;
+ }
+
+}
diff --git a/LingoHooks.php b/src/LingoHooks.php
similarity index 100%
rename from LingoHooks.php
rename to src/LingoHooks.php
diff --git a/LingoMessageLog.php b/src/LingoMessageLog.php
similarity index 100%
rename from LingoMessageLog.php
rename to src/LingoMessageLog.php
diff --git a/LingoParser.php b/src/LingoParser.php
similarity index 97%
rename from LingoParser.php
rename to src/LingoParser.php
index 82a7cde..e9f9c45 100644
--- a/LingoParser.php
+++ b/src/LingoParser.php
@@ -326,9 +326,9 @@
$wgOut->addModuleStyles( 'ext.Lingo.Styles' );
}
} else {
- $parserOutput->addHeadItem( "<link rel='stylesheet'
href='$wgScriptPath/extensions/Lingo/skins/Lingo.css' />\n", 'ext.Lingo.Styles'
);
+ $parserOutput->addHeadItem( "<link rel='stylesheet'
href='$wgScriptPath/extensions/Lingo/styles/Lingo.css' />\n",
'ext.Lingo.Styles' );
if ( !$wgOut->isArticle() ) {
- $wgOut->addHeadItem( 'ext.Lingo.Styles', "<link
rel='stylesheet' href='$wgScriptPath/extensions/Lingo/skins/Lingo.css' />\n" );
+ $wgOut->addHeadItem( 'ext.Lingo.Styles', "<link
rel='stylesheet' href='$wgScriptPath/extensions/Lingo/styles/Lingo.css' />\n" );
}
}
}
diff --git a/LingoTree.php b/src/LingoTree.php
similarity index 100%
rename from LingoTree.php
rename to src/LingoTree.php
diff --git a/skins/Lingo.css b/styles/Lingo.css
similarity index 100%
rename from skins/Lingo.css
rename to styles/Lingo.css
diff --git a/skins/jquery.qtip.css b/styles/jquery.qtip.css
similarity index 100%
rename from skins/jquery.qtip.css
rename to styles/jquery.qtip.css
diff --git a/skins/linkicon.png b/styles/linkicon.png
similarity index 100%
rename from skins/linkicon.png
rename to styles/linkicon.png
Binary files differ
--
To view, visit https://gerrit.wikimedia.org/r/176642
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I16cb0b2b8613b2333778633afca94c64cd8d4cfe
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Lingo
Gerrit-Branch: master
Gerrit-Owner: Foxtrott <[email protected]>
Gerrit-Reviewer: Foxtrott <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits