123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /*
- Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
- For licensing, see LICENSE.html or http://ckeditor.com/license
- */
- /**
- * @file Plugin for inserting Drupal teaser and page breaks.
- */
- ( function() {
- var pluginRequires = [ 'fakeobjects' ];
- if (Drupal.ckeditor_ver == 3) {
- pluginRequires = [ 'fakeobjects', 'htmldataprocessor' ];
- }
- CKEDITOR.plugins.add( 'drupalbreaks',
- {
- requires : pluginRequires,
- init : function( editor )
- {
- var addCssObj = CKEDITOR;
- if (Drupal.ckeditor_ver == 3) {
- addCssObj = editor;
- }
- // Add the styles that renders our fake objects.
- addCssObj.addCss(
- 'img.cke_drupal_pagebreak,img.cke_drupal_break' +
- '{' +
- 'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/pagebreak.gif' ) + ');' +
- 'background-position: center center;' +
- 'background-repeat: no-repeat;' +
- 'clear: both;' +
- 'display: block;' +
- 'float: none;' +
- 'width: 100%;' +
- 'border-top: #999999 1px dotted;' +
- 'border-bottom: #999999 1px dotted;' +
- 'height: 5px;' +
- '}' +
- 'img.cke_drupal_break' +
- '{' +
- 'border-top: #FF0000 1px dotted;' +
- 'border-bottom: #FF0000 1px dotted;' +
- '}'
- );
- // Register the toolbar buttons.
- editor.ui.addButton( 'DrupalBreak',
- {
- label : Drupal.t('Insert Teaser Break'),
- icon : this.path + 'images/drupalbreak.png',
- command : 'drupalbreak'
- });
- editor.addCommand( 'drupalbreak',
- {
- exec : function()
- {
- // There should be only one <!--break--> in document. So, look
- // for an image with class "cke_drupal_break" (the fake element).
- var images = editor.document.getElementsByTag( 'img' );
- for ( var i = 0, len = images.count() ; i < len ; i++ )
- {
- var img = images.getItem( i );
- if ( img.hasClass( 'cke_drupal_break' ) )
- {
- if ( confirm( Drupal.t( 'The document already contains a teaser break. Do you want to proceed by removing it first?' ) ) )
- {
- img.remove();
- break;
- }
- else
- return;
- }
- }
- insertComment( 'break' );
- }
- } );
- editor.ui.addButton( 'DrupalPageBreak',
- {
- label : Drupal.t( 'Insert Page Break' ),
- icon : this.path + 'images/drupalpagebreak.png',
- command : 'drupalpagebreak'
- });
- editor.addCommand( 'drupalpagebreak',
- {
- exec : function()
- {
- insertComment( 'pagebreak' );
- }
- } );
- // This function effectively inserts the comment into the editor.
- function insertComment( text )
- {
- // Create the fake element that will be inserted into the document.
- // The trick is declaring it as an <hr>, so it will behave like a
- // block element (and in effect it behaves much like an <hr>).
- if ( !CKEDITOR.dom.comment.prototype.getAttribute ) {
- CKEDITOR.dom.comment.prototype.getAttribute = function() {
- return '';
- };
- CKEDITOR.dom.comment.prototype.attributes = {
- align : ''
- };
- }
- var fakeElement = editor.createFakeElement( new CKEDITOR.dom.comment( text ), 'cke_drupal_' + text, 'hr' );
- // This is the trick part. We can't use editor.insertElement()
- // because we need to put the comment directly at <body> level.
- // We need to do range manipulation for that.
- // Get a DOM range from the current selection.
- var range = editor.getSelection().getRanges()[0],
- elementsPath = new CKEDITOR.dom.elementPath( range.getCommonAncestor( true ) ),
- element = ( elementsPath.block && elementsPath.block.getParent() ) || elementsPath.blockLimit,
- hasMoved;
- // If we're not in <body> go moving the position to after the
- // elements until reaching it. This may happen when inside tables,
- // lists, blockquotes, etc.
- while ( element && element.getName() != 'body' )
- {
- range.moveToPosition( element, CKEDITOR.POSITION_AFTER_END );
- hasMoved = 1;
- element = element.getParent();
- }
- // Split the current block.
- if ( !hasMoved )
- range.splitBlock( 'p' );
- // Insert the fake element into the document.
- range.insertNode( fakeElement );
- // Now, we move the selection to the best possible place following
- // our fake element.
- var next = fakeElement;
- while ( ( next = next.getNext() ) && !range.moveToElementEditStart( next ) )
- {}
- range.select();
- }
- },
- afterInit : function( editor )
- {
- // Adds the comment processing rules to the data filter, so comments
- // are replaced by fake elements.
- editor.dataProcessor.dataFilter.addRules(
- {
- comment : function( value )
- {
- if ( !CKEDITOR.htmlParser.comment.prototype.getAttribute ) {
- CKEDITOR.htmlParser.comment.prototype.getAttribute = function() {
- return '';
- };
- CKEDITOR.htmlParser.comment.prototype.attributes = {
- align : ''
- };
- }
- if ( value == 'break' || value == 'pagebreak' )
- return editor.createFakeParserElement( new CKEDITOR.htmlParser.comment( value ), 'cke_drupal_' + value, 'hr' );
- return value;
- }
- });
- }
- });
- } )();
|