Created
May 20, 2015 23:15
-
-
Save webketje/8c949d57beffe097a770 to your computer and use it in GitHub Desktop.
CKEditor Toolbar code generator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
<title>CKEditor Toolbar builder</title> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script> | |
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> | |
<style> | |
body { font-family: sans-serif; font-size: 14px; padding: 0; margin: 0;} | |
#statusbar { position: absolute; right: 0; background: white; padding: 5px; width: 200px; border: 1px solid #c0c0c0; border-top-width: 0; border-right-width: 0; border-bottom-left-radius: 3px; height: 1em; top: 0;} | |
#predefined-schemes { padding: 5px 0; } | |
div.button.selected { background: #ffe; } | |
#toolbar { background: #eeeeee; overflow: auto; margin-top: 15px; } | |
#toolbar div.button-group, #toolbar div.button { border: 1px solid #c0c0c0; float: left; margin: 5px; padding: 2px; border-radius: 3px; font-family: sans-serif;font-size: 13px; } | |
#toolbar div.button {margin: 2px; padding: 2px 4px;} | |
#toolbar div.icon { background-image: url(http://i.imgur.com/MnAHdlU.png); width: 16px; height: 16px;} | |
#output { border: 1px solid #c0c0c0; padding: 2px; border-radius: 3px;} | |
</style> | |
</head> | |
<body> | |
<div id="predefined-schemes" data-bind="foreach: schemes"> | |
<input type="radio" name="predef-schemes" data-bind="checked: $root.selScheme, checkedValue: $index(), disable: name === 'custom'"> | |
<label data-bind="text: name" for="predef-schemes"></label> | |
</div> | |
<div data-bind="text: activeButton() ? activeButton() : ''" id="statusbar"></div> | |
<div id="toolbar" data-bind="foreach: buttonGroups"> | |
<div data-bind="foreach: items" class="button-group"> | |
<div class="button" data-bind="click: function() { selected(!selected()); }, css: { selected: selected }"> | |
<!-- ko if: $data.hasOwnProperty('pos') --> | |
<div data-bind="style: { backgroundPosition: '0 -' + (pos*16) + 'px', float: name === 'Source' ? 'left' : 'none' }" class="icon"></div> | |
<!-- ko if: name === 'Source' --> | |
<span data-bind="text: name" style="margin-left: 3px; vertical-align: middle;"></span> | |
<!-- /ko --> | |
<!-- /ko --> | |
<!-- ko ifnot: $data.hasOwnProperty('pos') --> | |
<div data-bind="text: name" style="font-size: 14px;"></div> | |
<!-- /ko --> | |
</div> | |
</div> | |
</div> | |
<div style="margin-top: 10px;"> | |
<label for="output" style="margin-right: 10px;">Paste code:</label> | |
<input type="text" name="output" id="output" data-bind="value: output, event: {click: $element.select()} "/> | |
</div> | |
<script> | |
var app = { | |
activeButton: ko.observable(false), | |
buttonGroups: [ | |
{ name: 'Document', items : [ {name: 'Source', pos: 0}, {name: 'Save', pos: 2}, {name: 'NewPage', pos: 3}, {name: 'DocProps', pos: 4}, {name: 'Preview', pos: 4}, {name: 'Print', pos: 11}, {name: 'Templates', pos: 5}]}, | |
{ name: 'Clipboard', items : [ {name: 'Cut', pos: 6}, {name: 'Copy', pos: 7}, {name: 'Paste', pos: 8}, {name: 'PasteText', pos: 9}, {name: 'PasteFromWord', pos: 10},{name: 'Undo', pos: 13}, {name: 'Redo', pos: 14}]}, | |
{ name: 'Editing', items : [ {name: 'Find', pos: 15}, {name: 'Replace', pos: 16}, {name: 'SelectAll', pos: 17}, {name: 'SpellChecker', pos: 12}, {name: 'Scayt', pos: 12 }]}, | |
{ name: 'Forms', br: true, items : [{name: 'Form', pos: 51},{name: 'Checkbox', pos:48}, {name: 'Radio', pos: 49}, {name: 'TextField', pos: 50}, {name: 'Textarea', pos: 51}, {name: 'Select', pos: 52}, {name: 'Button', pos: 53},{name: 'ImageButton', pos: 54},{name: 'HiddenField', pos: 55}]}, | |
{ name: 'Basicstyles', br: true, items : [ {name: 'Bold', pos: 19}, {name: 'Italic', pos: 20},{name: 'Underline', pos: 21}, {name: 'Strike', pos: 22}, {name: 'Subscript', pos:23},{name: 'Superscript', pos: 24},{name: 'RemoveFormat', pos: 18}]}, | |
{ name: 'Paragraph', items : [ {name: 'NumberedList', pos: 25},{name: 'BulletedList', pos: 26},{name: 'Outdent', pos: 27},{name: 'Indent', pos: 28},{name: 'Blockquote', pos: 72}, {name: 'CreateDiv', pos: 73},{name: 'JustifyLeft', pos: 29},{name: 'JustifyCenter', pos: 30}, {name: 'JustifyRight', pos: 31}, {name: 'JustifyBlock', pos: 32},{name: 'BidiLtr', pos: 66}, {name: 'BidiRtl', pos: 67}]}, | |
{ name: 'Links', items : [ {name: 'Link', pos:33}, {name: 'Unlink', pos:34}, {name: 'Anchor', pos:35}]}, | |
{ name: 'Insert', items : [ {name: 'Image', pos:36}, {name: 'Flash', pos:37}, {name: 'Table', pos:38}, {name: 'HorizontalRule', pos:39}, {name: 'Smiley', pos:40}, {name: 'SpecialChar', pos:41}, {name: 'PageBreak', pos:42}, {name: 'Iframe', pos:43}]}, | |
{ name: 'Styles', items : [ {name: 'Styles'}, {name: 'Format'}, {name: 'Font'}, {name: 'FontSize'}]}, | |
{ name: 'Colors', items : [ {name: 'TextColor', pos: 45}, {name: 'BGColor', pos: 46}]}, | |
{ name: 'Tools', items : [ {name: 'Maximize', pos: 65}, {name: 'ShowBlocks', pos: 47}, {name: 'About', pos: 46}]} | |
] | |
}; | |
var order = 0; | |
ko.utils.arrayForEach(app.buttonGroups, function(btg) { | |
ko.utils.arrayForEach(btg.items, function(bt) { | |
bt.selected = ko.observable(false); | |
bt.order = order++; | |
}); | |
}); | |
app.triggerUpdates = ko.observable(true); | |
app.selectedButtons = ko.computed(function() { | |
var result = []; | |
ko.utils.arrayForEach(app.buttonGroups, function(btg) { | |
ko.utils.arrayForEach(btg.items, function(bt) { | |
var x = bt; | |
if ( bt.selected() === true) { | |
x.group = btg.name; | |
result.push(x); | |
} | |
}); | |
}); | |
result.sort(function (l, r) { return l.order > r.order ? 1 : -1 }) | |
return result; | |
}).extend({rateLimit: 200 }); | |
app.selectedButtons.subscribe(function(value) { | |
function match(a, b) { | |
if (a.length === b.length) { | |
for (var i = 0; i < a.length; i++) { | |
if (a[i] !== b[i]) { | |
console.log(a[i] + ' - ' + b[i]); | |
return false; | |
} | |
} | |
return true; | |
} | |
return false; | |
} | |
var value = ko.utils.arrayMap(value, function(item) { return item.name }), flag = false; | |
ko.utils.arrayForEach(app.schemes, function(scheme, i) { | |
if (scheme.items && match(value, scheme.items)) { | |
flag = true; | |
if (app.selScheme() !== i) app.selScheme(i); | |
} | |
}); | |
if (flag === false) { | |
app.selScheme(app.schemes.length-1); | |
} | |
}); | |
app.output = ko.computed(function() { | |
var collection = app.selectedButtons(), output = '[', groups = 0; | |
var seps = function(i) { | |
var arr = [2, 3, 5, 7]; | |
for (var x = arr.length; x--;) { | |
if (i === arr[x]) return true; | |
} | |
return false; | |
}; | |
for (var i = 0; i < collection.length; i++) { | |
var item = collection[i]; | |
if (i === 0) | |
output += '['; | |
if (collection[i-1] && collection[i-1].group !== item.group) | |
groups++; | |
output += '"' + item.name + '"'; | |
if (collection[i+1] && collection[i+1].group === item.group) { | |
output += ','; | |
} | |
else if (i === collection.length-1) | |
output += ']'; | |
else { | |
//if (seps(groups)) | |
// continue; //output += '], "/", ['; | |
//else | |
output += '], ['; | |
} | |
} | |
return output + ']'; | |
}); | |
app.iterateButtons = function(action) { | |
ko.utils.arrayForEach(app.buttonGroups, function(btg) { | |
ko.utils.arrayForEach(btg.items, function(bt) { | |
action(btg, bt); | |
}); | |
}); | |
}; | |
app.schemes = [ | |
{name: 'none', items: [], output: '[]'}, | |
{name: 'basic', items: ['Source','Bold', 'Italic', 'Underline', 'RemoveFormat', 'NumberedList', 'BulletedList', 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock', 'Link', 'Unlink', 'Image'], output: ko.toJSON(['Source','Bold', 'Italic', 'Underline', 'RemoveFormat', 'NumberedList', 'BulletedList', 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock', 'Link', 'Unlink', 'Image'])}, | |
{name: 'advanced', items: ['Source','Bold', 'Italic', 'Underline', 'RemoveFormat', 'NumberedList', 'BulletedList', 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock', 'Link', 'Unlink', 'Image', 'Table', 'Styles','Format','Font','FontSize','TextColor', 'BGColor'], | |
output: ko.toJSON([['Bold', 'Italic', 'Underline', 'NumberedList', 'BulletedList', 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock', 'Table', 'TextColor', 'BGColor', 'Link', 'Unlink', 'Image', 'RemoveFormat', 'Source'],'/',['Styles','Format','Font','FontSize']])}, | |
{name: 'full', items: [], output: ''}, | |
{name: 'custom'} | |
]; | |
app.iterateButtons(function(group, button) { app.schemes[3].items.push(button.name); }); | |
app.schemes[3].output = ko.toJSON(app.schemes[3].items); | |
app.selScheme = ko.observable(0); | |
app.selScheme.subscribe(function(value) { | |
var s = app.schemes[ko.unwrap(value)].items; | |
if (app.selScheme() !== 4) { | |
app.iterateButtons(function(group, bt) { | |
if (s.indexOf(bt.name) > -1) | |
bt.selected(true); | |
else | |
bt.selected(false); | |
}); | |
} | |
}); | |
app.getScheme = function(scheme) { | |
if (scheme === 'full') { | |
var result = []; | |
ko.utils.arrayForEach(app.buttonGroups, function(btg) { | |
var btGroup = []; | |
ko.utils.arrayForEach(btg.items, function(bt) { | |
btGroup.push(bt.name); | |
}); | |
result.push(btGroup); | |
}); | |
return result; | |
} else { | |
return app.schemes[scheme]; | |
} | |
}; | |
ko.applyBindings(app); | |
$('.button').mouseenter(function() { | |
var data = ko.dataFor(this).name, | |
ctx = ko.contextFor(this).$parent.name; | |
app.activeButton(ctx + ': ' + data); | |
}); | |
$('.button').mouseleave(function() { | |
app.activeButton(false); | |
}); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment