diff options
Diffstat (limited to '_source/plugins/pagebreak/plugin.js')
| -rw-r--r-- | _source/plugins/pagebreak/plugin.js | 271 |
1 files changed, 164 insertions, 107 deletions
diff --git a/_source/plugins/pagebreak/plugin.js b/_source/plugins/pagebreak/plugin.js index 3d840fc..3b54b68 100644 --- a/_source/plugins/pagebreak/plugin.js +++ b/_source/plugins/pagebreak/plugin.js @@ -1,107 +1,164 @@ -/* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. -For licensing, see LICENSE.html or http://ckeditor.com/license -*/ - -/** - * @file Horizontal Page Break - */ - -// Register a plugin named "pagebreak". -CKEDITOR.plugins.add( 'pagebreak', -{ - init : function( editor ) - { - // Register the command. - editor.addCommand( 'pagebreak', CKEDITOR.plugins.pagebreakCmd ); - - // Register the toolbar button. - editor.ui.addButton( 'PageBreak', - { - label : editor.lang.pagebreak, - command : 'pagebreak' - }); - - // Add the style that renders our placeholder. - editor.addCss( - 'img.cke_pagebreak' + - '{' + - '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%;_width:99.9%;' + - 'border-top: #999999 1px dotted;' + - 'border-bottom: #999999 1px dotted;' + - 'height: 5px;' + - 'page-break-after: always;' + - - '}' ); - }, - - afterInit : function( editor ) - { - // Register a filter to displaying placeholders after mode change. - - var dataProcessor = editor.dataProcessor, - dataFilter = dataProcessor && dataProcessor.dataFilter; - - if ( dataFilter ) - { - dataFilter.addRules( - { - elements : - { - div : function( element ) - { - var attributes = element.attributes, - style = attributes && attributes.style, - child = style && element.children.length == 1 && element.children[ 0 ], - childStyle = child && ( child.name == 'span' ) && child.attributes.style; - - if ( childStyle && ( /page-break-after\s*:\s*always/i ).test( style ) && ( /display\s*:\s*none/i ).test( childStyle ) ) - return editor.createFakeParserElement( element, 'cke_pagebreak', 'div' ); - } - } - }); - } - }, - - requires : [ 'fakeobjects' ] -}); - -CKEDITOR.plugins.pagebreakCmd = -{ - exec : function( editor ) - { - // Create the element that represents a print break. - var breakObject = CKEDITOR.dom.element.createFromHtml( '<div style="page-break-after: always;"><span style="display: none;"> </span></div>' ); - - // Creates the fake image used for this element. - breakObject = editor.createFakeElement( breakObject, 'cke_pagebreak', 'div' ); - - var ranges = editor.getSelection().getRanges(); - - editor.fire( 'saveSnapshot' ); - - for ( var range, i = 0 ; i < ranges.length ; i++ ) - { - range = ranges[ i ]; - - if ( i > 0 ) - breakObject = breakObject.clone( true ); - - range.splitBlock( 'p' ); - range.insertNode( breakObject ); - if ( i == ranges.length - 1 ) - { - range.moveToPosition( breakObject, CKEDITOR.POSITION_AFTER_END ); - range.select(); - } - } - - editor.fire( 'saveSnapshot' ); - } -}; +/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+/**
+ * @file Horizontal Page Break
+ */
+
+// Register a plugin named "pagebreak".
+CKEDITOR.plugins.add( 'pagebreak',
+{
+ init : function( editor )
+ {
+ // Register the command.
+ editor.addCommand( 'pagebreak', CKEDITOR.plugins.pagebreakCmd );
+
+ // Register the toolbar button.
+ editor.ui.addButton( 'PageBreak',
+ {
+ label : editor.lang.pagebreak,
+ command : 'pagebreak'
+ });
+
+ var cssStyles = [
+ '{' ,
+ 'background: url(' + CKEDITOR.getUrl( this.path + 'images/pagebreak.gif' ) + ') no-repeat center center;' ,
+ 'clear: both;' ,
+ 'width:100%; _width:99.9%;' ,
+ 'border-top: #999999 1px dotted;' ,
+ 'border-bottom: #999999 1px dotted;' ,
+ 'padding:0;' ,
+ 'height: 5px;' ,
+ 'cursor: default;' ,
+ '}'
+ ].join( '' ).replace(/;/g, ' !important;' ); // Increase specificity to override other styles, e.g. block outline.
+
+ // Add the style that renders our placeholder.
+ editor.addCss( 'div.cke_pagebreak' + cssStyles );
+
+ // Opera needs help to select the page-break.
+ CKEDITOR.env.opera && editor.on( 'contentDom', function()
+ {
+ editor.document.on( 'click', function( evt )
+ {
+ var target = evt.data.getTarget();
+ if ( target.is( 'div' ) && target.hasClass( 'cke_pagebreak') )
+ editor.getSelection().selectElement( target );
+ });
+ });
+ },
+
+ afterInit : function( editor )
+ {
+ var label = editor.lang.pagebreakAlt;
+
+ // Register a filter to displaying placeholders after mode change.
+ var dataProcessor = editor.dataProcessor,
+ dataFilter = dataProcessor && dataProcessor.dataFilter,
+ htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+
+ if ( htmlFilter )
+ {
+ htmlFilter.addRules(
+ {
+ attributes : {
+ 'class' : function( value, element )
+ {
+ var className = value.replace( 'cke_pagebreak', '' );
+ if ( className != value )
+ {
+ var span = CKEDITOR.htmlParser.fragment.fromHtml( '<span style="display: none;"> </span>' );
+ element.children.length = 0;
+ element.add( span );
+ var attrs = element.attributes;
+ delete attrs[ 'aria-label' ];
+ delete attrs.contenteditable;
+ delete attrs.title;
+ }
+ return className;
+ }
+ }
+ }, 5 );
+ }
+
+ if ( dataFilter )
+ {
+ dataFilter.addRules(
+ {
+ elements :
+ {
+ div : function( element )
+ {
+ var attributes = element.attributes,
+ style = attributes && attributes.style,
+ child = style && element.children.length == 1 && element.children[ 0 ],
+ childStyle = child && ( child.name == 'span' ) && child.attributes.style;
+
+ if ( childStyle && ( /page-break-after\s*:\s*always/i ).test( style ) && ( /display\s*:\s*none/i ).test( childStyle ) )
+ {
+ attributes.contenteditable = "false";
+ attributes[ 'class' ] = "cke_pagebreak";
+ attributes[ 'data-cke-display-name' ] = "pagebreak";
+ attributes[ 'aria-label' ] = label;
+ attributes[ 'title' ] = label;
+
+ element.children.length = 0;
+ }
+ }
+ }
+ });
+ }
+ },
+
+ requires : [ 'fakeobjects' ]
+});
+
+CKEDITOR.plugins.pagebreakCmd =
+{
+ exec : function( editor )
+ {
+ var label = editor.lang.pagebreakAlt;
+
+ // Create read-only element that represents a print break.
+ var pagebreak = CKEDITOR.dom.element.createFromHtml(
+ '<div style="' +
+ 'page-break-after: always;"' +
+ 'contenteditable="false" ' +
+ 'title="'+ label + '" ' +
+ 'aria-label="'+ label + '" ' +
+ 'data-cke-display-name="pagebreak" ' +
+ 'class="cke_pagebreak">' +
+ '</div>', editor.document );
+
+ var ranges = editor.getSelection().getRanges( true );
+
+ editor.fire( 'saveSnapshot' );
+
+ for ( var range, i = ranges.length - 1 ; i >= 0; i-- )
+ {
+ range = ranges[ i ];
+
+ if ( i < ranges.length -1 )
+ pagebreak = pagebreak.clone( true );
+
+ range.splitBlock( 'p' );
+ range.insertNode( pagebreak );
+ if ( i == ranges.length - 1 )
+ {
+ var next = pagebreak.getNext();
+ range.moveToPosition( pagebreak, CKEDITOR.POSITION_AFTER_END );
+
+ // If there's nothing or a non-editable block followed by, establish a new paragraph
+ // to make sure cursor is not trapped.
+ if ( !next || next.type == CKEDITOR.NODE_ELEMENT && !next.isEditable() )
+ range.fixBlock( true, editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'p' );
+
+ range.select();
+ }
+ }
+
+ editor.fire( 'saveSnapshot' );
+ }
+};
|
