-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplugin.js
More file actions
124 lines (109 loc) · 5.04 KB
/
plugin.js
File metadata and controls
124 lines (109 loc) · 5.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
CKEDITOR.plugins.add('collapsable', {
requires: 'widget',
icons: 'collapsable',
lang: ['en', 'cs', 'sk'],
init: function (editor) {
CKEDITOR.dtd.$editable['span'] = true;
CKEDITOR.dtd.$removeEmpty['span'] = false;
CKEDITOR.dialog.add('collapsable', this.path + 'dialogs/collapsable.js');
/* Set default options */
var options = editor.config.collapsable || {};
var headingTag = typeof options.headingTag === 'string' && options.headingTag || 'h3';
function getClassName(fromBem, element, defaultClass) {
var context = fromBem ? 'bemClass' : 'additionalClass';
var className = options[context] && options[context][element];
if (typeof className === 'undefined') {
className = options[context] && options[context]['elements'] && options[context]['elements'][element];
}
if (typeof className === 'undefined') {
className = defaultClass;
}
return className;
}
var bemClass = {
block: getClassName(true, 'block', 'wysiwyg-collapsable'),
elements: {
heading: getClassName(true, 'heading', 'wysiwyg-collapsable__heading'),
link: getClassName(true, 'link', 'wysiwyg-collapsable__link'),
linkInner: getClassName(true, 'linkInner', 'wysiwyg-collapsable__link-inner'),
box: getClassName(true, 'box', 'wysiwyg-collapsable__box')
}
};
var additionalClass = {
block: getClassName(false, 'block', 'js-collapsable'),
elements: {
heading: getClassName(false, 'heading', 'js-collapsable__control'),
link: getClassName(false, 'link', ''),
linkInner: getClassName(false, 'linkInner', ''),
box: getClassName(false, 'box', 'js-collapsable__box')
}
};
/* Set CSS if required */
if (options.useFallbackCSS) {
CKEDITOR.addCss("" +
"." + bemClass.block + " { margin:0 0 1em; padding:5px; }" +
"." + bemClass.elements.heading + " { display:-webkit-box; display:-ms-flexbox; display:flex; -webkit-box-align:center; -ms-flex-align:center; align-items:center; font-size:150%; }" +
"." + bemClass.elements.heading + ":before { -webkit-box-flex:0; -ms-flex:0 0 auto; flex:0 0 auto; width:0; height:0; margin:0 .5em 0 0; border-style:solid; border-width: .33em .33em 0; border-color: currentColor transparent transparent; content:''; }" +
"." + bemClass.elements.link + " { -webkit-box-flex:0; -ms-flex:0 1 100%; flex:0 1 100%; text-decoration:none; color:inherit; }" +
"." + bemClass.elements.linkInner + " { display:block; }" +
"." + bemClass.elements.box + " { margin-left:calc(1.5 * (.5em + .66em)); }"
);
}
/* Create widget */
editor.widgets.add('collapsable', {
button: editor.lang.collapsable.title,
dialog: 'collapsable',
lang: ['en', 'cs', 'sk'],
template:
'<section class="' + bemClass.block + ' ' + additionalClass.block + '">\n' +
' <' + headingTag +' class="' + bemClass.elements.heading + ' ' + additionalClass.elements.heading + '">\n' +
' <a class="' + bemClass.elements.link + ' ' + additionalClass.elements.link + '" href="#">\n' +
' <span class="' + bemClass.elements.linkInner + ' ' + additionalClass.elements.linkInner + '">{heading}</span>\n' +
' </a>\n' +
' </' + headingTag + '>\n' +
' <div class="' + bemClass.elements.box + ' ' + additionalClass.elements.box + '">\n' +
' {content}\n' +
' </div>\n' +
'</section>',
editables: {
heading: {
selector: '.' + bemClass.elements.linkInner,
allowedContent: 'br'
},
content: {
selector: '.' + bemClass.elements.box,
allowedContent: 'p ul ol li br strong em; img[!src,alt]; a[!href]'
}
},
allowedContent: 'section(!' + bemClass.block + ', ' + additionalClass.block.split(' ').join(', ') + ');' +
'' + headingTag + '(!' + bemClass.elements.heading + ', ' + additionalClass.elements.heading.split(' ').join(', ') + ');' +
'a(!' + bemClass.elements.link + ', ' + additionalClass.elements.link.split(' ').join(', ') + ');' +
'span(!' + bemClass.elements.linkInner + ', ' + additionalClass.elements.linkInner.split(' ').join(', ') + ');' +
'div(!' + bemClass.elements.box + ', ' + additionalClass.elements.box.split(' ').join(', ') + ');',
requiredContent: 'section(' + bemClass.block + ')',
defaults: {
heading: (options.defaults && options.defaults.heading || editor.lang.collapsable.heading),
content: (options.defaults && options.defaults.content || 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor.')
},
upcast: function(element) {
return element.name === 'section' && element.hasClass(bemClass.block);
},
init: function() {
// editables
for (var i in this.data) {
if (this.data.hasOwnProperty(i) && i in this.editables) {
this.setData(i, this.editables[i].getData());
}
}
},
data: function() {
// editables
for (var i in this.data) {
if (this.data.hasOwnProperty(i) && i in this.editables) {
this.editables[i].setData(this.data[i]);
}
}
}
});
}
});