JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.5
[ckeditor.git] / _source / plugins / placeholder / plugin.js
diff --git a/_source/plugins/placeholder/plugin.js b/_source/plugins/placeholder/plugin.js
new file mode 100644 (file)
index 0000000..5ea9b24
--- /dev/null
@@ -0,0 +1,160 @@
+/*\r
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+/**\r
+ * @fileOverview The "placeholder" plugin.\r
+ *\r
+ */\r
+\r
+(function()\r
+{\r
+       var placeholderReplaceRegex = /\[\[[^\]]+\]\]/g;\r
+       CKEDITOR.plugins.add( 'placeholder',\r
+       {\r
+               requires : [ 'dialog' ],\r
+               lang : [ 'en' ],\r
+               init : function( editor )\r
+               {\r
+                       var lang = editor.lang.placeholder;\r
+\r
+                       editor.addCommand( 'createplaceholder', new CKEDITOR.dialogCommand( 'createplaceholder' ) );\r
+                       editor.addCommand( 'editplaceholder', new CKEDITOR.dialogCommand( 'editplaceholder' ) );\r
+\r
+                       editor.ui.addButton( 'CreatePlaceholder',\r
+                       {\r
+                               label : lang.toolbar,\r
+                               command :'createplaceholder',\r
+                               icon : this.path + 'placeholder.gif'\r
+                       });\r
+\r
+                       if ( editor.addMenuItems )\r
+                       {\r
+                               editor.addMenuGroup( 'placeholder', 20 );\r
+                               editor.addMenuItems(\r
+                                       {\r
+                                               editplaceholder :\r
+                                               {\r
+                                                       label : lang.edit,\r
+                                                       command : 'editplaceholder',\r
+                                                       group : 'placeholder',\r
+                                                       order : 1,\r
+                                                       icon : this.path + 'placeholder.gif'\r
+                                               }\r
+                                       } );\r
+\r
+                               if ( editor.contextMenu )\r
+                               {\r
+                                       editor.contextMenu.addListener( function( element, selection )\r
+                                               {\r
+                                                       if ( !element || !element.data( 'cke-placeholder' ) )\r
+                                                               return null;\r
+\r
+                                                       return { editplaceholder : CKEDITOR.TRISTATE_OFF };\r
+                                               } );\r
+                               }\r
+                       }\r
+\r
+                       editor.on( 'doubleclick', function( evt )\r
+                               {\r
+                                       var element = evt.data.element;\r
+                                       if ( element.data( 'cke-placeholder' ) )\r
+                                               evt.data.dialog = 'editplaceholder';\r
+                               });\r
+\r
+                       editor.addCss(\r
+                               '.cke_placeholder' +\r
+                               '{' +\r
+                                       'background-color: #ffff00;' +\r
+                                       ( CKEDITOR.env.gecko ? 'cursor: default;' : '' ) +\r
+                               '}'\r
+                       );\r
+\r
+                       editor.on( 'contentDom', function()\r
+                               {\r
+                                       editor.document.getBody().on( 'resizestart', function( evt )\r
+                                               {\r
+                                                       if ( editor.getSelection().getSelectedElement().data( 'cke-placeholder' ) )\r
+                                                               evt.data.preventDefault();\r
+                                               });\r
+                               });\r
+\r
+                       CKEDITOR.dialog.add( 'createplaceholder', this.path + 'dialogs/placeholder.js' );\r
+                       CKEDITOR.dialog.add( 'editplaceholder', this.path + 'dialogs/placeholder.js' );\r
+               },\r
+               afterInit : function( editor )\r
+               {\r
+                       var dataProcessor = editor.dataProcessor,\r
+                               dataFilter = dataProcessor && dataProcessor.dataFilter,\r
+                               htmlFilter = dataProcessor && dataProcessor.htmlFilter;\r
+\r
+                       if ( dataFilter )\r
+                       {\r
+                               dataFilter.addRules(\r
+                               {\r
+                                       text : function( text )\r
+                                       {\r
+                                               return text.replace( placeholderReplaceRegex, function( match )\r
+                                                       {\r
+                                                               return CKEDITOR.plugins.placeholder.createPlaceholder( editor, null, match, 1 );\r
+                                                       });\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       if ( htmlFilter )\r
+                       {\r
+                               htmlFilter.addRules(\r
+                               {\r
+                                       elements :\r
+                                       {\r
+                                               'span' : function( element )\r
+                                               {\r
+                                                       if ( element.attributes && element.attributes[ 'data-cke-placeholder' ] )\r
+                                                               delete element.name;\r
+                                               }\r
+                                       }\r
+                               });\r
+                       }\r
+               }\r
+       });\r
+})();\r
+\r
+CKEDITOR.plugins.placeholder =\r
+{\r
+       createPlaceholder : function( editor, oldElement, text, isGet )\r
+       {\r
+               var element = new CKEDITOR.dom.element( 'span', editor.document );\r
+               element.setAttributes(\r
+                       {\r
+                               contentEditable         : 'false',\r
+                               'data-cke-placeholder'  : 1,\r
+                               'class'                 : 'cke_placeholder'\r
+                       }\r
+               );\r
+\r
+               text && element.setText( text );\r
+\r
+               if ( isGet )\r
+                       return element.getOuterHtml();\r
+\r
+               if ( oldElement )\r
+               {\r
+                       if ( CKEDITOR.env.ie )\r
+                       {\r
+                               element.insertAfter( oldElement );\r
+                               // Some time is required for IE before the element is removed.\r
+                               setTimeout( function()\r
+                                       {\r
+                                               oldElement.remove();\r
+                                               element.focus();\r
+                                       }, 10 );\r
+                       }\r
+                       else\r
+                               element.replace( oldElement );\r
+               }\r
+               else\r
+                       editor.insertElement( element );\r
+       }\r
+};\r