Adrian Heine has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/286421

Change subject: Move parser output post-processing from View to Repo
......................................................................

Move parser output post-processing from View to Repo

Change-Id: Ia2e42846738b22d0d604cd524b2384c8407ac85d
---
M repo/WikibaseRepo.entitytypes.php
M repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php
M repo/includes/ParserOutput/DispatchingEntityViewFactory.php
M repo/includes/ParserOutput/EntityParserOutputGenerator.php
R repo/includes/ParserOutput/EntityViewPlaceholderExpander.php
A repo/includes/ParserOutput/ParserOutputEntityTermsView.php
A repo/includes/ParserOutput/PlaceholderEmittingTermsListView.php
R repo/includes/ParserOutput/TextInjector.php
M repo/tests/phpunit/includes/ParserOutput/DispatchingEntityViewFactoryTest.php
M repo/tests/phpunit/includes/ParserOutput/EntityParserOutputGeneratorTest.php
R repo/tests/phpunit/includes/ParserOutput/EntityViewPlaceholderExpanderTest.php
A repo/tests/phpunit/includes/ParserOutput/ParserOutputEntityTermsViewTest.php
R repo/tests/phpunit/includes/ParserOutput/TextInjectorTest.php
M view/resources/templates.php
M view/src/EntityTermsView.php
M view/src/EntityView.php
A view/src/TableTermsListView.php
M view/src/TermsListView.php
M view/src/ViewFactory.php
M view/tests/phpunit/EntityTermsViewTest.php
M view/tests/phpunit/ItemViewTest.php
M view/tests/phpunit/PropertyViewTest.php
R view/tests/phpunit/TableTermsListViewTest.php
M view/tests/phpunit/ViewFactoryTest.php
24 files changed, 589 insertions(+), 319 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/21/286421/1

diff --git a/repo/WikibaseRepo.entitytypes.php 
b/repo/WikibaseRepo.entitytypes.php
index af53142..1fbe0d2 100644
--- a/repo/WikibaseRepo.entitytypes.php
+++ b/repo/WikibaseRepo.entitytypes.php
@@ -22,6 +22,7 @@
 use Wikibase\LanguageFallbackChain;
 use Wikibase\Repo\WikibaseRepo;
 use Wikibase\View\EditSectionGenerator;
+use Wikibase\View\EntityTermsView;
 
 return array(
        'item' => array(
@@ -29,14 +30,16 @@
                        $languageCode,
                        LabelDescriptionLookup $labelDescriptionLookup,
                        LanguageFallbackChain $fallbackChain,
-                       EditSectionGenerator $editSectionGenerator
+                       EditSectionGenerator $editSectionGenerator,
+                       EntityTermsView $entityTermsView
                ) {
                        $viewFactory = 
WikibaseRepo::getDefaultInstance()->getViewFactory();
                        return $viewFactory->newItemView(
                                $languageCode,
                                $labelDescriptionLookup,
                                $fallbackChain,
-                               $editSectionGenerator
+                               $editSectionGenerator,
+                               $entityTermsView
                        );
                },
                'content-model-id' => CONTENT_MODEL_WIKIBASE_ITEM,
@@ -53,14 +56,16 @@
                        $languageCode,
                        LabelDescriptionLookup $labelDescriptionLookup,
                        LanguageFallbackChain $fallbackChain,
-                       EditSectionGenerator $editSectionGenerator
+                       EditSectionGenerator $editSectionGenerator,
+                       EntityTermsView $entityTermsView
                ) {
                        $viewFactory = 
WikibaseRepo::getDefaultInstance()->getViewFactory();
                        return $viewFactory->newPropertyView(
                                $languageCode,
                                $labelDescriptionLookup,
                                $fallbackChain,
-                               $editSectionGenerator
+                               $editSectionGenerator,
+                               $entityTermsView
                        );
                },
                'content-model-id' => CONTENT_MODEL_WIKIBASE_PROPERTY,
diff --git a/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php 
b/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php
index fc1376a..2ca9873 100644
--- a/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php
+++ b/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php
@@ -16,10 +16,10 @@
 use Wikibase\Repo\BabelUserLanguageLookup;
 use Wikibase\Repo\MediaWikiLanguageDirectionalityLookup;
 use Wikibase\Repo\MediaWikiLocalizedTextProvider;
+use Wikibase\Repo\ParserOutput\EntityViewPlaceholderExpander;
+use Wikibase\Repo\ParserOutput\TextInjector;
 use Wikibase\Repo\WikibaseRepo;
-use Wikibase\View\EntityViewPlaceholderExpander;
 use Wikibase\View\Template\TemplateFactory;
