public static function replaceIdxByData($var) { $data = RTEData::get('data', intval($var[1])); if (isset($data['type'])) { if (isset($data['wikitextIdx'])) { $data['wikitext'] = RTEData::get('wikitext', $data['wikitextIdx']); // macbre: correctly handle and unmark entities inside links wikitext (RT #38844) $data['wikitext'] = htmlspecialchars_decode($data['wikitext']); $data['wikitext'] = RTEParser::unmarkEntities($data['wikitext']); unset($data['wikitextIdx']); if (strpos($data['wikitext'], '_rte_wikitextidx') !== false) { RTE::$edgeCases[] = 'COMPLEX.01'; } else { if (strpos($data['wikitext'], '_rte_dataidx') !== false) { RTE::$edgeCases[] = 'COMPLEX.02'; } else { if ($data['type'] == 'double-brackets') { if (strrpos($data['wikitext'], '{{') !== 0 && strpos($data['wikitext'], '{{') !== strlen($data['wikitext']) - 2) { RTE::$edgeCases[] = 'COMPLEX.03'; } } else { if (strpos($data['wikitext'], "") !== false) { RTE::$edgeCases[] = 'COMPLEX.07'; } } } } } } return self::convertDataToAttributes($data); }
/** * Parse provided wikitext to HTML using RTE parser */ public static function rteparse() { global $wgTitle, $wgRequest, $wgUser; wfProfileIn(__METHOD__); $wikitext = $wgRequest->getVal('wikitext', ''); $parserOptions = new ParserOptions(); // don't show [edit] link for sections $parserOptions->setEditSection(false); // disable headings numbering $parserOptions->setNumberHeadings(false); $parser = new RTEParser(); // call preSaveTransform so signatures, {{subst:foo}}, etc. will work $wikitext = $parser->preSaveTransform($wikitext, $wgTitle, $wgUser, $parserOptions); // parse wikitext using RTE parser $html = $parser->parse($wikitext, $wgTitle, $parserOptions)->getText(); $res = array('html' => $html); wfProfileOut(__METHOD__); return $res; }
/** * Handle row/cell/table */ private function handleTable($node, $textContent) { wfProfileIn(__METHOD__); $out = ''; // get node attributes $attributes = self::getAttributesStr($node); switch ($node->nodeName) { case 'table': // remove row line breaks $textContent = trim($textContent, "\n"); // don't render empty tables (<table ... />) if ($textContent == '') { RTE::log(__METHOD__, 'empty table found'); $out = ''; break; } $out = "{|{$attributes}\n{$textContent}\n|}\n"; $out = $this->fixForTableCell($node, $out); $out = $this->fixForDiv($node, $out); // add \n if previous node is header and table is inside <div> (RT #44119) if (self::isChildOf($node, 'div')) { if (!empty($node->previousSibling) && self::isHeadingNode($node->previousSibling)) { $out = "\n{$out}"; } } // add \n if previous node is <div> (RT #54113) or <span> (RT #83859) if (self::previousSiblingIs($node, array('div', 'span'))) { $out = "\n{$out}"; } break; case 'caption': // add pipe after attributes if ($attributes != '') { $attributes .= '|'; } $out = "\n|+{$attributes}{$textContent}"; break; case 'tr': // remove cell line breaks $textContent = trim($textContent, "\n"); $addRowDelimiter = false; if (self::isFirstChild($node)) { // add |- before first table row when table header (caption) is present $tableNode = $node->parentNode->parentNode; if (self::firstChildIs($tableNode, 'thead') || self::firstChildIs($tableNode, 'caption')) { $addRowDelimiter = true; } } else { // for next rows always add row delimiter $addRowDelimiter = true; } // delimiter is needed when <tr> has attributes provided if ($attributes != '') { $addRowDelimiter = true; } // preserve row delimiter from wikitext if (self::getEmptyLinesBefore($node)) { $addRowDelimiter = true; } // add row delimiter and attributes when needed if ($addRowDelimiter) { $out = "\n|-{$attributes}"; } $out .= "\n{$textContent}"; break; case 'th': case 'td': $out = ''; $char = $node->nodeName == 'td' ? '|' : '!'; // support cells separated using double pipe $shortRowMarkup = $node->hasAttribute(self::DATA_RTE_SHORT_ROW_MARKUP); $spacesAfterLastCell = intval($node->getAttribute(self::DATA_RTE_SPACES_AFTER_LAST_CELL)); if ($shortRowMarkup) { // add trailing spaces from previous cell (RT #33879) if ($spacesAfterLastCell) { $out .= str_repeat(' ', $spacesAfterLastCell); } $out .= "{$char}{$char}"; } else { $out .= "\n{$char}"; } // add pipe after attributes if ($attributes != '') { $attributes .= '|'; } // remove trailing line breaks $textContent = rtrim(self::addSpaces($node, $textContent), "\n"); // add space before + and - (RT #53351) if (isset($textContent[0]) && in_array($textContent[0], array('-', '+'))) { $textContent = " {$textContent}"; } else { if (isset($textContent[0]) && $textContent[0] == '|') { $textContent = RTEParser::markEntities('|') . substr($textContent, 1); } } $out .= "{$attributes}{$textContent}"; break; } wfProfileOut(__METHOD__); return $out; }
/** * Take a tag soup fragment listing an HTML element's attributes * and normalize it to well-formed XML, discarding unwanted attributes. * Output is safe for further wikitext processing, with escaping of * values that could trigger problems. * * - Normalizes attribute names to lowercase * - Discards attributes not on a whitelist for the given element * - Turns broken or invalid entities into plaintext * - Double-quotes all attribute values * - Attributes without values are given the name as attribute * - Double attributes are discarded * - Unsafe style attributes are discarded * - Prepends space if there are attributes. * * @param $text String * @param $element String * @return String */ static function fixTagAttributes($text, $element) { if (trim($text) == '') { return ''; } $decoded = Sanitizer::decodeTagAttributes($text); $decoded = Sanitizer::fixDeprecatedAttributes($decoded, $element); $stripped = Sanitizer::validateTagAttributes($decoded, $element); $attribs = array(); foreach ($stripped as $attribute => $value) { $encAttribute = htmlspecialchars($attribute); $encValue = Sanitizer::safeEncodeAttribute($value); # RTE (Rich Text Editor) - begin # @author: Inez Korczyński, macbre global $wgRTEParserEnabled; if (!empty($wgRTEParserEnabled) && $encAttribute == 'style') { // BugId:2462 - remove apostrophes from style attribute $encValue = str_replace(''', '', $encValue); $attribs[] = "data-rte-style=\"{$encValue}\""; } # RTE - end $attribs[] = "{$encAttribute}=\"{$encValue}\""; } # RTE (Rich Text Editor) - begin # @author: Inez Korczyński global $wgRTEParserEnabled; if (!empty($wgRTEParserEnabled)) { if (strpos($text, "") !== false) { RTE::$edgeCases[] = 'COMPLEX.08'; } $attribs[] = RTEParser::encodeAttributesStr($text); } # RTE - end return count($attribs) ? ' ' . implode(' ', $attribs) : ''; }
function ImagePlaceholderMakePlaceholder($file, $frameParams, $handlerParams) { wfProfileIn(__METHOD__); global $wgRequest, $wgWikiaImagePlaceholderId, $wgContLang; // Shortcuts $fp =& $frameParams; $hp =& $handlerParams; global $wgContLang, $wgUser, $wgThumbLimits, $wgThumbUpright, $wgRTEParserEnabled; $plc_tag = ''; $plc_tag = $wgContLang->getFormattedNsText(NS_FILE) . ':' . wfMsgForContent('imgplc-placeholder'); isset($hp['options']) && is_string($hp['options']) && '' != $hp['options'] ? $wikitext = '[[' . $plc_tag . '|' . $hp['options'] . ']]' : ($wikitext = '[[' . $plc_tag . ']]'); $prefix = $postfix = ''; $thumb = false; $frame = false; $caption = ''; $link = ''; $align = ''; $isalign = 0; $isthumb = 0; $iswidth = 0; $iscaption = 0; $islink = 0; if (isset($hp['width']) && 0 != $hp['width']) { // FCK takes 0 $width = $hp['width']; // if too small, the box will end up looking... extremely silly if ($width < IMG_PLC_MIN_WIDTH) { $width = IMG_PLC_MIN_WIDTH; } $iswidth = $width; } else { $width = IMG_PLC_DEF_WIDTH; } $height = $width; if (isset($fp['thumbnail'])) { $thumb = true; $isthumb = 1; } if (isset($fp['frame'])) { $frame = true; } if (isset($fp['align'])) { if ('left' == $fp['align'] || 'right' == $fp['align'] || 'center' == $fp['align']) { $align = $fp['align']; 'left' == $fp['align'] ? $isalign = 1 : ($isalign = 2); } } else { $thumb || $frame ? $align = 'right' : ($align = ''); } // set margin accordingly to alignment, identical to normal Image: -- RT#21368 // FIXME: this REALLY should be done in a class $margin = ''; if (isset($align)) { if ($align == 'right') { $margin = 'margin: 0.5em 0 1.2em 1.4em;'; } else { if ($align == 'center') { $margin = 'margin: 0.5em auto 1.2em;'; } else { $margin = 'margin: 0.5em 1.4em 1.2em 0;'; } } } if (isset($fp['caption'])) { $caption = $fp['caption']; $iscaption = 1; } if (isset($fp['link'])) { $link = $fp['link']; $islink = 1; } $height = $width; // this is for positioning the "Add Image" button $lmarg = ceil(($width - 90) / 2); $tmarg = ceil(($height - 30) / 2); // macbre: RTE support for video placeholder // TODO: use JSSnippets to load dependencies if (empty($wgRTEParserEnabled)) { if ($wgRequest->getVal('diff', 0) == 0 && $wgRequest->getVal('oldid', 0) == 0) { $onclick = '$.loadYUI( function() {$.getScript(wgExtensionsPath+\'/wikia/WikiaMiniUpload/js/WMU.js\', function() { WMU_show( $.getEvent(), ' . -2 . ', ' . $wgWikiaImagePlaceholderId . ',' . $isalign . ',' . $isthumb . ' ,' . $iswidth . ', \'' . htmlspecialchars($caption) . '\' , \'' . htmlspecialchars($link) . '\' ); mw.loader.load( wgExtensionsPath+\'/wikia/WikiaMiniUpload/css/WMU.css\', "text/css" ) } ) } )'; } else { $onclick = 'alert(' . escapeshellarg(wfMsg('imgplc-notinhistory')) . '); return false;'; } } // FIXME: argh! inline styles! Move to classes someday... --TOR $margin = ''; $additionalClass = ''; if (isset($align)) { if ($align == 'right') { $margin = 'margin: 0.5em 0 1.2em 1.4em;'; } else { if ($align == 'center') { $margin = 'margin: 0.5em auto 1.2em;'; $additionalClass = ' center'; } else { $margin = 'margin: 0.5em 1.4em 1.2em 0;'; } } } // render HTML (RT #21087) $out = ''; $wrapperAttribs = array('id' => "WikiaImagePlaceholder{$wgWikiaImagePlaceholderId}", 'class' => "gallerybox wikiaPlaceholder{$additionalClass}", 'style' => 'vertical-align: bottom'); if (isset($refid)) { $wrapperAttribs['refid'] = $refid; } $out .= Xml::openElement('div', $wrapperAttribs); $out .= Xml::openElement('div', array('class' => "thumb t{$align} videobox", 'style' => "height: {$height}px; width: {$width}px; {$margin}")); // "Add video" green button $out .= Xml::openElement('a', array('id' => "WikiaImagePlaceholderInner{$wgWikiaImagePlaceholderId}", 'class' => 'wikia-button', 'style' => "top: {$tmarg}px;position:relative;", 'href' => '#', 'onclick' => !empty($onclick) ? $onclick : '')); $out .= wfMsg('imgplc-create'); $out .= Xml::closeElement('a'); // caption (RT #47460) if ($caption != '') { $out .= Xml::element('span', array('class' => 'thumbcaption'), $caption); } $out .= Xml::closeElement('div') . Xml::closeElement('div') . Xml::closeElement('td'); // increase counter $wgWikiaImagePlaceholderId++; // dirty hack for CK support global $wgRTEParserEnabled; if (!empty($wgRTEParserEnabled)) { $out = RTEParser::renderMediaPlaceholder(array('type' => 'image-placeholder', 'params' => array('width' => $width, 'height' => $height, 'caption' => $caption, 'align' => $align, 'isAlign' => $isalign, 'isThumb' => $isthumb))); } wfProfileOut(__METHOD__); return $out; }
/** * Process [[ ]] wikilinks (RIL) * @return LinkHolderArray * * @private */ function replaceInternalLinks2(&$s) { wfProfileIn(__METHOD__); # RTE (Rich Text Editor) - begin # @author: Inez Korczyński global $wgRTEParserEnabled; # RTE (Rich Text Editor) - end wfProfileIn(__METHOD__ . '-setup'); static $tc = FALSE, $e1, $e1_img; # the % is needed to support urlencoded titles as well if (!$tc) { $tc = Title::legalChars() . '#%'; # Match a link having the form [[namespace:link|alternate]]trail $e1 = "/^([{$tc}]+)(?:\\|(.+?))?]](.*)\$/sD"; # Match cases where there is no "]]", which might still be images $e1_img = "/^([{$tc}]+)\\|(.*)\$/sD"; } $holders = new LinkHolderArray($this); # split the entire text string on occurences of [[ $a = StringUtils::explode('[[', ' ' . $s); # get the first element (all text up to first [[), and remove the space we added $s = $a->current(); $a->next(); $line = $a->current(); # Workaround for broken ArrayIterator::next() that returns "void" $s = substr($s, 1); $useLinkPrefixExtension = $this->getTargetLanguage()->linkPrefixExtension(); $e2 = null; if ($useLinkPrefixExtension) { # Match the end of a line for a word that's not followed by whitespace, # e.g. in the case of 'The Arab al[[Razi]]', 'al' will be matched $e2 = wfMsgForContent('linkprefix'); } if (is_null($this->mTitle)) { wfProfileOut(__METHOD__ . '-setup'); wfProfileOut(__METHOD__); throw new MWException(__METHOD__ . ": \$this->mTitle is null\n"); } $nottalk = !$this->mTitle->isTalkPage(); if ($useLinkPrefixExtension) { $m = array(); if (preg_match($e2, $s, $m)) { $first_prefix = $m[2]; } else { $first_prefix = false; } } else { $prefix = ''; } if ($this->getConverterLanguage()->hasVariants()) { $selflink = $this->getConverterLanguage()->autoConvertToAllVariants($this->mTitle->getPrefixedText()); } else { $selflink = array($this->mTitle->getPrefixedText()); } $useSubpages = $this->areSubpagesAllowed(); wfProfileOut(__METHOD__ . '-setup'); # Loop for each link for (; $line !== false && $line !== null; $a->next(), $line = $a->current()) { # Check for excessive memory usage if ($holders->isBig()) { # Too big # Do the existence check, replace the link holders and clear the array $holders->replace($s); $holders->clear(); } # RTE (Rich Text Editor) - begin # @author: Inez Korczyński if (!empty($wgRTEParserEnabled)) { $RTE_wikitextIdx = RTEMarker::getDataIdx(RTEMarker::INTERNAL_WIKITEXT, $line); // decode entities inside links wikimarkup (RT #38844) if ($pos = strpos($line, ']]')) { // unmark entities inside link $link = substr($line, 0, $pos); $link = RTEParser::unmarkEntities($link); // leave the rest of the line untouched $line = $link . substr($line, $pos); } } # RTE - end if ($useLinkPrefixExtension) { wfProfileIn(__METHOD__ . '-prefixhandling'); if (preg_match($e2, $s, $m)) { $prefix = $m[2]; $s = $m[1]; } else { $prefix = ''; } # first link if ($first_prefix) { $prefix = $first_prefix; $first_prefix = false; } wfProfileOut(__METHOD__ . '-prefixhandling'); } $might_be_img = false; wfProfileIn(__METHOD__ . "-e1"); if (preg_match($e1, $line, $m)) { # page with normal text or alt $text = $m[2]; # If we get a ] at the beginning of $m[3] that means we have a link that's something like: # [[Image:Foo.jpg|[http://example.com desc]]] <- having three ] in a row f***s up, # the real problem is with the $e1 regex # See bug 1300. # # Still some problems for cases where the ] is meant to be outside punctuation, # and no image is in sight. See bug 2095. # if ($text !== '' && substr($m[3], 0, 1) === ']' && strpos($text, '[') !== false) { $text .= ']'; # so that replaceExternalLinks($text) works later $m[3] = substr($m[3], 1); } # fix up urlencoded title texts if (strpos($m[1], '%') !== false) { # Should anchors '#' also be rejected? $m[1] = str_replace(array('<', '>'), array('<', '>'), rawurldecode($m[1])); } $trail = $m[3]; } elseif (preg_match($e1_img, $line, $m)) { # Invalid, but might be an image with a link in its caption $might_be_img = true; $text = $m[2]; if (strpos($m[1], '%') !== false) { $m[1] = rawurldecode($m[1]); } $trail = ""; } else { # Invalid form; output directly $s .= $prefix . '[[' . $line; wfProfileOut(__METHOD__ . "-e1"); continue; } wfProfileOut(__METHOD__ . "-e1"); wfProfileIn(__METHOD__ . "-misc"); # Don't allow internal links to pages containing # PROTO: where PROTO is a valid URL protocol; these # should be external links. if (preg_match('/^(?:' . wfUrlProtocols() . ')/', $m[1])) { $s .= $prefix . '[[' . $line; wfProfileOut(__METHOD__ . "-misc"); continue; } # Make subpage if necessary if ($useSubpages) { $link = $this->maybeDoSubpageLink($m[1], $text); } else { $link = $m[1]; } $noforce = substr($m[1], 0, 1) !== ':'; if (!$noforce) { # Strip off leading ':' $link = substr($link, 1); } wfProfileOut(__METHOD__ . "-misc"); wfProfileIn(__METHOD__ . "-title"); $nt = Title::newFromText($this->mStripState->unstripNoWiki($link)); if ($nt === null) { $s .= $prefix . '[[' . $line; wfProfileOut(__METHOD__ . "-title"); continue; } $ns = $nt->getNamespace(); $iw = $nt->getInterWiki(); wfProfileOut(__METHOD__ . "-title"); if ($might_be_img) { # if this is actually an invalid link wfProfileIn(__METHOD__ . "-might_be_img"); if ($ns == NS_FILE && $noforce) { # but might be an image $found = false; while (true) { # look at the next 'line' to see if we can close it there $a->next(); $next_line = $a->current(); if ($next_line === false || $next_line === null) { break; } $m = explode(']]', $next_line, 3); if (count($m) == 3) { # the first ]] closes the inner link, the second the image $found = true; $text .= "[[{$m[0]}]]{$m[1]}"; $trail = $m[2]; break; } elseif (count($m) == 2) { # if there's exactly one ]] that's fine, we'll keep looking $text .= "[[{$m[0]}]]{$m[1]}"; } else { # if $next_line is invalid too, we need look no further $text .= '[[' . $next_line; break; } } if (!$found) { # we couldn't find the end of this imageLink, so output it raw # but don't ignore what might be perfectly normal links in the text we've examined $holders->merge($this->replaceInternalLinks2($text)); $s .= "{$prefix}[[{$link}|{$text}"; # note: no $trail, because without an end, there *is* no trail wfProfileOut(__METHOD__ . "-might_be_img"); continue; } } else { # it's not an image, so output it raw $s .= "{$prefix}[[{$link}|{$text}"; # note: no $trail, because without an end, there *is* no trail wfProfileOut(__METHOD__ . "-might_be_img"); continue; } wfProfileOut(__METHOD__ . "-might_be_img"); } $wasblank = $text == ''; if ($wasblank) { $text = $link; } else { # Bug 4598 madness. Handle the quotes only if they come from the alternate part # [[Lista d''e paise d''o munno]] -> <a href="...">Lista d''e paise d''o munno</a> # [[Criticism of Harry Potter|Criticism of ''Harry Potter'']] # -> <a href="Criticism of Harry Potter">Criticism of <i>Harry Potter</i></a> $text = $this->doQuotes($text); } # Link not escaped by : , create the various objects if ($noforce) { global $wgContLang; # Interwikis if (empty($wgRTEParserEnabled)) { # wikia wfProfileIn(__METHOD__ . "-interwiki"); if ($iw && $this->mOptions->getInterwikiMagic() && $nottalk && $wgContLang->getLanguageName($iw)) { $this->mOutput->addLanguageLink($nt->getFullText()); $s = rtrim($s . $prefix); $s .= trim($trail, "\n") == '' ? '' : $prefix . $trail; wfProfileOut(__METHOD__ . "-interwiki"); continue; } wfProfileOut(__METHOD__ . "-interwiki"); } # wikia if ($ns == NS_FILE) { wfProfileIn(__METHOD__ . "-image"); if (!wfIsBadImage($nt->getDBkey(), $this->mTitle)) { if ($wasblank) { # if no parameters were passed, $text # becomes something like "File:Foo.png", # which we don't want to pass on to the # image generator $text = ''; } else { # recursively parse links inside the image caption # actually, this will parse them in any other parameters, too, # but it might be hard to fix that, and it doesn't matter ATM $text = $this->replaceExternalLinks($text); $holders->merge($this->replaceInternalLinks2($text)); } # RTE (Rich Text Editor) - begin # @author: Inez Korczyński if (!empty($wgRTEParserEnabled)) { $text = RTEMarker::generate(RTEMarker::IMAGE_DATA, $RTE_wikitextIdx) . $text; } # RTE - end # cloak any absolute URLs inside the image markup, so replaceExternalLinks() won't touch them /** wikia $s .= $prefix . $this->armorLinks( $this->makeImage( $nt, $text, $holders ) ) . $trail; wikia **/ # cater for new placeholder-in-template namespace - Bartek # TODO: Get the hell out with this code from here this can be done in hook handler fired in makeImage function - Inez if ("Template Placeholder" != $nt->getText()) { $s .= $prefix . $this->armorLinks($this->makeImage($nt, $text, $holders)) . $trail; } else { $s .= $prefix . $this->armorLinks(ImagePlaceholder_makeDullImage($nt, $text, $holders)) . $trail; } } else { $s .= $prefix . $trail; } wfProfileOut(__METHOD__ . "-image"); continue; } if ($ns == NS_CATEGORY) { wfProfileIn(__METHOD__ . "-category"); # RTE (Rich Text Editor) - begin # @author: Inez Korczyński # Category handling if (!empty($wgRTEParserEnabled)) { $dataIdx = RTEData::put('placeholder', array('type' => 'category', 'wikitextIdx' => $RTE_wikitextIdx)); $s .= $prefix . RTEMarker::generate(RTEMarker::PLACEHOLDER, $dataIdx) . $trail; } else { $s = rtrim($s . "\n"); # bug 87 if ($wasblank) { $sortkey = $this->getDefaultSort(); } else { $sortkey = $text; } $sortkey = Sanitizer::decodeCharReferences($sortkey); $sortkey = str_replace("\n", '', $sortkey); $sortkey = $this->getConverterLanguage()->convertCategoryKey($sortkey); $this->mOutput->addCategory($nt->getDBkey(), $sortkey); /** * Strip the whitespace Category links produce, see bug 87 * @todo We might want to use trim($tmp, "\n") here. */ $s .= trim($prefix . $trail, "\n") == '' ? '' : $prefix . $trail; } wfProfileOut(__METHOD__ . "-category"); continue; } # Wikia change begin # @author macbre $hookRet = wfRunHooks('ParserReplaceInternalLinks2NoForce', array(&$s, $nt, $prefix, $trail, isset($RTE_wikitextIdx) ? $RTE_wikitextIdx : null)); if ($hookRet === false) { continue; } # Wikia change end } # RTE (Rich Text Editor) - begin # @author: Inez Korczyński # No special handling for self-linking in RTE mode # Self-link checking if (empty($wgRTEParserEnabled) && $nt->getFragment() === '' && $ns != NS_SPECIAL) { if (in_array($nt->getPrefixedText(), $selflink, true)) { $s .= $prefix . Linker::makeSelfLinkObj($nt, $text, '', $trail); continue; } } # RTE - end # NS_MEDIA is a pseudo-namespace for linking directly to a file # @todo FIXME: Should do batch file existence checks, see comment below if ($ns == NS_MEDIA) { # RTE (Rich Text Editor) - begin # @author: macbre # BugId:1694 - handle [[Media:xxx]] as placeholders if (!empty($wgRTEParserEnabled)) { $dataIdx = RTEData::put('placeholder', array('type' => 'media', 'wikitextIdx' => $RTE_wikitextIdx)); $s .= $prefix . RTEMarker::generate(RTEMarker::PLACEHOLDER, $dataIdx) . $trail; continue; } # RTE - end wfProfileIn(__METHOD__ . "-media"); # Give extensions a chance to select the file revision for us $options = array(); $descQuery = false; wfRunHooks('BeforeParserFetchFileAndTitle', array($this, $nt, &$options, &$descQuery)); # Fetch and register the file (file title may be different via hooks) list($file, $nt) = $this->fetchFileAndTitle($nt, $options); # Cloak with NOPARSE to avoid replacement in replaceExternalLinks $s .= $prefix . $this->armorLinks(Linker::makeMediaLinkFile($nt, $file, $text)) . $trail; wfProfileOut(__METHOD__ . "-media"); continue; } wfProfileIn(__METHOD__ . "-always_known"); # RTE (Rich Text Editor) - begin # @author: Inez Korczyński if (!empty($wgRTEParserEnabled)) { $text = RTEMarker::generate(RTEMarker::INTERNAL_DATA, RTEData::put('data', array('type' => 'internal', 'wikitextIdx' => $RTE_wikitextIdx, 'text' => $text, 'link' => $link, 'wasblank' => $wasblank, 'noforce' => $noforce))) . $text; } # RTE - end # Some titles, such as valid special pages or files in foreign repos, should # be shown as bluelinks even though they're not included in the page table # # @todo FIXME: isAlwaysKnown() can be expensive for file links; we should really do # batch file existence checks for NS_FILE and NS_MEDIA if ($iw == '' && $nt->isAlwaysKnown()) { $this->mOutput->addLink($nt); $s .= $this->makeKnownLinkHolder($nt, $text, array(), $trail, $prefix); } else { # Links will be added to the output link list after checking $s .= $holders->makeHolder($nt, $text, array(), $trail, $prefix); } wfProfileOut(__METHOD__ . "-always_known"); } wfProfileOut(__METHOD__); return $holders; }
/** * Handle ParserMakeImageParams hook (get parsed image options) */ public static function makeImageParams($title, $file, &$params) { wfProfileIn(__METHOD__); // run only when parsing for RTE global $wgRTEParserEnabled; if (empty($wgRTEParserEnabled)) { wfProfileOut(__METHOD__); return true; } // store image params (to be used in makeImage) self::$imageParams = $params; wfProfileOut(__METHOD__); return true; }
function ImagePlaceholderMakePlaceholder($file, $frameParams, $handlerParams) { wfProfileIn(__METHOD__); global $wgRequest, $wgWikiaImagePlaceholderId, $wgWikiaVideoPlaceholderId, $wgContLang, $wgTitle; // Shortcuts $fp =& $frameParams; $hp =& $handlerParams; global $wgContLang, $wgUser, $wgThumbLimits, $wgThumbUpright, $wgRTEParserEnabled; $plc_tag = ''; $plc_tag = $wgContLang->getFormattedNsText(NS_FILE) . ':' . wfMsgForContent('imgplc-placeholder'); isset($hp['options']) && is_string($hp['options']) && '' != $hp['options'] ? $wikitext = '[[' . $plc_tag . '|' . $hp['options'] . ']]' : ($wikitext = '[[' . $plc_tag . ']]'); $prefix = $postfix = ''; $thumb = false; $frame = false; $caption = ''; $link = ''; $align = ''; $isalign = 0; $isthumb = 0; $iswidth = 0; $iscaption = 0; $islink = 0; $isvideo = 0; if (!empty($hp['isvideo'])) { $isvideo = 1; } if (isset($hp['width']) && 0 != $hp['width']) { // FCK takes 0 $width = $hp['width']; // if too small, the box will end up looking... extremely silly if ($width < IMG_PLC_MIN_WIDTH) { $width = IMG_PLC_MIN_WIDTH; } $iswidth = $width; } else { $width = IMG_PLC_DEF_WIDTH; } $height = $width; if (isset($fp['thumbnail'])) { $thumb = true; $isthumb = 1; } if (isset($fp['frame'])) { $frame = true; } if (isset($fp['align'])) { if ('left' == $fp['align'] || 'right' == $fp['align'] || 'center' == $fp['align']) { $align = $fp['align']; 'left' == $fp['align'] ? $isalign = 1 : ($isalign = 2); } } else { $thumb || $frame ? $align = 'right' : ($align = ''); } // set margin accordingly to alignment, identical to normal Image: -- RT#21368 // FIXME: this REALLY should be done in a class $margin = ''; if (isset($align)) { if ($align == 'right') { $margin = 'margin: 0.5em 0 1.2em 1.4em;'; } else { if ($align == 'center') { $margin = 'margin: 0.5em auto 1.2em;'; } else { $margin = 'margin: 0.5em 1.4em 1.2em 0;'; } } } if (isset($fp['caption'])) { $caption = $fp['caption']; $iscaption = 1; } if (isset($fp['link'])) { $link = $fp['link']; $islink = 1; } $height = $width; // this is for positioning the "Add Image" button $lmarg = ceil(($width - 90) / 2); $tmarg = ceil(($height - 30) / 2); $additionalClass = ''; if ($isvideo) { $additionalClass .= ' wikiaVideoPlaceholder'; } else { $additionalClass .= ' wikiaImagePlaceholder'; } // render HTML (RT #21087) $out = ''; $wrapperAttribs = array('class' => "gallerybox wikiaPlaceholder{$additionalClass}"); // ImagePlaceholders still use id attribute, videos use data-id attribute. Images should be updated to match videos at some point if (!$isvideo) { $wrapperAttribs['id'] = "WikiaImagePlaceholder{$wgWikiaImagePlaceholderId}"; } if (isset($refid)) { $wrapperAttribs['refid'] = $refid; } $out .= Xml::openElement('div', $wrapperAttribs); $out .= Xml::openElement('div', array('class' => "thumb t{$align} videobox", 'style' => "height: {$height}px; width: {$width}px;")); $linkAttrs = array('id' => "WikiaImagePlaceholderInner{$wgWikiaImagePlaceholderId}", 'class' => 'wikia-button', 'style' => "top: {$tmarg}px;", 'href' => $wgTitle instanceof Title ? $wgTitle->getLocalUrl(array('action' => 'edit')) : '#', 'data-id' => $isvideo ? $wgWikiaVideoPlaceholderId : $wgWikiaImagePlaceholderId, 'data-align' => $isalign, 'data-thumb' => $isthumb, 'data-caption' => htmlspecialchars($caption), 'data-width' => $width); if (!$isvideo) { // image placeholder $linkAttrs = array_merge($linkAttrs, array('data-link' => htmlspecialchars($link), 'data-width' => $width)); } $out .= Xml::openElement('a', $linkAttrs); $out .= $isvideo ? wfMsg('imgplc-add-video') : wfMsg('imgplc-add-image'); $out .= Xml::closeElement('a'); // caption (RT #47460) if ($caption != '') { $out .= Xml::element('span', array('class' => 'thumbcaption'), $caption); } $out .= Xml::closeElement('div') . Xml::closeElement('div') . Xml::closeElement('td'); // increase counter if ($isvideo) { $wgWikiaVideoPlaceholderId++; } else { $wgWikiaImagePlaceholderId++; } // dirty hack for CK support global $wgRTEParserEnabled; if (!empty($wgRTEParserEnabled)) { $out = RTEParser::renderMediaPlaceholder(array('type' => $isvideo ? 'video-placeholder' : 'image-placeholder', 'params' => array('width' => $width, 'height' => $height, 'caption' => $caption, 'align' => $align, 'isAlign' => $isalign, 'isThumb' => $isthumb))); } else { $out .= JSSnippets::addToStack(array('/extensions/wikia/ImagePlaceholder/js/MediaPlaceholder.js'), array(), 'MediaPlaceholder.init'); } wfProfileOut(__METHOD__); return $out; }