From e455091d0a1ef464fcff10370657a59cbc770cf4 Mon Sep 17 00:00:00 2001 From: ryan Date: Sun, 6 Jul 2008 16:38:37 +0000 Subject: [PATCH] Image caption fixes from azaozz: captions are properly created in tables and in lists, all tags are properly removed when deleting a caption, the align buttons can be used to align the captions. see #6812 git-svn-id: http://svn.automattic.com/wordpress/trunk@8260 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/js/editor.js | 1 + .../plugins/wordpress/editor_plugin.js | 106 +++++++++--------- .../plugins/wpeditimage/editor_plugin.js | 38 ++----- .../plugins/wpeditimage/js/editimage.js | 56 +++++---- wp-includes/js/tinymce/tiny_mce_config.php | 2 +- wp-includes/script-loader.php | 4 +- 6 files changed, 106 insertions(+), 101 deletions(-) diff --git a/wp-admin/js/editor.js b/wp-admin/js/editor.js index d2049e484..7f5875ad0 100644 --- a/wp-admin/js/editor.js +++ b/wp-admin/js/editor.js @@ -53,6 +53,7 @@ switchEditors = { content = content.replace(new RegExp('\\s*\\s*', 'mg'), '\n'); content = content.replace(new RegExp('\\s*\\[wp_caption([^\\[]+)\\[/wp_caption\\]\\s*', 'gi'), '\n\n[wp_caption$1[/wp_caption]\n\n'); + content = content.replace(new RegExp('wp_caption\\]\\n\\n+\\[wp_caption', 'g'), 'wp_caption]\n\n[wp_caption'); var blocklist2 = 'blockquote|ul|ol|li|table|thead|tr|th|td|h[1-6]|pre'; content = content.replace(new RegExp('\\s*<(('+blocklist2+') ?[^>]*)\\s*>', 'mg'), '\n<$1>'); diff --git a/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js b/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js index ab3eb1247..faff84150 100644 --- a/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js +++ b/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js @@ -127,68 +127,48 @@ }); // Add Media buttons to fullscreen - ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { - if ( 'mceFullScreen' != cmd ) return; + ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { + if ( 'mceFullScreen' != cmd ) return; if ( 'mce_fullscreen' != ed.id ) ed.settings.theme_advanced_buttons1 += ',|,add_image,add_video,add_audio,add_media'; - }); + }); // Add class "alignleft", "alignright" and "aligncenter" when selecting align for images. - ed.onExecCommand.add(function( ed, cmd ) { - var n, bl, dom = ed.dom; + ed.addCommand('JustifyLeft', function() { + var n = ed.selection.getNode(); - if ( 'JustifyCenter' == cmd ) { - tinymce.each(dom.select('img'), function(n) { - var v = n.className; - - if (v.indexOf('aligncenter') == -1) { - dom.getParent(n, function(P) { - if (P && P.style && P.style.textAlign == 'center') - dom.setStyle(P, 'textAlign', ''); - }); - } - }); - - ed.execCommand('mceRepaint'); - } + if ( n.nodeName != 'IMG' ) + ed.editorCommands.mceJustify('JustifyLeft', 'left'); + else ed.plugins.wordpress.do_align(n, 'alignleft'); }); - ed.onBeforeExecCommand.add(function( ed, cmd ) { - var n, dir, xdir, bl, dom = ed.dom; + ed.addCommand('JustifyRight', function() { + var n = ed.selection.getNode(); - if ( ( cmd.indexOf('Justify') != -1 ) && ( n = ed.selection.getNode() ) ) { - if ( 'JustifyFull' == cmd || n.nodeName !== 'IMG' ) return; - dir = cmd.substring(7).toLowerCase(); - - if ( ed.queryCommandState( cmd ) ) { - n.className = n.className.replace(/align[^ '"]+\s?/g, ''); - dom.addClass( n, "alignnone" ); - } else if ( 'JustifyCenter' == cmd ) { - n.className = n.className.replace(/alignleft\s?|alignright\s?|alignnone\s?/g, ''); - if ( dom.hasClass( n, "aligncenter" ) ) { - dom.removeClass( n, "aligncenter" ); - dom.addClass( n, "alignnone" ); - } else - dom.addClass( n, "aligncenter" ); - - } else { - n.className = n.className.replace(/align[^ '"]+\s?/g, ''); - dom.addClass( n, "align"+dir ); - } - } + if ( n.nodeName != 'IMG' ) + ed.editorCommands.mceJustify('JustifyRight', 'right'); + else ed.plugins.wordpress.do_align(n, 'alignright'); }); - // Word count if script is loaded - if ( 'undefined' != typeof wpWordCount ) { - var last = 0; - ed.onKeyUp.add(function(ed, e) { - if ( e.keyCode == last ) return; - if ( 13 == e.keyCode || 8 == last || 46 == last ) wpWordCount.wc( ed.getContent({format : 'raw'}) ); - last = e.keyCode; - }); - }; + ed.addCommand('JustifyCenter', function() { + var n = ed.selection.getNode(), P = ed.dom.getParent(n, 'p'), DL = ed.dom.getParent(n, 'dl'); - // Add listeners to handle more break + if ( n.nodeName == 'IMG' && ( P || DL ) ) + ed.plugins.wordpress.do_align(n, 'aligncenter'); + else ed.editorCommands.mceJustify('JustifyCenter', 'center'); + }); + + // Word count if script is loaded + if ( 'undefined' != typeof wpWordCount ) { + var last = 0; + ed.onKeyUp.add(function(ed, e) { + if ( e.keyCode == last ) return; + if ( 13 == e.keyCode || 8 == last || 46 == last ) wpWordCount.wc( ed.getContent({format : 'raw'}) ); + last = e.keyCode; + }); + }; + + // Add listeners to handle more break t._handleMoreBreak(ed, url); // Add custom shortcuts @@ -227,6 +207,30 @@ }, // Internal functions + do_align : function(n, a) { + var P, DL, DIV, cls, c, ed = tinyMCE.activeEditor; + + P = ed.dom.getParent(n, 'p'); + DL = ed.dom.getParent(n, 'dl'); + DIV = ed.dom.getParent(n, 'div'); + + if ( DL && DIV ) { + cls = ed.dom.hasClass(DL, a) ? 'alignnone' : a; + DL.className = DL.className.replace(/align[^ '"]+\s?/g, ''); + ed.dom.addClass(DL, cls); + c = (cls == 'aligncenter') ? ed.dom.addClass(DIV, 'mceIEcenter') : ed.dom.removeClass(DIV, 'mceIEcenter'); + } else if ( P ) { + cls = ed.dom.hasClass(n, a) ? 'alignnone' : a; + n.className = n.className.replace(/align[^ '"]+\s?/g, ''); + ed.dom.addClass(n, cls); + if ( cls == 'aligncenter' ) + ed.dom.setStyle(P, 'textAlign', 'center'); + else if (P.style && P.style.textAlign == 'center') + ed.dom.setStyle(P, 'textAlign', ''); + } + + ed.execCommand('mceRepaint'); + }, // Resizes the iframe by a relative height value _resizeIframe : function(ed, tb_id, dy) { diff --git a/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js b/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js index 230746e59..7e6b4ba77 100644 --- a/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js +++ b/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js @@ -21,16 +21,16 @@ ed.onInit.add(function(ed) { tinymce.dom.Event.add(ed.getWin(), 'scroll', function(e) { - ed.plugins.wpeditimage.hideButtons(); + ed.plugins.wpeditimage.hideButtons(); }); }); ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { ed.plugins.wpeditimage.hideButtons(); - }); + }); ed.onSaveContent.add(function(ed, o) { - ed.plugins.wpeditimage.hideButtons(); + ed.plugins.wpeditimage.hideButtons(); }); ed.onMouseUp.add(function(ed, e) { @@ -63,8 +63,8 @@ }); ed.onBeforeSetContent.add(function(ed, o) { - o.content = t._do_shcode(o.content); - }); + o.content = t._do_shcode(o.content); + }); ed.onPostProcess.add(function(ed, o) { if (o.get) @@ -74,8 +74,8 @@ _do_shcode : function(co) { return co.replace(/\[wp_caption([^\]]+)\]([\s\S]+?)\[\/wp_caption\][\s\u00a0]*/g, function(a,b,c){ - var id = b.match(/id=['"]([^'"]+)/), cls = b.match(/align=['"]([^'"]+)/); - var w = b.match(/width=['"]([0-9]+)/), cap = b.match(/caption=['"]([^'"]+)/); + var id = b.match(/id=['"]([^'"]+)/i), cls = b.match(/align=['"]([^'"]+)/i); + var w = b.match(/width=['"]([0-9]+)/), cap = b.match(/caption=['"]([^'"]+)/i); id = ( id && id[1] ) ? id[1] : ''; cls = ( cls && cls[1] ) ? cls[1] : 'alignnone'; @@ -91,8 +91,8 @@ }, _get_shcode : function(co) { - return co.replace(/
\s*]+)>\s*]+>([\s\S]+?)<\/dt>\s*]+>([^<]+)<\/dd>\s*<\/dl>\s*<\/div>\s*/g, function(a,b,c,cap){ - var id = b.match(/id=['"]([^'"]+)/), cls = b.match(/class=['"]([^'"]+)/); + return co.replace(/
\s*]+)>\s*]+>([\s\S]+?)<\/dt>\s*]+>([^<]+)<\/dd>\s*<\/dl>\s*<\/div>\s*/gi, function(a,b,c,cap){ + var id = b.match(/id=['"]([^'"]+)/i), cls = b.match(/class=['"]([^'"]+)/i); var w = c.match(/width=['"]([0-9]+)/); id = ( id && id[1] ) ? id[1] : ''; @@ -100,26 +100,12 @@ w = ( w && w[1] ) ? w[1] : ''; if ( ! w || ! cap ) return c; - cls = cls ? cls.match(/align[^ '"]+/) : ''; + cls = cls.match(/align[^ '"]+/) || 'alignnone'; return '[wp_caption id="'+id+'" align="'+cls+'" width="'+w+'" caption="'+cap+'"]'+c+'[/wp_caption]'; }); }, - _fixCenter : function(c) { - var ed = tinyMCE.activeEditor; - - tinymce.each(ed.dom.select('img', c), function(n) { - if ( ed.dom.hasClass(n, 'aligncenter') ) { - var P = ed.dom.getParent(n, 'p'); - if ( tinymce.isIE ) - ed.dom.addClass(P, 'mce_iecenter'); - if ( P.style && P.style.textAlign == 'center' ) - ed.dom.setStyle(P, 'textAlign', ''); - } - }); - }, - showButtons : function(n) { var t = this, ed = tinyMCE.activeEditor, p1, p2, vp, DOM = tinymce.DOM, X, Y; @@ -172,7 +158,7 @@ ed.windowManager.bookmark = ed.selection.getBookmark('simple'); ed.execCommand("WP_EditImage"); this.parentNode.style.display = 'none'; - } + }; var wp_delimgbtn = DOM.add('wp_editbtns', 'img', { src : t.url+'/img/delete.png', @@ -196,7 +182,7 @@ ed.execCommand('mceRepaint'); return false; } - } + }; }, getInfo : function() { diff --git a/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js b/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js index 89b4d7171..fb1d2d8b5 100644 --- a/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js +++ b/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js @@ -260,11 +260,11 @@ var wpImage = { if ( DL = dom.getParent(el, 'dl') ) { var dlc = ed.dom.getAttrib(DL, 'class'); dlc = dlc.match(/align[^ "']+/i); - if ( ! dom.hasClass(el, dlc) ) + if ( dlc && ! dom.hasClass(el, dlc) ) c += ' '+dlc; - + tinymce.each(DL.childNodes, function(e) { - if ( e.nodeName == 'DD' ) { + if ( e.nodeName == 'DD' && dom.hasClass(e, 'wp_caption_dd') ) { caption = e.innerHTML; return; } @@ -377,16 +377,10 @@ var wpImage = { 'class' : img_class }); - if ( ! f.link_href.value ) { - if ( A ) { - b = ed.selection.getBookmark(); - ed.dom.remove(A, 1); - ed.selection.moveToBookmark(b); - } - } else { + if ( f.link_href.value ) { // Create new anchor elements if ( A == null ) { - if ( ! f.link_href.value.match(/https?:\/\//) ) + if ( ! f.link_href.value.match(/https?:\/\//i) ) f.link_href.value = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.link_href.value); if ( tinymce.isWebKit && ed.dom.hasClass(el, 'aligncenter') ) { @@ -431,18 +425,26 @@ var wpImage = { style : 'width: '+cap_width+'px;' }); - if ( DIV ) + if ( DIV ) ed.dom.setAttrib(DIV, 'class', div_cls); if ( (DT = ed.dom.getParent(el, 'dt')) && (DD = DT.nextSibling) && ed.dom.hasClass(DD, 'wp_caption_dd') ) ed.dom.setHTML(DD, f.img_alt.value); } else { + var lnk = '', pa; if ( (id = f.img_classes.value.match( /wp-image-([0-9]{1,6})/ )) && id[1] ) cap_id = 'attachment_'+id[1]; - if ( f.link_href.value ) html = ed.dom.getOuterHTML(ed.dom.getParent(el, 'a')); - else html = ed.dom.getOuterHTML(el); + if ( f.link_href.value && (lnk = ed.dom.getParent(el, 'a')) ) { + if ( lnk.childNodes.length == 1 ) + html = ed.dom.getOuterHTML(lnk); + else { + html = ed.dom.getOuterHTML(lnk); + html = html.match(/]+>/i); + html = html+ed.dom.getOuterHTML(el)+''; + } + } else html = ed.dom.getOuterHTML(el); html = '
'+html+'
'+f.img_alt.value+'
'; @@ -451,19 +453,25 @@ var wpImage = { if ( P ) { P.parentNode.insertBefore(cap, P); - ed.dom.remove(P); + if ( P.childNodes.length == 1 ) + ed.dom.remove(P); + else if ( lnk && lnk.childNodes.length == 1 ) + ed.dom.remove(lnk); + else ed.dom.remove(el); + } else if ( pa = ed.dom.getParent(el, 'TD,TH,LI') ) { + pa.appendChild(cap); + if ( lnk && lnk.childNodes.length == 1 ) + ed.dom.remove(lnk); + else ed.dom.remove(el); } } - tinyMCEPopup.execCommand("mceEndUndoLevel"); - ed.execCommand('mceRepaint'); - tinyMCEPopup.close(); - return; } else { if ( DL && DIV ) { - if ( f.link_href.value ) html = ed.dom.getOuterHTML(ed.dom.getParent(el, 'a')); + var aa; + if ( f.link_href.value && (aa = ed.dom.getParent(el, 'a')) ) html = ed.dom.getOuterHTML(aa); else html = ed.dom.getOuterHTML(el); - + P = ed.dom.create('p', {}, html); DIV.parentNode.insertBefore(P, DIV); ed.dom.remove(DIV); @@ -478,6 +486,12 @@ var wpImage = { ed.dom.setStyle(P, 'textAlign', ''); } + if ( ! f.link_href.value && A ) { + b = ed.selection.getBookmark(); + ed.dom.remove(A, 1); + ed.selection.moveToBookmark(b); + } + tinyMCEPopup.execCommand("mceEndUndoLevel"); ed.execCommand('mceRepaint'); tinyMCEPopup.close(); diff --git a/wp-includes/js/tinymce/tiny_mce_config.php b/wp-includes/js/tinymce/tiny_mce_config.php index 8a72ad472..1d36907da 100644 --- a/wp-includes/js/tinymce/tiny_mce_config.php +++ b/wp-includes/js/tinymce/tiny_mce_config.php @@ -222,7 +222,7 @@ if ( $compress && isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) { // Setup cache info if ( $disk_cache ) { - $cacheKey = apply_filters('tiny_mce_version', '20080703'); + $cacheKey = apply_filters('tiny_mce_version', '20080706'); foreach ( $initArray as $v ) $cacheKey .= $v; diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index 47728fd12..e998bae5b 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -34,10 +34,10 @@ function wp_default_scripts( &$scripts ) { $visual_editor = apply_filters('visual_editor', array('tiny_mce')); $scripts->add( 'editor', false, $visual_editor, '20080321' ); - $scripts->add( 'editor_functions', '/wp-admin/js/editor.js', false, '20080702' ); + $scripts->add( 'editor_functions', '/wp-admin/js/editor.js', false, '20080706' ); // Modify this version when tinyMCE plugins are changed. - $mce_version = apply_filters('tiny_mce_version', '20080703'); + $mce_version = apply_filters('tiny_mce_version', '20080706'); $scripts->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_config.php', array('editor_functions'), $mce_version ); $scripts->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6');