X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Feditor%2Fjs%2Feditor.admin.js;fp=web%2Fcore%2Fmodules%2Feditor%2Fjs%2Feditor.admin.js;h=377aef23244c8259e5104739ac3f6b81dd603778;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hp=1fdb35320248c9fa2efcf2a1ff8346e8513cc06e;hpb=aea91e65e895364e460983b890e295aa5d5540a5;p=yaffs-website diff --git a/web/core/modules/editor/js/editor.admin.js b/web/core/modules/editor/js/editor.admin.js index 1fdb35320..377aef232 100644 --- a/web/core/modules/editor/js/editor.admin.js +++ b/web/core/modules/editor/js/editor.admin.js @@ -1,147 +1,22 @@ /** - * @file - * Provides a JavaScript API to broadcast text editor configuration changes. - * - * Filter implementations may listen to the drupalEditorFeatureAdded, - * drupalEditorFeatureRemoved, and drupalEditorFeatureRemoved events on document - * to automatically adjust their settings based on the editor configuration. - */ +* DO NOT EDIT THIS FILE. +* See the following change record for more information, +* https://www.drupal.org/node/2815083 +* @preserve +**/ (function ($, _, Drupal, document) { - - 'use strict'; - - /** - * Editor configuration namespace. - * - * @namespace - */ Drupal.editorConfiguration = { - - /** - * Must be called by a specific text editor's configuration whenever a - * feature is added by the user. - * - * Triggers the drupalEditorFeatureAdded event on the document, which - * receives a {@link Drupal.EditorFeature} object. - * - * @param {Drupal.EditorFeature} feature - * A text editor feature object. - * - * @fires event:drupalEditorFeatureAdded - */ - addedFeature: function (feature) { + addedFeature: function addedFeature(feature) { $(document).trigger('drupalEditorFeatureAdded', feature); }, - - /** - * Must be called by a specific text editor's configuration whenever a - * feature is removed by the user. - * - * Triggers the drupalEditorFeatureRemoved event on the document, which - * receives a {@link Drupal.EditorFeature} object. - * - * @param {Drupal.EditorFeature} feature - * A text editor feature object. - * - * @fires event:drupalEditorFeatureRemoved - */ - removedFeature: function (feature) { + removedFeature: function removedFeature(feature) { $(document).trigger('drupalEditorFeatureRemoved', feature); }, - - /** - * Must be called by a specific text editor's configuration whenever a - * feature is modified, i.e. has different rules. - * - * For example when the "Bold" button is configured to use the `` tag - * instead of the `` tag. - * - * Triggers the drupalEditorFeatureModified event on the document, which - * receives a {@link Drupal.EditorFeature} object. - * - * @param {Drupal.EditorFeature} feature - * A text editor feature object. - * - * @fires event:drupalEditorFeatureModified - */ - modifiedFeature: function (feature) { + modifiedFeature: function modifiedFeature(feature) { $(document).trigger('drupalEditorFeatureModified', feature); }, - - /** - * May be called by a specific text editor's configuration whenever a - * feature is being added, to check whether it would require the filter - * settings to be updated. - * - * The canonical use case is when a text editor is being enabled: - * preferably - * this would not cause the filter settings to be changed; rather, the - * default set of buttons (features) for the text editor should adjust - * itself to not cause filter setting changes. - * - * Note: for filters to integrate with this functionality, it is necessary - * that they implement - * `Drupal.filterSettingsForEditors[filterID].getRules()`. - * - * @param {Drupal.EditorFeature} feature - * A text editor feature object. - * - * @return {bool} - * Whether the given feature is allowed by the current filters. - */ - featureIsAllowedByFilters: function (feature) { - - /** - * Generate the universe U of possible values that can result from the - * feature's rules' requirements. - * - * This generates an object of this form: - * var universe = { - * a: { - * 'touchedByAllowedPropertyRule': false, - * 'tag': false, - * 'attributes:href': false, - * 'classes:external': false, - * }, - * strong: { - * 'touchedByAllowedPropertyRule': false, - * 'tag': false, - * }, - * img: { - * 'touchedByAllowedPropertyRule': false, - * 'tag': false, - * 'attributes:src': false - * } - * }; - * - * In this example, the given text editor feature resulted in the above - * universe, which shows that it must be allowed to generate the a, - * strong and img tags. For the a tag, it must be able to set the "href" - * attribute and the "external" class. For the strong tag, no further - * properties are required. For the img tag, the "src" attribute is - * required. The "tag" key is used to track whether that tag was - * explicitly allowed by one of the filter's rules. The - * "touchedByAllowedPropertyRule" key is used for state tracking that is - * essential for filterStatusAllowsFeature() to be able to reason: when - * all of a filter's rules have been applied, and none of the forbidden - * rules matched (which would have resulted in early termination) yet the - * universe has not been made empty (which would be the end result if - * everything in the universe were explicitly allowed), then this piece - * of state data enables us to determine whether a tag whose properties - * were not all explicitly allowed are in fact still allowed, because its - * tag was explicitly allowed and there were no filter rules applying - * "allowed tag property value" restrictions for this particular tag. - * - * @param {object} feature - * The feature in question. - * - * @return {object} - * The universe generated. - * - * @see findPropertyValueOnTag() - * @see filterStatusAllowsFeature() - */ + featureIsAllowedByFilters: function featureIsAllowedByFilters(feature) { function generateUniverseFromFeatureRequirements(feature) { var properties = ['attributes', 'styles', 'classes']; var universe = {}; @@ -149,31 +24,21 @@ for (var r = 0; r < feature.rules.length; r++) { var featureRule = feature.rules[r]; - // For each tag required by this feature rule, create a basic entry in - // the universe. var requiredTags = featureRule.required.tags; for (var t = 0; t < requiredTags.length; t++) { universe[requiredTags[t]] = { - // Whether this tag was allowed or not. tag: false, - // Whether any filter rule that applies to this tag had an allowed - // property rule. i.e. will become true if >=1 filter rule has >=1 - // allowed property rule. + touchedByAllowedPropertyRule: false, - // Analogous, but for forbidden property rule. + touchedBytouchedByForbiddenPropertyRule: false }; } - // If no required properties are defined for this rule, we can move on - // to the next feature. if (emptyProperties(featureRule.required)) { continue; } - // Expand the existing universe, assume that each tags' property - // value is disallowed. If the filter rules allow everything in the - // feature's universe, then the feature is allowed. for (var p = 0; p < properties.length; p++) { var property = properties[p]; for (var pv = 0; pv < featureRule.required[property].length; pv++) { @@ -186,41 +51,11 @@ return universe; } - /** - * Provided a section of a feature or filter rule, checks if no property - * values are defined for all properties: attributes, classes and styles. - * - * @param {object} section - * The section to check. - * - * @return {bool} - * Returns true if the section has empty properties, false otherwise. - */ function emptyProperties(section) { return section.attributes.length === 0 && section.classes.length === 0 && section.styles.length === 0; } - /** - * Calls findPropertyValueOnTag on the given tag for every property value - * that is listed in the "propertyValues" parameter. Supports the wildcard - * tag. - * - * @param {object} universe - * The universe to check. - * @param {string} tag - * The tag to look for. - * @param {string} property - * The property to check. - * @param {Array} propertyValues - * Values of the property to check. - * @param {bool} allowing - * Whether to update the universe or not. - * - * @return {bool} - * Returns true if found, false otherwise. - */ function findPropertyValuesOnTag(universe, tag, property, propertyValues, allowing) { - // Detect the wildcard case. if (tag === '*') { return findPropertyValuesOnAllTags(universe, property, propertyValues, allowing); } @@ -234,21 +69,6 @@ return atLeastOneFound; } - /** - * Calls findPropertyValuesOnAllTags for all tags in the universe. - * - * @param {object} universe - * The universe to check. - * @param {string} property - * The property to check. - * @param {Array} propertyValues - * Values of the property to check. - * @param {bool} allowing - * Whether to update the universe or not. - * - * @return {bool} - * Returns true if found, false otherwise. - */ function findPropertyValuesOnAllTags(universe, property, propertyValues, allowing) { var atLeastOneFound = false; _.each(_.keys(universe), function (tag) { @@ -259,43 +79,17 @@ return atLeastOneFound; } - /** - * Finds out if a specific property value (potentially containing - * wildcards) exists on the given tag. When the "allowing" parameter - * equals true, the universe will be updated if that specific property - * value exists. Returns true if found, false otherwise. - * - * @param {object} universe - * The universe to check. - * @param {string} tag - * The tag to look for. - * @param {string} property - * The property to check. - * @param {string} propertyValue - * The property value to check. - * @param {bool} allowing - * Whether to update the universe or not. - * - * @return {bool} - * Returns true if found, false otherwise. - */ function findPropertyValueOnTag(universe, tag, property, propertyValue, allowing) { - // If the tag does not exist in the universe, then it definitely can't - // have this specific property value. if (!_.has(universe, tag)) { return false; } var key = property + ':' + propertyValue; - // Track whether a tag was touched by a filter rule that allows specific - // property values on this particular tag. - // @see generateUniverseFromFeatureRequirements if (allowing) { universe[tag].touchedByAllowedPropertyRule = true; } - // The simple case: no wildcard in property value. if (_.indexOf(propertyValue, '*') === -1) { if (_.has(universe, tag) && _.has(universe[tag], key)) { if (allowing) { @@ -305,36 +99,22 @@ } return false; } - // The complex case: wildcard in property value. - else { - var atLeastOneFound = false; - var regex = key.replace(/\*/g, '[^ ]*'); - _.each(_.keys(universe[tag]), function (key) { - if (key.match(regex)) { - atLeastOneFound = true; - if (allowing) { - universe[tag][key] = true; - } + + + var atLeastOneFound = false; + var regex = key.replace(/\*/g, '[^ ]*'); + _.each(_.keys(universe[tag]), function (key) { + if (key.match(regex)) { + atLeastOneFound = true; + if (allowing) { + universe[tag][key] = true; } - }); - return atLeastOneFound; - } + } + }); + return atLeastOneFound; } - /** - * Deletes a tag from the universe if the tag itself and each of its - * properties are marked as allowed. - * - * @param {object} universe - * The universe to delete from. - * @param {string} tag - * The tag to check. - * - * @return {bool} - * Whether something was deleted from the universe. - */ function deleteFromUniverseIfAllowed(universe, tag) { - // Detect the wildcard case. if (tag === '*') { return deleteAllTagsFromUniverseIfAllowed(universe); } @@ -345,15 +125,6 @@ return false; } - /** - * Calls deleteFromUniverseIfAllowed for all tags in the universe. - * - * @param {object} universe - * The universe to delete from. - * - * @return {bool} - * Whether something was deleted from the universe. - */ function deleteAllTagsFromUniverseIfAllowed(universe) { var atLeastOneDeleted = false; _.each(_.keys(universe), function (tag) { @@ -364,24 +135,11 @@ return atLeastOneDeleted; } - /** - * Checks if any filter rule forbids either a tag or a tag property value - * that exists in the universe. - * - * @param {object} universe - * Universe to check. - * @param {object} filterStatus - * Filter status to use for check. - * - * @return {bool} - * Whether any filter rule forbids something in the universe. - */ function anyForbiddenFilterRuleMatches(universe, filterStatus) { var properties = ['attributes', 'styles', 'classes']; - // Check if a tag in the universe is forbidden. var allRequiredTags = _.keys(universe); - var filterRule; + var filterRule = void 0; for (var i = 0; i < filterStatus.rules.length; i++) { filterRule = filterStatus.rules[i]; if (filterRule.allow === false) { @@ -391,20 +149,16 @@ } } - // Check if a property value of a tag in the universe is forbidden. - // For all filter rules… for (var n = 0; n < filterStatus.rules.length; n++) { filterRule = filterStatus.rules[n]; - // … if there are tags with restricted property values … + if (filterRule.restrictedTags.tags.length && !emptyProperties(filterRule.restrictedTags.forbidden)) { - // … for all those tags … for (var j = 0; j < filterRule.restrictedTags.tags.length; j++) { var tag = filterRule.restrictedTags.tags[j]; - // … then iterate over all properties … + for (var k = 0; k < properties.length; k++) { var property = properties[k]; - // … and return true if just one of the forbidden property - // values for this tag and property is listed in the universe. + if (findPropertyValuesOnTag(universe, tag, property, filterRule.restrictedTags.forbidden[property], false)) { return true; } @@ -416,23 +170,11 @@ return false; } - /** - * Applies every filter rule's explicit allowing of a tag or a tag - * property value to the universe. Whenever both the tag and all of its - * required property values are marked as explicitly allowed, they are - * deleted from the universe. - * - * @param {object} universe - * Universe to delete from. - * @param {object} filterStatus - * The filter status in question. - */ function markAllowedTagsAndPropertyValues(universe, filterStatus) { var properties = ['attributes', 'styles', 'classes']; - // Check if a tag in the universe is allowed. - var filterRule; - var tag; + var filterRule = void 0; + var tag = void 0; for (var l = 0; !_.isEmpty(universe) && l < filterStatus.rules.length; l++) { filterRule = filterStatus.rules[l]; if (filterRule.allow === true) { @@ -446,22 +188,16 @@ } } - // Check if a property value of a tag in the universe is allowed. - // For all filter rules… for (var i = 0; !_.isEmpty(universe) && i < filterStatus.rules.length; i++) { filterRule = filterStatus.rules[i]; - // … if there are tags with restricted property values … + if (filterRule.restrictedTags.tags.length && !emptyProperties(filterRule.restrictedTags.allowed)) { - // … for all those tags … for (var j = 0; !_.isEmpty(universe) && j < filterRule.restrictedTags.tags.length; j++) { tag = filterRule.restrictedTags.tags[j]; - // … then iterate over all properties … + for (var k = 0; k < properties.length; k++) { var property = properties[k]; - // … and try to delete this tag from the universe if just one - // of the allowed property values for this tag and property is - // listed in the universe. (Because everything might be allowed - // now.) + if (findPropertyValuesOnTag(universe, tag, property, filterRule.restrictedTags.allowed[property], true)) { deleteFromUniverseIfAllowed(universe, tag); } @@ -471,114 +207,59 @@ } } - /** - * Checks whether the current status of a filter allows a specific feature - * by building the universe of potential values from the feature's - * requirements and then checking whether anything in the filter prevents - * that. - * - * @param {object} filterStatus - * The filter status in question. - * @param {object} feature - * The feature requested. - * - * @return {bool} - * Whether the current status of the filter allows specified feature. - * - * @see generateUniverseFromFeatureRequirements() - */ function filterStatusAllowsFeature(filterStatus, feature) { - // An inactive filter by definition allows the feature. if (!filterStatus.active) { return true; } - // A feature that specifies no rules has no HTML requirements and is - // hence allowed by definition. if (feature.rules.length === 0) { return true; } - // Analogously for a filter that specifies no rules. if (filterStatus.rules.length === 0) { return true; } - // Generate the universe U of possible values that can result from the - // feature's rules' requirements. var universe = generateUniverseFromFeatureRequirements(feature); - // If anything that is in the universe (and is thus required by the - // feature) is forbidden by any of the filter's rules, then this filter - // does not allow this feature. if (anyForbiddenFilterRuleMatches(universe, filterStatus)) { return false; } - // Mark anything in the universe that is allowed by any of the filter's - // rules as allowed. If everything is explicitly allowed, then the - // universe will become empty. markAllowedTagsAndPropertyValues(universe, filterStatus); - // If there was at least one filter rule allowing tags, then everything - // in the universe must be allowed for this feature to be allowed, and - // thus by now it must be empty. However, it is still possible that the - // filter allows the feature, due to no rules for allowing tag property - // values and/or rules for forbidding tag property values. For details: - // see the comments below. - // @see generateUniverseFromFeatureRequirements() if (_.some(_.pluck(filterStatus.rules, 'allow'))) { - // If the universe is empty, then everything was explicitly allowed - // and our job is done: this filter allows this feature! if (_.isEmpty(universe)) { return true; } - // Otherwise, it is still possible that this feature is allowed. - else { - // Every tag must be explicitly allowed if there are filter rules - // doing tag whitelisting. - if (!_.every(_.pluck(universe, 'tag'))) { - return false; - } - // Every tag was explicitly allowed, but since the universe is not - // empty, one or more tag properties are disallowed. However, if - // only blacklisting of tag properties was applied to these tags, - // and no whitelisting was ever applied, then it's still fine: - // since none of the tag properties were blacklisted, we got to - // this point, and since no whitelisting was applied, it doesn't - // matter that the properties: this could never have happened - // anyway. It's only this late that we can know this for certain. - else { - var tags = _.keys(universe); - // Figure out if there was any rule applying whitelisting tag - // restrictions to each of the remaining tags. - for (var i = 0; i < tags.length; i++) { - var tag = tags[i]; - if (_.has(universe, tag)) { - if (universe[tag].touchedByAllowedPropertyRule === false) { - delete universe[tag]; - } - } + + if (!_.every(_.pluck(universe, 'tag'))) { + return false; + } + + + var tags = _.keys(universe); + + for (var i = 0; i < tags.length; i++) { + var tag = tags[i]; + if (_.has(universe, tag)) { + if (universe[tag].touchedByAllowedPropertyRule === false) { + delete universe[tag]; } - return _.isEmpty(universe); } } + return _.isEmpty(universe); } - // Otherwise, if all filter rules were doing blacklisting, then the sole - // fact that we got to this point indicates that this filter allows for - // everything that is required for this feature. - else { - return true; - } + + + return true; } - // If any filter's current status forbids the editor feature, return - // false. Drupal.filterConfiguration.update(); for (var filterID in Drupal.filterConfiguration.statuses) { if (Drupal.filterConfiguration.statuses.hasOwnProperty(filterID)) { var filterStatus = Drupal.filterConfiguration.statuses[filterID]; - if (!(filterStatusAllowsFeature(filterStatus, feature))) { + if (!filterStatusAllowsFeature(filterStatus, feature)) { return false; } } @@ -588,248 +269,43 @@ } }; - /** - * Constructor for an editor feature HTML rule. - * - * Intended to be used in combination with {@link Drupal.EditorFeature}. - * - * A text editor feature rule object describes both: - * - required HTML tags, attributes, styles and classes: without these, the - * text editor feature is unable to function. It's possible that a - * - allowed HTML tags, attributes, styles and classes: these are optional - * in the strictest sense, but it is possible that the feature generates - * them. - * - * The structure can be very clearly seen below: there's a "required" and an - * "allowed" key. For each of those, there are objects with the "tags", - * "attributes", "styles" and "classes" keys. For all these keys the values - * are initialized to the empty array. List each possible value as an array - * value. Besides the "required" and "allowed" keys, there's an optional - * "raw" key: it allows text editor implementations to optionally pass in - * their raw representation instead of the Drupal-defined representation for - * HTML rules. - * - * @example - * tags: [''] - * attributes: ['href', 'alt'] - * styles: ['color', 'text-decoration'] - * classes: ['external', 'internal'] - * - * @constructor - * - * @see Drupal.EditorFeature - */ Drupal.EditorFeatureHTMLRule = function () { + this.required = { tags: [], attributes: [], styles: [], classes: [] }; + + this.allowed = { tags: [], attributes: [], styles: [], classes: [] }; - /** - * - * @type {object} - * - * @prop {Array} tags - * @prop {Array} attributes - * @prop {Array} styles - * @prop {Array} classes - */ - this.required = {tags: [], attributes: [], styles: [], classes: []}; - - /** - * - * @type {object} - * - * @prop {Array} tags - * @prop {Array} attributes - * @prop {Array} styles - * @prop {Array} classes - */ - this.allowed = {tags: [], attributes: [], styles: [], classes: []}; - - /** - * - * @type {null} - */ this.raw = null; }; - /** - * A text editor feature object. Initialized with the feature name. - * - * Contains a set of HTML rules ({@link Drupal.EditorFeatureHTMLRule} objects) - * that describe which HTML tags, attributes, styles and classes are required - * (i.e. essential for the feature to function at all) and which are allowed - * (i.e. the feature may generate this, but they're not essential). - * - * It is necessary to allow for multiple HTML rules per feature: with just - * one HTML rule per feature, there is not enough expressiveness to describe - * certain cases. For example: a "table" feature would probably require the - * `` tag, and might allow e.g. the "summary" attribute on that tag. - * However, the table feature would also require the `` and ` - * { - * tags: ['p', 'strong', 'a'], - * allow: true, - * restrictedTags: { - * tags: [], - * allowed: { attributes: [], styles: [], classes: [] }, - * forbidden: { attributes: [], styles: [], classes: [] } - * } - * } - * @example - * - * { - * tags: [], - * allow: null, - * restrictedTags: { - * tags: ['a'], - * allowed: { attributes: ['href'], styles: [], classes: ['external'] }, - * forbidden: { attributes: ['target'], styles: [], classes: [] } - * } - * } - * @example - * - * { - * tags: [], - * allow: null, - * restrictedTags: { - * tags: ['*'], - * allowed: { attributes: ['data-*'], styles: [], classes: [] }, - * forbidden: { attributes: [], styles: [], classes: [] } - * } - * } - * - * @return {object} - * An object with the following structure: - * ``` - * { - * tags: Array, - * allow: null, - * restrictedTags: { - * tags: Array, - * allowed: {attributes: Array, styles: Array, classes: Array}, - * forbidden: {attributes: Array, styles: Array, classes: Array} - * } - * } - * ``` - * - * @see Drupal.FilterStatus - */ Drupal.FilterHTMLRule = function () { - // Allow or forbid tags. this.tags = []; this.allow = null; - // Apply restrictions to properties set on tags. this.restrictedTags = { tags: [], - allowed: {attributes: [], styles: [], classes: []}, - forbidden: {attributes: [], styles: [], classes: []} + allowed: { attributes: [], styles: [], classes: [] }, + forbidden: { attributes: [], styles: [], classes: [] } }; return this; @@ -849,87 +325,36 @@ return clone; }; - /** - * Tracks the configuration of all text filters in {@link Drupal.FilterStatus} - * objects for {@link Drupal.editorConfiguration.featureIsAllowedByFilters}. - * - * @namespace - */ Drupal.filterConfiguration = { - - /** - * Drupal.FilterStatus objects, keyed by filter ID. - * - * @type {Object.} - */ statuses: {}, - /** - * Live filter setting parsers. - * - * Object keyed by filter ID, for those filters that implement it. - * - * Filters should load the implementing JavaScript on the filter - * configuration form and implement - * `Drupal.filterSettings[filterID].getRules()`, which should return an - * array of {@link Drupal.FilterHTMLRule} objects. - * - * @namespace - */ liveSettingParsers: {}, - /** - * Updates all {@link Drupal.FilterStatus} objects to reflect current state. - * - * Automatically checks whether a filter is currently enabled or not. To - * support more finegrained. - * - * If a filter implements a live setting parser, then that will be used to - * keep the HTML rules for the {@link Drupal.FilterStatus} object - * up-to-date. - */ - update: function () { + update: function update() { for (var filterID in Drupal.filterConfiguration.statuses) { if (Drupal.filterConfiguration.statuses.hasOwnProperty(filterID)) { - // Update status. Drupal.filterConfiguration.statuses[filterID].active = $('[name="filters[' + filterID + '][status]"]').is(':checked'); - // Update current rules. if (Drupal.filterConfiguration.liveSettingParsers[filterID]) { Drupal.filterConfiguration.statuses[filterID].rules = Drupal.filterConfiguration.liveSettingParsers[filterID].getRules(); } } } } - }; - /** - * Initializes {@link Drupal.filterConfiguration}. - * - * @type {Drupal~behavior} - * - * @prop {Drupal~behaviorAttach} attach - * Gets filter configuration from filter form input. - */ Drupal.behaviors.initializeFilterConfiguration = { - attach: function (context, settings) { + attach: function attach(context, settings) { var $context = $(context); $context.find('#filters-status-wrapper input.form-checkbox').once('filter-editor-status').each(function () { var $checkbox = $(this); var nameAttribute = $checkbox.attr('name'); - // The filter's checkbox has a name attribute of the form - // "filters[][status]", parse "" - // from it. var filterID = nameAttribute.substring(8, nameAttribute.indexOf(']')); - // Create a Drupal.FilterStatus object to track the state (whether it's - // active or not and its current settings, if any) of each filter. Drupal.filterConfiguration.statuses[filterID] = new Drupal.FilterStatus(filterID); }); } }; - -})(jQuery, _, Drupal, document); +})(jQuery, _, Drupal, document); \ No newline at end of file
` tags, - * but it doesn't make sense to allow for a "summary" attribute on these tags. - * Hence these would need to be split in two separate rules. - * - * HTML rules must be added with the `addHTMLRule()` method. A feature that - * has zero HTML rules does not create or modify HTML. - * - * @constructor - * - * @param {string} name - * The name of the feature. - * - * @see Drupal.EditorFeatureHTMLRule - */ Drupal.EditorFeature = function (name) { this.name = name; this.rules = []; }; - /** - * Adds a HTML rule to the list of HTML rules for this feature. - * - * @param {Drupal.EditorFeatureHTMLRule} rule - * A text editor feature HTML rule. - */ Drupal.EditorFeature.prototype.addHTMLRule = function (rule) { this.rules.push(rule); }; - /** - * Text filter status object. Initialized with the filter ID. - * - * Indicates whether the text filter is currently active (enabled) or not. - * - * Contains a set of HTML rules ({@link Drupal.FilterHTMLRule} objects) that - * describe which HTML tags are allowed or forbidden. They can also describe - * for a set of tags (or all tags) which attributes, styles and classes are - * allowed and which are forbidden. - * - * It is necessary to allow for multiple HTML rules per feature, for - * analogous reasons as {@link Drupal.EditorFeature}. - * - * HTML rules must be added with the `addHTMLRule()` method. A filter that has - * zero HTML rules does not disallow any HTML. - * - * @constructor - * - * @param {string} name - * The name of the feature. - * - * @see Drupal.FilterHTMLRule - */ Drupal.FilterStatus = function (name) { - - /** - * - * @type {string} - */ this.name = name; - /** - * - * @type {bool} - */ this.active = false; - /** - * - * @type {Array.} - */ this.rules = []; }; - /** - * Adds a HTML rule to the list of HTML rules for this filter. - * - * @param {Drupal.FilterHTMLRule} rule - * A text filter HTML rule. - */ Drupal.FilterStatus.prototype.addHTMLRule = function (rule) { this.rules.push(rule); }; - /** - * A text filter HTML rule object. - * - * Intended to be used in combination with {@link Drupal.FilterStatus}. - * - * A text filter rule object describes: - * 1. allowed or forbidden tags: (optional) whitelist or blacklist HTML tags - * 2. restricted tag properties: (optional) whitelist or blacklist - * attributes, styles and classes on a set of HTML tags. - * - * Typically, each text filter rule object does either 1 or 2, not both. - * - * The structure can be very clearly seen below: - * 1. use the "tags" key to list HTML tags, and set the "allow" key to - * either true (to allow these HTML tags) or false (to forbid these HTML - * tags). If you leave the "tags" key's default value (the empty array), - * no restrictions are applied. - * 2. all nested within the "restrictedTags" key: use the "tags" subkey to - * list HTML tags to which you want to apply property restrictions, then - * use the "allowed" subkey to whitelist specific property values, and - * similarly use the "forbidden" subkey to blacklist specific property - * values. - * - * @example - *
Whitelist the "p", "strong" and "a" HTML tags.For the "a" HTML tag, only allow the "href" attribute - * and the "external" class and disallow the "target" attribute.For all tags, allow the "data-*" attribute (that is, any - * attribute that begins with "data-").