-use Wikibase\View\TextInjector;
 
 /**
  * Handler for the "OutputPageBeforeHTML" hook.
diff --git a/repo/includes/ParserOutput/DispatchingEntityViewFactory.php 
b/repo/includes/ParserOutput/DispatchingEntityViewFactory.php
index 8b654dc..2c40517 100644
--- a/repo/includes/ParserOutput/DispatchingEntityViewFactory.php
+++ b/repo/includes/ParserOutput/DispatchingEntityViewFactory.php
@@ -7,6 +7,7 @@
 use Wikibase\LanguageFallbackChain;
 use Wikibase\View\EditSectionGenerator;
 use Wikibase\View\EntityView;
+use Wikibase\View\EntityTermsView;
 use Wikimedia\Assert\Assert;
 
 /**
@@ -41,6 +42,7 @@
         * @param LabelDescriptionLookup $labelDescriptionLookup
         * @param LanguageFallbackChain $languageFallbackChain
         * @param EditSectionGenerator $editSectionGenerator
+        * @param EntityTermsView $entityTermsView
         *
         * @throws OutOfBoundsException
         * @return EntityView
@@ -50,7 +52,8 @@
                $languageCode,
                LabelDescriptionLookup $labelDescriptionLookup,
                LanguageFallbackChain $languageFallbackChain,
-               EditSectionGenerator $editSectionGenerator
+               EditSectionGenerator $editSectionGenerator,
+               EntityTermsView $entityTermsView
        ) {
                if ( !isset( $this->entityViewFactoryCallbacks[$entityType] ) ) 
{
                        throw new OutOfBoundsException( "No EntityView is 
registered for entity type '$entityType'" );
@@ -61,7 +64,8 @@
                        $languageCode,
                        $labelDescriptionLookup,
                        $languageFallbackChain,
-                       $editSectionGenerator
+                       $editSectionGenerator,
+                       $entityTermsView
                );
 
                Assert::postcondition(
diff --git a/repo/includes/ParserOutput/EntityParserOutputGenerator.php 
b/repo/includes/ParserOutput/EntityParserOutputGenerator.php
index 817eccd..0306ee9 100644
--- a/repo/includes/ParserOutput/EntityParserOutputGenerator.php
+++ b/repo/includes/ParserOutput/EntityParserOutputGenerator.php
@@ -23,8 +23,8 @@
 use Wikibase\Repo\View\RepoSpecialPageLinker;
 use Wikibase\View\EmptyEditSectionGenerator;
 use Wikibase\View\LocalizedTextProvider;
+use Wikibase\View\TableTermsListView;
 use Wikibase\View\Template\TemplateFactory;
-use Wikibase\View\TermsListView;
 use Wikibase\View\ToolbarEditSectionGenerator;
 
 /**
@@ -279,12 +279,21 @@
                        $this->textProvider
                ) : new EmptyEditSectionGenerator();
 
+               $textInjector = new TextInjector();
+               $entityTermsView = new ParserOutputEntityTermsView(
+                       $this->templateFactory,
+                       $editSectionGenerator,
+                       $this->textProvider,
+                       $textInjector
+               );
+
                $entityView = $this->entityViewFactory->newEntityView(
                        $entity->getType(),
                        $this->languageCode,
                        $labelDescriptionLookup,
                        $this->languageFallbackChain,
-                       $editSectionGenerator
+                       $editSectionGenerator,
+                       $entityTermsView
                );
 
                // Set the display title to display the label together with the 
item's id
@@ -293,13 +302,13 @@
 
                $html = $entityView->getHtml( $entity );
                $parserOutput->setText( $html );
-               $parserOutput->setExtensionData( 'wikibase-view-chunks', 
$entityView->getPlaceholders() );
+               $parserOutput->setExtensionData( 'wikibase-view-chunks', 
$textInjector->getMarkers() );
 
                $parserOutput->setExtensionData( 'wikibase-terms-list-items', 
$this->getTermsListItems( $entity ) );
        }
 
        private function getTermsListItems( EntityDocument $entity ) {
-               $termsListView = new TermsListView(
+               $termsListView = new TableTermsListView(
                        TemplateFactory::getDefaultInstance(),
                        new LanguageNameLookup( $this->languageCode ),
                        new MediaWikiLocalizedTextProvider( $this->languageCode 
),
diff --git a/view/src/EntityViewPlaceholderExpander.php 
b/repo/includes/ParserOutput/EntityViewPlaceholderExpander.php
similarity index 94%
rename from view/src/EntityViewPlaceholderExpander.php
rename to repo/includes/ParserOutput/EntityViewPlaceholderExpander.php
index 5f65c5e..a54748c 100644
--- a/view/src/EntityViewPlaceholderExpander.php
+++ b/repo/includes/ParserOutput/EntityViewPlaceholderExpander.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Wikibase\View;
+namespace Wikibase\Repo\ParserOutput;
 
 use InvalidArgumentException;
 use MWException;
@@ -10,18 +10,16 @@
 use Wikibase\DataModel\Term\DescriptionsProvider;
 use Wikibase\DataModel\Term\LabelsProvider;
 use Wikibase\Lib\LanguageNameLookup;
+use Wikibase\View\LanguageDirectionalityLookup;
+use Wikibase\View\LocalizedTextProvider;
+use Wikibase\View\TableTermsListView;
 use Wikibase\View\Template\TemplateFactory;
 
 /**
- * Utility for expanding the placeholders left in the HTML by EntityView.
+ * Utility for expanding placeholders left in the HTML
  *
  * This is used to inject any non-cacheable information into the HTML
  * that was cached as part of the ParserOutput.
- *
- * @note This class encapsulated knowledge about which placeholders are used by
- * EntityView, and with what meaning.
- *
- * @see EntityView
  *
  * @since 0.5
  *
@@ -182,7 +180,7 @@
         */
        public function renderTermBox() {
 
-               $termsListView = new TermsListView(
+               $termsListView = new TableTermsListView(
                        $this->templateFactory,
                        $this->languageNameLookup,
                        $this->textProvider,
diff --git a/repo/includes/ParserOutput/ParserOutputEntityTermsView.php 
b/repo/includes/ParserOutput/ParserOutputEntityTermsView.php
new file mode 100644
index 0000000..055a76b
--- /dev/null
+++ b/repo/includes/ParserOutput/ParserOutputEntityTermsView.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Wikibase\Repo\ParserOutput;
+
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Term\AliasGroupList;
+use Wikibase\DataModel\Term\AliasesProvider;
+use Wikibase\DataModel\Term\DescriptionsProvider;
+use Wikibase\DataModel\Term\LabelsProvider;
+use Wikibase\DataModel\Term\TermList;
+use Wikibase\View\EditSectionGenerator;
+use Wikibase\View\EntityTermsView;
+use Wikibase\View\LocalizedTextProvider;
+use Wikibase\View\Template\TemplateFactory;
+use Wikibase\View\TermsListView;
+
+/**
+ * An EntityTermsView that returns placeholders for some parts of the HTML
+ *
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class ParserOutputEntityTermsView extends EntityTermsView {
+
+       /**
+        * @var TextInjector
+        */
+       private $textInjector;
+
+       /**
+        * @param TemplateFactory $templateFactory
+        * @param EditSectionGenerator $sectionEditLinkGenerator
+        * @param LocalizedTextProvider $textProvider
+        */
+       public function __construct(
+               TemplateFactory $templateFactory,
+               EditSectionGenerator $sectionEditLinkGenerator,
+               LocalizedTextProvider $textProvider,
+               TextInjector $textInjector
+       ) {
+               $termsListView = new PlaceholderEmittingTermsListView( 
$textInjector );
+               parent::__construct( $templateFactory, 
$sectionEditLinkGenerator, $termsListView, $textProvider );
+               $this->textInjector = $textInjector;
+       }
+
+       /**
+        * @param string $mainLanguageCode Desired language of the label, 
description and aliases in the
+        *  title and header section. Not necessarily identical to the 
interface language.
+        * @param LabelsProvider $labelsProvider
+        * @param DescriptionsProvider $descriptionsProvider
+        * @param AliasesProvider|null $aliasesProvider
+        * @param EntityId|null $entityId the id of the entity
+        * @param string $cssClasses
+        *
+        * @return string HTML
+        */
+       public function getHtml(
+               $mainLanguageCode,
+               LabelsProvider $labelsProvider,
+               DescriptionsProvider $descriptionsProvider,
+               AliasesProvider $aliasesProvider = null,
+               EntityId $entityId = null,
+               $cssClasses = ''
+       ) {
+               if ( $cssClasses !== '' ) {
+                       $cssClasses .= ' ';
+               }
+               $cssClasses .= $this->textInjector->newMarker(
+                       
'entityViewPlaceholder-entitytermsview-entitytermsforlanguagelistview-class'
+               );
+
+               return parent::getHtml(
+                       $mainLanguageCode,
+                       $labelsProvider,
+                       $descriptionsProvider,
+                       $aliasesProvider,
+                       $entityId,
+                       $cssClasses
+               );
+       }
+
+}
diff --git a/repo/includes/ParserOutput/PlaceholderEmittingTermsListView.php 
b/repo/includes/ParserOutput/PlaceholderEmittingTermsListView.php
new file mode 100644
index 0000000..3d800f1
--- /dev/null
+++ b/repo/includes/ParserOutput/PlaceholderEmittingTermsListView.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Wikibase\Repo\ParserOutput;
+
+use Wikibase\DataModel\Term\AliasesProvider;
+use Wikibase\DataModel\Term\DescriptionsProvider;
+use Wikibase\DataModel\Term\LabelsProvider;
+use Wikibase\View\TermsListView;
+
+/**
+ * Generates a TextInjector marker instead of a terms list
+ *
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class PlaceholderEmittingTermsListView implements TermsListView {
+
+       /**
+        * @var TextInjector
+        */
+       private $textInjector;
+
+       /**
+        * @param TextInjector $textInjector
+        */
+       public function __construct(
+               TextInjector $textInjector
+       ) {
+               $this->textInjector = $textInjector;
+       }
+
+       /**
+        * @param LabelsProvider $labelsProvider
+        * @param DescriptionsProvider $descriptionsProvider
+        * @param AliasesProvider|null $aliasesProvider
+        * @param string[] $languageCodes The languages the user requested to 
be shown
+        *
+        * @return string HTML
+        */
+       public function getHtml(
+               LabelsProvider $labelsProvider,
+               DescriptionsProvider $descriptionsProvider,
+               AliasesProvider $aliasesProvider = null,
+               array $languageCodes
+       ) {
+               return $this->textInjector->newMarker( 'termbox' );
+       }
+
+}
diff --git a/view/src/TextInjector.php 
b/repo/includes/ParserOutput/TextInjector.php
similarity index 97%
rename from view/src/TextInjector.php
rename to repo/includes/ParserOutput/TextInjector.php
index 800719b..f85ea5e 100644
--- a/view/src/TextInjector.php
+++ b/repo/includes/ParserOutput/TextInjector.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Wikibase\View;
+namespace Wikibase\Repo\ParserOutput;
 
 /**
  * Helper for injecting text by substituting placeholders.
diff --git 
a/repo/tests/phpunit/includes/ParserOutput/DispatchingEntityViewFactoryTest.php 
b/repo/tests/phpunit/includes/ParserOutput/DispatchingEntityViewFactoryTest.php
index 4916e55..44cc801 100644
--- 
a/repo/tests/phpunit/includes/ParserOutput/DispatchingEntityViewFactoryTest.php
+++ 
b/repo/tests/phpunit/includes/ParserOutput/DispatchingEntityViewFactoryTest.php
@@ -10,6 +10,7 @@
 use Wikibase\LanguageFallbackChain;
 use Wikibase\Repo\ParserOutput\DispatchingEntityViewFactory;
 use Wikibase\View\EditSectionGenerator;
+use Wikibase\View\EntityTermsView;
 use Wikibase\View\EntityView;
 
 /**
@@ -36,13 +37,17 @@
                $factory = new DispatchingEntityViewFactory(
                        array()
                );
+               $entityTermsView = $this->getMockBuilder( 
EntityTermsView::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
 
                $factory->newEntityView(
                        'unknown',
                        'en',
                        $this->getMock( LabelDescriptionLookup::class ),
                        new LanguageFallbackChain( array() ),
-                       $this->getMock( EditSectionGenerator::class )
+                       $this->getMock( EditSectionGenerator::class ),
+                       $entityTermsView
                );
        }
 
@@ -57,13 +62,17 @@
                                }
                        )
                );
+               $entityTermsView = $this->getMockBuilder( 
EntityTermsView::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
 
                $factory->newEntityView(
                        'foo',
                        'en',
                        $this->getMock( LabelDescriptionLookup::class ),
                        new LanguageFallbackChain( array() ),
-                       $this->getMock( EditSectionGenerator::class )
+                       $this->getMock( EditSectionGenerator::class ),
+                       $entityTermsView
                );
        }
 
@@ -71,6 +80,9 @@
                $labelDescriptionLookup = $this->getMock( 
LabelDescriptionLookup::class );
                $languageFallbackChain = new LanguageFallbackChain( array() );
                $editSectionGenerator = $this->getMock( 
EditSectionGenerator::class );
+               $entityTermsView = $this->getMockBuilder( 
EntityTermsView::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
                $entityView = $this->getMockBuilder( EntityView::class )
                        ->disableOriginalConstructor()
                        ->getMockForAbstractClass();
@@ -78,18 +90,26 @@
                $factory = new DispatchingEntityViewFactory(
                        array(
                                'foo' => function(
-                                       $languageCodeParam,
-                                       LabelDescriptionLookup 
$labelDescriptionLookupParam,
-                                       LanguageFallbackChain 
$languageFallbackChainParam,
-                                       EditSectionGenerator 
$editSectionGeneratorParam
-                               ) use ( $labelDescriptionLookup, 
$languageFallbackChain, $editSectionGenerator, $entityView ) {
-                                       $this->assertEquals( 'en', 
$languageCodeParam );
-                                       $this->assertSame( 
$labelDescriptionLookup, $labelDescriptionLookupParam );
-                                       $this->assertSame( 
$languageFallbackChain, $languageFallbackChainParam );
-                                       $this->assertSame( 
$editSectionGenerator, $editSectionGeneratorParam );
+                                               $languageCodeParam,
+                                               LabelDescriptionLookup 
$labelDescriptionLookupParam,
+                                               LanguageFallbackChain 
$languageFallbackChainParam,
+                                               EditSectionGenerator 
$editSectionGeneratorParam,
+                                               EntityTermsView 
$entityTermsViewParam
+                                       ) use(
+                                               $labelDescriptionLookup,
+                                               $languageFallbackChain,
+                                               $editSectionGenerator,
+                                               $entityTermsView,
+                                               $entityView
+                                       ) {
+                                               $this->assertEquals( 'en', 
$languageCodeParam );
+                                               $this->assertSame( 
$labelDescriptionLookup, $labelDescriptionLookupParam );
+                                               $this->assertSame( 
$languageFallbackChain, $languageFallbackChainParam );
+                                               $this->assertSame( 
$editSectionGenerator, $editSectionGeneratorParam );
+                                               $this->assertSame( 
$entityTermsView, $entityTermsViewParam );
 
-                                       return $entityView;
-                               }
+                                               return $entityView;
+                                       }
                        )
                );
 
@@ -98,7 +118,8 @@
                        'en',
                        $labelDescriptionLookup,
                        $languageFallbackChain,
-                       $editSectionGenerator
+                       $editSectionGenerator,
+                       $entityTermsView
                );
 
                $this->assertSame( $entityView, $newEntityView );
diff --git 
a/repo/tests/phpunit/includes/ParserOutput/EntityParserOutputGeneratorTest.php 
b/repo/tests/phpunit/includes/ParserOutput/EntityParserOutputGeneratorTest.php
index 4c31202..ece1d71 100644
--- 
a/repo/tests/phpunit/includes/ParserOutput/EntityParserOutputGeneratorTest.php
+++ 
b/repo/tests/phpunit/includes/ParserOutput/EntityParserOutputGeneratorTest.php
@@ -50,11 +50,7 @@
                $this->assertSame( '<TITLE>', $parserOutput->getTitleText(), 
'title text' );
                $this->assertSame( '<HTML>', $parserOutput->getText(), 'html 
text' );
 
-               $this->assertSame(
-                       '<PLACEHOLDERS>',
-                       $parserOutput->getExtensionData( 'wikibase-view-chunks' 
),
-                       'view chunks'
-               );
+               $this->assertSame( [], $parserOutput->getExtensionData( 
'wikibase-view-chunks' ), 'view chunks' );
 
                $this->assertSame( array( '<JS>' ), 
$parserOutput->getJsConfigVars(), 'config vars' );
 
@@ -244,7 +240,6 @@
                        ->setMethods( array(
                                'getTitleHtml',
                                'getHtml',
-                               'getPlaceholders',
                        ) )
                        ->disableOriginalConstructor()
                        ->getMockForAbstractClass();
@@ -256,10 +251,6 @@
                $entityView->expects( $this->any() )
                        ->method( 'getHtml' )
                        ->will( $this->returnValue( '<HTML>' ) );
-
-               $entityView->expects( $this->any() )
-                       ->method( 'getPlaceholders' )
-                       ->will( $this->returnValue( '<PLACEHOLDERS>' ) );
 
                return $entityView;
        }
diff --git a/view/tests/phpunit/EntityViewPlaceholderExpanderTest.php 
b/repo/tests/phpunit/includes/ParserOutput/EntityViewPlaceholderExpanderTest.php
similarity index 94%
rename from view/tests/phpunit/EntityViewPlaceholderExpanderTest.php
rename to 
repo/tests/phpunit/includes/ParserOutput/EntityViewPlaceholderExpanderTest.php
index e0eeb95..32e04cf 100644
--- a/view/tests/phpunit/EntityViewPlaceholderExpanderTest.php
+++ 
b/repo/tests/phpunit/includes/ParserOutput/EntityViewPlaceholderExpanderTest.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Wikibase\View\Tests;
+namespace Wikibase\Repo\Tests\ParserOutput;
 
 use PHPUnit_Framework_TestCase;
 use User;
@@ -8,13 +8,13 @@
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Term\AliasesProvider;
 use Wikibase\Lib\LanguageNameLookup;
-use Wikibase\View\EntityViewPlaceholderExpander;
+use Wikibase\Repo\ParserOutput\EntityViewPlaceholderExpander;
 use Wikibase\View\DummyLocalizedTextProvider;
 use Wikibase\View\LanguageDirectionalityLookup;
 use Wikibase\View\Template\TemplateFactory;
 
 /**
- * @covers Wikibase\View\EntityViewPlaceholderExpander
+ * @covers Wikibase\Repo\ParserOutput\EntityViewPlaceholderExpander
  *
  * @uses Wikibase\View\TermsListView
  * @uses Wikibase\View\Template\Template
@@ -22,7 +22,6 @@
  * @uses Wikibase\View\Template\TemplateRegistry
  *
  * @group Wikibase
- * @group WikibaseView
  *
  * @license GPL-2.0+
  * @author Daniel Kinzler
diff --git 
a/repo/tests/phpunit/includes/ParserOutput/ParserOutputEntityTermsViewTest.php 
b/repo/tests/phpunit/includes/ParserOutput/ParserOutputEntityTermsViewTest.php
new file mode 100644
index 0000000..6429ffe
--- /dev/null
+++ 
b/repo/tests/phpunit/includes/ParserOutput/ParserOutputEntityTermsViewTest.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Wikibase\Repo\Tests\ParserOutput;
+
+use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Entity\Property;
+use Wikibase\Repo\ParserOutput\ParserOutputEntityTermsView;
+use Wikibase\Repo\ParserOutput\TextInjector;
+use Wikibase\View\EditSectionGenerator;
+use Wikibase\View\LocalizedTextProvider;
+use Wikibase\View\Template\TemplateFactory;
+
+/**
+ * @covers Wikibase\Repo\ParserOutput\ParserOutputEntityTermsView
+ *
+ * @license GNU GPL v2+
+ * @author Adrian Heine <[email protected]>
+ */
+class ParserOutputEntityTermsViewTest extends PHPUnit_Framework_TestCase {
+
+       private function newEntityTermsView( TextInjector $textInjector ) {
+               return new ParserOutputEntityTermsView(
+                       TemplateFactory::getDefaultInstance(),
+                       $this->getMock( EditSectionGenerator::class ),
+                       $this->getMock( LocalizedTextProvider::class ),
+                       $textInjector
+               );
+       }
+
+       public function testGetHtml() {
+               $textInjector = new TextInjector();
+               $property = new Property( null, null, 'string' );
+
+               $entityTermsView = $this->newEntityTermsView( $textInjector );
+
+               $result = $entityTermsView->getHtml(
+                       'lkt',
+                       $property,
+                       $property,
+                       $property
+               );
+
+               $this->assertEquals(
+                       array_values( $textInjector->getMarkers() ),
+                       [ [ 
'entityViewPlaceholder-entitytermsview-entitytermsforlanguagelistview-class' ], 
[ 'termbox' ] ]
+               );
+       }
+
+}
diff --git a/view/tests/phpunit/TextInjectorTest.php 
b/repo/tests/phpunit/includes/ParserOutput/TextInjectorTest.php
similarity index 87%
rename from view/tests/phpunit/TextInjectorTest.php
rename to repo/tests/phpunit/includes/ParserOutput/TextInjectorTest.php
index 4d1ac49..06ba794 100644
--- a/view/tests/phpunit/TextInjectorTest.php
+++ b/repo/tests/phpunit/includes/ParserOutput/TextInjectorTest.php
@@ -1,14 +1,14 @@
 <?php
 
-namespace Wikibase\View\Tests;
+namespace Wikibase\Repo\ParserOutput\Tests;
 
-use Wikibase\View\TextInjector;
+use Wikibase\Repo\ParserOutput\TextInjector;
 
 /**
- * @covers Wikibase\View\TextInjector
+ * @covers Wikibase\Repo\ParserOutput\TextInjector
  *
  * @group Wikibase
- * @group WikibaseView
+ * @group WikibaseRepo
  *
  * @license GPL-2.0+
  * @author Daniel Kinzler
diff --git a/view/resources/templates.php b/view/resources/templates.php
index 1cae72c..e971bb4 100644
--- a/view/resources/templates.php
+++ b/view/resources/templates.php
@@ -166,14 +166,19 @@
        $templates['wikibase-entitytermsview'] =
 <<<HTML
 <div class="wikibase-entitytermsview">
-       <div class="wikibase-entitytermsview-heading">
-               <!-- [0,*] wikibase-entitytermsview-heading-part -->$1
-       </div>
+       <!-- wikibase-entitytermsview-heading -->$1
        <!-- ? wikibase-toolbar -->$4
        <div class="wikibase-entitytermsview-entitytermsforlanguagelistview 
$3"><!-- wikibase-entitytermsforlanguagelistview -->$2</div>
 </div>
 HTML;
 
+       $templates['wikibase-entitytermsview-heading'] =
+<<<HTML
+<div class="wikibase-entitytermsview-heading">
+       <!-- [0,*] wikibase-entitytermsview-heading-part -->$1
+</div>
+HTML;
+
        $templates['wikibase-entitytermsview-heading-part'] =
 <<<HTML
                <div class="wikibase-entitytermsview-heading-$1 $2">$3</div>
diff --git a/view/src/EntityTermsView.php b/view/src/EntityTermsView.php
index 63e7251..126081c 100644
--- a/view/src/EntityTermsView.php
+++ b/view/src/EntityTermsView.php
@@ -34,6 +34,11 @@
        private $sectionEditLinkGenerator;
 
        /**
+        * @var TermsListView
+        */
+       private $termsListView;
+
+       /**
         * @var LocalizedTextProvider
         */
        private $textProvider;
@@ -41,15 +46,18 @@
        /**
         * @param TemplateFactory $templateFactory
         * @param EditSectionGenerator $sectionEditLinkGenerator
+        * @param TermsListView $termsListView
         * @param LocalizedTextProvider $textProvider
         */
        public function __construct(
                TemplateFactory $templateFactory,
                EditSectionGenerator $sectionEditLinkGenerator,
+               TermsListView $termsListView,
                LocalizedTextProvider $textProvider
        ) {
                $this->sectionEditLinkGenerator = $sectionEditLinkGenerator;
                $this->templateFactory = $templateFactory;
+               $this->termsListView = $termsListView;
                $this->textProvider = $textProvider;
        }
 
@@ -60,8 +68,7 @@
         * @param DescriptionsProvider $descriptionsProvider
         * @param AliasesProvider|null $aliasesProvider
         * @param EntityId|null $entityId the id of the entity
-        * @param string $termBoxHtml
-        * @param TextInjector $textInjector
+        * @param string $cssClasses
         *
         * @return string HTML
         */
@@ -71,8 +78,25 @@
                DescriptionsProvider $descriptionsProvider,
                AliasesProvider $aliasesProvider = null,
                EntityId $entityId = null,
-               $termBoxHtml,
-               TextInjector $textInjector
+               $cssClasses = ''
+       ) {
+               return $this->templateFactory->render( 
'wikibase-entitytermsview',
+                       $this->getHeadingHtml( $mainLanguageCode, 
$descriptionsProvider, $aliasesProvider ),
+                       $this->termsListView->getHtml(
+                               $labelsProvider,
+                               $descriptionsProvider,
+                               $aliasesProvider,
+                               [ $mainLanguageCode ]
+                       ),
+                       $cssClasses,
+                       $this->getHtmlForLabelDescriptionAliasesEditSection( 
$mainLanguageCode, $entityId )
+               );
+       }
+
+       public function getHeadingHtml(
+               $languageCode,
+               DescriptionsProvider $descriptionsProvider,
+               AliasesProvider $aliasesProvider = null
        ) {
                $headingPartsHtml = '';
 
@@ -80,8 +104,8 @@
                $headingPartsHtml .= $this->templateFactory->render(
                        'wikibase-entitytermsview-heading-part',
                        'description',
-                       $descriptions->hasTermForLanguage( $mainLanguageCode ) 
? '' : 'wb-empty',
-                       $this->getDescriptionHtml( $mainLanguageCode, 
$descriptions )
+                       $descriptions->hasTermForLanguage( $languageCode ) ? '' 
: 'wb-empty',
+                       $this->getDescriptionHtml( $languageCode, $descriptions 
)
                );
 
                if ( $aliasesProvider !== null ) {
@@ -89,20 +113,13 @@
                        $headingPartsHtml .= $this->templateFactory->render(
                                'wikibase-entitytermsview-heading-part',
                                'aliases',
-                               $aliasGroups->hasGroupForLanguage( 
$mainLanguageCode ) ? '' : 'wb-empty',
-                               $this->getHtmlForAliases( $mainLanguageCode, 
$aliasGroups )
+                               $aliasGroups->hasGroupForLanguage( 
$languageCode ) ? '' : 'wb-empty',
+                               $this->getHtmlForAliases( $languageCode, 
$aliasGroups )
                        );
                }
 
-               $marker = $textInjector->newMarker(
-                       
'entityViewPlaceholder-entitytermsview-entitytermsforlanguagelistview-class'
-               );
-
-               return $this->templateFactory->render( 
'wikibase-entitytermsview',
-                       $headingPartsHtml,
-                       $termBoxHtml,
-                       $marker,
-                       $this->getHtmlForLabelDescriptionAliasesEditSection( 
$mainLanguageCode, $entityId )
+               return $this->templateFactory->render( 
'wikibase-entitytermsview-heading',
+                       $headingPartsHtml
                );
        }
 
diff --git a/view/src/EntityView.php b/view/src/EntityView.php
index 812cdc5..f93f86f 100644
--- a/view/src/EntityView.php
+++ b/view/src/EntityView.php
@@ -44,11 +44,6 @@
        protected $languageCode;
 
        /**
-        * @var TextInjector
-        */
-       private $textInjector;
-
-       /**
         * @param TemplateFactory $templateFactory
         * @param EntityTermsView $entityTermsView
         * @param LanguageDirectionalityLookup $languageDirectionalityLookup
@@ -64,27 +59,11 @@
                $this->languageDirectionalityLookup = 
$languageDirectionalityLookup;
                $this->languageCode = $languageCode;
 
-               $this->textInjector = new TextInjector();
                $this->templateFactory = $templateFactory;
        }
 
        /**
-        * Returns the placeholder map build while generating HTML.
-        * The map returned here may be used with TextInjector.
-        *
-        * @return array[] string -> array
-        */
-       public function getPlaceholders() {
-               return $this->textInjector->getMarkers();
-       }
-
-       /**
         * Builds and returns the HTML representing a whole WikibaseEntity.
-        *
-        * @note: The HTML returned by this method may contain placeholders. 
Such placeholders can be
-        * expanded with the help of TextInjector::inject() calling back to
-        * EntityViewPlaceholderExpander::getHtmlForPlaceholder()
-        * @note: In order to keep the list of placeholders small, this calls 
resetPlaceholders().
         *
         * @since 0.1
         *
@@ -163,22 +142,11 @@
                                $entity,
                                $entity,
                                $entity instanceof AliasesProvider ? $entity : 
null,
-                               $id,
-                               $this->getHtmlForTermBox(),
-                               $this->textInjector
+                               $id
                        );
                }
 
                return '';
-       }
-
-       /**
-        * @return string HTML
-        */
-       private function getHtmlForTermBox() {
-               // Placeholder for a termbox for the present item.
-               // EntityViewPlaceholderExpander must know about the parameters 
used here.
-               return $this->textInjector->newMarker( 'termbox' );
        }
 
 }
