WordPress.org

Make WordPress Core

Ticket #11420: internal-linking.first-pass.diff

File internal-linking.first-pass.diff, 17.4 KB (added by koopersmith, 10 years ago)
  • wp-includes/js/tinymce/plugins/wplink/editor_plugin.js

     
     1(function() {
     2        tinymce.create('tinymce.plugins.wpLink', {
     3                /**
     4                 * Initializes the plugin, this will be executed after the plugin has been created.
     5                 * This call is done before the editor instance has finished it's initialization so use the onInit event
     6                 * of the editor instance to intercept that event.
     7                 *
     8                 * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
     9                 * @param {string} url Absolute URL to where the plugin is located.
     10                 */
     11                init : function(ed, url) {
     12                        // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
     13                        ed.addCommand('WP_Link', function() {
     14                                ed.windowManager.open({
     15                                        file : tinymce.baseURL + '/wp-mce-link.php',
     16                                        width : 320,
     17                                        height : 260,
     18                                        inline : 1
     19                                }, {
     20                                        plugin_url : url // Plugin absolute URL
     21                                });
     22                        });
     23
     24                        // Register example button
     25                        ed.addButton('wplink', {
     26                                title : ed.getLang('wplink.link_desc'),
     27                                cmd : 'WP_Link'
     28                        });
     29                       
     30                        ed.addShortcut('alt+shift+a', ed.getLang('wplink.link_desc'), 'WP_Link');
     31
     32                        // Add a node change handler, selects the button in the UI when a link is selected
     33                        ed.onNodeChange.add(function(ed, cm, n) {
     34                                cm.setActive('wplink', n.nodeName == 'A');
     35                        });
     36                },
     37                /**
     38                 * Returns information about the plugin as a name/value array.
     39                 * The current keys are longname, author, authorurl, infourl and version.
     40                 *
     41                 * @return {Object} Name/value array containing information about the plugin.
     42                 */
     43                getInfo : function() {
     44                        return {
     45                                longname : 'WordPress Link Dialog',
     46                                author : 'WordPress',
     47                                authorurl : 'http://wordpress.org',
     48                                infourl : '',
     49                                version : "1.0"
     50                        };
     51                }
     52        });
     53
     54        // Register plugin
     55        tinymce.PluginManager.add('wplink', tinymce.plugins.wpLink);
     56})();
     57 No newline at end of file
  • wp-includes/js/tinymce/plugins/wplink/js/wplink.js

     
     1(function($){   
     2        var inputs = {}, panels, active, ed,
     3        wpLink = {
     4                init : function() {
     5                        var e, etarget, eclass;
     6                        // Init shared vars
     7                        ed = tinyMCEPopup.editor;
     8                        // Secondary options
     9                        inputs.title = $('#link-title-field');
     10                        // Advanced Options
     11                        inputs.advancedOptions = $('#link-advanced-options');
     12                        inputs.target = $('#link-target-select');
     13                        inputs['class'] = $('#link-class-select');
     14                        // Types
     15                        inputs.typeDropdown = $('#link-type');
     16                        inputs.typeOptions = inputs.typeDropdown.find('option');
     17                       
     18                        panels = $('.link-panel');
     19                        active = $('.link-panel-active');
     20                       
     21                        // Build lists
     22                        wpLink.fillClassList('link-class-select');
     23                        wpLink.fillTargetList('link-target-select');
     24                       
     25                        // Extract type names
     26                        inputs.typeOptions.each( function(){
     27                                $(this).data( 'link-type', this.id.replace('link-option-id-','') );
     28                        });
     29                        panels.each( function(){
     30                                $(this).data( 'link-type', this.id.replace('link-panel-id-','') );
     31                        });
     32                       
     33                        // Bind event handlers
     34                        inputs.typeDropdown.change( wpLink.selectPanel );
     35                        $('#wp-update').click( wpLink.update );
     36                        $('#wp-cancel').click( function() { tinyMCEPopup.close(); } );
     37                        $('#link-advanced-options-toggle').click( wpLink.toggleAdvancedOptions );
     38                       
     39                        // If link exists, select proper values.
     40                        e = ed.dom.getParent(ed.selection.getNode(), 'A');
     41                        if ( ! e )
     42                                return;
     43                       
     44                        // @TODO: select proper panel/fill values when a link is edited
     45                        active.find('input.url-field').val( e.href );
     46                        inputs.title.val( ed.dom.getAttrib(e, 'title') );
     47                        // Advanced Options
     48                        inputs.target.val( etarget = ed.dom.getAttrib(e, 'target') );
     49                        inputs['class'].val( eclass = ed.dom.getAttrib(e, 'class') );
     50                        if ( etarget || eclass ) // Open the adv. options if one is set.
     51                                inputs.advancedOptions.toggleClass('adv-options-active');
     52                },
     53               
     54                update : function() {
     55                        var ed = tinyMCEPopup.editor,
     56                                attrs = {
     57                                        href : active.find('input.url-field').val(),
     58                                        title : inputs.title.val(),
     59                                        target : inputs.target.val(),
     60                                        'class' : inputs['class'].val()
     61                                }, defaultContent, e, b;
     62                       
     63                        if ( active.hasClass('link-panel-custom') )
     64                                defaultContent = attrs.href;
     65                        else // @TODO: Update to use the title
     66                                defaultContent = attrs.href;
     67                       
     68                        tinyMCEPopup.restoreSelection();
     69                        e = ed.dom.getParent(ed.selection.getNode(), 'A');
     70                       
     71                        // If the values are empty...
     72                        if ( ! attrs.href ) {
     73                                // ...and nothing is selected, we should return
     74                                if ( ed.selection.isCollapsed() ) {
     75                                        tinyMCEPopup.close();
     76                                        return;
     77                                // ...and a link exists, we should unlink and return
     78                                } else if ( e ) {
     79                                        tinyMCEPopup.execCommand("mceBeginUndoLevel");
     80                                        b = ed.selection.getBookmark();
     81                                        ed.dom.remove(e, 1);
     82                                        ed.selection.moveToBookmark(b);
     83                                        tinyMCEPopup.execCommand("mceEndUndoLevel");
     84                                        tinyMCEPopup.close();
     85                                        return;
     86                                }
     87                        }
     88                       
     89                        tinyMCEPopup.execCommand("mceBeginUndoLevel");
     90
     91                        if (e == null) {
     92                                ed.getDoc().execCommand("unlink", false, null);
     93                               
     94                                // If no selection exists, create a new link from scratch.
     95                                if ( ed.selection.isCollapsed() ) {
     96                                        var el = ed.dom.create('a', { href: "#mce_temp_url#" }, defaultContent);
     97                                        ed.selection.setNode(el);
     98                                // If a selection exists, wrap it in a link.
     99                                } else {
     100                                        tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1});
     101                                }
     102
     103                                tinymce.each(ed.dom.select("a"), function(n) {
     104                                        if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') {
     105                                                e = n;
     106                                                ed.dom.setAttribs(e, attrs);
     107                                        }
     108                                });
     109                        } else {
     110                                ed.dom.setAttribs(e, attrs);
     111                        }
     112
     113                        // Don't move caret if selection was image
     114                        if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') {
     115                                ed.focus();
     116                                ed.selection.select(e);
     117                                ed.selection.collapse(0);
     118                                tinyMCEPopup.storeSelection();
     119                        }
     120
     121                        tinyMCEPopup.execCommand("mceEndUndoLevel");
     122                        tinyMCEPopup.close();
     123                },
     124               
     125                selectPanel : function( option ) {
     126                        var sel = inputs.typeOptions.filter(':selected');
     127                       
     128                        if ( option.jquery ) {
     129                                sel.removeAttr('selected');
     130                                sel = option.attr('selected', 'selected');
     131                        }
     132                       
     133                        active.removeClass('link-panel-active');
     134                        active = $('#link-panel-id-' + sel.data('link-type') ).addClass('link-panel-active');
     135                },
     136               
     137                toggleAdvancedOptions : function() {
     138                        inputs.advancedOptions.toggleClass('adv-options-active');
     139                        return false;
     140                },
     141               
     142                /**
     143                 * Taken from themes/advanced/js/link.js
     144                 */
     145                fillClassList : function(id) {
     146                        var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
     147
     148                        if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
     149                                cl = [];
     150
     151                                tinymce.each(v.split(';'), function(v) {
     152                                        var p = v.split('=');
     153
     154                                        cl.push({'title' : p[0], 'class' : p[1]});
     155                                });
     156                        } else
     157                                cl = tinyMCEPopup.editor.dom.getClasses();
     158
     159                        if (cl.length > 0) {
     160                                lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
     161
     162                                tinymce.each(cl, function(o) {
     163                                        lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
     164                                });
     165                        } else
     166                                dom.remove(dom.getParent(id, 'tr'));
     167                },
     168
     169                /**
     170                 * Taken from themes/advanced/js/link.js
     171                 */
     172                fillTargetList : function(id) {
     173                        var dom = tinyMCEPopup.dom, lst = dom.get(id), v;
     174
     175                        lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
     176                        lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self');
     177                        lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank');
     178
     179                        if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) {
     180                                tinymce.each(v.split(','), function(v) {
     181                                        v = v.split('=');
     182                                        lst.options[lst.options.length] = new Option(v[0], v[1]);
     183                                });
     184                        }
     185                }
     186        }
     187       
     188        $(document).ready( wpLink.init );
     189})(jQuery);
     190 No newline at end of file
  • wp-includes/js/tinymce/langs/wp-langs-en.js

     
    429429caption:"Edit Image Caption",
    430430alt:"Edit Alternate Text"
    431431});
     432
     433tinyMCE.addI18n("en.wplink",{
     434link_desc:"Insert/edit link",
     435unlink_desc:"Unlink (Alt+Shift+S)"
     436});
  • wp-includes/js/tinymce/langs/wp-langs.php

     
    452452caption:"' . mce_escape( __('Edit Image Caption') ) . '",
    453453alt:"' . mce_escape( __('Edit Alternate Text') ) . '"
    454454});
     455
     456tinyMCE.addI18n("' . $language . '.wplink",{
     457link_desc:"' . mce_escape( __('Insert/edit link') ) . '",
     458unlink_desc:"' . mce_escape( __('Unlink') ) . ' (Alt+Shift+S)"
     459});
    455460';
  • wp-includes/js/tinymce/themes/advanced/skins/wp_theme/ui.css

     
    274274.wp_themeSkin span.mce_anchor {background-position:-200px 0}
    275275.wp_themeSkin span.mce_indent {background-position:-400px 0}
    276276.wp_themeSkin span.mce_outdent {background-position:-540px 0}
    277 .wp_themeSkin span.mce_link {background-position:-500px 0}
     277.wp_themeSkin span.mce_link,
     278.wp_themeSkin span.mce_wplink {background-position:-500px 0}
    278279.wp_themeSkin span.mce_unlink {background-position:-640px 0}
    279280.wp_themeSkin span.mce_sub {background-position:-600px 0}
    280281.wp_themeSkin span.mce_sup {background-position:-620px 0}
  • wp-includes/js/tinymce/wp-mce-link.php

     
     1<?php
     2/** @ignore */
     3require_once('../../../wp-load.php');
     4
     5// Set up some vars
     6$pts = get_post_types( array( 'show_ui' => true ), 'objects' );
     7$taxes = get_taxonomies( array( 'show_ui' => true ), 'objects' );
     8
     9// Helper functions
     10function wp_link_panel_custom() { ?>
     11        <div id="link-panel-id-custom" class="link-panel link-panel-custom link-panel-active">
     12                <label>
     13                        <span><?php _e('URL:'); ?></span><input class="url-field" type="text" />
     14                </label>
     15        </div>
     16<?php }
     17function wp_link_panel_post_type( $pt_obj ) { ?>
     18        <div id="link-panel-id-<?php echo $pt_obj->name; ?>" class="link-panel link-panel-pt">
     19                <label>
     20                        <span><?php _e('URL:'); ?></span><input class="url-field" type="text" />
     21                </label>
     22        </div>
     23<?php }
     24function wp_link_panel_taxonomy( $tax_obj ) { ?>
     25        <div id="link-panel-id-<?php echo $tax_obj->name; ?>" class="link-panel link-panel-tax">
     26                <label>
     27                        <span><?php _e('URL:'); ?></span><input class="url-field" type="text" />
     28                </label>
     29        </div>
     30<?php }
     31
     32
     33header('Content-Type: text/html; charset=' . get_bloginfo('charset'));
     34?>
     35<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     36<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
     37<head>
     38<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
     39<title><?php _e('Insert/edit link') ?></title>
     40<script type="text/javascript" src="tiny_mce_popup.js?ver=3223"></script>
     41<?php
     42wp_print_scripts( array('jquery') );
     43?>
     44<script type="text/javascript" src="plugins/wplink/js/wplink.js?ver=1.0"></script>
     45<?php
     46wp_admin_css( 'global', true );
     47wp_admin_css( 'wp-admin', true );
     48wp_admin_css( 'colors-fresh', true );
     49?>
     50<style>
     51html, body {
     52        background: #f1f1f1;
     53}
     54
     55a:link, a:visited {
     56        color: #21759B;
     57}
     58
     59select {
     60        height: 2em;
     61}
     62
     63#link-header,
     64#link-options,
     65#link-advanced-options {
     66        padding: 5px;
     67        border-bottom: 1px solid #dfdfdf;
     68}
     69#link-type {
     70        width: 140px;
     71}
     72
     73.link-panel {
     74        padding: 5px 5px 0;
     75        display: none;
     76}
     77        .link-panel-active {
     78                display: block;
     79        }
     80
     81label input[type="text"] {
     82        width: 220px;
     83}
     84
     85label span {
     86        display: inline-block;
     87        width: 80px;
     88        text-align: right;
     89        padding-right: 5px;
     90}
     91
     92#link-advanced-options,
     93#link-advanced-options select,
     94#link-advanced-options option {
     95        font-size: 11px;
     96}
     97
     98#link-advanced-options {
     99        background: #f9f9f9;
     100        padding: 3px 5px;
     101}
     102        #link-advanced-options label select {
     103                width: 195px;
     104        }
     105
     106#link-advanced-options-toggle {
     107        display: block;
     108}
     109
     110#link-advanced-options label {
     111        padding-top: 2px;
     112        display: none;
     113}
     114        #link-advanced-options.adv-options-active label {
     115                display: block;
     116        }
     117
     118.submitbox {
     119        padding: 5px;
     120        font-size: 11px;
     121        overflow: auto;
     122        height: 29px;
     123}
     124#wp-cancel {
     125        line-height: 25px;
     126        float: left;
     127}
     128#wp-update {
     129        line-height: 23px;
     130        float: right;
     131}
     132#wp-update a {
     133        display: inline-block;
     134}
     135</style>
     136</head>
     137<body>
     138<div id="link-header">
     139        <label for="link-type">
     140                <span><strong><?php _e('Link Type:'); ?></strong>
     141                </span><select id="link-type">
     142                        <option id="link-option-id-custom" class="link-custom"><?php _e('External Link'); ?></option>
     143                <?php
     144                foreach ( $pts as $pt_obj )
     145                        echo '<option id="link-option-id-' . $pt_obj->name . '" class="link-option-pt">' . $pt_obj->labels->singular_name . '</option>';
     146                foreach ( $taxes as $tax_obj )
     147                        echo '<option id="link-option-id-' . $tax_obj->name . '" class="link-option-tax">' . $tax_obj->labels->singular_name . '</option>';
     148                ?>
     149                </select>
     150        </label>
     151</div>
     152<div id="link-selector">
     153        <?php
     154        wp_link_panel_custom();
     155        foreach ( $pts as $pt_obj ) {
     156                wp_link_panel_post_type( $pt_obj );
     157        }
     158        foreach ( $taxes as $tax_obj ) {
     159                wp_link_panel_taxonomy( $tax_obj );
     160        }
     161        ?>
     162        <div id="link-options">
     163                <label for="link-title-field">
     164                        <span><?php _e('Description:'); ?></span><input id="link-title-field" type="text" />
     165                </label>
     166        </div>
     167        <div id="link-advanced-options">
     168                <a id="link-advanced-options-toggle" href="#"><?php _e('Advanced Options'); ?></a>
     169                <label for="link-target-select">
     170                        <span><?php _e('Target:'); ?></span><select id="link-target-select"></select>
     171                </label>
     172                <label for="link-class-select">
     173                        <span><?php _e('Class:'); ?></span><select id="link-class-select"></select>
     174                </label>
     175        </div>
     176</div>
     177<div class="submitbox">
     178        <div id="wp-cancel">
     179                <a class="submitdelete deletion"><?php _e('Cancel'); ?></a>
     180        </div>
     181        <div id="wp-update">
     182                <a class="button-primary"><?php _e('Update'); ?></a>
     183        </div>
     184</div>
     185</body>
     186</html>
  • wp-admin/includes/post.php

     
    13111311        $mce_spellchecker_languages = apply_filters('mce_spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv');
    13121312
    13131313        if ( $teeny ) {
    1314                 $plugins = apply_filters( 'teeny_mce_plugins', array('inlinepopups', 'media', 'fullscreen', 'wordpress') );
     1314                $plugins = apply_filters( 'teeny_mce_plugins', array('inlinepopups', 'media', 'fullscreen', 'wordpress', 'wplink') );
    13151315                $ext_plugins = '';
    13161316        } else {
    1317                 $plugins = array( 'inlinepopups', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen', 'wpeditimage', 'wpgallery', 'tabfocus' );
     1317                $plugins = array( 'inlinepopups', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen', 'wpeditimage', 'wpgallery', 'tabfocus', 'wplink' );
    13181318
    13191319                /*
    13201320                The following filter takes an associative array of external plugins for TinyMCE in the form 'plugin_name' => 'url'.
     
    13981398        $plugins = implode($plugins, ',');
    13991399
    14001400        if ( $teeny ) {
    1401                 $mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold, italic, underline, blockquote, separator, strikethrough, bullist, numlist,justifyleft, justifycenter, justifyright, undo, redo, link, unlink, fullscreen') );
     1401                $mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold, italic, underline, blockquote, separator, strikethrough, bullist, numlist,justifyleft, justifycenter, justifyright, undo, redo, wplink, unlink, fullscreen') );
    14021402                $mce_buttons = implode($mce_buttons, ',');
    14031403                $mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = '';
    14041404        } else {
    1405                 $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'blockquote', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'wp_more', '|', 'spellchecker', 'fullscreen', 'wp_adv' ));
     1405                $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'blockquote', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'wplink', 'unlink', 'wp_more', '|', 'spellchecker', 'fullscreen', 'wp_adv' ));
    14061406                $mce_buttons = implode($mce_buttons, ',');
    14071407
    14081408                $mce_buttons_2 = array('formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', 'removeformat', '|' );