Make WordPress Core

Changeset 22567


Ignore:
Timestamp:
11/14/2012 07:17:22 AM (14 years ago)
Author:
koopersmith
Message:

Media: Restore 3.4 editor behavior and remove TinyMCE views.

  • Reactivates the wpgallery and wpeditimage TinyMCE plugins. Deactivates the wpviews TinyMCE plugin.
  • Moves still-relevant logic from mce-views.js to media-upload.js and shortcode.js.
  • No longer include wp-includes/js/mce-views.js. This code will not be used in 3.5, and should be considered unstable.
  • Currently, this is the real 3.4 experience; as such, editing triggers the old modals. Changing this is the next major step.

When reassessing views, we should look over all of these tickets and anticipate these bugs accordingly.

fixes #21813, #22123, #22155, #22161, #22257, #22266, #22318, #22407, see #21390.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/js/media-upload.js

    r22547 r22567  
    9191// -----------------------------
    9292(function($){
    93         // Stores the editors' `wp.media.controller.Workflow` instances.
    94         var workflows = {};
    95 
    96         wp.mce.media = {
     93        // Stores the editors' `wp.media.controller.Frame` instances.
     94        var workflows = {},
     95                linkToUrl;
     96
     97        linkToUrl = function( attachment, props ) {
     98                var link = props.link,
     99                        url;
     100
     101                if ( 'file' === link )
     102                        url = attachment.get('url');
     103                else if ( 'post' === link )
     104                        url = attachment.get('link');
     105                else if ( 'custom' === link )
     106                        url = props.linkUrl;
     107
     108                return url || '';
     109        };
     110
     111        wp.media.string = {};
     112
     113        wp.media.string.link = function( attachment, props ) {
     114                var linkTo  = getUserSetting( 'urlbutton', 'post' ),
     115                        options = {
     116                                tag:     'a',
     117                                content: attachment.get('title') || attachment.get('filename'),
     118                                attrs:   {
     119                                        rel: 'attachment wp-att-' + attachment.id
     120                                }
     121                        };
     122
     123                options.attrs.href = linkToUrl( attachment, props );
     124
     125                return wp.html.string( options );
     126        };
     127
     128        wp.media.string.image = function( attachment, props ) {
     129                var classes, img, options, size, shortcode, html;
     130
     131                props = _.defaults( props || {}, {
     132                        img:   {},
     133                        align: getUserSetting( 'align', 'none' ),
     134                        size:  getUserSetting( 'imgsize', 'medium' ),
     135                        link:  getUserSetting( 'urlbutton', 'post' )
     136                });
     137
     138                props.linkUrl = linkToUrl( attachment, props );
     139
     140                attachment = attachment.toJSON();
     141
     142                img     = _.clone( props.img );
     143                classes = img['class'] ? img['class'].split(/\s+/) : [];
     144                size    = attachment.sizes ? attachment.sizes[ props.size ] : {};
     145
     146                if ( ! size ) {
     147                        delete props.size;
     148                        size = attachment;
     149                }
     150
     151                img.width  = size.width;
     152                img.height = size.height;
     153                img.src    = size.url;
     154
     155                // Only assign the align class to the image if we're not printing
     156                // a caption, since the alignment is sent to the shortcode.
     157                if ( props.align && ! attachment.caption )
     158                        classes.push( 'align' + props.align );
     159
     160                if ( props.size )
     161                        classes.push( 'size-' + props.size );
     162
     163                classes.push( 'wp-image-' + attachment.id );
     164
     165                img['class'] = _.compact( classes ).join(' ');
     166
     167                // Generate `img` tag options.
     168                options = {
     169                        tag:    'img',
     170                        attrs:  img,
     171                        single: true
     172                };
     173
     174                // Generate the `href` based on the `link` property.
     175                if ( props.linkUrl ) {
     176                        props.anchor = props.anchor || {};
     177                        props.anchor.href = props.linkUrl;
     178                }
     179
     180                // Generate the `a` element options, if they exist.
     181                if ( props.anchor ) {
     182                        options = {
     183                                tag:     'a',
     184                                attrs:   props.anchor,
     185                                content: options
     186                        };
     187                }
     188
     189                html = wp.html.string( options );
     190
     191                // Generate the caption shortcode.
     192                if ( attachment.caption ) {
     193                        shortcode = {
     194                                id:    'attachment_' + attachment.id,
     195                                width: img.width
     196                        };
     197
     198                        if ( props.align )
     199                                shortcode.align = 'align' + props.align;
     200
     201                        html = wp.shortcode.string({
     202                                tag:     'caption',
     203                                attrs:   shortcode,
     204                                content: html + ' ' + attachment.caption
     205                        });
     206                }
     207
     208                return html;
     209        };
     210
     211        wp.media.gallery = (function() {
     212                var galleries = {};
     213
     214                return {
     215                        attachments: function( shortcode, parent ) {
     216                                var shortcodeString = shortcode.string(),
     217                                        result = galleries[ shortcodeString ],
     218                                        attrs, args, query, others;
     219
     220                                delete galleries[ shortcodeString ];
     221
     222                                if ( result )
     223                                        return result;
     224
     225                                attrs = shortcode.attrs.named;
     226                                args  = _.pick( attrs, 'orderby', 'order' );
     227
     228                                args.type    = 'image';
     229                                args.perPage = -1;
     230
     231                                // Map the `ids` param to the correct query args.
     232                                if ( attrs.ids ) {
     233                                        args.post__in = attrs.ids.split(',');
     234                                        args.orderby  = 'post__in';
     235                                } else if ( attrs.include ) {
     236                                        args.post__in = attrs.include.split(',');
     237                                }
     238
     239                                if ( attrs.exclude )
     240                                        args.post__not_in = attrs.exclude.split(',');
     241
     242                                if ( ! args.post__in )
     243                                        args.parent = attrs.id || parent;
     244
     245                                // Collect the attributes that were not included in `args`.
     246                                others = {};
     247                                _.filter( attrs, function( value, key ) {
     248                                        if ( _.isUndefined( args[ key ] ) )
     249                                                others[ key ] = value;
     250                                });
     251
     252                                query = media.query( args );
     253                                query.gallery = new Backbone.Model( others );
     254                                return query;
     255                        },
     256
     257                        shortcode: function( attachments ) {
     258                                var props = attachments.props.toJSON(),
     259                                        attrs = _.pick( props, 'include', 'exclude', 'orderby', 'order' ),
     260                                        shortcode, clone;
     261
     262                                if ( attachments.gallery )
     263                                        _.extend( attrs, attachments.gallery.toJSON() );
     264
     265                                attrs.ids = attachments.pluck('id');
     266
     267                                // If the `ids` attribute is set and `orderby` attribute
     268                                // is the default value, clear it for cleaner output.
     269                                if ( attrs.ids && 'post__in' === attrs.orderby )
     270                                        delete attrs.orderby;
     271
     272                                shortcode = new wp.shortcode({
     273                                        tag:    'gallery',
     274                                        attrs:  attrs,
     275                                        type:   'single'
     276                                });
     277
     278                                // Use a cloned version of the gallery.
     279                                clone = new wp.media.model.Attachments( attachments.models, {
     280                                        props: props
     281                                });
     282                                clone.gallery = attachments.gallery;
     283                                galleries[ shortcode.string() ] = clone;
     284
     285                                return shortcode;
     286                        }
     287                };
     288        }());
     289
     290        wp.media.editor = {
    97291                insert: send_to_editor,
    98292
     
    135329
    136330                        workflow.get('gallery-edit').on( 'update', function( selection ) {
    137                                 var view = wp.mce.view.get('gallery'),
    138                                         shortcode;
    139 
    140                                 if ( ! view )
    141                                         return;
    142 
    143                                 shortcode = view.gallery.shortcode( selection );
    144                                 this.insert( shortcode.string() );
     331                                this.insert( wp.media.gallery.shortcode( selection ).string() );
    145332                        }, this );
    146333
     
    212399                                        return;
    213400
    214                                 workflow = wp.mce.media.get( editor );
     401                                workflow = wp.media.editor.get( editor );
    215402
    216403                                // If the workflow exists, just open it.
     
    221408
    222409                                // Initialize the editor's workflow if we haven't yet.
    223                                 wp.mce.media.add( editor );
     410                                wp.media.editor.add( editor );
    224411                        });
    225412                }
    226413        };
    227414
    228         $( wp.mce.media.init );
     415        $( wp.media.editor.init );
    229416}(jQuery));
  • trunk/wp-includes/class-wp-editor.php

    r22416 r22567  
    192192                                self::$mce_locale = $mce_locale = ( '' == get_locale() ) ? 'en' : strtolower( substr(get_locale(), 0, 2) ); // only ISO 639-1
    193193                                $no_captions = (bool) apply_filters( 'disable_captions', '' );
    194                                 $plugins = array( 'inlinepopups', 'spellchecker', 'tabfocus', 'paste', 'media', 'fullscreen', 'wordpress', 'wplink', 'wpdialogs', 'wpview' );
     194                                $plugins = array( 'inlinepopups', 'spellchecker', 'tabfocus', 'paste', 'media', 'fullscreen', 'wordpress', 'wpeditimage', 'wpgallery', 'wplink', 'wpdialogs' );
    195195                                $first_run = true;
    196196                                $ext_plugins = '';
    197197
    198198                                if ( $set['teeny'] ) {
    199                                         self::$plugins = $plugins = apply_filters( 'teeny_mce_plugins', array('inlinepopups', 'fullscreen', 'wordpress', 'wplink', 'wpdialogs', 'wpview'), $editor_id );
     199                                        self::$plugins = $plugins = apply_filters( 'teeny_mce_plugins', array('inlinepopups', 'fullscreen', 'wordpress', 'wplink', 'wpdialogs' ), $editor_id );
    200200                                } else {
    201201                                        /*
  • trunk/wp-includes/js/mce-view.js

    r22554 r22567  
    11// Ensure the global `wp` object exists.
    22window.wp = window.wp || {};
    3 
    4 // HTML utility functions
    5 // ----------------------
    6 (function(){
    7         wp.html = _.extend( wp.html || {}, {
    8                 // ### Parse HTML attributes.
    9                 //
    10                 // Converts `content` to a set of parsed HTML attributes.
    11                 // Utilizes `wp.shortcode.attrs( content )`, which is a valid superset of
    12                 // the HTML attribute specification. Reformats the attributes into an
    13                 // object that contains the `attrs` with `key:value` mapping, and a record
    14                 // of the attributes that were entered using `empty` attribute syntax (i.e.
    15                 // with no value).
    16                 attrs: function( content ) {
    17                         var result, attrs;
    18 
    19                         // If `content` ends in a slash, strip it.
    20                         if ( '/' === content[ content.length - 1 ] )
    21                                 content = content.slice( 0, -1 );
    22 
    23                         result = wp.shortcode.attrs( content );
    24                         attrs  = result.named;
    25 
    26                         _.each( result.numeric, function( key ) {
    27                                 if ( /\s/.test( key ) )
    28                                         return;
    29 
    30                                 attrs[ key ] = '';
    31                         });
    32 
    33                         return attrs;
    34                 },
    35 
    36                 // ### Convert an HTML-representation of an object to a string.
    37                 string: function( options ) {
    38                         var text = '<' + options.tag,
    39                                 content = options.content || '';
    40 
    41                         _.each( options.attrs, function( value, attr ) {
    42                                 text += ' ' + attr;
    43 
    44                                 // Use empty attribute notation where possible.
    45                                 if ( '' === value )
    46                                         return;
    47 
    48                                 // Convert boolean values to strings.
    49                                 if ( _.isBoolean( value ) )
    50                                         value = value ? 'true' : 'false';
    51 
    52                                 text += '="' + value + '"';
    53                         });
    54 
    55                         // Return the result if it is a self-closing tag.
    56                         if ( options.single )
    57                                 return text + ' />';
    58 
    59                         // Complete the opening tag.
    60                         text += '>';
    61 
    62                         // If `content` is an object, recursively call this function.
    63                         text += _.isObject( content ) ? wp.html.string( content ) : content;
    64 
    65                         return text + '</' + options.tag + '>';
    66                 }
    67         });
    68 }());
    693
    704(function($){
     
    410344                        $node.removeClass('selected');
    411345                        $( node.firstChild ).trigger('deselect');
    412                 },
    413 
    414                 // Link any localized strings.
    415                 l10n: _.isUndefined( _wpMceViewL10n ) ? {} : _wpMceViewL10n
     346                }
    416347        };
    417348
    418349}(jQuery));
    419 
    420 // Default TinyMCE Views
    421 // ---------------------
    422 (function($){
    423         var mceview = wp.mce.view,
    424                 linkToUrl;
    425 
    426         linkToUrl = function( attachment, props ) {
    427                 var link = props.link,
    428                         url;
    429 
    430                 if ( 'file' === link )
    431                         url = attachment.get('url');
    432                 else if ( 'post' === link )
    433                         url = attachment.get('link');
    434                 else if ( 'custom' === link )
    435                         url = props.linkUrl;
    436 
    437                 return url || '';
    438         };
    439 
    440         wp.media.string = {};
    441 
    442         wp.media.string.link = function( attachment, props ) {
    443                 var linkTo  = getUserSetting( 'urlbutton', 'post' ),
    444                         options = {
    445                                 tag:     'a',
    446                                 content: attachment.get('title') || attachment.get('filename'),
    447                                 attrs:   {
    448                                         rel: 'attachment wp-att-' + attachment.id
    449                                 }
    450                         };
    451 
    452                 options.attrs.href = linkToUrl( attachment, props );
    453 
    454                 return wp.html.string( options );
    455         };
    456 
    457         wp.media.string.image = function( attachment, props ) {
    458                 var classes, img, options, size, shortcode, html;
    459 
    460                 props = _.defaults( props || {}, {
    461                         img:   {},
    462                         align: getUserSetting( 'align', 'none' ),
    463                         size:  getUserSetting( 'imgsize', 'medium' ),
    464                         link:  getUserSetting( 'urlbutton', 'post' )
    465                 });
    466 
    467                 props.linkUrl = linkToUrl( attachment, props );
    468 
    469                 attachment = attachment.toJSON();
    470 
    471                 img     = _.clone( props.img );
    472                 classes = img['class'] ? img['class'].split(/\s+/) : [];
    473                 size    = attachment.sizes ? attachment.sizes[ props.size ] : {};
    474 
    475                 if ( ! size ) {
    476                         delete props.size;
    477                         size = attachment;
    478                 }
    479 
    480                 img.width  = size.width;
    481                 img.height = size.height;
    482                 img.src    = size.url;
    483 
    484                 // Only assign the align class to the image if we're not printing
    485                 // a caption, since the alignment is sent to the shortcode.
    486                 if ( props.align && ! attachment.caption )
    487                         classes.push( 'align' + props.align );
    488 
    489                 if ( props.size )
    490                         classes.push( 'size-' + props.size );
    491 
    492                 classes.push( 'wp-image-' + attachment.id );
    493 
    494                 img['class'] = _.compact( classes ).join(' ');
    495 
    496                 // Generate `img` tag options.
    497                 options = {
    498                         tag:    'img',
    499                         attrs:  img,
    500                         single: true
    501                 };
    502 
    503                 // Generate the `href` based on the `link` property.
    504                 if ( props.linkUrl ) {
    505                         props.anchor = props.anchor || {};
    506                         props.anchor.href = props.linkUrl;
    507                 }
    508 
    509                 // Generate the `a` element options, if they exist.
    510                 if ( props.anchor ) {
    511                         options = {
    512                                 tag:     'a',
    513                                 attrs:   props.anchor,
    514                                 content: options
    515                         };
    516                 }
    517 
    518                 html = wp.html.string( options );
    519 
    520                 // Generate the caption shortcode.
    521                 if ( attachment.caption ) {
    522                         shortcode = {
    523                                 id:    'attachment_' + attachment.id,
    524                                 width: img.width
    525                         };
    526 
    527                         if ( props.align )
    528                                 shortcode.align = 'align' + props.align;
    529 
    530                         html = wp.shortcode.string({
    531                                 tag:     'caption',
    532                                 attrs:   shortcode,
    533                                 content: html + ' ' + attachment.caption
    534                         });
    535                 }
    536 
    537                 return html;
    538         };
    539 
    540         mceview.add( 'attachment', {
    541                 pattern: new RegExp( '(?:<a([^>]*)>)?<img([^>]*class=(?:"[^"]*|\'[^\']*)\\bwp-image-(\\d+)[^>]*)>(?:</a>)?' ),
    542 
    543                 text: function( instance ) {
    544                         var props = _.pick( instance, 'align', 'size', 'link', 'img', 'anchor' );
    545                         return wp.media.string.image( instance.model, props );
    546                 },
    547 
    548                 view: {
    549                         className: 'editor-attachment',
    550                         template:  media.template('editor-attachment'),
    551 
    552                         events: {
    553                                 'click .close': 'remove'
    554                         },
    555 
    556                         initialize: function() {
    557                                 var view    = this,
    558                                         results = this.options.results,
    559                                         id      = results[3],
    560                                         className;
    561 
    562                                 this.model = wp.media.model.Attachment.get( id );
    563 
    564                                 if ( results[1] )
    565                                         this.anchor = mceview.attrs( results[1] );
    566 
    567                                 this.img  = mceview.attrs( results[2] );
    568                                 className = this.img['class'];
    569 
    570                                 // Strip ID class.
    571                                 className = className.replace( /(?:^|\s)wp-image-\d+/, '' );
    572 
    573                                 // Calculate thumbnail `size` and remove class.
    574                                 className = className.replace( /(?:^|\s)size-(\S+)/, function( match, size ) {
    575                                         view.size = size;
    576                                         return '';
    577                                 });
    578 
    579                                 // Calculate `align` and remove class.
    580                                 className = className.replace( /(?:^|\s)align(left|center|right|none)(?:\s|$)/, function( match, align ) {
    581                                         view.align = align;
    582                                         return '';
    583                                 });
    584 
    585                                 this.img['class'] = className;
    586 
    587                                 this.$el.addClass('spinner');
    588                                 this.model.fetch().done( _.bind( this.render, this ) );
    589                         },
    590 
    591                         render: function() {
    592                                 var attachment = this.model.toJSON(),
    593                                         options;
    594 
    595                                 // If we don't have the attachment data, bail.
    596                                 if ( ! attachment.url )
    597                                         return;
    598 
    599                                 // Align the wrapper.
    600                                 if ( this.align )
    601                                         this.$wrapper.addClass( 'align' + this.align );
    602 
    603                                 // Generate the template options.
    604                                 options = {
    605                                         url: 'image' === attachment.type ? attachment.url : attachment.icon,
    606                                         uploading: attachment.uploading
    607                                 };
    608 
    609                                 _.extend( options, wp.media.fit({
    610                                         width:    attachment.width,
    611                                         height:   attachment.height,
    612                                         maxWidth: mceview.l10n.contentWidth
    613                                 }) );
    614 
    615                                 // Use the specified size if it exists.
    616                                 if ( this.size && attachment.sizes && attachment.sizes[ this.size ] )
    617                                         _.extend( options, _.pick( attachment.sizes[ this.size ], 'url', 'width', 'height' ) );
    618 
    619                                 this.$el.html( this.template( options ) );
    620                         }
    621                 }
    622         });
    623 
    624         mceview.add( 'gallery', {
    625                 shortcode: 'gallery',
    626 
    627                 gallery: (function() {
    628                         var galleries = {};
    629 
    630                         return {
    631                                 attachments: function( shortcode, parent ) {
    632                                         var shortcodeString = shortcode.string(),
    633                                                 result = galleries[ shortcodeString ],
    634                                                 attrs, args, query, others;
    635 
    636                                         delete galleries[ shortcodeString ];
    637 
    638                                         if ( result )
    639                                                 return result;
    640 
    641                                         attrs = shortcode.attrs.named;
    642                                         args  = _.pick( attrs, 'orderby', 'order' );
    643 
    644                                         args.type    = 'image';
    645                                         args.perPage = -1;
    646 
    647                                         // Map the `ids` param to the correct query args.
    648                                         if ( attrs.ids ) {
    649                                                 args.post__in = attrs.ids.split(',');
    650                                                 args.orderby  = 'post__in';
    651                                         } else if ( attrs.include ) {
    652                                                 args.post__in = attrs.include.split(',');
    653                                         }
    654 
    655                                         if ( attrs.exclude )
    656                                                 args.post__not_in = attrs.exclude.split(',');
    657 
    658                                         if ( ! args.post__in )
    659                                                 args.parent = attrs.id || parent;
    660 
    661                                         // Collect the attributes that were not included in `args`.
    662                                         others = {};
    663                                         _.filter( attrs, function( value, key ) {
    664                                                 if ( _.isUndefined( args[ key ] ) )
    665                                                         others[ key ] = value;
    666                                         });
    667 
    668                                         query = media.query( args );
    669                                         query.gallery = new Backbone.Model( others );
    670                                         return query;
    671                                 },
    672 
    673                                 shortcode: function( attachments ) {
    674                                         var props = attachments.props.toJSON(),
    675                                                 attrs = _.pick( props, 'include', 'exclude', 'orderby', 'order' ),
    676                                                 shortcode, clone;
    677 
    678                                         if ( attachments.gallery )
    679                                                 _.extend( attrs, attachments.gallery.toJSON() );
    680 
    681                                         attrs.ids = attachments.pluck('id');
    682 
    683                                         // If the `ids` attribute is set and `orderby` attribute
    684                                         // is the default value, clear it for cleaner output.
    685                                         if ( attrs.ids && 'post__in' === attrs.orderby )
    686                                                 delete attrs.orderby;
    687 
    688                                         shortcode = new wp.shortcode({
    689                                                 tag:    'gallery',
    690                                                 attrs:  attrs,
    691                                                 type:   'single'
    692                                         });
    693 
    694                                         // Use a cloned version of the gallery.
    695                                         clone = new wp.media.model.Attachments( attachments.models, {
    696                                                 props: props
    697                                         });
    698                                         clone.gallery = attachments.gallery;
    699                                         galleries[ shortcode.string() ] = clone;
    700 
    701                                         return shortcode;
    702                                 }
    703                         };
    704                 }()),
    705 
    706                 view: {
    707                         className: 'editor-gallery',
    708                         template:  media.template('editor-gallery'),
    709 
    710                         // The fallback post ID to use as a parent for galleries that don't
    711                         // specify the `ids` or `include` parameters.
    712                         //
    713                         // Uses the hidden input on the edit posts page by default.
    714                         parent: $('#post_ID').val(),
    715 
    716                         events: {
    717                                 'click .close': 'remove',
    718                                 'click .edit':  'edit'
    719                         },
    720 
    721                         initialize: function() {
    722                                 this.update();
    723                         },
    724 
    725                         update: function() {
    726                                 var     view = mceview.get('gallery');
    727 
    728                                 this.attachments = view.gallery.attachments( this.options.shortcode, this.parent );
    729                                 this.attachments.more().done( _.bind( this.render, this ) );
    730                         },
    731 
    732                         render: function() {
    733                                 var options, thumbnail, size;
    734 
    735                                 if ( ! this.attachments.length )
    736                                         return;
    737 
    738                                 thumbnail = this.attachments.first().toJSON();
    739                                 size = thumbnail.sizes && thumbnail.sizes.thumbnail ? thumbnail.sizes.thumbnail : thumbnail;
    740 
    741                                 options = {
    742                                         url:         size.url,
    743                                         orientation: size.orientation,
    744                                         count:       this.attachments.length
    745                                 };
    746 
    747                                 this.$el.html( this.template( options ) );
    748                         },
    749 
    750                         edit: function() {
    751                                 var selection;
    752 
    753                                 if ( ! wp.media.view || this.frame )
    754                                         return;
    755 
    756                                 selection = new wp.media.model.Selection( this.attachments.models, {
    757                                         props:    this.attachments.props.toJSON(),
    758                                         multiple: true
    759                                 });
    760                                 selection.gallery = this.attachments.gallery;
    761 
    762                                 this.frame = wp.media({
    763                                         frame:     'post',
    764                                         state:     'gallery-edit',
    765                                         title:     mceview.l10n.editGallery,
    766                                         editing:   true,
    767                                         multiple:  true,
    768                                         selection: selection
    769                                 });
    770 
    771                                 // Create a single-use frame. If the frame is closed,
    772                                 // then detach it from the DOM and remove the reference.
    773                                 this.frame.on( 'close', function() {
    774                                         if ( this.frame )
    775                                                 this.frame.detach();
    776                                         delete this.frame;
    777                                 }, this );
    778 
    779                                 // Update the `shortcode` and `attachments`.
    780                                 this.frame.get('gallery-edit').on( 'update', function( selection ) {
    781                                         var     view = mceview.get('gallery');
    782 
    783                                         this.options.shortcode = view.gallery.shortcode( selection );
    784                                         this.update();
    785                                 }, this );
    786                         }
    787                 }
    788         });
    789 }(jQuery));
  • trunk/wp-includes/js/shortcode.js

    r22522 r22567  
    273273        });
    274274}());
     275
     276// HTML utility functions
     277// ----------------------
     278//
     279// Experimental. These functions may change or be removed in the future.
     280(function(){
     281        wp.html = _.extend( wp.html || {}, {
     282                // ### Parse HTML attributes.
     283                //
     284                // Converts `content` to a set of parsed HTML attributes.
     285                // Utilizes `wp.shortcode.attrs( content )`, which is a valid superset of
     286                // the HTML attribute specification. Reformats the attributes into an
     287                // object that contains the `attrs` with `key:value` mapping, and a record
     288                // of the attributes that were entered using `empty` attribute syntax (i.e.
     289                // with no value).
     290                attrs: function( content ) {
     291                        var result, attrs;
     292
     293                        // If `content` ends in a slash, strip it.
     294                        if ( '/' === content[ content.length - 1 ] )
     295                                content = content.slice( 0, -1 );
     296
     297                        result = wp.shortcode.attrs( content );
     298                        attrs  = result.named;
     299
     300                        _.each( result.numeric, function( key ) {
     301                                if ( /\s/.test( key ) )
     302                                        return;
     303
     304                                attrs[ key ] = '';
     305                        });
     306
     307                        return attrs;
     308                },
     309
     310                // ### Convert an HTML-representation of an object to a string.
     311                string: function( options ) {
     312                        var text = '<' + options.tag,
     313                                content = options.content || '';
     314
     315                        _.each( options.attrs, function( value, attr ) {
     316                                text += ' ' + attr;
     317
     318                                // Use empty attribute notation where possible.
     319                                if ( '' === value )
     320                                        return;
     321
     322                                // Convert boolean values to strings.
     323                                if ( _.isBoolean( value ) )
     324                                        value = value ? 'true' : 'false';
     325
     326                                text += '="' + value + '"';
     327                        });
     328
     329                        // Return the result if it is a self-closing tag.
     330                        if ( options.single )
     331                                return text + ' />';
     332
     333                        // Complete the opening tag.
     334                        text += '>';
     335
     336                        // If `content` is an object, recursively call this function.
     337                        text += _.isObject( content ) ? wp.html.string( content ) : content;
     338
     339                        return text + '</' + options.tag + '>';
     340                }
     341        });
     342}());
  • trunk/wp-includes/script-loader.php

    r22516 r22567  
    299299        ) );
    300300
    301         $scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox', 'mce-view', 'media-views' ), false, 1 );
     301        $scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox', 'shortcode', 'media-views' ), false, 1 );
    302302
    303303        $scripts->add( 'hoverIntent', "/wp-includes/js/hoverIntent$suffix.js", array('jquery'), 'r6', 1 );
     
    327327        $scripts->add( 'shortcode', "/wp-includes/js/shortcode$suffix.js", array( 'underscore' ), false, 1 );
    328328        $scripts->add( 'mce-view', "/wp-includes/js/mce-view$suffix.js", array( 'shortcode', 'media-models' ), false, 1 );
    329         did_action( 'init' ) && $scripts->localize( 'mce-view', '_wpMceViewL10n', array(
    330                 'contentWidth' => isset( $GLOBALS['content_width'] ) ? $GLOBALS['content_width'] : 800,
    331                 'editGallery'  => __( 'Edit Gallery' ),
    332         ) );
    333329
    334330        if ( is_admin() ) {
Note: See TracChangeset for help on using the changeset viewer.