diff --git a/view/src/TableTermsListView.php b/view/src/TableTermsListView.php
new file mode 100644
index 0000000..c4a2ed4
--- /dev/null
+++ b/view/src/TableTermsListView.php
@@ -0,0 +1,201 @@
+<?php
+
+namespace Wikibase\View;
+
+use Wikibase\DataModel\Term\AliasGroupList;
+use Wikibase\DataModel\Term\AliasesProvider;
+use Wikibase\DataModel\Term\DescriptionsProvider;
+use Wikibase\DataModel\Term\LabelsProvider;
+use Wikibase\DataModel\Term\TermList;
+use Wikibase\Lib\LanguageNameLookup;
+use Wikibase\View\Template\TemplateFactory;
+
+/**
+ * Generates HTML to display terms of an entity in a list.
+ *
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Thiemo Mättig
+ * @author Bene* < [email protected] >
+ * @author H. Snater < [email protected] >
+ * @author Adrian Heine <[email protected]>
+ */
+class TableTermsListView implements TermsListView {
+
+       /**
+        * @var TemplateFactory
+        */
+       private $templateFactory;
+
+       /**
+        * @var LanguageDirectionalityLookup
+        */
+       private $languageDirectionalityLookup;
+
+       /**
+        * @var LanguageNameLookup
+        */
+       private $languageNameLookup;
+
+       /**
+        * @var LocalizedTextProvider
+        */
+       private $textProvider;
+
+       /**
+        * @param TemplateFactory $templateFactory
+        * @param LanguageNameLookup $languageNameLookup
+        * @param LocalizedTextProvider $textProvider
+        * @param LanguageDirectionalityLookup $languageDirectionalityLookup
+        */
+       public function __construct(
+               TemplateFactory $templateFactory,
+               LanguageNameLookup $languageNameLookup,
+               LocalizedTextProvider $textProvider,
+               LanguageDirectionalityLookup $languageDirectionalityLookup
+       ) {
+               $this->templateFactory = $templateFactory;
+               $this->languageNameLookup = $languageNameLookup;
+               $this->textProvider = $textProvider;
+               $this->languageDirectionalityLookup = 
$languageDirectionalityLookup;
+       }
+
+       /**
+        * @param LabelsProvider $labelsProvider
+        * @param DescriptionsProvider $descriptionsProvider
+        * @param AliasesProvider|null $aliasesProvider
+        * @param string[] $languageCodes The languages the user requested to 
be shown
+        *
+        * @return string HTML
+        */
+       public function getHtml(
+               LabelsProvider $labelsProvider,
+               DescriptionsProvider $descriptionsProvider,
+               AliasesProvider $aliasesProvider = null,
+               array $languageCodes
+       ) {
+               $entityTermsForLanguageViewsHtml = '';
+
+               foreach ( $languageCodes as $languageCode ) {
+                       $entityTermsForLanguageViewsHtml .= 
$this->getListItemHtml(
+                               $labelsProvider,
+                               $descriptionsProvider,
+                               $aliasesProvider,
+                               $languageCode
+                       );
+               }
+
+               return $this->getListViewHtml( $entityTermsForLanguageViewsHtml 
);
+       }
+
+       /**
+        * @param string $contentHtml
+        *
+        * @return string HTML
+        */
+       public function getListViewHtml( $contentHtml ) {
+               return $this->templateFactory->render( 
'wikibase-entitytermsforlanguagelistview',
+                       htmlspecialchars( $this->textProvider->get( 
'wikibase-entitytermsforlanguagelistview-language' ) ),
+                       htmlspecialchars( $this->textProvider->get( 
'wikibase-entitytermsforlanguagelistview-label' ) ),
+                       htmlspecialchars( $this->textProvider->get( 
'wikibase-entitytermsforlanguagelistview-description' ) ),
+                       htmlspecialchars( $this->textProvider->get( 
'wikibase-entitytermsforlanguagelistview-aliases' ) ),
+                       $contentHtml
+               );
+
+       }
+
+       /**
+        * @param LabelsProvider $labelsProvider
+        * @param DescriptionsProvider $descriptionsProvider
+        * @param AliasesProvider|null $aliasesProvider
+        * @param string $languageCode
+        *
+        * @return string HTML
+        */
+       public function getListItemHtml(
+               LabelsProvider $labelsProvider,
+               DescriptionsProvider $descriptionsProvider,
+               AliasesProvider $aliasesProvider = null,
+               $languageCode
+       ) {
+               $languageName = $this->languageNameLookup->getName( 
$languageCode );
+               $labels = $labelsProvider->getLabels();
+               $descriptions = $descriptionsProvider->getDescriptions();
+               $hasLabel = $labels->hasTermForLanguage( $languageCode );
+               $hasDescription = $descriptions->hasTermForLanguage( 
$languageCode );
+
+               return $this->templateFactory->render( 
'wikibase-entitytermsforlanguageview',
+                       'tr',
+                       'td',
+                       $languageCode,
+                       htmlspecialchars( $languageName ),
+                       $this->getTermView(
+                               $labels,
+                               'wikibase-labelview', // Template
+                               'wikibase-label-empty', // Text key
+                               $languageCode
+                       ),
+                       $this->getTermView(
+                               $descriptions,
+                               'wikibase-descriptionview', // Template
+                               'wikibase-description-empty', // Text key
+                               $languageCode
+                       ),
+                       $aliasesProvider ? $this->getAliasesView( 
$aliasesProvider->getAliasGroups(), $languageCode ) : '',
+                       '',
+                       'th'
+               );
+       }
+
+       private function getTermView( TermList $termList, $templateName, 
$emptyTextKey, $languageCode ) {
+               $hasTerm = $termList->hasTermForLanguage( $languageCode );
+               $effectiveLanguage = $hasTerm ? $languageCode : 
$this->textProvider->getLanguageOf( $emptyTextKey );
+               return $this->templateFactory->render( $templateName,
+                       $hasTerm ? '' : 'wb-empty',
+                       htmlspecialchars( $hasTerm
+                               ? $termList->getByLanguage( $languageCode 
)->getText()
+                               : $this->textProvider->get( $emptyTextKey )
+                       ),
+                       '',
+                       $this->languageDirectionalityLookup->getDirectionality( 
$effectiveLanguage ) ?: 'auto',
+                       $effectiveLanguage
+               );
+       }
+
+       /**
+        * @param AliasGroupList $aliasGroups
+        * @param string $languageCode
+        *
+        * @return string HTML
+        */
+       private function getAliasesView( AliasGroupList $aliasGroups, 
$languageCode ) {
+               if ( !$aliasGroups->hasGroupForLanguage( $languageCode ) ) {
+                       return $this->templateFactory->render( 
'wikibase-aliasesview',
+                               'wb-empty',
+                               '',
+                               '',
+                               '', // No text, no language
+                               ''
+                       );
+               } else {
+                       $aliasesHtml = '';
+                       $aliases = $aliasGroups->getByLanguage( $languageCode 
)->getAliases();
+                       foreach ( $aliases as $alias ) {
+                               $aliasesHtml .= $this->templateFactory->render(
+                                       'wikibase-aliasesview-list-item',
+                                       htmlspecialchars( $alias )
+                               );
+                       }
+
+                       return $this->templateFactory->render( 
'wikibase-aliasesview',
+                               '',
+                               $aliasesHtml,
+                               '',
+                               
$this->languageDirectionalityLookup->getDirectionality( $languageCode ) ?: 
'auto',
+                               $languageCode
+                       );
+               }
+       }
+
+}
diff --git a/view/src/TermsListView.php b/view/src/TermsListView.php
index aa36ca1..d42a8e8 100644
--- a/view/src/TermsListView.php
+++ b/view/src/TermsListView.php
@@ -2,13 +2,9 @@
 
 namespace Wikibase\View;
 
