--- /dev/null
+<?php\r
+\r
+/**\r
+ * Validates a rel/rev link attribute against a directive of allowed values\r
+ * @note We cannot use Enum because link types allow multiple\r
+ * values.\r
+ * @note Assumes link types are ASCII text\r
+ */\r
+class HTMLPurifier_AttrDef_HTML_LinkTypes extends HTMLPurifier_AttrDef\r
+{\r
+\r
+ /**\r
+ * Name config attribute to pull.\r
+ * @type string\r
+ */\r
+ protected $name;\r
+\r
+ /**\r
+ * @param string $name\r
+ */\r
+ public function __construct($name)\r
+ {\r
+ $configLookup = array(\r
+ 'rel' => 'AllowedRel',\r
+ 'rev' => 'AllowedRev'\r
+ );\r
+ if (!isset($configLookup[$name])) {\r
+ trigger_error(\r
+ 'Unrecognized attribute name for link ' .\r
+ 'relationship.',\r
+ E_USER_ERROR\r
+ );\r
+ return;\r
+ }\r
+ $this->name = $configLookup[$name];\r
+ }\r
+\r
+ /**\r
+ * @param string $string\r
+ * @param HTMLPurifier_Config $config\r
+ * @param HTMLPurifier_Context $context\r
+ * @return bool|string\r
+ */\r
+ public function validate($string, $config, $context)\r
+ {\r
+ $allowed = $config->get('Attr.' . $this->name);\r
+ if (empty($allowed)) {\r
+ return false;\r
+ }\r
+\r
+ $string = $this->parseCDATA($string);\r
+ $parts = explode(' ', $string);\r
+\r
+ // lookup to prevent duplicates\r
+ $ret_lookup = array();\r
+ foreach ($parts as $part) {\r
+ $part = strtolower(trim($part));\r
+ if (!isset($allowed[$part])) {\r
+ continue;\r
+ }\r
+ $ret_lookup[$part] = true;\r
+ }\r
+\r
+ if (empty($ret_lookup)) {\r
+ return false;\r
+ }\r
+ $string = implode(' ', array_keys($ret_lookup));\r
+ return $string;\r
+ }\r
+}\r
+\r
+// vim: et sw=4 sts=4\r