diff options
Diffstat (limited to 'includes/common.inc')
-rw-r--r-- | includes/common.inc | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/includes/common.inc b/includes/common.inc index f2db46b28..878e8106d 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -3095,6 +3095,79 @@ function drupal_clear_css_cache() { } /** + * Prepare a string for use as a valid CSS identifier (element, class or ID selector). + * + * http://www.w3.org/TR/CSS21/syndata.html#characters shows the syntax for valid + * CSS identifiers (including element names, classes, and IDs in selectors.) + * + * @param $identifier + * The CSS identifier to clean. + * @param $filter + * An array of string replacements to use on the identifier. + * @return + * The cleaned identifier. + */ +function drupal_clean_css_identifier($identifier, $filter = array(' ' => '-', '_' => '-', '[' => '-', ']' => '')) { + // By default, we filter using Drupal's coding standards. + $identifier = strtr($identifier, $filter); + + // Valid characters in a CSS identifier are: + // - the hyphen (U+002D) + // - a-z (U+0030 - U+0039) + // - A-Z (U+0041 - U+005A) + // - the underscore (U+005F) + // - 0-9 (U+0061 - U+007A) + // - ISO 10646 characters U+00A1 and higher + // We strip out any character not in the above list. + $identifier = preg_replace('/[^\x{002D}\x{0030}-\x{0039}\x{0041}-\x{005A}\x{005F}\x{0061}-\x{007A}\x{00A1}-\x{FFFF}]/u', '', $identifier); + + return $identifier; +} + +/** + * Prepare a string for use as a valid CSS class name. + * + * Do not pass one string containing multiple classes as they will be + * incorrectly concatenated with dashes, i.e. "one two" will become "one-two". + * + * @param $class + * The class name to clean. + * @return + * The cleaned class name. + */ +function drupal_css_class($class) { + return drupal_clean_css_identifier(drupal_strtolower($class)); +} + +/** + * Prepare a string for use as a valid HTML ID and guarantee uniqueness. + * + * @param $id + * The ID to clean. + * @return + * The cleaned ID. + */ +function drupal_css_id($id) { + $seen_ids = &drupal_static(__FUNCTION__, array()); + $id = drupal_clean_css_identifier(drupal_strtolower($id)); + + // Ensure IDs are unique. The first occurrence is held but left alone. + // Subsequent occurrences get a number appended to them. This incrementing + // will almost certainly break code that relies on explicit HTML IDs in forms + // that appear more than once on the page, but the alternative is outputting + // duplicate IDs, which would break JS code and XHTML validity anyways. For + // now, it's an acceptable stopgap solution. + if (isset($seen_ids[$id])) { + $id = $id . '-' . ++$seen_ids[$id]; + } + else { + $seen_ids[$id] = 1; + } + + return $id; +} + +/** * Add a JavaScript file, setting or inline code to the page. * * The behavior of this function depends on the parameters it is called with. |