예제 #1
0
 /**
  * Helper method adding _rte_dataidx attribute based on RTE marker stored in text
  *
  * @param $text string link content
  * @param $attribs array attributes
  * @param $markerType integer see RTEMarker class for constants definition
  * @return array attributes
  */
 private static function addDataIdxAttributes(&$text, array $attribs, $markerType)
 {
     wfProfileIn(__METHOD__);
     // get link metadata entry ID and remove RTE marker from link text
     $dataIdx = RTEMarker::getDataIdx($markerType, $text);
     if (is_null($dataIdx)) {
         wfDebug(__METHOD__ . " - dataIdx is empty!\n");
     } else {
         // add internal RTE attribute pointing to link metadata entry
         // it has to be the first one - use array_merge()
         $attribs = array_merge(array('_rte_dataidx' => sprintf('%04d', $dataIdx)), $attribs);
     }
     wfProfileOut(__METHOD__);
     return $attribs;
 }
예제 #2
0
 /**
  * Return the text to be used for a given extension tag.
  * This is the ghost of strip().
  *
  * @param $params Associative array of parameters:
  *     name       PPNode for the tag name
  *     attr       PPNode for unparsed text where tag attributes are thought to be
  *     attributes Optional associative array of parsed attributes
  *     inner      Contents of extension element
  *     noClose    Original text did not have a close tag
  * @param $frame PPFrame
  *
  * @return string
  */
 function extensionSubstitution($params, $frame)
 {
     $name = $frame->expand($params['name']);
     $attrText = !isset($params['attr']) ? null : $frame->expand($params['attr']);
     $content = !isset($params['inner']) ? null : $frame->expand($params['inner']);
     # RTE (Rich Text Editor) - begin
     # @author: Inez Korczyński
     global $wgRTEParserEnabled;
     if (!empty($wgRTEParserEnabled)) {
         $wikitextIdx = RTEMarker::getDataIdx(RTEMarker::EXT_WIKITEXT, $content);
         # Allow parser extensions to generate their own placeholders (instead of default one from RTE)
         # @author: Macbre
         if (wfRunHooks('RTEUseDefaultPlaceholder', array($name, $params, $frame, $wikitextIdx))) {
             if ($wikitextIdx !== null) {
                 $dataIdx = RTEData::put('placeholder', array('type' => 'ext', 'wikitextIdx' => $wikitextIdx));
                 return RTEMarker::generate(RTEMarker::PLACEHOLDER, $dataIdx);
             }
         } else {
             RTE::log(__METHOD__, "skipped default placeholder for <{$name}>");
             // restore value of $content
             $content = RTEData::get('wikitext', $wikitextIdx);
             // keep inner content of tag
             $content = preg_replace('#^<[^>]+>(.*)<[^>]+>$#s', '\\1', $content);
         }
     }
     # RTE - end
     $marker = "{$this->mUniqPrefix}-{$name}-" . sprintf('%08X', $this->mMarkerIndex++) . self::MARKER_SUFFIX;
     $isFunctionTag = isset($this->mFunctionTagHooks[strtolower($name)]) && ($this->ot['html'] || $this->ot['pre']);
     if ($isFunctionTag) {
         $markerType = 'none';
     } else {
         $markerType = 'general';
     }
     if ($this->ot['html'] || $isFunctionTag) {
         $name = strtolower($name);
         # PLB - begin
         # @author: Tomasz Odrobny
         $this->mCurrentTagName = $name;
         # PLB - end
         $attributes = Sanitizer::decodeTagAttributes($attrText);
         if (isset($params['attributes'])) {
             $attributes = $attributes + $params['attributes'];
         }
         if (isset($this->mTagHooks[$name])) {
             # Workaround for PHP bug 35229 and similar
             if (!is_callable($this->mTagHooks[$name])) {
                 throw new MWException("Tag hook for {$name} is not callable\n");
             }
             wfRunHooks('ParserTagHooksBeforeInvoke', [$name, $marker, $content, $attributes, $this, $frame]);
             $output = call_user_func_array($this->mTagHooks[$name], array($content, $attributes, $this, $frame));
         } elseif (isset($this->mFunctionTagHooks[$name])) {
             list($callback, $flags) = $this->mFunctionTagHooks[$name];
             if (!is_callable($callback)) {
                 throw new MWException("Tag hook for {$name} is not callable\n");
             }
             $output = call_user_func_array($callback, array(&$this, $frame, $content, $attributes));
         } else {
             $output = '<span class="error">Invalid tag extension name: ' . htmlspecialchars($name) . '</span>';
         }
         if (is_array($output)) {
             # Extract flags to local scope (to override $markerType)
             $flags = $output;
             $output = $flags[0];
             unset($flags[0]);
             extract($flags);
         }
     } else {
         if (is_null($attrText)) {
             $attrText = '';
         }
         if (isset($params['attributes'])) {
             foreach ($params['attributes'] as $attrName => $attrValue) {
                 $attrText .= ' ' . htmlspecialchars($attrName) . '="' . htmlspecialchars($attrValue) . '"';
             }
         }
         if ($content === null) {
             $output = "<{$name}{$attrText}/>";
         } else {
             $close = is_null($params['close']) ? '' : $frame->expand($params['close']);
             $output = "<{$name}{$attrText}>{$content}{$close}";
         }
     }
     if ($markerType === 'none') {
         return $output;
     } elseif ($markerType === 'nowiki') {
         $this->mStripState->addNoWiki($marker, $output);
     } elseif ($markerType === 'general') {
         $this->mStripState->addGeneral($marker, $output);
     } else {
         throw new MWException(__METHOD__ . ': invalid marker type');
     }
     return $marker;
 }
예제 #3
0
 public function makeKnownLinkHolder($nt, $text = '', $query = '', $trail = '', $prefix = '')
 {
     wfProfileIn(__METHOD__);
     $dataIdx = RTEMarker::getDataIdx(RTEMarker::INTERNAL_DATA, $text);
     $ret = parent::makeKnownLinkHolder($nt, $text, $query, $trail, $prefix);
     $ret = RTEData::addIdxToTag($dataIdx, $ret);
     wfProfileOut(__METHOD__);
     return $ret;
 }