Enable toc generation per message type
authorAlexander Ebert <ebert@woltlab.com>
Thu, 21 Jun 2018 18:12:45 +0000 (20:12 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Thu, 21 Jun 2018 18:19:58 +0000 (20:19 +0200)
See #2579

com.woltlab.wcf/objectType.xml
wcfsetup/install/files/lib/system/html/output/HtmlOutputProcessor.class.php
wcfsetup/install/files/lib/system/html/output/node/HtmlOutputNodeProcessor.class.php

index 78037149dde5a6f3e2b3079d2a420bd07b3d6a1a..20a83cd7c8b8a6e57f1dd2889b1a4d4af5500e91 100644 (file)
@@ -69,6 +69,7 @@
                <type>
                        <name>com.woltlab.wcf.article.content</name>
                        <definitionname>com.woltlab.wcf.message</definitionname>
+                       <enableToc>1</enableToc>
                </type>
                <type>
                        <name>com.woltlab.wcf.article</name>
index 607a8753be38cc1d7309d10551d59996c34fdd49..7bf37b15b548f00a2b162639bc60a5bdeca74f3e 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 declare(strict_types=1);
 namespace wcf\system\html\output;
+use wcf\data\object\type\ObjectTypeCache;
 use wcf\system\html\output\node\HtmlOutputNodeProcessor;
 use wcf\system\html\AbstractHtmlProcessor;
 use wcf\system\message\embedded\object\MessageEmbeddedObjectManager;
@@ -15,6 +16,13 @@ use wcf\system\message\embedded\object\MessageEmbeddedObjectManager;
  * @since       3.0
  */
 class HtmlOutputProcessor extends AbstractHtmlProcessor {
+       /**
+        * generate the table of contents
+        * @var bool
+        * @since 3.2
+        */
+       public $enableToc = false;
+       
        /**
         * output node processor instance
         * @var HtmlOutputNodeProcessor
@@ -81,6 +89,8 @@ class HtmlOutputProcessor extends AbstractHtmlProcessor {
                parent::setContext($objectType, $objectID);
                
                MessageEmbeddedObjectManager::getInstance()->setActiveMessage($objectType, $objectID, $this->languageID);
+               $objectType = ObjectTypeCache::getInstance()->getObjectTypeByName('com.woltlab.wcf.message', $objectType);
+               $this->enableToc = (!empty($objectType->additionalData['enableToc']));
        }
        
        /**
index 67ac09588d0b0ff2e0836c12cc3986d33526a162..d593883f2839498fd0960b2d07865cc4762a6865 100644 (file)
@@ -6,6 +6,8 @@ use wcf\system\bbcode\KeywordHighlighter;
 use wcf\system\event\EventHandler;
 use wcf\system\html\node\AbstractHtmlNodeProcessor;
 use wcf\system\html\node\IHtmlNode;
+use wcf\system\html\output\HtmlOutputProcessor;
+use wcf\system\html\toc\HtmlToc;
 use wcf\util\DOMUtil;
 use wcf\util\StringUtil;
 
@@ -17,6 +19,7 @@ use wcf\util\StringUtil;
  * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
  * @package     WoltLabSuite\Core\System\Html\Output\Node
  * @since       3.0
+ * @method      HtmlOutputProcessor     getHtmlProcessor()
  */
 class HtmlOutputNodeProcessor extends AbstractHtmlNodeProcessor {
        /**
@@ -175,7 +178,15 @@ class HtmlOutputNodeProcessor extends AbstractHtmlNodeProcessor {
         * @inheritDoc
         */
        public function getHtml() {
-               $html = parent::getHtml();
+               $toc = '';
+               if ($this->getHtmlProcessor()->enableToc && $this->outputType === 'text/html') {
+                       $context = $this->getHtmlProcessor()->getContext();
+                       $idPrefix = substr(sha1($context['objectType'] . '-' . $context['objectID']), 0, 8);
+                       
+                       $toc = HtmlToc::forMessage($this->getDocument(), $idPrefix);
+               }
+               
+               $html = $toc . parent::getHtml();
                
                if ($this->outputType === 'text/plain') {
                        $html = StringUtil::trim($html);