Extension:FCKeditor (by Mafs)/extension
From MediaWiki.org
<?php /* This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ if( !defined( 'MEDIAWIKI' ) ) { die(); } $wgExtensionCredits['other'][] = array( "name" => "fckeditor extension", "author" => "Mafs", "version" => "fck/mw-extension (0.7.2) 2006", "url" => "http://meta.wikimedia.org/wiki/FCKeditor", "description" => "integrating the fckeditor" ); # REGISTER HOOKS $wgHooks['ParserBeforeStrip'][] = 'wfFCKeditorBypassParserCut'; $wgHooks['ParserAfterTidy'][] = 'wfFCKeditorBypassParserPaste'; $wgHooks['ArticleAfterFetchContent'][] = 'wfFCKeditorCheck'; $wgHooks['EditPage::showEditForm:initial'][] = 'wfFCKeditorAddFCKScript'; //************************************************************************ // Not used yet, needs some testing ... /* $wgHooks['ArticleSave'][] = 'wfFCKeditorImageLinks'; function wfFCKeditorImageLinks($q, $user, $text, $summary, $f1, $f2, $f3, $flags) { // In case the html text was copied from an other wiki, the src attribute // of the image links is no longer valid. // Therefore, the img tags have to be rewritten. // For nomal images: Extract the image name and create a new url. // For tex images: Extract the tex text (alt="...") and send it to the parser. global $wgFCKEditorToken; if (preg_match("/$wgFCKEditorToken/i", $text, $a )) { global $wgOut, $wgUser; $wgUser->setOption("math", 0); // render png $list_md5 = array(); $list_tex = array(); $list_names = array(); $list_img = array(); $att_list = array("href", "longdesc", "alt", "src"); // tex ************************************************************* while (preg_match("/<img.*?class=[\'\"]tex[\'\"].*?>/i", $text, $a)) { $img_tag = $a[0]; $img_md5 = "tex_".md5($img_tag); $text = str_replace($img_tag, $img_md5, $text ); $list_md5[] = $img_md5; preg_match("/alt=[\'\"](.*?)[\'\"]/", $img_tag, $a); $list_tex["$img_md5"] = $a[1]; } foreach($list_md5 as $md5) { $tex = $list_tex["$md5"]; $math = $wgOut->parse("<math>$tex</math>"); preg_match("/<img.*?>/i", $math, $a); $math = $a[0]; $text = str_replace( $md5, $math, $text ); } // imgage ********************************************************** // add class="image" to a-tag and replace attributes. $list_md5 = array(); //die("replace"); while (preg_match("/<a.*?>.*?<img.*?>.*?<\/a.*?>/i", $text, $a) ) { $img_tag = $a[0]; $img_md5 = "img_".md5($img_tag); $text = str_replace($img_tag, $img_md5, $text ); $list_md5[] = $img_md5; if (! preg_match("/<a.*?class=[\'\"]image[\'\"].*?>/", $img_tag, $a)) $img_tag = preg_replace("/<a (.*?)/", "<a class= \"image\" \\1", $img_tag); preg_match("/src=[\'\"].*?\/([^\/]+?)[\'\"]/", $img_tag, $a); $image_name = $a[1]; echo($image_name."<br>"); $image = $wgOut->parse("[[image:$image_name]]"); preg_match("/<a.*?>.*?<img.*?>.*?<\/a.*?>/i", $image, $a); $image = $a[0]; //echo($image."<br>"."<br>"); foreach ($att_list as $att) { preg_match("/$att=[\"\']([^\"\'])*?[\"\']/i", $image, $a); $content = $a[0]; //echo($att." ".$image_name."<br>"); $img_tag = preg_replace( "/(.*?)($att=[\"\'][^\"\']*[\"\'])(.*?)/i", "\\1$content\\3", $img_tag ); } $list_img["$img_md5"] = $img_tag; } foreach($list_md5 as $md5) { $img_tag = $list_img["$md5"]; $text = str_replace( $md5, $img_tag, $text ); //echo($img_tag); } } //die("end"); return true; } */ function wfFCKeditorAddFCKScript ($q) { global $wgOut, $wgTitle, $wgScriptPath; global $wgFCKexcludedNamespaces, $wgFCKUseEditor, $wgFCKEditorToolbarSet; global $wgFCKEditorDir, $wgFCKEditorHeight; $ns_allowed = true; $ns = $wgTitle->getNamespace(); if (in_array($ns, $wgFCKexcludedNamespaces)) $ns_allowed = false; if ($ns_allowed and $wgFCKUseEditor) { $wgOut->addScript( "<script type=\"text/javascript\" src=\"$wgScriptPath/$wgFCKEditorDir/fckeditor.js\"></script>\n" ); $wgOut->addScript("<script type=\"text/javascript\"> function onLoadFCK () { var oFCKeditor = new FCKeditor('wpTextbox1') ; oFCKeditor.BasePath = \"$wgScriptPath/$wgFCKEditorDir/\" ; if (document.getElementById(\"wpTextbox1\")) {oFCKeditor.Height = \"$wgFCKEditorHeight\" ; oFCKeditor.ToolbarSet = \"$wgFCKEditorToolbarSet\" ; oFCKeditor.ReplaceTextarea() ; var oDiv=document.getElementById(\"toolbar\"); oDiv.style.cssText = 'display: none;'; }} addOnloadHook(onLoadFCK); </script>\n"); } return true; } function wfFCKeditorCheck ($q, $text) { global $wgFCKUseEditor, $wgFCKEditorToken; if (preg_match("/$wgFCKEditorToken/i", $text, $a)) { $wgFCKUseEditor = true; } return true; } function wfFCKeditorBypassParserCut ($q, $text) { global $wgFCKexcludedNamespaces, $wgFCKUseEditor, $wgTitle; global $wgFCKBypassText, $wgFCKEditorToken; $ns_allowed = true; $ns = $wgTitle->getNamespace(); if (in_array($ns, $wgFCKexcludedNamespaces)) $ns_allowed = false; if ($ns_allowed and $wgFCKUseEditor) { $wgFCKBypassText = $text; $text = ""; } return true; } function wfFCKeditorBypassParserPaste ($q, $text) { global $wgOut, $wgTitle, $wgParser; global $wgFCKexcludedNamespaces, $wgFCKEditorHeight, $wgFCKEditorToolbarSet, $wgFCKUseEditor; global $wgFCKBypassText, $wgFCKEditorToken, $wgFCKEditorAllow_a_tags, $wgFCKEditorAllow_img_tags; $List = array(); $ns_allowed = true; $ns = $wgTitle->getNamespace(); if (in_array($ns, $wgFCKexcludedNamespaces)) $ns_allowed = false; if ($ns_allowed and $wgFCKUseEditor) { $fcktext = $wgFCKBypassText; if ($wgFCKEditorAllow_a_tags) { $i = 0; $ta = md5("aopen"); while (preg_match("|(<a.*?>)|i", $fcktext, $a)) { $j = $ta."_".md5($i); $List[$j]["content"] = $a[0]; $List[$j]["index"] = $j; $fcktext = str_replace($a[0], $j, $fcktext); $i++; } $i = 0; $ta = md5("aclose"); while (preg_match("|(</a>)|i", $fcktext, $a)) { $j = $ta."_".md5($i); $List[$j]["content"] = $a[0]; $List[$j]["index"] = $j; $fcktext = str_replace($a[0], $j, $fcktext); $i++; } } if ($wgFCKEditorAllow_img_tags) { $i = 0; $timg = md5("img"); while (preg_match("|(<img[^>]*?/>)|i", $fcktext, $a)) { $j = $timg."_".md5($i); $List[$j]["content"] = $a[0]; $List[$j]["index"] = $j; $fcktext = str_replace($a[0], $j, $fcktext); $i++; } } $tagList = array("pre", "math", "gallery", "nowiki", "html"); foreach($tagList as $tag) { while (preg_match("|<($tag.*?)>(.*?)</$tag>|is", $fcktext, $a)) { $r = preg_replace("|<br.*?>|i", "", $a[0]); $r = preg_replace("| |i", " ", $r); $fcktext = str_replace($a[0], html_entity_decode($r), $fcktext); } } foreach($q->mTagHooks as $tag => $func) { while (preg_match("|<($tag.*?)>(.*?)</$tag>|is", $fcktext, $a)) { $r = preg_replace("|<br.*?>|i", "", $a[0]); $r = preg_replace("| |i", " ", $r); $fcktext = str_replace($a[0], html_entity_decode($r), $fcktext); } } $state = new StripState; $x =& $state; $fcktext = $q->strip($fcktext, $x); $fcktext = preg_replace("/<\/?tbody>/i","", $fcktext); $fcktext = preg_replace("/$wgFCKEditorToken/i","", $fcktext); $fcktext = Sanitizer::removeHTMLtags( $fcktext, array( &$q, 'attributeStripCallback' ) ); $fcktext = $q->replaceVariables($fcktext); #replace "stripToc" to "doDoubleUnderscore" into new version of MediaWiKi $fcktext = $q->doDoubleUnderscore( $fcktext ); $fcktext = $q->replaceInternalLinks( $fcktext ); $fcktext = $q->replaceExternalLinks( $fcktext ); # replaceInternalLinks may sometimes leave behind # absolute URLs, which have to be masked to hide them from replaceExternalLinks $fcktext = str_replace($q->mUniqPrefix."NOPARSE", "", $fcktext); $fcktext = $q->doMagicLinks( $fcktext ); $fcktext = $q->formatHeadings( $fcktext, true ); $q->replaceLinkHolders( $fcktext ); $fcktext = $q->unstripNoWiki( $fcktext, $state ); $fcktext = $q->unstrip($fcktext, $state); foreach($List as $item) { $fcktext = str_replace($item["index"], $item["content"], $fcktext); $i++; } $text = $fcktext; } return true; } function wfSajaxSearchImageFCKeditor( $term ) { global $wgContLang, $wgAjaxCachePolicy, $wgOut; $limit = 10; $term = $wgContLang->checkTitleEncoding( $wgContLang->recodeInput( js_unescape( $term ) ) ); $term1 = str_replace( ' ', '_', $wgContLang->ucfirst( $term ) ); $term2 = str_replace( ' ', '_', $wgContLang->lc( $term ) ); $term3 = str_replace( ' ', '_', $wgContLang->uc( $term ) ); $term = $term1; if ( strlen( str_replace( '_', '', $term ) )<3 ) return "<input type=\"hidden\" name=\"wfSajaxSearchImageFCKeditor\" value=\"\"><br /><b>\"".$term2."\"</b>: Type one more character ..."; $wgAjaxCachePolicy->setPolicy( 30*60 ); $db =& wfGetDB( DB_SLAVE ); $res = $db->select( 'page', 'page_title', array( 'page_namespace' => 6, "LCASE(page_title) LIKE '%". $db->strencode( $term2 ) ."%'" ), "wfSajaxSearch", array( 'LIMIT' => $limit+1 ) ); $r = ""; $i=0; while ( ( $row = $db->fetchObject( $res ) ) && ( ++$i <= $limit ) ) { $im = Image::newFromName($row->page_title); $url = $im->getURL(); $ti = Title::makeTitle(6, $row->page_title); $tiURL = ""; $tiName= ""; if (is_object($ti)) { $tiURL = $ti->getLocalURL(); $tiName = $ti->getPrefixedDBkey(); } $r .= '<li>' . "<div style=\"background-color: #DFDFDF; cursor: pointer;\" onMouseover=\"this.style.backgroundColor='#0099FF'\" onMouseout=\"this.style.backgroundColor='#DFDFDF'\" onclick=\"clickOnList('".$row->page_title."','".$url."','".$tiURL."','".$tiName."')\">".htmlspecialchars( $row->page_title ) .'</div>'. "</li>\n"; } $term = htmlspecialchars( $term ); return "<input type=\"hidden\" name=\"wfSajaxSearchImageFCKeditor\" value=\"\"><br />Images containing <b>\"".$term2."\"</b><br /><ul>" .$r ."</ul>"; } ?>
