summaryrefslogtreecommitdiff
path: root/includes/common.inc
diff options
context:
space:
mode:
Diffstat (limited to 'includes/common.inc')
-rw-r--r--includes/common.inc73
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.