Ticket #1410: 1410.patch

File 1410.patch, 15.5 KB (added by Deimon, 15 years ago)
  • FCKeditor.php

     
    6969$wgUseAjax = true;
    7070$wgAjaxExportList[] = 'wfSajaxSearchImageFCKeditor';
    7171$wgAjaxExportList[] = 'wfSajaxSearchArticleFCKeditor';
     72$wgAjaxExportList[] = 'wfSajaxSearchCategoryFCKeditor';
    7273$wgAjaxExportList[] = 'wfSajaxWikiToHTML';
    7374$wgAjaxExportList[] = 'wfSajaxGetImageUrl';
    7475$wgAjaxExportList[] = 'wfSajaxGetMathUrl';
  • fckeditor_config.js

     
    1212        ['Cut','Copy','Paste',/*'PasteText','PasteWord',*/'-','Print'],
    1313        ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
    1414        ['SpecialChar','Table','Image','Rule'],
    15         ['MW_Template','MW_Special','MW_Ref','MW_References','MW_Math'],
     15        ['MW_Template','MW_Special','MW_Ref','MW_References','MW_Math','Category'],
    1616        '/',
    1717        ['FontFormat'],
    1818        ['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
  • FCKeditorSajax.body.php

     
    145145        return $ret;
    146146}
    147147
     148function wfSajaxSearchCategoryFCKeditor()
     149{
     150        global $wgContLang, $wgOut;
     151        $ns = NS_CATEGORY;
     152        $db =& wfGetDB( DB_SLAVE );
     153        $m_sql="SELECT tmpSelectCat1.cl_to AS title FROM ".$db->tableName('categorylinks')." AS tmpSelectCat1 ".
     154                "LEFT JOIN ".$db->tableName('page')." AS tmpSelectCatPage ON ( tmpSelectCat1.cl_to = tmpSelectCatPage.page_title ".
     155                "AND tmpSelectCatPage.page_namespace =$ns ) ".
     156                "LEFT JOIN ".$db->tableName('categorylinks')." AS tmpSelectCat2 ON tmpSelectCatPage.page_id = tmpSelectCat2.cl_from ".
     157                "WHERE tmpSelectCat2.cl_from IS NULL GROUP BY tmpSelectCat1.cl_to";
     158
     159        $res = $db->query($m_sql,__METHOD__ );
     160
     161        $ret = "";
     162        $i=0;
     163        while ( ( $row = $db->fetchObject( $res ) ) ) {
     164                $ret .= $row->title ."\n";
     165                $sub = explode("\n",wfSajaxSearchCategoryChildrenFCKeditor($row->title));
     166                foreach($sub as $subrow)if(strlen($subrow)>0)$ret.=" ".$subrow."\n";
     167        }
     168
     169        return $ret;
     170}
     171
     172function wfSajaxSearchCategoryChildrenFCKeditor($m_root)
     173{
     174        global $wgContLang, $wgOut;
     175        $limit = 50;
     176        $ns = NS_CATEGORY;
     177    $m_root = str_replace("'","\'",$m_root);
     178        $db =& wfGetDB( DB_SLAVE );
     179    $m_sql ="SELECT tmpSelectCatPage.page_title AS title FROM ".$db->tableName('categorylinks')." AS tmpSelectCat ".
     180                        "LEFT JOIN ".$db->tableName('page')." AS tmpSelectCatPage ON tmpSelectCat.cl_from = tmpSelectCatPage.page_id ".
     181            "WHERE tmpSelectCat.cl_to LIKE '$m_root' AND tmpSelectCatPage.page_namespace = $ns";
     182       
     183       
     184        $res = $db->query($m_sql,__METHOD__ );
     185
     186        $ret = "";
     187        $i=0;
     188        while ( ( $row = $db->fetchObject( $res ) ) ) {
     189                $ret .= $row->title ."\n";
     190                $sub = explode("\n",wfSajaxSearchCategoryChildrenFCKeditor($row->title));
     191                foreach($sub as $subrow)if(strlen($subrow)>0)$ret.=" ".$subrow."\n";
     192               
     193        }
     194
     195        return $ret;
     196}
     197
    148198function wfSajaxSearchTemplateFCKeditor($empty) {
    149199        global $wgContLang, $wgOut;
    150200        $ns = NS_TEMPLATE;
  • plugins/mediawiki/dialogs/category.html

     
     1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
     2<!--
     3 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
     4 * Copyright (C) 2003-2007 Frederico Caldeira Knabben
     5 *
     6 * == BEGIN LICENSE ==
     7 *
     8 * Licensed under the terms of any of the following licenses at your
     9 * choice:
     10 *
     11 *  - GNU General Public License Version 2 or later (the "GPL")
     12 *    http://www.gnu.org/licenses/gpl.html
     13 *
     14 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
     15 *    http://www.gnu.org/licenses/lgpl.html
     16 *
     17 *  - Mozilla Public License Version 1.1 or later (the "MPL")
     18 *    http://www.mozilla.org/MPL/MPL-1.1.html
     19 *
     20 * == END LICENSE ==
     21 *
     22 * Category dialog window.
     23-->
     24<html>
     25<head>
     26        <title>Categories</title>
     27        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     28        <meta name="robots" content="noindex, nofollow" />
     29        <script type="text/javascript">
     30
     31var oEditor             = window.parent.InnerDialogLoaded() ;
     32var FCK                 = oEditor.FCK ;
     33var FCKLang             = oEditor.FCKLang ;
     34var FCKConfig   = oEditor.FCKConfig ;
     35var FCKRegexLib = oEditor.FCKRegexLib ;
     36var FCKTools    = oEditor.FCKTools ;
     37var FCKBrowserInfo      = oEditor.FCKBrowserInfo ;
     38var EditorDocument = oEditor.FCK.EditorDocument ;
     39
     40document.write( '<script src="' + FCKConfig.BasePath + 'dialog/common/fck_dialog_common.js" type="text/javascript"><\/script>' ) ;
     41
     42        </script>
     43        <script type="text/javascript">
     44
     45
     46window.onload = function()
     47{
     48        // Translate the dialog box texts.
     49        oEditor.FCKLanguageManager.TranslatePage(document) ;
     50
     51        // Load the selected link information (if any).
     52        InitSelected() ;
     53        SetSearchMessage( 'loading categories...' ) ;
     54        oEditor.window.parent.sajax_request_type = 'GET' ;
     55        oEditor.window.parent.sajax_do_call( 'wfSajaxSearchCategoryFCKeditor', [], InitCategoryTree ) ;
     56
     57        // Activate the "OK" button.
     58        window.parent.SetOkButton( true ) ;
     59        window.parent.SetAutoSize( true ) ;
     60}
     61
     62var selectedCats;
     63
     64function InitSelected()
     65{
     66        selectedCats=new Array();
     67        var node=EditorDocument;
     68    while(node){
     69                if(node.nodeType==1 && node.tagName.toLowerCase() == 'a'){
     70                        // Get the actual Link href.
     71                        var sHRef = node.getAttribute( '_fcksavedurl' ) ;
     72                        if ( sHRef == null )sHRef = node.getAttribute( 'href' , 2 ) || '' ;
     73                        if(sHRef.StartsWith('Category:')){
     74                                var select = GetE('xCategories' ) ;
     75                                var cat=sHRef.slice(9);
     76                                SelectCategory(cat,-1);
     77                        }
     78                }
     79        node=FCKTools.GetNextNode(node,EditorDocument);
     80    }
     81       
     82
     83        // Make an Ajax search for the pages.
     84}
     85
     86function SelectCategory(cat,catTreeRow)
     87{
     88        var row=parseInt(catTreeRow);
     89        if(row>=0){
     90                var select = GetE('xWikiResults' );
     91                cat=select.options[row].text;
     92                var lvl=0;
     93                while(cat.charAt(lvl)==placeholder)lvl++;
     94                cat=cat.slice(lvl);
     95                if(cat.charAt(0)=='[' && cat.charAt(cat.length-1)==']')cat=cat.substring(1,cat.length-1);
     96        }
     97
     98        if(selectedCats[cat])delete selectedCats[cat];
     99        else selectedCats[cat]=cat;
     100        var select = GetE( 'xCategories' ) ;
     101        while (select.options.length > 0 )select.remove( 0 );
     102        for(var cat in selectedCats) FCKTools.AddSelectOption( select, cat, cat) ;
     103}
     104
     105
     106var catTree;
     107
     108function InitCategoryTree( result )
     109{
     110        SetSearchMessage( '' ) ;
     111
     112        catTree=new Object();
     113        var levelsHead=new Array('root');
     114        var levelsBody=new Array('');
     115       
     116        var results = result.responseText.Trim().split( '\n' ) ;
     117        var previousLvl=-1;
     118                for ( var i = 0 ; i < results.length ; i++ ){
     119                        var lvl=0;
     120                        while(results[i].charAt(lvl)==' ')lvl++;
     121                        var t=results[i].slice(lvl);
     122                        for(var j=previousLvl;j>lvl-1;j--){
     123                       
     124                                if(levelsBody[j+1]!='')catTree[levelsHead[j+1]]=levelsBody[j+1];
     125                                delete levelsHead[j+1];
     126                                delete levelsBody[j+1];
     127                        }
     128                        if(lvl>previousLvl)levelsBody[lvl]=t;
     129                        else levelsBody[lvl]=levelsBody[lvl]+' '+t;
     130                        levelsHead[lvl+1]=t;
     131                        levelsBody[lvl+1]='';
     132                        previousLvl=lvl;
     133                }
     134                for(var j=previousLvl;j>=-1;j--){
     135                if(levelsBody[j+1]!='')catTree[levelsHead[j+1]]=levelsBody[j+1];
     136                delete levelsHead[j+1];
     137                delete levelsBody[j+1];
     138        }
     139
     140        ShowCategoriesSubTree(-1);
     141}
     142
     143var placeholder='.';
     144
     145//draw category subtree
     146function ShowCategoriesSubTree(rowInTree){
     147        var row=parseInt(rowInTree);
     148        var select = GetE('xWikiResults' ) ;
     149        var root='root';
     150        var lvl=-1;
     151        var prefix='';
     152        if(row>=0){
     153                root=select.options[row].text;
     154                lvl=0;
     155                while(root.charAt(lvl)==placeholder)lvl++;
     156                root=root.slice(lvl);
     157                if(root.charAt(0)=='[' && root.charAt(root.length-1)==']')
     158                        root=root.substring(1,root.length-1);
     159                prefix=new Array(lvl+1+3).join(placeholder);
     160        }
     161        if(!catTree[root])return;
     162       
     163        var itCount=select.options.length;
     164        var itSkip=row+1;
     165        var opts=new Array();
     166        for(var i=row+1;i<itCount;i++){
     167                var t=select.options[i].text;
     168                var sublvl=0;
     169                while(t.charAt(sublvl)==placeholder)sublvl++;
     170                if(sublvl>lvl)itSkip=i+1;
     171                else break;
     172        }
     173        for(var i=itCount-1;i>row;i--){
     174                var t=select.options[i].text;
     175                if(i>=itSkip)opts.push(t);
     176                select.remove(i);
     177        }
     178                if(itSkip==row+1){
     179                        var cats = catTree[root].split(' ') ;
     180
     181                        for(var k in cats){
     182                                var p=cats[k];
     183                                if(catTree[cats[k]])p='['+p+']';
     184                                var e=FCKTools.AddSelectOption( select, prefix+p, ++row) ;
     185                                if(catTree[cats[k]])e.style.color='#00f';
     186               
     187                        }       
     188                }
     189                for(var i=opts.length-1;i>=0;i--){
     190                        var e=FCKTools.AddSelectOption( select, opts[i], ++row) ;
     191                        if(opts[i].indexOf('[')>=0)e.style.color='#00f';
     192        }       
     193       
     194}
     195
     196//draw filtered
     197function ShowFilteredCategories(filter){
     198        var select = GetE('xWikiResults' ) ;
     199        while (select.options.length > 0 )select.remove( 0 );
     200        var found=new Object();
     201        if(filter.length==0){
     202                ShowCategoriesSubTree(-1);
     203                return;
     204        }
     205        filter=filter.toLowerCase();
     206        var row=-1;
     207        for(var folder in catTree){
     208                var cats = catTree[folder].split(' ') ;
     209                for(var k in cats){
     210                        var p=cats[k].toLowerCase();
     211                        if(p.indexOf(filter)>=0){
     212                                if(found[cats[k]]);
     213                                else{
     214                                        found[cats[k]]=cats[k];
     215                                        FCKTools.AddSelectOption( select, cats[k], ++row ) ;
     216                                }
     217                        }
     218                }
     219        }
     220}
     221
     222function AddNew(){
     223        var select = GetE('txtUrl' );
     224        SelectCategory(select.value,-1)
     225
     226}
     227
     228
     229//#### The OK button was hit.
     230function Ok()
     231{
     232        var nodes=new Array();
     233    var node=EditorDocument;
     234        var nodeNext;
     235        var s='';
     236        var i=0;
     237    while(node){
     238        nodeNext=FCKTools.GetNextNode(node,EditorDocument);
     239                if(node.nodeType==1 && node.tagName.toLowerCase() == 'a'){
     240                        // Get the actual Link href.
     241                        var sHRef = node.getAttribute( '_fcksavedurl' ) ;
     242                        if ( sHRef == null )sHRef = node.getAttribute( 'href' , 2 ) || '' ;
     243                        if(sHRef.StartsWith('Category:'))nodes[i++]=node;
     244                }
     245                node=nodeNext;
     246    }
     247        for(var i=0;i<nodes.length;i++)nodes[i].parentNode.removeChild(nodes[i]);
     248
     249        for(var cat in selectedCats)AddCategoryLink(cat);
     250        return true;
     251
     252}
     253
     254
     255function AddCategoryLink(cat){
     256        var sUri = 'Category:'+cat;
     257        var sInnerHtml ;
     258
     259        // If no link is selected, create a new one (it may result in more than one link creation - #220).
     260        var aLinks = oEditor.FCK.CreateLink( sUri ) ;
     261
     262        // If no selection, no links are created, so use the uri as the link text (by dom, 2006-05-26)
     263        var aHasSelection = ( aLinks.length > 0 ) ;
     264        if ( !aHasSelection )
     265        {
     266                sInnerHtml = sUri;
     267
     268                var oLinkPathRegEx = new RegExp("//?([^?\"']+)([?].*)?$") ;
     269                var asLinkPath = oLinkPathRegEx.exec( sUri ) ;
     270                if (asLinkPath != null)
     271                        sInnerHtml = asLinkPath[1];  // use matched path
     272               
     273                // Create a new (empty) anchor.
     274                aLinks = [ oEditor.FCK.InsertElement( 'a' ) ] ;
     275        }
     276
     277        oEditor.FCKUndo.SaveUndoStep() ;
     278
     279        for ( var i = 0 ; i < aLinks.length ; i++ )
     280        {
     281                oLink = aLinks[i] ;
     282
     283                if ( aHasSelection )
     284                        sInnerHtml = oLink.innerHTML ;          // Save the innerHTML (IE changes it if it is like an URL).
     285
     286                oLink.href = sUri ;
     287                SetAttribute( oLink, '_fcksavedurl', sUri ) ;
     288
     289                oLink.innerHTML = sInnerHtml ;          // Set (or restore) the innerHTML
     290
     291        }
     292
     293        // Select the (first) link.
     294        //oEditor.FCKSelection.SelectNode( aLinks[0] );
     295
     296        return true ;
     297
     298}
     299
     300//////////////////////
     301var searchTimer ;
     302
     303//#### Called while the user types the URL.
     304function OnUrlChange()
     305{
     306        var link =GetE('txtUrl').value.Trim();
     307ShowFilteredCategories(link);
     308return;
     309        if ( searchTimer )
     310                window.clearTimeout( searchTimer ) ;
     311               
     312        if ( link.StartsWith( '#' ) )
     313        {
     314                SetSearchMessage( 'anchor link... no search for it' ) ;
     315                return ;
     316        }
     317       
     318        if ( link.StartsWith( 'mailto:' ) )
     319        {
     320                SetSearchMessage( 'e-mail link... no search for it' ) ;
     321                return ;
     322        }
     323       
     324        if( /^\w+:\/\//.test( link ) )
     325        {
     326                SetSearchMessage( 'external link... no search for it' ) ;
     327                return ;
     328        }
     329
     330        /*if ( link.length < 3  )
     331        {
     332                ClearSearch() ;
     333
     334                if ( link.length == 0 )
     335                        SetSearchMessage( 'start typing in the above field' ) ;
     336                else
     337                        SetSearchMessage( 'too short... type more' ) ;
     338                return ;
     339        }
     340        */
     341        SetSearchMessage( 'stop typing to search' ) ;
     342        //searchTimer = window.setTimeout( StartSearch, 500 ) ;
     343}
     344
     345function SetSearchMessage( message )
     346{
     347        GetE('xWikiSearchStatus').innerHTML = message ;
     348}
     349
     350
     351
     352
     353
     354
     355
     356        </script>
     357</head>
     358<body scroll="no" style="overflow: hidden">
     359        <div id="divInfo">
     360                <div id="divLinkTypeUrl">
     361                        <span>Selected categories</span><br />
     362                        <select id="xCategories" size="10" style="width: 100%; height:70px"  ondblclick="SelectCategory( this.value,-1);">
     363                        </select><br />
     364                        Search category<br />
     365                        <input id="txtUrl" style="width: 80%" type="text" onkeyup="OnUrlChange();" />
     366                        <input id="btnNew" style="width: 18%" type="button" onclick="AddNew();" value="Add new"/>
     367                        <br />
     368                        Category tree (<span id="xWikiSearchStatus">start typing in the above field</span>)<br />
     369                        <select id="xWikiResults" size="10" style="width: 100%; height:300px" onclick="ShowCategoriesSubTree( this.value );" ondblclick="SelectCategory('', this.value );">
     370                        </select>
     371                </div>
     372        </div>
     373</body>
     374</html>
  • plugins/mediawiki/fckplugin.js

     
    8282tbButton.IconPath = FCKConfig.PluginsPath + 'mediawiki/images/tb_icon_special.gif' ;
    8383FCKToolbarItems.RegisterItem( 'MW_Special', tbButton ) ;
    8484
     85tbButton = new FCKToolbarButton( 'Category', 'Categories', 'Insert/Edit categories' ) ;
     86tbButton.IconPath = FCKConfig.PluginsPath + 'mediawiki/images/tb_icon_category.gif' ;
     87FCKToolbarItems.RegisterItem( 'Category', tbButton ) ;
     88
    8589// Override some dialogs.
    8690FCKCommands.RegisterCommand( 'MW_Template', new FCKDialogCommand( 'MW_Template', ( FCKLang.wikiCmdTemplate || 'Template Properties' ), FCKConfig.PluginsPath + 'mediawiki/dialogs/template.html', 400, 330 ) ) ;
    8791FCKCommands.RegisterCommand( 'MW_Ref', new FCKDialogCommand( 'MW_Ref', ( FCKLang.wikiCmdReference || 'Reference Properties' ), FCKConfig.PluginsPath + 'mediawiki/dialogs/ref.html', 400, 250 ) ) ;
    8892FCKCommands.RegisterCommand( 'MW_Math', new FCKDialogCommand( 'MW_Math', ( FCKLang.wikiCmdFormula || 'Formula' ), FCKConfig.PluginsPath + 'mediawiki/dialogs/math.html', 400, 300 ) ) ;
    8993FCKCommands.RegisterCommand( 'MW_Special', new FCKDialogCommand( 'MW_Special', ( FCKLang.wikiCmdSpecial || 'Special Tag Properties' ), FCKConfig.PluginsPath + 'mediawiki/dialogs/special.html', 400, 330 ) ) ;
    9094FCKCommands.RegisterCommand( 'Link', new FCKDialogCommand( 'Link', FCKLang.DlgLnkWindowTitle, FCKConfig.PluginsPath + 'mediawiki/dialogs/link.html', 400, 250 ) ) ;
     95FCKCommands.RegisterCommand( 'Category', new FCKDialogCommand( 'Category', 'Categories', FCKConfig.PluginsPath + 'mediawiki/dialogs/category.html', 400, 500 ) ) ;
    9196FCKCommands.RegisterCommand( 'Image', new FCKDialogCommand( 'Image', FCKLang.DlgImgTitle, FCKConfig.PluginsPath + 'mediawiki/dialogs/image.html', 450, 300 ) ) ;
    9297
    9398FCKToolbarItems.OldGetItem = FCKToolbarItems.GetItem;
© 2003 – 2022, CKSource sp. z o.o. sp.k. All rights reserved. | Terms of use | Privacy policy