-use Wikibase\DataModel\Term\AliasGroupList;
 use Wikibase\DataModel\Term\AliasesProvider;
 use Wikibase\DataModel\Term\DescriptionsProvider;
 use Wikibase\DataModel\Term\LabelsProvider;
-use Wikibase\DataModel\Term\TermList;
-use Wikibase\Lib\LanguageNameLookup;
-use Wikibase\View\Template\TemplateFactory;
 
 /**
  * Generates HTML to display terms of an entity in a list.
@@ -16,56 +12,15 @@
  * @since 0.5
  *
  * @license GPL-2.0+
- * @author Thiemo Mättig
- * @author Bene* < [email protected] >
- * @author H. Snater < [email protected] >
  * @author Adrian Heine <[email protected]>
  */
-class TermsListView {
-
-       /**
-        * @var TemplateFactory
-        */
-       private $templateFactory;
-
-       /**
-        * @var LanguageDirectionalityLookup
-        */
-       private $languageDirectionalityLookup;
-
-       /**
-        * @var LanguageNameLookup
-        */
-       private $languageNameLookup;
-
-       /**
-        * @var LocalizedTextProvider
-        */
-       private $textProvider;
-
-       /**
-        * @param TemplateFactory $templateFactory
-        * @param LanguageNameLookup $languageNameLookup
-        * @param LocalizedTextProvider $textProvider
-        * @param LanguageDirectionalityLookup $languageDirectionalityLookup
-        */
-       public function __construct(
-               TemplateFactory $templateFactory,
-               LanguageNameLookup $languageNameLookup,
-               LocalizedTextProvider $textProvider,
-               LanguageDirectionalityLookup $languageDirectionalityLookup
-       ) {
-               $this->templateFactory = $templateFactory;
-               $this->languageNameLookup = $languageNameLookup;
-               $this->textProvider = $textProvider;
-               $this->languageDirectionalityLookup = 
$languageDirectionalityLookup;
-       }
+interface TermsListView {
 
        /**
         * @param LabelsProvider $labelsProvider
         * @param DescriptionsProvider $descriptionsProvider
         * @param AliasesProvider|null $aliasesProvider
-        * @param string[] $languageCodes The languages the user requested to 
be shown
+        * @param string[] $languageCodes The languages in which terms should 
be shown
         *
         * @return string HTML
         */
@@ -74,128 +29,6 @@
                DescriptionsProvider $descriptionsProvider,
                AliasesProvider $aliasesProvider = null,
                array $languageCodes
-       ) {
-               $entityTermsForLanguageViewsHtml = '';
-
-               foreach ( $languageCodes as $languageCode ) {
-                       $entityTermsForLanguageViewsHtml .= 
$this->getListItemHtml(
-                               $labelsProvider,
-                               $descriptionsProvider,
-                               $aliasesProvider,
-                               $languageCode
-                       );
-               }
-
-               return $this->getListViewHtml( $entityTermsForLanguageViewsHtml 
);
-       }
-
-       /**
-        * @param string $contentHtml
-        *
-        * @return string HTML
-        */
-       public function getListViewHtml( $contentHtml ) {
-               return $this->templateFactory->render( 
'wikibase-entitytermsforlanguagelistview',
-                       htmlspecialchars( $this->textProvider->get( 
'wikibase-entitytermsforlanguagelistview-language' ) ),
-                       htmlspecialchars( $this->textProvider->get( 
'wikibase-entitytermsforlanguagelistview-label' ) ),
-                       htmlspecialchars( $this->textProvider->get( 
'wikibase-entitytermsforlanguagelistview-description' ) ),
-                       htmlspecialchars( $this->textProvider->get( 
'wikibase-entitytermsforlanguagelistview-aliases' ) ),
-                       $contentHtml
-               );
-
-       }
-
-       /**
-        * @param LabelsProvider $labelsProvider
-        * @param DescriptionsProvider $descriptionsProvider
-        * @param AliasesProvider|null $aliasesProvider
-        * @param string $languageCode
-        *
-        * @return string HTML
-        */
-       public function getListItemHtml(
-               LabelsProvider $labelsProvider,
-               DescriptionsProvider $descriptionsProvider,
-               AliasesProvider $aliasesProvider = null,
-               $languageCode
-       ) {
-               $languageName = $this->languageNameLookup->getName( 
$languageCode );
-               $labels = $labelsProvider->getLabels();
-               $descriptions = $descriptionsProvider->getDescriptions();
-               $hasLabel = $labels->hasTermForLanguage( $languageCode );
-               $hasDescription = $descriptions->hasTermForLanguage( 
$languageCode );
-
-               return $this->templateFactory->render( 
'wikibase-entitytermsforlanguageview',
-                       'tr',
-                       'td',
-                       $languageCode,
-                       htmlspecialchars( $languageName ),
-                       $this->getTermView(
-                               $labels,
-                               'wikibase-labelview', // Template
-                               'wikibase-label-empty', // Text key
-                               $languageCode
-                       ),
-                       $this->getTermView(
-                               $descriptions,
-                               'wikibase-descriptionview', // Template
-                               'wikibase-description-empty', // Text key
-                               $languageCode
-                       ),
-                       $aliasesProvider ? $this->getAliasesView( 
$aliasesProvider->getAliasGroups(), $languageCode ) : '',
-                       '',
-                       'th'
-               );
-       }
-
-       private function getTermView( TermList $termList, $templateName, 
$emptyTextKey, $languageCode ) {
-               $hasTerm = $termList->hasTermForLanguage( $languageCode );
-               $effectiveLanguage = $hasTerm ? $languageCode : 
$this->textProvider->getLanguageOf( $emptyTextKey );
-               return $this->templateFactory->render( $templateName,
-                       $hasTerm ? '' : 'wb-empty',
-                       htmlspecialchars( $hasTerm
-                               ? $termList->getByLanguage( $languageCode 
)->getText()
-                               : $this->textProvider->get( $emptyTextKey )
-                       ),
-                       '',
-                       $this->languageDirectionalityLookup->getDirectionality( 
$effectiveLanguage ) ?: 'auto',
-                       $effectiveLanguage
-               );
-       }
-
-       /**
-        * @param AliasGroupList $aliasGroups
-        * @param string $languageCode
-        *
-        * @return string HTML
-        */
-       private function getAliasesView( AliasGroupList $aliasGroups, 
$languageCode ) {
-               if ( !$aliasGroups->hasGroupForLanguage( $languageCode ) ) {
-                       return $this->templateFactory->render( 
'wikibase-aliasesview',
-                               'wb-empty',
-                               '',
-                               '',
-                               '', // No text, no language
-                               ''
-                       );
-               } else {
-                       $aliasesHtml = '';
-                       $aliases = $aliasGroups->getByLanguage( $languageCode 
)->getAliases();
-                       foreach ( $aliases as $alias ) {
-                               $aliasesHtml .= $this->templateFactory->render(
-                                       'wikibase-aliasesview-list-item',
-                                       htmlspecialchars( $alias )
-                               );
-                       }
-
-                       return $this->templateFactory->render( 
'wikibase-aliasesview',
-                               '',
-                               $aliasesHtml,
-                               '',
-                               
$this->languageDirectionalityLookup->getDirectionality( $languageCode ) ?: 
'auto',
-                               $languageCode
-                       );
-               }
-       }
+       );
 
 }
