From 3d68488ff6010db0004d4fc7bd54ca508a94f6d4 Mon Sep 17 00:00:00 2001 From: Ella Iseulde Van Dorpe <*@iseulde.com> Date: Tue, 23 Feb 2016 08:33:27 +0000 Subject: [PATCH] TinyMCE: inline text patterns First run. See #33300. Built from https://develop.svn.wordpress.org/trunk@36627 git-svn-id: http://core.svn.wordpress.org/trunk@36594 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- .../tinymce/plugins/wptextpattern/plugin.js | 143 +++++++++++++++--- .../plugins/wptextpattern/plugin.min.js | 2 +- wp-includes/js/tinymce/wp-tinymce.js.gz | Bin 164993 -> 165367 bytes wp-includes/version.php | 2 +- 4 files changed, 126 insertions(+), 21 deletions(-) diff --git a/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js b/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js index 22e6dd2da5..f861dae822 100644 --- a/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js +++ b/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js @@ -12,23 +12,56 @@ */ ( function( tinymce, setTimeout ) { tinymce.PluginManager.add( 'wptextpattern', function( editor ) { - var VK = tinymce.util.VK, - spacePatterns = [ - { regExp: /^[*-]\s/, cmd: 'InsertUnorderedList' }, - { regExp: /^1[.)]\s/, cmd: 'InsertOrderedList' } - ], - enterPatterns = [ - { start: '##', format: 'h2' }, - { start: '###', format: 'h3' }, - { start: '####', format: 'h4' }, - { start: '#####', format: 'h5' }, - { start: '######', format: 'h6' }, - { start: '>', format: 'blockquote' } - ], - canUndo, refNode, refPattern; + var VK = tinymce.util.VK; + + var spacePatterns = [ + { regExp: /^[*-]\s/, cmd: 'InsertUnorderedList' }, + { regExp: /^1[.)]\s/, cmd: 'InsertOrderedList' } + ]; + + var enterPatterns = [ + { start: '##', format: 'h2' }, + { start: '###', format: 'h3' }, + { start: '####', format: 'h4' }, + { start: '#####', format: 'h5' }, + { start: '######', format: 'h6' }, + { start: '>', format: 'blockquote' } + ]; + + var inlinePatterns = [ + { start: '*', end: '*', format: 'italic' }, + { start: '**', end: '**', format: 'bold' }, + { start: '_', end: '_', format: 'italic' }, + { start: '__', end: '__', format: 'bold' }, + { start: '`', end: '`', format: 'code' } + ]; + + var canUndo; + var refNode; + var refPattern; + var chars = []; + var zeroWidthSpaceNode; + + tinymce.each( inlinePatterns, function( pattern ) { + tinymce.each( ( pattern.start + pattern.end ).split( '' ), function( c ) { + if ( tinymce.inArray( chars, c ) === -1 ) { + chars.push( c ); + } + } ); + } ); editor.on( 'selectionchange', function() { + var offset; + canUndo = null; + + if ( zeroWidthSpaceNode ) { + offset = zeroWidthSpaceNode.data.indexOf( '\u200b' ); + + if ( offset !== -1 ) { + zeroWidthSpaceNode.deleteData( offset, offset + 1 ); + } + } } ); editor.on( 'keydown', function( event ) { @@ -48,9 +81,85 @@ space(); } else if ( event.keyCode === VK.ENTER && ! VK.modifierPressed( event ) ) { enter(); + } else if ( event.keyCode > 47 && ! ( event.keyCode >= 91 && event.keyCode <= 93 ) ) { + inline(); } } ); + function inline() { + var rng = editor.selection.getRng(); + var node = rng.startContainer; + var offset = rng.startOffset; + var startOffset; + var endOffset; + var pattern; + var format; + var zero; + + if ( node.nodeType !== 3 || ! node.data.length || ! offset ) { + return; + } + + if ( tinymce.inArray( chars, node.data.charAt( offset - 1 ) ) === -1 ) { + return; + } + + function findStart( node ) { + var i = inlinePatterns.length; + var offset; + + while ( i-- ) { + pattern = inlinePatterns[ i ]; + offset = node.data.indexOf( pattern.end ); + + if ( offset !== -1 ) { + return offset; + } + } + } + + startOffset = findStart( node ); + endOffset = node.data.lastIndexOf( pattern.end ); + + if ( startOffset === endOffset || endOffset === -1 ) { + return; + } + + if ( endOffset - startOffset <= pattern.start.length ) { + return; + } + + if ( node.data.slice( startOffset + pattern.start.length, endOffset ).indexOf( pattern.start.slice( 0, 1 ) ) !== -1 ) { + return; + } + + format = editor.formatter.get( pattern.format ); + + if ( format && format[0].inline ) { + editor.undoManager.add(); + + editor.undoManager.transact( function() { + node.insertData( offset, '\u200b' ); + + node = node.splitText( startOffset ); + zero = node.splitText( offset - startOffset ); + + node.deleteData( 0, pattern.start.length ); + node.deleteData( node.data.length - pattern.end.length, pattern.end.length ); + + editor.formatter.apply( pattern.format, {}, node ); + + editor.selection.setCursorLocation( zero, 1 ); + } ); + + // We need to wait for native events to be triggered. + setTimeout( function() { + canUndo = 'space'; + zeroWidthSpaceNode = zero; + } ); + } + } + function firstTextNode( node ) { var parent = editor.dom.getParent( node, 'p' ), child; @@ -157,11 +266,7 @@ } function ltrim( text ) { - if ( text ) { - return text.replace( /^\s+/, '' ); - } - - return ''; + return text ? text.replace( /^\s+/, '' ) : ''; } function enter() { diff --git a/wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js b/wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js index cd569e975b..4d895fbb2b 100644 --- a/wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js +++ b/wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js @@ -1 +1 @@ -!function(a,b){a.PluginManager.add("wptextpattern",function(c){function d(a){var b,d=c.dom.getParent(a,"p");if(d){for(;(b=d.firstChild)&&3!==b.nodeType;)d=b;if(b)return b.data||(b=b.nextSibling&&3===b.nextSibling.nodeType?b.nextSibling:null),b}}function e(){var e,f,g=c.selection.getRng(),h=g.startContainer;h&&d(h)===h&&(e=h.parentNode,f=h.data,a.each(m,function(a){var d=f.match(a.regExp);if(d&&g.startOffset===d[0].length)return c.undoManager.add(),c.undoManager.transact(function(){h.deleteData(0,d[0].length),e.innerHTML||e.appendChild(document.createElement("br")),c.selection.setCursorLocation(e),c.execCommand(a.cmd)}),b(function(){i="space"}),!1}))}function f(){var b,e,f=c.selection.getRng(),g=f.startContainer,h=d(g),i=n.length;if(h){for(b=h.data;i--;)if(0===b.indexOf(n[i].start)){e=n[i];break}e&&(h!==g||a.trim(b)!==e.start)&&(j=h,k=e)}}function g(a){return a?a.replace(/^\s+/,""):""}function h(){j&&(c.undoManager.add(),c.undoManager.transact(function(){c.formatter.apply(k.format,{},j),j.replaceData(0,j.data.length,g(j.data.slice(k.start.length)))}),b(function(){i="enter"})),j=null,k=null}var i,j,k,l=a.util.VK,m=[{regExp:/^[*-]\s/,cmd:"InsertUnorderedList"},{regExp:/^1[.)]\s/,cmd:"InsertOrderedList"}],n=[{start:"##",format:"h2"},{start:"###",format:"h3"},{start:"####",format:"h4"},{start:"#####",format:"h5"},{start:"######",format:"h6"},{start:">",format:"blockquote"}];c.on("selectionchange",function(){i=null}),c.on("keydown",function(a){(i&&27===a.keyCode||"space"===i&&a.keyCode===l.BACKSPACE)&&(c.undoManager.undo(),a.preventDefault(),a.stopImmediatePropagation()),a.keyCode!==l.ENTER||l.modifierPressed(a)||f()},!0),c.on("keyup",function(a){a.keyCode!==l.SPACEBAR||a.ctrlKey||a.metaKey||a.altKey?a.keyCode!==l.ENTER||l.modifierPressed(a)||h():e()})})}(window.tinymce,window.setTimeout); \ No newline at end of file +!function(a,b){a.PluginManager.add("wptextpattern",function(c){function d(){function d(a){for(var b,c=q.length;c--;)if(g=q[c],b=a.data.indexOf(g.end),-1!==b)return b}var e,f,g,h,i,k=c.selection.getRng(),l=k.startContainer,n=k.startOffset;3===l.nodeType&&l.data.length&&n&&-1!==a.inArray(r,l.data.charAt(n-1))&&(e=d(l),f=l.data.lastIndexOf(g.end),e!==f&&-1!==f&&(f-e<=g.start.length||-1===l.data.slice(e+g.start.length,f).indexOf(g.start.slice(0,1))&&(h=c.formatter.get(g.format),h&&h[0].inline&&(c.undoManager.add(),c.undoManager.transact(function(){l.insertData(n,"\u200b"),l=l.splitText(e),i=l.splitText(n-e),l.deleteData(0,g.start.length),l.deleteData(l.data.length-g.end.length,g.end.length),c.formatter.apply(g.format,{},l),c.selection.setCursorLocation(i,1)}),b(function(){j="space",m=i})))))}function e(a){var b,d=c.dom.getParent(a,"p");if(d){for(;(b=d.firstChild)&&3!==b.nodeType;)d=b;if(b)return b.data||(b=b.nextSibling&&3===b.nextSibling.nodeType?b.nextSibling:null),b}}function f(){var d,f,g=c.selection.getRng(),h=g.startContainer;h&&e(h)===h&&(d=h.parentNode,f=h.data,a.each(o,function(a){var e=f.match(a.regExp);if(e&&g.startOffset===e[0].length)return c.undoManager.add(),c.undoManager.transact(function(){h.deleteData(0,e[0].length),d.innerHTML||d.appendChild(document.createElement("br")),c.selection.setCursorLocation(d),c.execCommand(a.cmd)}),b(function(){j="space"}),!1}))}function g(){var b,d,f=c.selection.getRng(),g=f.startContainer,h=e(g),i=p.length;if(h){for(b=h.data;i--;)if(0===b.indexOf(p[i].start)){d=p[i];break}d&&(h!==g||a.trim(b)!==d.start)&&(k=h,l=d)}}function h(a){return a?a.replace(/^\s+/,""):""}function i(){k&&(c.undoManager.add(),c.undoManager.transact(function(){c.formatter.apply(l.format,{},k),k.replaceData(0,k.data.length,h(k.data.slice(l.start.length)))}),b(function(){j="enter"})),k=null,l=null}var j,k,l,m,n=a.util.VK,o=[{regExp:/^[*-]\s/,cmd:"InsertUnorderedList"},{regExp:/^1[.)]\s/,cmd:"InsertOrderedList"}],p=[{start:"##",format:"h2"},{start:"###",format:"h3"},{start:"####",format:"h4"},{start:"#####",format:"h5"},{start:"######",format:"h6"},{start:">",format:"blockquote"}],q=[{start:"*",end:"*",format:"italic"},{start:"**",end:"**",format:"bold"},{start:"_",end:"_",format:"italic"},{start:"__",end:"__",format:"bold"},{start:"`",end:"`",format:"code"}],r=[];a.each(q,function(b){a.each((b.start+b.end).split(""),function(b){-1===a.inArray(r,b)&&r.push(b)})}),c.on("selectionchange",function(){var a;j=null,m&&(a=m.data.indexOf("\u200b"),-1!==a&&m.deleteData(a,a+1))}),c.on("keydown",function(a){(j&&27===a.keyCode||"space"===j&&a.keyCode===n.BACKSPACE)&&(c.undoManager.undo(),a.preventDefault(),a.stopImmediatePropagation()),a.keyCode!==n.ENTER||n.modifierPressed(a)||g()},!0),c.on("keyup",function(a){a.keyCode!==n.SPACEBAR||a.ctrlKey||a.metaKey||a.altKey?a.keyCode!==n.ENTER||n.modifierPressed(a)?a.keyCode>47&&!(a.keyCode>=91&&a.keyCode<=93)&&d():i():f()})})}(window.tinymce,window.setTimeout); \ No newline at end of file diff --git a/wp-includes/js/tinymce/wp-tinymce.js.gz b/wp-includes/js/tinymce/wp-tinymce.js.gz index ad1240b53a7a8aebbcac22c0a01e66aec8eb7f75..cb9ef3a00879be99ad1a8f113deb76c42b8eee7d 100644 GIT binary patch delta 6848 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