Просмотр исходного кода

#261 add bx-link class to every link in user's content

Alex Trofimov 10 лет назад
Родитель
Сommit
fe7afaa517

+ 1 - 1
inc/classes/BxDolCmts.php

@@ -910,7 +910,7 @@ class BxDolCmts extends BxDol implements iBxDolReplaceable
     {
     	$iDataAction = $this->isNl2br() ? BX_DATA_TEXT_MULTILINE : BX_DATA_HTML;
     	$s = bx_process_output($s, $iDataAction);
-    	$s = bx_linkify_html($s);
+    	$s = bx_linkify_html($s, 'class="' . BX_DOL_LINK_CLASS . '"');
 
         if ($this->_sMetatagsObj && $iCmtId) {
             $oMetatags = BxDolMetatags::getObjectInstance($this->_sMetatagsObj);

+ 3 - 1
inc/utils.inc.php

@@ -7,6 +7,8 @@
  * @{
  */
 
+define('BX_DOL_LINK_CLASS', 'bx-link'); ///< class to add to every link in user content
+
 define('BX_DATA_TEXT', 1); ///< regular text data type
 define('BX_DATA_TEXT_MULTILINE', 2); ///< regular multiline text data type
 define('BX_DATA_INT', 3); ///< integer data type
@@ -474,7 +476,7 @@ function clear_xss($val)
             $oConfig->set('HTML.Nofollow', 'true');
         }
 
-        $oConfig->set('Filter.Custom', array (new HTMLPurifier_Filter_YouTube(), new HTMLPurifier_Filter_YoutubeIframe()));
+        $oConfig->set('Filter.Custom', array (new HTMLPurifier_Filter_YouTube(), new HTMLPurifier_Filter_YoutubeIframe(), new HTMLPurifier_Filter_AddBxLinksClass()));
 
         $oDef = $oConfig->getHTMLDefinition(true);
         $oDef->addAttribute('a', 'target', 'Enum#_blank,_self,_target,_top');

+ 1 - 1
modules/boonex/timeline/classes/BxTimelineTemplate.php

@@ -960,7 +960,7 @@ class BxTimelineTemplate extends BxBaseModNotificationsTemplate
     protected function _prepareTextForOutput($s, $iEventId = 0)
     {
     	$s = bx_process_output($s, BX_DATA_HTML);
-        $s = bx_linkify_html($s);
+        $s = bx_linkify_html($s, 'class="' . BX_DOL_LINK_CLASS . '"');
 
         $oMetatags = BxDolMetatags::getObjectInstance($this->_oConfig->getObject('metatags'));
 		$s = $oMetatags->keywordsParse($iEventId, $s);

+ 36 - 0
plugins/htmlpurifier/standalone/HTMLPurifier/Filter/AddBxLinksClass.php

@@ -0,0 +1,36 @@
+<?php
+
+class HTMLPurifier_Filter_AddBxLinksClass extends HTMLPurifier_Filter
+{
+    public $name = 'AddBxLinksClass';
+    protected $class = BX_DOL_LINK_CLASS;
+
+    public function preFilter($sHtml, $config, $context)
+    {
+        if (false === strstr($sHtml, '<a '))
+            return $sHtml;
+
+        $sId = 'bx-links-' . md5(microtime());
+        $dom = new DOMDocument();
+        @$dom->loadHTML('<?xml encoding="UTF-8"><div id="' . $sId . '">' . $sHtml . '</div>');
+        $xpath = new DOMXpath($dom);
+
+        $oLinks = $xpath->evaluate('//a');
+        for ($i = 0; $i < $oLinks->length; $i++) {
+            $oLink = $oLinks->item($i);
+
+            $sClasses = $oLink->getAttribute('class');
+            if (!$sClasses || false === strpos($sClasses, $this->class))
+                $sClasses = ($sClasses ? $sClasses . ' ' : '') . $this->class;
+
+            $oLink->removeAttribute('class');
+            $oLink->setAttribute("class", $sClasses);
+        }
+
+        if (false === ($s = $dom->saveXML($dom->getElementById($sId)))) // in case of error return original string
+            return $sHtml;
+
+        return mb_substr($s, 52, -6); // strip added tags
+    }
+}
+