diff --git a/view/src/ViewFactory.php b/view/src/ViewFactory.php
index e6940e1..cc11874 100644
--- a/view/src/ViewFactory.php
+++ b/view/src/ViewFactory.php
@@ -179,6 +179,7 @@
         * @param LabelDescriptionLookup $labelDescriptionLookup
         * @param LanguageFallbackChain $fallbackChain
         * @param EditSectionGenerator $editSectionGenerator
+        * @param EntityTermsView $entityTermsView
         *
         * @return ItemView
         */
@@ -186,10 +187,9 @@
                $languageCode,
                LabelDescriptionLookup $labelDescriptionLookup,
                LanguageFallbackChain $fallbackChain,
-               EditSectionGenerator $editSectionGenerator
+               EditSectionGenerator $editSectionGenerator,
+               EntityTermsView $entityTermsView
        ) {
-               $entityTermsView = $this->newEntityTermsView( 
$editSectionGenerator );
-
                $statementSectionsView = $this->newStatementSectionsView(
                        $languageCode,
                        $labelDescriptionLookup,
@@ -228,6 +228,7 @@
         * @param LabelDescriptionLookup $labelDescriptionLookup
         * @param LanguageFallbackChain $fallbackChain
         * @param EditSectionGenerator $editSectionGenerator
+        * @param EntityTermsView $entityTermsView
         *
         * @return PropertyView
         */
@@ -235,10 +236,9 @@
                $languageCode,
                LabelDescriptionLookup $labelDescriptionLookup,
                LanguageFallbackChain $fallbackChain,
-               EditSectionGenerator $editSectionGenerator
+               EditSectionGenerator $editSectionGenerator,
+               EntityTermsView $entityTermsView
        ) {
-               $entityTermsView = $this->newEntityTermsView( 
$editSectionGenerator );
-
                $statementSectionsView = $this->newStatementSectionsView(
                        $languageCode,
                        $labelDescriptionLookup,
@@ -315,6 +315,12 @@
                return new EntityTermsView(
                        $this->templateFactory,
                        $editSectionGenerator,
+                       new TableTermsListView(
+                               $this->templateFactory,
+                               $this->languageNameLookup,
+                               $this->textProvider,
+                               $this->languageDirectionalityLookup
+                       ),
                        $this->textProvider
                );
        }
diff --git a/view/tests/phpunit/EntityTermsViewTest.php 
b/view/tests/phpunit/EntityTermsViewTest.php
index 1a6c98b..f1790c6 100644
--- a/view/tests/phpunit/EntityTermsViewTest.php
+++ b/view/tests/phpunit/EntityTermsViewTest.php
@@ -6,12 +6,14 @@
 use Wikibase\DataModel\Entity\Item;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Term\Fingerprint;
+use Wikibase\Lib\LanguageNameLookup;
 use Wikibase\View\EditSectionGenerator;
 use Wikibase\View\EntityTermsView;
 use Wikibase\View\DummyLocalizedTextProvider;
+use Wikibase\View\LanguageDirectionalityLookup;
 use Wikibase\View\LocalizedTextProvider;
 use Wikibase\View\Template\TemplateFactory;
-use Wikibase\View\TextInjector;
+use Wikibase\View\TableTermsListView;
 
 /**
  * @covers Wikibase\View\EntityTermsView
@@ -19,7 +21,7 @@
  * @uses Wikibase\View\Template\Template
  * @uses Wikibase\View\Template\TemplateFactory
  * @uses Wikibase\View\Template\TemplateRegistry
- * @uses Wikibase\View\TextInjector
+ * @uses Wikibase\View\TableTermsListView
  *
  * @group Wikibase
  * @group WikibaseView
@@ -32,7 +34,7 @@
 
        private function getEntityTermsView(
                $editSectionCalls = 0,
-               $languageNameCalls = 0,
+               $languageNameCalls = 1,
                LocalizedTextProvider $textProvider = null
        ) {
                $editSectionGenerator = $this->getMock( 
EditSectionGenerator::class );
@@ -40,11 +42,35 @@
                        ->method( 'getLabelDescriptionAliasesEditSection' )
                        ->will( $this->returnValue( '<EDITSECTION>' ) );
 
+               $languageNameLookup = $this->getMock( LanguageNameLookup::class 
);
+               $languageNameLookup->expects( $this->exactly( 
$languageNameCalls ) )
+                       ->method( 'getName' )
+                       ->will( $this->returnCallback( function( $languageCode 
) {
+                               return "<LANGUAGENAME-$languageCode>";
+                       } ) );
+
+               $languageDirectionalityLookup = $this->getMock( 
LanguageDirectionalityLookup::class );
+               $languageDirectionalityLookup->expects( $this->any() )
+                       ->method( 'getDirectionality' )
+                       ->will( $this->returnCallback( function( $languageCode 
) {
+                               return [
+                                       'en' => 'ltr',
+                                       'arc' => 'rtl',
+                                       'lkt' => 'ltr'
+                               ][ $languageCode ];
+                       } ) );
+
                $textProvider = $textProvider ?: new 
DummyLocalizedTextProvider( 'lkt' );
 
                return new EntityTermsView(
                        TemplateFactory::getDefaultInstance(),
                        $editSectionGenerator,
+                       new TableTermsListView(
+                               TemplateFactory::getDefaultInstance(),
+                               $languageNameLookup,
+                               $textProvider,
+                               $languageDirectionalityLookup
+                       ),
                        $textProvider
                );
        }
@@ -60,7 +86,7 @@
        public function testGetHtml_containsDescriptionAndAliases() {
                $entityTermsView = $this->getEntityTermsView( 1 );
                $fingerprint = $this->getFingerprint();
-               $html = $entityTermsView->getHtml( 'en', $fingerprint, 
$fingerprint, $fingerprint, null, '', new TextInjector() );
+               $html = $entityTermsView->getHtml( 'en', $fingerprint, 
$fingerprint, $fingerprint, null, '' );
 
                $this->assertContains( '&lt;DESCRIPTION&gt;', $html );
                $this->assertContains( '&lt;ALIAS1&gt;', $html );
@@ -81,8 +107,8 @@
         * @dataProvider entityFingerprintProvider
         */
        public function testGetHtml_isEditable( Fingerprint $fingerprint, 
ItemId $entityId, $languageCode ) {
-               $entityTermsView = $this->getEntityTermsView( 1, 0 );
-               $html = $entityTermsView->getHtml( $languageCode, $fingerprint, 
$fingerprint, $fingerprint, $entityId, '', new TextInjector() );
+               $entityTermsView = $this->getEntityTermsView( 1 );
+               $html = $entityTermsView->getHtml( $languageCode, $fingerprint, 
$fingerprint, $fingerprint, $entityId, '' );
 
                $this->assertContains( '<EDITSECTION>', $html );
        }
@@ -93,7 +119,7 @@
                $fingerprint->setAliasGroup( 'en', array( '<a href="#">evil 
html</a>', '<b>bold</b>', '<i>italic</i>' ) );
 
                $view = $this->getEntityTermsView( 1 );
-               $html = $view->getHtml( 'en', $fingerprint, $fingerprint, 
$fingerprint, null, '', new TextInjector() );
+               $html = $view->getHtml( 'en', $fingerprint, $fingerprint, 
$fingerprint, null, '' );
 
                $this->assertContains( 'evil html', $html, 'make sure it works' 
);
                $this->assertNotContains( 'href="#"', $html );
@@ -106,7 +132,7 @@
        public function testGetHtml_isMarkedAsEmptyValue() {
                $entityTermsView = $this->getEntityTermsView( 1 );
                $fingerprint = new Fingerprint();
-               $html = $entityTermsView->getHtml( 'en', $fingerprint, 
$fingerprint, $fingerprint, null, '', new TextInjector() );
+               $html = $entityTermsView->getHtml( 'en', $fingerprint, 
$fingerprint, $fingerprint, null, '' );
 
                $this->assertContains( 'wb-empty', $html );
                $this->assertContains( '(wikibase-description-empty)', $html );
@@ -116,7 +142,7 @@
        public function testGetHtml_isNotMarkedAsEmpty() {
                $entityTermsView = $this->getEntityTermsView( 1 );
                $fingerprint = $this->getFingerprint();
-               $html = $entityTermsView->getHtml( 'en', $fingerprint, 
$fingerprint, $fingerprint, null, '', new TextInjector() );
+               $html = $entityTermsView->getHtml( 'en', $fingerprint, 
$fingerprint, $fingerprint, null, '' );
 
                $this->assertNotContains( 'wb-empty', $html );
                $this->assertNotContains( '(wikibase-description-empty)', $html 
);
@@ -128,7 +154,7 @@
                $fingerprint->removeDescription( 'en' );
 
                $view = $this->getEntityTermsView( 1 );
-               $html = $view->getHtml( 'en', $fingerprint, $fingerprint, 
$fingerprint, null, '', new TextInjector() );
+               $html = $view->getHtml( 'en', $fingerprint, $fingerprint, 
$fingerprint, null, '' );
 
                $this->assertContains( 'wb-empty', $html );
                $this->assertContains( '(wikibase-description-empty)', $html );
@@ -140,7 +166,7 @@
                $fingerprint->removeAliasGroup( 'en' );
 
                $view = $this->getEntityTermsView( 1 );
-               $html = $view->getHtml( 'en', $fingerprint, $fingerprint, 
$fingerprint, null, '', new TextInjector() );
+               $html = $view->getHtml( 'en', $fingerprint, $fingerprint, 
$fingerprint, null, '' );
 
                $this->assertContains( 'wb-empty', $html );
                $this->assertNotContains( '(wikibase-description-empty)', $html 
);
@@ -148,7 +174,7 @@
        }
 
        public function testGetTitleHtml_containsLabel() {
-               $entityTermsView = $this->getEntityTermsView();
+               $entityTermsView = $this->getEntityTermsView( 0, 0 );
                $fingerprint = $this->getFingerprint();
                $html = $entityTermsView->getTitleHtml( 'en', $fingerprint, 
null );
 
@@ -159,7 +185,7 @@
         * @dataProvider entityFingerprintProvider
         */
        public function testGetTitleHtml_withEntityId( Fingerprint 
$fingerprint, ItemId $entityId ) {
-               $entityTermsView = $this->getEntityTermsView();
+               $entityTermsView = $this->getEntityTermsView( 0, 0 );
                $html = $entityTermsView->getTitleHtml( 'en', $fingerprint, 
$entityId );
                $idString = $entityId->getSerialization();
 
@@ -167,14 +193,14 @@
        }
 
        public function testGetTitleHtml_withoutEntityId() {
-               $entityTermsView = $this->getEntityTermsView();
+               $entityTermsView = $this->getEntityTermsView( 0, 0 );
                $html = $entityTermsView->getTitleHtml( 'en', new 
Fingerprint(), null );
 
                $this->assertNotContains( '(parentheses', $html );
        }
 
        public function testGetTitleHtml_labelIsEscaped() {
-               $entityTermsView = $this->getEntityTermsView();
+               $entityTermsView = $this->getEntityTermsView( 0, 0 );
                $fingerprint = new Fingerprint();
                $fingerprint->setLabel( 'en', '<a href="#">evil html</a>' );
                $html = $entityTermsView->getTitleHtml( 'en', $fingerprint, 
null );
@@ -188,7 +214,7 @@
                $fingerprint = $this->getFingerprint();
                $fingerprint->removeLabel( 'en' );
 
-               $entityTermsView = $this->getEntityTermsView();
+               $entityTermsView = $this->getEntityTermsView( 0, 0 );
                $html = $entityTermsView->getTitleHtml( 'en', $fingerprint, 
null );
 
                $this->assertContains( 'wb-empty', $html );
@@ -198,7 +224,7 @@
        public function testGetTitleHtml_isNotMarkedAsEmpty() {
                $fingerprint = $this->getFingerprint();
 
-               $entityTermsView = $this->getEntityTermsView();
+               $entityTermsView = $this->getEntityTermsView( 0, 0 );
                $html = $entityTermsView->getTitleHtml( 'en', $fingerprint, 
null );
 
                $this->assertNotContains( 'wb-empty', $html );
diff --git a/view/tests/phpunit/ItemViewTest.php 
b/view/tests/phpunit/ItemViewTest.php
index 54bff61..60b124d 100644
--- a/view/tests/phpunit/ItemViewTest.php
+++ b/view/tests/phpunit/ItemViewTest.php
@@ -22,7 +22,6 @@
  * @uses Wikibase\View\Template\Template
  * @uses Wikibase\View\Template\TemplateFactory
  * @uses Wikibase\View\Template\TemplateRegistry
- * @uses Wikibase\View\TextInjector
  *
  * @group Wikibase
  * @group WikibaseView
diff --git a/view/tests/phpunit/PropertyViewTest.php 
b/view/tests/phpunit/PropertyViewTest.php
index 537253f..bc512c9 100644
--- a/view/tests/phpunit/PropertyViewTest.php
+++ b/view/tests/phpunit/PropertyViewTest.php
@@ -23,7 +23,6 @@
  * @uses Wikibase\View\Template\Template
  * @uses Wikibase\View\Template\TemplateFactory
  * @uses Wikibase\View\Template\TemplateRegistry
- * @uses Wikibase\View\TextInjector
  *
  * @group Wikibase
  * @group WikibaseView
diff --git a/view/tests/phpunit/TermsListViewTest.php 
b/view/tests/phpunit/TableTermsListViewTest.php
similarity index 90%
rename from view/tests/phpunit/TermsListViewTest.php
rename to view/tests/phpunit/TableTermsListViewTest.php
index 6ac8e48..1e3a079 100644
--- a/view/tests/phpunit/TermsListViewTest.php
+++ b/view/tests/phpunit/TableTermsListViewTest.php
@@ -9,13 +9,13 @@
 use Wikibase\DataModel\Term\Fingerprint;
 use Wikibase\Lib\LanguageNameLookup;
 use Wikibase\View\LanguageDirectionalityLookup;
-use Wikibase\View\TermsListView;
+use Wikibase\View\TableTermsListView;
 use Wikibase\View\DummyLocalizedTextProvider;
 use Wikibase\View\LocalizedTextProvider;
 use Wikibase\View\Template\TemplateFactory;
 
 /**
- * @covers Wikibase\View\TermsListView
+ * @covers Wikibase\View\TableTermsListView
  *
  * @uses Wikibase\View\Template\Template
  * @uses Wikibase\View\Template\TemplateFactory
@@ -29,9 +29,9 @@
  * @author Thiemo Mättig
  * @author Adrian Heine <[email protected]>
  */
-class TermsListViewTest extends PHPUnit_Framework_TestCase {
+class TableTermsListViewTest extends PHPUnit_Framework_TestCase {
 
-       private function getTermsListView(
+       private function getTableTermsListView(
                $languageNameCalls = 0,
                LocalizedTextProvider $textProvider = null
        ) {
@@ -55,7 +55,7 @@
                                ][ $languageCode ];
                        } ) );
 
-               return new TermsListView(
+               return new TableTermsListView(
                        TemplateFactory::getDefaultInstance(),
                        $languageNameLookup,
                        $textProvider,
@@ -71,7 +71,7 @@
                return $fingerprint;
        }
 
-       public function getTermsListViewProvider() {
+       public function getTableTermsListViewProvider() {
                $item = new Item(
                        new ItemId( 'Q1' ),
                        $this->getFingerprint( 'arc' )
@@ -97,9 +97,9 @@
        }
 
        /**
-        * @dataProvider getTermsListViewProvider
+        * @dataProvider getTableTermsListViewProvider
         */
-       public function testGetTermsListView(
+       public function testGetTableTermsListView(
                EntityDocument $entity,
                $languageCode,
                $hasLabel,
@@ -107,7 +107,7 @@
                $hasAliases
        ) {
                $languageDirectionality = $languageCode === 'arc' ? 'rtl' : 
'ltr';
-               $view = $this->getTermsListView( 1 );
+               $view = $this->getTableTermsListView( 1 );
                $html = $view->getHtml( $entity, $entity, $entity, [ 
$languageCode ] );
 
                $this->assertContains( 
'(wikibase-entitytermsforlanguagelistview-language)', $html );
@@ -159,7 +159,7 @@
                $this->assertNotContains( '&amp;', $html, 'no double escaping' 
);
        }
 
-       public function testGetTermsListView_isEscaped() {
+       public function testGetTableTermsListView_isEscaped() {
                $textProvider = $this->getMock( LocalizedTextProvider::class );
                $textProvider->expects( $this->any() )
                        ->method( 'get' )
@@ -171,19 +171,19 @@
                        new ItemId( 'Q1' ),
                        new Fingerprint()
                );
-               $view = $this->getTermsListView( 0, $textProvider );
+               $view = $this->getTableTermsListView( 0, $textProvider );
                $html = $view->getHtml( $item, $item, $item, [] );
 
                $this->assertContains( '&quot;RAW&quot;', $html );
                $this->assertNotContains( '"RAW"', $html );
        }
 
-       public function testGetTermsListView_noAliasesProvider() {
+       public function testGetTableTermsListView_noAliasesProvider() {
                $item = new Item(
                        new ItemId( 'Q1' ),
                        $this->getFingerprint()
                );
-               $view = $this->getTermsListView( 1 );
+               $view = $this->getTableTermsListView( 1 );
                $html = $view->getHtml( $item, $item, null, array( 'en' ) );
 
                $this->assertContains( 
'(wikibase-entitytermsforlanguagelistview-language)', $html );
diff --git a/view/tests/phpunit/ViewFactoryTest.php 
b/view/tests/phpunit/ViewFactoryTest.php
index 2029e0a..7607bd2 100644
--- a/view/tests/phpunit/ViewFactoryTest.php
+++ b/view/tests/phpunit/ViewFactoryTest.php
@@ -42,7 +42,6 @@
  * @uses Wikibase\View\Template\Template
  * @uses Wikibase\View\Template\TemplateFactory
  * @uses Wikibase\View\Template\TemplateRegistry
- * @uses Wikibase\View\TextInjector
  *
  * @group Wikibase
  * @group WikibaseView
@@ -105,22 +104,28 @@
        }
 
        public function testNewItemView() {
-               $itemView = $this->newViewFactory()->newItemView(
+               $factory = $this->newViewFactory();
+               $editSectionGenerator = $this->getMock( 
EditSectionGenerator::class );
+               $itemView = $factory->newItemView(
                        'de',
                        $this->getMock( LabelDescriptionLookup::class ),
                        new LanguageFallbackChain( array() ),
-                       $this->getMock( EditSectionGenerator::class )
+                       $editSectionGenerator,
+                       $factory->newEntityTermsView( $editSectionGenerator )
                );
 
                $this->assertInstanceOf( ItemView::class, $itemView );
        }
 
        public function testNewPropertyView() {
-               $propertyView = $this->newViewFactory()->newPropertyView(
+               $factory = $this->newViewFactory();
+               $editSectionGenerator = $this->getMock( 
EditSectionGenerator::class );
+               $propertyView = $factory->newPropertyView(
                        'de',
                        $this->getMock( LabelDescriptionLookup::class ),
                        new LanguageFallbackChain( array() ),
-                       $this->getMock( EditSectionGenerator::class )
+                       $editSectionGenerator,
+                       $factory->newEntityTermsView( $editSectionGenerator )
                );
 
                $this->assertInstanceOf( PropertyView::class, $propertyView );

-- 
To view, visit https://gerrit.wikimedia.org/r/286421
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia2e42846738b22d0d604cd524b2384c8407ac85d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Adrian Heine <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to