]>
Commit | Line | Data |
---|---|---|
7adcb81e IB |
1 | /**\r |
2 | * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.\r | |
3 | * For licensing, see LICENSE.md or http://ckeditor.com/license\r | |
4 | */\r | |
5 | \r | |
6 | /**\r | |
7 | * @fileOverview Horizontal Page Break\r | |
8 | */\r | |
9 | \r | |
10 | 'use strict';\r | |
11 | \r | |
12 | ( function() {\r | |
13 | // Register a plugin named "pagebreak".\r | |
14 | CKEDITOR.plugins.add( 'pagebreak', {\r | |
15 | requires: 'fakeobjects',\r | |
16 | // jscs:disable maximumLineLength\r | |
17 | lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%\r | |
18 | // jscs:enable maximumLineLength\r | |
19 | icons: 'pagebreak,pagebreak-rtl', // %REMOVE_LINE_CORE%\r | |
20 | hidpi: true, // %REMOVE_LINE_CORE%\r | |
21 | onLoad: function() {\r | |
22 | var cssStyles = (\r | |
23 | 'background:url(' + CKEDITOR.getUrl( this.path + 'images/pagebreak.gif' ) + ') no-repeat center center;' +\r | |
24 | 'clear:both;' +\r | |
25 | 'width:100%;' +\r | |
26 | 'border-top:#999 1px dotted;' +\r | |
27 | 'border-bottom:#999 1px dotted;' +\r | |
28 | 'padding:0;' +\r | |
29 | 'height:7px;' +\r | |
30 | 'cursor:default;'\r | |
31 | ).replace( /;/g, ' !important;' ); // Increase specificity to override other styles, e.g. block outline.\r | |
32 | \r | |
33 | // Add the style that renders our placeholder.\r | |
34 | CKEDITOR.addCss( 'div.cke_pagebreak{' + cssStyles + '}' );\r | |
35 | },\r | |
36 | \r | |
37 | init: function( editor ) {\r | |
38 | if ( editor.blockless )\r | |
39 | return;\r | |
40 | \r | |
41 | // Register the command.\r | |
42 | editor.addCommand( 'pagebreak', CKEDITOR.plugins.pagebreakCmd );\r | |
43 | \r | |
44 | // Register the toolbar button.\r | |
45 | editor.ui.addButton && editor.ui.addButton( 'PageBreak', {\r | |
46 | label: editor.lang.pagebreak.toolbar,\r | |
47 | command: 'pagebreak',\r | |
48 | toolbar: 'insert,70'\r | |
49 | } );\r | |
50 | \r | |
51 | // Webkit based browsers needs help to select the page-break.\r | |
52 | CKEDITOR.env.webkit && editor.on( 'contentDom', function() {\r | |
53 | editor.document.on( 'click', function( evt ) {\r | |
54 | var target = evt.data.getTarget();\r | |
55 | if ( target.is( 'div' ) && target.hasClass( 'cke_pagebreak' ) )\r | |
56 | editor.getSelection().selectElement( target );\r | |
57 | } );\r | |
58 | } );\r | |
59 | },\r | |
60 | \r | |
61 | afterInit: function( editor ) {\r | |
62 | // Register a filter to displaying placeholders after mode change.\r | |
63 | var dataProcessor = editor.dataProcessor,\r | |
64 | dataFilter = dataProcessor && dataProcessor.dataFilter,\r | |
65 | htmlFilter = dataProcessor && dataProcessor.htmlFilter,\r | |
66 | styleRegex = /page-break-after\s*:\s*always/i,\r | |
67 | childStyleRegex = /display\s*:\s*none/i;\r | |
68 | \r | |
69 | function upcastPageBreak( element ) {\r | |
70 | CKEDITOR.tools.extend( element.attributes, attributesSet( editor.lang.pagebreak.alt ), true );\r | |
71 | \r | |
72 | element.children.length = 0;\r | |
73 | }\r | |
74 | \r | |
75 | if ( htmlFilter ) {\r | |
76 | htmlFilter.addRules( {\r | |
77 | attributes: {\r | |
78 | 'class': function( value, element ) {\r | |
79 | var className = value.replace( 'cke_pagebreak', '' );\r | |
80 | if ( className != value ) {\r | |
81 | var span = CKEDITOR.htmlParser.fragment.fromHtml( '<span style="display: none;"> </span>' ).children[ 0 ];\r | |
82 | element.children.length = 0;\r | |
83 | element.add( span );\r | |
84 | var attrs = element.attributes;\r | |
85 | delete attrs[ 'aria-label' ];\r | |
86 | delete attrs.contenteditable;\r | |
87 | delete attrs.title;\r | |
88 | }\r | |
89 | return className;\r | |
90 | }\r | |
91 | }\r | |
92 | }, { applyToAll: true, priority: 5 } );\r | |
93 | }\r | |
94 | \r | |
95 | if ( dataFilter ) {\r | |
96 | dataFilter.addRules( {\r | |
97 | elements: {\r | |
98 | div: function( element ) {\r | |
99 | // The "internal form" of a pagebreak is pasted from clipboard.\r | |
100 | // ACF may have distorted the HTML because "internal form" is\r | |
101 | // different than "data form". Make sure that element remains valid\r | |
102 | // by re-upcasting it (#11133).\r | |
103 | if ( element.attributes[ 'data-cke-pagebreak' ] )\r | |
104 | upcastPageBreak( element );\r | |
105 | \r | |
106 | // Check for "data form" of the pagebreak. If both element and\r | |
107 | // descendants match, convert them to internal form.\r | |
108 | else if ( styleRegex.test( element.attributes.style ) ) {\r | |
109 | var child = element.children[ 0 ];\r | |
110 | \r | |
111 | if ( child && child.name == 'span' && childStyleRegex.test( child.attributes.style ) )\r | |
112 | upcastPageBreak( element );\r | |
113 | }\r | |
114 | }\r | |
115 | }\r | |
116 | } );\r | |
117 | }\r | |
118 | }\r | |
119 | } );\r | |
120 | \r | |
121 | // TODO Much probably there's no need to expose this object as public object.\r | |
122 | CKEDITOR.plugins.pagebreakCmd = {\r | |
123 | exec: function( editor ) {\r | |
124 | // Create read-only element that represents a print break.\r | |
125 | var pagebreak = editor.document.createElement( 'div', {\r | |
126 | attributes: attributesSet( editor.lang.pagebreak.alt )\r | |
127 | } );\r | |
128 | \r | |
129 | editor.insertElement( pagebreak );\r | |
130 | },\r | |
131 | context: 'div',\r | |
132 | allowedContent: {\r | |
133 | div: {\r | |
134 | styles: '!page-break-after'\r | |
135 | },\r | |
136 | span: {\r | |
137 | match: function( element ) {\r | |
138 | var parent = element.parent;\r | |
139 | return parent && parent.name == 'div' && parent.styles && parent.styles[ 'page-break-after' ];\r | |
140 | },\r | |
141 | styles: 'display'\r | |
142 | }\r | |
143 | },\r | |
144 | requiredContent: 'div{page-break-after}'\r | |
145 | };\r | |
146 | \r | |
147 | // Returns an object representing all the attributes\r | |
148 | // of the "internal form" of the pagebreak element.\r | |
149 | function attributesSet( label ) {\r | |
150 | return {\r | |
151 | 'aria-label': label,\r | |
152 | 'class': 'cke_pagebreak',\r | |
153 | contenteditable: 'false',\r | |
154 | 'data-cke-display-name': 'pagebreak',\r | |
155 | 'data-cke-pagebreak': 1,\r | |
156 | style: 'page-break-after: always',\r | |
157 | title: label\r | |
158 | };\r | |
159 | }\r | |
160 | } )();\r |