Mercurial > hg > cmmr2012-drupal-site
diff core/modules/ckeditor/js/views/ControllerView.js @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/ckeditor/js/views/ControllerView.js Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,230 @@ +/** +* DO NOT EDIT THIS FILE. +* See the following change record for more information, +* https://www.drupal.org/node/2815083 +* @preserve +**/ + +(function ($, Drupal, Backbone, CKEDITOR, _) { + Drupal.ckeditor.ControllerView = Backbone.View.extend({ + events: {}, + + initialize: function initialize() { + this.getCKEditorFeatures(this.model.get('hiddenEditorConfig'), this.disableFeaturesDisallowedByFilters.bind(this)); + + this.model.listenTo(this.model, 'change:activeEditorConfig', this.model.sync); + this.listenTo(this.model, 'change:isDirty', this.parseEditorDOM); + }, + parseEditorDOM: function parseEditorDOM(model, isDirty, options) { + if (isDirty) { + var currentConfig = this.model.get('activeEditorConfig'); + + var rows = []; + this.$el.find('.ckeditor-active-toolbar-configuration').children('.ckeditor-row').each(function () { + var groups = []; + + $(this).find('.ckeditor-toolbar-group').each(function () { + var $group = $(this); + var $buttons = $group.find('.ckeditor-button'); + if ($buttons.length) { + var group = { + name: $group.attr('data-drupal-ckeditor-toolbar-group-name'), + items: [] + }; + $group.find('.ckeditor-button, .ckeditor-multiple-button').each(function () { + group.items.push($(this).attr('data-drupal-ckeditor-button-name')); + }); + groups.push(group); + } + }); + if (groups.length) { + rows.push(groups); + } + }); + this.model.set('activeEditorConfig', rows); + + this.model.set('isDirty', false); + + if (options.broadcast !== false) { + var prev = this.getButtonList(currentConfig); + var next = this.getButtonList(rows); + if (prev.length !== next.length) { + this.$el.find('.ckeditor-toolbar-active').trigger('CKEditorToolbarChanged', [prev.length < next.length ? 'added' : 'removed', _.difference(_.union(prev, next), _.intersection(prev, next))[0]]); + } + } + } + }, + getCKEditorFeatures: function getCKEditorFeatures(CKEditorConfig, callback) { + var getProperties = function getProperties(CKEPropertiesList) { + return _.isObject(CKEPropertiesList) ? _.keys(CKEPropertiesList) : []; + }; + + var convertCKERulesToEditorFeature = function convertCKERulesToEditorFeature(feature, CKEFeatureRules) { + for (var i = 0; i < CKEFeatureRules.length; i++) { + var CKERule = CKEFeatureRules[i]; + var rule = new Drupal.EditorFeatureHTMLRule(); + + var tags = getProperties(CKERule.elements); + rule.required.tags = CKERule.propertiesOnly ? [] : tags; + rule.allowed.tags = tags; + + rule.required.attributes = getProperties(CKERule.requiredAttributes); + rule.allowed.attributes = getProperties(CKERule.attributes); + + rule.required.styles = getProperties(CKERule.requiredStyles); + rule.allowed.styles = getProperties(CKERule.styles); + + rule.required.classes = getProperties(CKERule.requiredClasses); + rule.allowed.classes = getProperties(CKERule.classes); + + rule.raw = CKERule; + + feature.addHTMLRule(rule); + } + }; + + var hiddenCKEditorID = 'ckeditor-hidden'; + if (CKEDITOR.instances[hiddenCKEditorID]) { + CKEDITOR.instances[hiddenCKEditorID].destroy(true); + } + + var hiddenEditorConfig = this.model.get('hiddenEditorConfig'); + if (hiddenEditorConfig.drupalExternalPlugins) { + var externalPlugins = hiddenEditorConfig.drupalExternalPlugins; + Object.keys(externalPlugins || {}).forEach(function (pluginName) { + CKEDITOR.plugins.addExternal(pluginName, externalPlugins[pluginName], ''); + }); + } + CKEDITOR.inline($('#' + hiddenCKEditorID).get(0), CKEditorConfig); + + CKEDITOR.once('instanceReady', function (e) { + if (e.editor.name === hiddenCKEditorID) { + var CKEFeatureRulesMap = {}; + var rules = e.editor.filter.allowedContent; + var rule = void 0; + var name = void 0; + for (var i = 0; i < rules.length; i++) { + rule = rules[i]; + name = rule.featureName || ':('; + if (!CKEFeatureRulesMap[name]) { + CKEFeatureRulesMap[name] = []; + } + CKEFeatureRulesMap[name].push(rule); + } + + var features = {}; + var buttonsToFeatures = {}; + Object.keys(CKEFeatureRulesMap).forEach(function (featureName) { + var feature = new Drupal.EditorFeature(featureName); + convertCKERulesToEditorFeature(feature, CKEFeatureRulesMap[featureName]); + features[featureName] = feature; + var command = e.editor.getCommand(featureName); + if (command) { + buttonsToFeatures[command.uiItems[0].name] = featureName; + } + }); + + callback(features, buttonsToFeatures); + } + }); + }, + getFeatureForButton: function getFeatureForButton(button) { + if (button === '-') { + return false; + } + + var featureName = this.model.get('buttonsToFeatures')[button.toLowerCase()]; + + if (!featureName) { + featureName = button.toLowerCase(); + } + var featuresMetadata = this.model.get('featuresMetadata'); + if (!featuresMetadata[featureName]) { + featuresMetadata[featureName] = new Drupal.EditorFeature(featureName); + this.model.set('featuresMetadata', featuresMetadata); + } + return featuresMetadata[featureName]; + }, + disableFeaturesDisallowedByFilters: function disableFeaturesDisallowedByFilters(features, buttonsToFeatures) { + this.model.set('featuresMetadata', features); + + this.model.set('buttonsToFeatures', buttonsToFeatures); + + this.broadcastConfigurationChanges(this.$el); + + var existingButtons = []; + + var buttonGroups = _.flatten(this.model.get('activeEditorConfig')); + for (var i = 0; i < buttonGroups.length; i++) { + var buttons = buttonGroups[i].items; + for (var k = 0; k < buttons.length; k++) { + existingButtons.push(buttons[k]); + } + } + + existingButtons = _.unique(existingButtons); + + for (var n = 0; n < existingButtons.length; n++) { + var button = existingButtons[n]; + var feature = this.getFeatureForButton(button); + + if (feature === false) { + continue; + } + + if (Drupal.editorConfiguration.featureIsAllowedByFilters(feature)) { + this.$el.find('.ckeditor-toolbar-active').trigger('CKEditorToolbarChanged', ['added', existingButtons[n]]); + } else { + $('.ckeditor-toolbar-active li[data-drupal-ckeditor-button-name="' + button + '"]').detach().appendTo('.ckeditor-toolbar-disabled > .ckeditor-toolbar-available > ul'); + + this.model.set({ isDirty: true }, { broadcast: false }); + } + } + }, + broadcastConfigurationChanges: function broadcastConfigurationChanges($ckeditorToolbar) { + var view = this; + var hiddenEditorConfig = this.model.get('hiddenEditorConfig'); + var getFeatureForButton = this.getFeatureForButton.bind(this); + var getCKEditorFeatures = this.getCKEditorFeatures.bind(this); + $ckeditorToolbar.find('.ckeditor-toolbar-active').on('CKEditorToolbarChanged.ckeditorAdmin', function (event, action, button) { + var feature = getFeatureForButton(button); + + if (feature === false) { + return; + } + + var configEvent = action === 'added' ? 'addedFeature' : 'removedFeature'; + Drupal.editorConfiguration[configEvent](feature); + }).on('CKEditorPluginSettingsChanged.ckeditorAdmin', function (event, settingsChanges) { + Object.keys(settingsChanges || {}).forEach(function (key) { + hiddenEditorConfig[key] = settingsChanges[key]; + }); + + getCKEditorFeatures(hiddenEditorConfig, function (features) { + var featuresMetadata = view.model.get('featuresMetadata'); + Object.keys(features || {}).forEach(function (name) { + var feature = features[name]; + if (featuresMetadata.hasOwnProperty(name) && !_.isEqual(featuresMetadata[name], feature)) { + Drupal.editorConfiguration.modifiedFeature(feature); + } + }); + + view.model.set('featuresMetadata', features); + }); + }); + }, + getButtonList: function getButtonList(config) { + var buttons = []; + + config = _.flatten(config); + + config.forEach(function (group) { + group.items.forEach(function (button) { + buttons.push(button); + }); + }); + + return _.without(buttons, '-'); + } + }); +})(jQuery, Drupal, Backbone, CKEDITOR, _); \ No newline at end of file