diff --git a/wp-includes/class-wp-editor.php b/wp-includes/class-wp-editor.php
index 7bccc2f0f1..acd789532c 100644
--- a/wp-includes/class-wp-editor.php
+++ b/wp-includes/class-wp-editor.php
@@ -368,7 +368,8 @@ final class _WP_Editors {
'wpgallery',
'wplink',
'wpdialogs',
- 'wpview',
+ 'wptextpattern',
+ 'wpview'
);
if ( ! self::$has_medialib ) {
diff --git a/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js b/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js
new file mode 100644
index 0000000000..1b7df4fb4a
--- /dev/null
+++ b/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js
@@ -0,0 +1,100 @@
+( function( tinymce, setTimeout ) {
+ tinymce.PluginManager.add( 'wptextpattern', function( editor ) {
+ var $$ = editor.$,
+ patterns = [],
+ canUndo = false;
+
+ function add( regExp, callback ) {
+ patterns.push( {
+ regExp: regExp,
+ callback: callback
+ } );
+ }
+
+ add( /^[*-]\s/, function() {
+ this.execCommand( 'InsertUnorderedList' );
+ } );
+
+ add( /^1[.)]\s/, function() {
+ this.execCommand( 'InsertOrderedList' );
+ } );
+
+ editor.on( 'selectionchange', function() {
+ canUndo = false;
+ } );
+
+ editor.on( 'keydown', function( event ) {
+ if ( canUndo && event.keyCode === tinymce.util.VK.BACKSPACE ) {
+ editor.undoManager.undo();
+ event.preventDefault();
+ }
+ } );
+
+ editor.on( 'keyup', function( event ) {
+ var rng, node, text, parent, child;
+
+ if ( event.keyCode !== tinymce.util.VK.SPACEBAR ) {
+ return;
+ }
+
+ rng = editor.selection.getRng();
+ node = rng.startContainer;
+ text = node.nodeValue;
+
+ if ( node.nodeType !== 3 ) {
+ return;
+ }
+
+ parent = editor.dom.getParent( node, 'p' );
+
+ if ( ! parent ) {
+ return;
+ }
+
+ while ( child = parent.firstChild ) {
+ if ( child.nodeType !== 3 ) {
+ parent = child;
+ } else {
+ break;
+ }
+ }
+
+ if ( child !== node ) {
+ return;
+ }
+
+ tinymce.each( patterns, function( pattern ) {
+ var replace = text.replace( pattern.regExp, '' );
+
+ if ( text === replace ) {
+ return;
+ }
+
+ if ( rng.startOffset !== text.length - replace.length ) {
+ return;
+ }
+
+ editor.undoManager.add();
+
+ editor.undoManager.transact( function() {
+ if ( replace ) {
+ $$( node ).replaceWith( document.createTextNode( replace ) );
+ } else {
+ $$( node.parentNode ).empty().append( '
' );
+ }
+
+ editor.selection.setCursorLocation( parent );
+
+ pattern.callback.apply( editor );
+ } );
+
+ // We need to wait for native events to be triggered.
+ setTimeout( function() {
+ canUndo = true;
+ } );
+
+ return false;
+ } );
+ } );
+ } );
+} )( window.tinymce, window.setTimeout );
diff --git a/wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js b/wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js
new file mode 100644
index 0000000000..f6c31eca42
--- /dev/null
+++ b/wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js
@@ -0,0 +1 @@
+!function(a,b){a.PluginManager.add("wptextpattern",function(c){function d(a,b){f.push({regExp:a,callback:b})}var e=c.$,f=[],g=!1;d(/^[*-]\s/,function(){this.execCommand("InsertUnorderedList")}),d(/^1[.)]\s/,function(){this.execCommand("InsertOrderedList")}),c.on("selectionchange",function(){g=!1}),c.on("keydown",function(b){g&&b.keyCode===a.util.VK.BACKSPACE&&(c.undoManager.undo(),b.preventDefault())}),c.on("keyup",function(d){var h,i,j,k,l;if(d.keyCode===a.util.VK.SPACEBAR&&(h=c.selection.getRng(),i=h.startContainer,j=i.nodeValue,3===i.nodeType&&(k=c.dom.getParent(i,"p")))){for(;(l=k.firstChild)&&3!==l.nodeType;)k=l;l===i&&a.each(f,function(a){var d=j.replace(a.regExp,"");if(j!==d&&h.startOffset===j.length-d.length)return c.undoManager.add(),c.undoManager.transact(function(){d?e(i).replaceWith(document.createTextNode(d)):e(i.parentNode).empty().append("
"),c.selection.setCursorLocation(k),a.callback.apply(c)}),b(function(){g=!0}),!1})}})})}(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 423749b2a7..81c0cfe29f 100644
Binary files a/wp-includes/js/tinymce/wp-tinymce.js.gz and b/wp-includes/js/tinymce/wp-tinymce.js.gz differ
diff --git a/wp-includes/version.php b/wp-includes/version.php
index ae9fe5159e..59a70c760c 100644
--- a/wp-includes/version.php
+++ b/wp-includes/version.php
@@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
-$wp_version = '4.3-alpha-32698';
+$wp_version = '4.3-alpha-32699';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.