Esempio n. 1
0
/**
 * Standard code module initialisation function.
 */
function init__validation()
{
    if (!function_exists('html_entity_decode')) {
        /**
         * Decode the HTML entitity encoded input string. Can give warning if unrecognised character set.
         *
         * @param  string		The text to decode
         * @param  integer	The quote style code
         * @return string		The decoded text
         */
        function html_entity_decode($input, $quote_style)
        {
            unset($quote_style);
            /*			// NB: &nbsp does not go to <space>. It's not something you use with html escaping, it's for hard-space-formatting. URL's don't contain spaces, but that's due to URL escaping (%20)
            			$replace_array=array(
            				'&amp;'=>'&',
            				'&gt;'=>'>',
            				'&lt;'=>'<',
            				'&#039;'=>'\'',
            				'&quot;'=>'"',
            			);
            
            			foreach ($replace_array as $from=>$to)
            			{
            				$input=str_replace($from,$to,$input);
            			}
            
            			return $input;
            */
            $trans_tbl = get_html_translation_table(HTML_ENTITIES);
            $trans_tbl = array_flip($trans_tbl);
            return strtr($input, $trans_tbl);
        }
    }
    if (!function_exists('str_word_count')) {
        /**
         * Isolate the words in the input string.
         *
         * @param  string			String to count words in
         * @param  integer		The format
         * @set	 0 1
         * @return mixed			Typically a list - the words of the input string
         */
        function str_word_count($input, $format = 0)
        {
            //count words
            $pattern = "/[^(\\w|\\d|\\'|\"|\\.|\\!|\\?|;|,|\\|\\/|\\-\\-|:|\\&|@)]+/";
            $all_words = trim(preg_replace($pattern, ' ', $input));
            $a = explode(' ', $all_words);
            return $format == 0 ? count($a) : $a;
        }
    }
    if (!function_exists('qualify_url')) {
        /**
         * Take a URL and base-URL, and fully qualify the URL according to it.
         *
         * @param  URLPATH		The URL to fully qualified
         * @param  URLPATH		The base-URL
         * @return URLPATH		Fully qualified URL
         */
        function qualify_url($url, $url_base)
        {
            if ($url != '' && $url[0] != '#' && substr($url, 0, 7) != 'mailto:') {
                if (strpos($url, '://') === false) {
                    if ($url[0] == '/') {
                        $parsed = parse_url($url_base);
                        if (!array_key_exists('scheme', $parsed)) {
                            $parsed['scheme'] = 'http';
                        }
                        if (!array_key_exists('host', $parsed)) {
                            $parsed['host'] = 'localhost';
                        }
                        if (substr($url, 0, 2) == '//') {
                            $url = $parsed['scheme'] . ':' . $url;
                        } else {
                            $url = $parsed['scheme'] . '://' . $parsed['host'] . (array_key_exists('port', $parsed) ? ':' . $parsed['port'] : '') . $url;
                        }
                    } else {
                        $url = $url_base . '/' . $url;
                    }
                }
            } else {
                return '';
            }
            return $url;
        }
    }
    if (!function_exists('http_download_file')) {
        /**
         * Return the file in the URL by downloading it over HTTP. If a byte limit is given, it will only download that many bytes. It outputs warnings, returning NULL, on error.
         *
         * @param  URLPATH		The URL to download
         * @param  ?integer		The number of bytes to download. This is not a guarantee, it is a minimum (NULL: all bytes)
         * @range  1 max
         * @param  boolean		Whether to throw an ocPortal error, on error
         * @param  boolean		Whether to block redirects (returns NULL when found)
         * @param  string			The user-agent to identify as
         * @param  ?array			An optional array of POST parameters to send; if this is NULL, a GET request is used (NULL: none)
         * @param  ?array			An optional array of cookies to send (NULL: none)
         * @param  ?string		'accept' header value (NULL: don't pass one)
         * @param  ?string		'accept-charset' header value (NULL: don't pass one)
         * @param  ?string		'accept-language' header value (NULL: don't pass one)
         * @param  ?resource		File handle to write to (NULL: do not do that)
         * @param  ?string		The HTTP referer (NULL: none)
         * @param  ?array			A pair: authentication username and password (NULL: none)
         * @param  float			The timeout
         * @param  boolean		Whether to treat the POST parameters as a raw POST (rather than using MIME)
         * @param  ?array			Files to send. Map between field to file path (NULL: none)
         * @return ?string		The data downloaded (NULL: error)
         */
        function http_download_file($url, $byte_limit = NULL, $trigger_error = true, $no_redirect = false, $ua = 'ocPortal', $post_params = NULL, $cookies = NULL, $accept = NULL, $accept_charset = NULL, $accept_language = NULL, $write_to_file = NULL, $referer = NULL, $auth = NULL, $timeout = 6.0, $is_xml = false, $files = NULL)
        {
            ini_set('allow_url_fopen', '1');
            return @file_get_contents($url);
            // Assumes URL-wrappers is on, whilst ocPortal's is much more sophisticated
        }
    }
    if (!function_exists('do_lang')) {
        /**
         * Get the human-readable form of a language id, or a language entry from a language INI file. (STUB)
         *
         * @param  ID_TEXT		The language id
         * @param  ?mixed			The first token [string or tempcode] (replaces {1}) (NULL: none)
         * @param  ?mixed			The second token [string or tempcode] (replaces {2}) (NULL: none)
         * @param  ?mixed			The third token (replaces {3}). May be an array of [of string], to allow any number of additional args (NULL: none)
         * @param  ?LANGUAGE_NAME The language to use (NULL: users language)
         * @param  boolean		Whether to cause ocPortal to exit if the lookup does not succeed
         * @return ?mixed			The human-readable content (NULL: not found). String normally. Tempcode if tempcode parameters.
         */
        function do_lang($a, $param_a = NULL, $param_b = NULL, $param_c = NULL, $lang = NULL, $require_result = true)
        {
            if (function_exists('_do_lang')) {
                return _do_lang($a, $param_a, $param_b, $param_c, $lang, $require_result);
            }
            unset($lang);
            unset($allow_fail);
            switch ($a) {
                case 'LINK_NEW_WINDOW':
                    return 'new window';
                case 'SPREAD_TABLE':
                    return 'Spread table';
                case 'MAP_TABLE':
                    return 'Item to value mapper table';
            }
            return array($a, $param_a, $param_b, $param_c);
        }
    }
    if (!function_exists('get_forum_type')) {
        /**
         * Get the type of forums installed.
         *
         * @return string			The type of forum installed
         */
        function get_forum_type()
        {
            return 'none';
        }
    }
    if (!function_exists('ocp_srv')) {
        /**
         * Get server environment variables. (STUB)
         *
         * @param  string			The variable name
         * @return string			The variable value ('' means unknown)
         */
        function ocp_srv($value)
        {
            return '';
        }
    }
    if (!function_exists('mailto_obfuscated')) {
        /**
         * Get obfuscate version of 'mailto:' (which'll hopefully fool e-mail scavengers to not pick up these e-mail addresses).
         *
         * @return string		The obfuscated 'mailto:' string
         */
        function mailto_obfuscated()
        {
            return 'mailto:';
        }
    }
    if (!function_exists('mixed')) {
        /**
         * Assign this to explicitly declare that a variable may be of mixed type, and initialise to NULL.
         *
         * @return ?mixed	Of mixed type (NULL: default)
         */
        function mixed()
        {
            return NULL;
        }
    }
    define('DOCTYPE_HTML', '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">');
    define('DOCTYPE_HTML_STRICT', '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">');
    define('DOCTYPE_XHTML', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
    define('DOCTYPE_XHTML_STRICT', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
    define('DOCTYPE_XHTML_NEW', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">');
    global $XHTML_VALIDATOR_OFF, $WELL_FORMED_ONLY, $VALIDATION_JAVASCRIPT, $VALIDATION_CSS, $VALIDATION_WCAG, $VALIDATION_COMPAT, $VALIDATION_EXT_FILES, $VALIDATION_MANUAL;
    $VALIDATION_JAVASCRIPT = true;
    $VALIDATION_CSS = true;
    $VALIDATION_WCAG = true;
    $VALIDATION_COMPAT = true;
    $VALIDATION_EXT_FILES = true;
    $VALIDATION_MANUAL = false;
    global $EXTRA_CHECK;
    $EXTRA_CHECK = array();
    global $VALIDATED_ALREADY;
    $VALIDATED_ALREADY = array();
    global $NO_XHTML_LINK_FOLLOW;
    $NO_XHTML_LINK_FOLLOW = 0;
    global $CSS_TAG_RANGES, $CSS_VALUE_RANGES;
    $CSS_TAG_RANGES = array();
    $CSS_VALUE_RANGES = array();
    global $ENTITIES;
    $ENTITIES = array('quot' => 1, 'amp' => 1, 'lt' => 1, 'gt' => 1, 'nbsp' => 1, 'iexcl' => 1, 'cent' => 1, 'pound' => 1, 'curren' => 1, 'yen' => 1, 'brvbar' => 1, 'sect' => 1, 'uml' => 1, 'copy' => 1, 'ordf' => 1, 'laquo' => 1, 'not' => 1, 'shy' => 1, 'reg' => 1, 'macr' => 1, 'deg' => 1, 'plusmn' => 1, 'sup2' => 1, 'sup3' => 1, 'acute' => 1, 'micro' => 1, 'para' => 1, 'middot' => 1, 'cedil' => 1, 'sup1' => 1, 'ordm' => 1, 'raquo' => 1, 'frac14' => 1, 'frac12' => 1, 'frac34' => 1, 'iquest' => 1, 'Agrave' => 1, 'Aacute' => 1, 'Acirc' => 1, 'Atilde' => 1, 'Auml' => 1, 'Aring' => 1, 'AElig' => 1, 'Ccedil' => 1, 'Egrave' => 1, 'Eacute' => 1, 'Ecirc' => 1, 'Euml' => 1, 'Igrave' => 1, 'Iacute' => 1, 'Icirc' => 1, 'Iuml' => 1, 'ETH' => 1, 'Ntilde' => 1, 'Ograve' => 1, 'Oacute' => 1, 'Ocirc' => 1, 'Otilde' => 1, 'Ouml' => 1, 'times' => 1, 'Oslash' => 1, 'Ugrave' => 1, 'Uacute' => 1, 'Ucirc' => 1, 'Uuml' => 1, 'Yacute' => 1, 'THORN' => 1, 'szlig' => 1, 'agrave' => 1, 'aacute' => 1, 'acirc' => 1, 'atilde' => 1, 'auml' => 1, 'aring' => 1, 'aelig' => 1, 'ccedil' => 1, 'egrave' => 1, 'eacute' => 1, 'ecirc' => 1, 'euml' => 1, 'igrave' => 1, 'iacute' => 1, 'icirc' => 1, 'iuml' => 1, 'eth' => 1, 'ntilde' => 1, 'ograve' => 1, 'oacute' => 1, 'ocirc' => 1, 'otilde' => 1, 'ouml' => 1, 'divide' => 1, 'oslash' => 1, 'ugrave' => 1, 'uacute' => 1, 'ucirc' => 1, 'uuml' => 1, 'yacute' => 1, 'thorn' => 1, 'yuml' => 1, 'fnof' => 1, 'Alpha' => 1, 'Beta' => 1, 'Gamma' => 1, 'Delta' => 1, 'Epsilon' => 1, 'Zeta' => 1, 'Eta' => 1, 'Theta' => 1, 'Iota' => 1, 'Kappa' => 1, 'Lambda' => 1, 'Mu' => 1, 'Nu' => 1, 'Xi' => 1, 'Omicron' => 1, 'Pi' => 1, 'Rho' => 1, 'Sigma' => 1, 'Tau' => 1, 'Upsilon' => 1, 'Phi' => 1, 'Chi' => 1, 'Psi' => 1, 'Omega' => 1, 'alpha' => 1, 'beta' => 1, 'gamma' => 1, 'delta' => 1, 'epsilon' => 1, 'zeta' => 1, 'eta' => 1, 'theta' => 1, 'iota' => 1, 'kappa' => 1, 'lambda' => 1, 'mu' => 1, 'nu' => 1, 'xi' => 1, 'omicron' => 1, 'pi' => 1, 'rho' => 1, 'sigmaf' => 1, 'sigma' => 1, 'tau' => 1, 'upsilon' => 1, 'phi' => 1, 'chi' => 1, 'psi' => 1, 'omega' => 1, 'thetasym' => 1, 'upsih' => 1, 'piv' => 1, 'bull' => 1, 'hellip' => 1, 'prime' => 1, 'Prime' => 1, 'oline' => 1, 'frasl' => 1, 'weierp' => 1, 'image' => 1, 'real' => 1, 'trade' => 1, 'alefsym' => 1, 'larr' => 1, 'uarr' => 1, 'rarr' => 1, 'darr' => 1, 'harr' => 1, 'crarr' => 1, 'lArr' => 1, 'uArr' => 1, 'rArr' => 1, 'dArr' => 1, 'hArr' => 1, 'forall' => 1, 'part' => 1, 'exist' => 1, 'empty' => 1, 'nabla' => 1, 'isin' => 1, 'notin' => 1, 'ni' => 1, 'prod' => 1, 'sum' => 1, 'minus' => 1, 'lowast' => 1, 'radic' => 1, 'prop' => 1, 'infin' => 1, 'ang' => 1, 'and' => 1, 'or' => 1, 'cap' => 1, 'cup' => 1, 'int' => 1, 'there4' => 1, 'sim' => 1, 'cong' => 1, 'asymp' => 1, 'ne' => 1, 'equiv' => 1, 'le' => 1, 'ge' => 1, 'sub' => 1, 'sup' => 1, 'nsub' => 1, 'sube' => 1, 'supe' => 1, 'oplus' => 1, 'otimes' => 1, 'perp' => 1, 'sdot' => 1, 'lceil' => 1, 'rceil' => 1, 'lfloor' => 1, 'rfloor' => 1, 'lang' => 1, 'rang' => 1, 'loz' => 1, 'spades' => 1, 'clubs' => 1, 'hearts' => 1, 'diams' => 1, 'OElig' => 1, 'oelig' => 1, 'Scaron' => 1, 'scaron' => 1, 'Yuml' => 1, 'circ' => 1, 'tidle' => 1, 'ensp' => 1, 'emsp' => 1, 'thinsp' => 1, 'zwnj' => 1, 'zwj' => 1, 'lrm' => 1, 'rlm' => 1, 'ndash' => 1, 'mdash' => 1, 'lsquo' => 1, 'rsquo' => 1, 'sbquo' => 1, 'ldquo' => 1, 'rdquo' => 1, 'bdquo' => 1, 'dagger' => 1, 'Dagger' => 1, 'permil' => 1, 'lsaquo' => 1, 'rsaquo' => 1, 'euro' => 1);
    $strict_form_accessibility = false;
    // Form fields may not be empty with this strict rule
    global $POSSIBLY_EMPTY_TAGS;
    $POSSIBLY_EMPTY_TAGS = array('a' => 1, 'div' => 1, 'td' => 1, 'th' => 1, 'textarea' => 1, 'button' => 1, 'script' => 1);
    if ($strict_form_accessibility) {
        unset($POSSIBLY_EMPTY_TAGS['textarea']);
    }
    global $MUST_SELFCLOSE_TAGS;
    $MUST_SELFCLOSE_TAGS = array('img' => 1, 'hr' => 1, 'br' => 1, 'param' => 1, 'input' => 1, 'base' => 1, 'link' => 1, 'meta' => 1, 'area' => 1, 'col' => 1, 'nobr' => 1);
    global $TAGS_BLOCK;
    $TAGS_BLOCK = array('div' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'p' => 1, 'blockquote' => 1, 'pre' => 1, 'br' => 1, 'hr' => 1, 'fieldset' => 1, 'address' => 1, 'iframe' => 1, 'noscript' => 1, 'table' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1, 'dd' => 1, 'dt' => 1, 'dl' => 1, 'li' => 1, 'ol' => 1, 'ul' => 1, 'rbc' => 1, 'rtc' => 1, 'rb' => 1, 'rt' => 1, 'rp' => 1);
    global $TAGS_INLINE;
    $TAGS_INLINE = array('span' => 1, 'abbr' => 1, 'acronym' => 1, 'cite' => 1, 'code' => 1, 'dfn' => 1, 'em' => 1, 'strong' => 1, 'kbd' => 1, 'q' => 1, 'samp' => 1, 'var' => 1, 'sub' => 1, 'sup' => 1, 'tt' => 1, 'del' => 1, 'ruby' => 1, 'a' => 1, 'bdo' => 1, 'img' => 1, 'ins' => 1, 'param' => 1, 'textarea' => 1, 'button' => 1, 'input' => 1, 'select' => 1, 'object' => 1, 'caption' => 1, 'label' => 1, 'b' => 1, 'i' => 1, 'small' => 1, 'big' => 1);
    global $TAGS_NORMAL;
    $TAGS_NORMAL = array('base' => 1, 'body' => 1, 'col' => 1, 'colgroup' => 1, 'head' => 1, 'html' => 1, 'link' => 1, 'map' => 1, 'meta' => 1, 'optgroup' => 1, 'option' => 1, 'style' => 1, 'title' => 1, 'legend' => 1, 'script' => 1, 'area' => 1, 'form' => 1);
    global $TAGS_BLOCK_DEPRECATED;
    $TAGS_BLOCK_DEPRECATED = array('dir' => 1, 'menu' => 1);
    global $TAGS_INLINE_DEPRECATED;
    $TAGS_INLINE_DEPRECATED = array('center' => 1, 'applet' => 1, 'font' => 1, 's' => 1, 'strike' => 1, 'u' => 1);
    global $TAGS_NORMAL_DEPRECATED;
    $TAGS_NORMAL_DEPRECATED = array('basefont' => 1);
    $browser = strtolower(ocp_srv('HTTP_USER_AGENT'));
    $is_ie = strpos($browser, 'msie') !== false && strpos($browser, 'opera') === false;
    $enforce_javascript = '([^\\n]+)';
    $enforce_lang = '[a-zA-Z][a-zA-Z](-[a-zA-Z]+)?';
    $enforce_direction = '(ltr|rtl)';
    $enforce_align = '(left|center|right|justify|char)';
    $enforce_align2 = '(top|middle|bottom|left|right)';
    $enforce_align3 = '(left|center|right|justify)';
    $enforce_align4 = '(top|bottom|left|right)';
    $enforce_valign = '(top|middle|bottom|baseline)';
    $enforce_number = '(-?[0-9]+)';
    $enforce_inumber = '[0-9]+';
    //$enforce_plain_or_html='(plaintext|html)';
    $enforce_character = '.';
    $enforce_color = '(black|silver|gray|white|maroon|purple|fuchsia|green|lime|olive|yellow|navy|blue|teal|aqua|orange|red|(\\#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f])|(\\#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]))';
    // orange and red aren't 'official' -- but kind of handy ;). In reality, the colour codes were never properly defined, and these two are obvious names for obviously needed ones-- they'll be supported
    $enforce_length = '((0)|(' . $enforce_number . '(|in|cm|mm|ex|pt|pc|px|em|%))|((' . $enforce_number . ')?\\.' . $enforce_number . '(in|cm|mm|ex|em|%)))';
    // |ex|pt|in|cm|mm|pc	We don't want these in our XHTML... preferably we only want em when it comes to font size!
    $enforce_ilength = '((0)|(' . $enforce_inumber . '(|in|cm|mm|ex|pt|pc|px|em|%))|((' . $enforce_inumber . ')?\\.' . $enforce_inumber . '(in|cm|mm|ex|em|%)))';
    // |ex|pt|in|cm|mm|pc	We don't want these in our XHTML... preferably we only want em when it comes to font size!
    $enforce_pixels = '[0-9]+';
    $enforce_auto_or_length = '(auto|' . $enforce_length . ')';
    $enforce_auto_or_ilength = '(auto|' . $enforce_ilength . ')';
    $enforce_normal_or_length = '(normal|' . $enforce_length . ')';
    $enforce_border_width = '(thin|medium|thick|' . $enforce_length . ')';
    $enforce_potential_4d_border_width = $enforce_border_width . '( ' . $enforce_border_width . '( ' . $enforce_border_width . '( ' . $enforce_border_width . '|)|)|)';
    $enforce_css_color = '((rgb\\(' . $enforce_inumber . '%,' . $enforce_inumber . '%,' . $enforce_inumber . '%\\))|(rgb\\(' . $enforce_inumber . ',' . $enforce_inumber . ',' . $enforce_inumber . '\\))|(\\#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f])|' . $enforce_color . '|ActiveBorder|ActiveCaption|AppWorkspace|Background|Buttonface|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText)';
    $enforce_transparent_or_color = '(transparent|' . $enforce_css_color . ')';
    $enforce_fraction = '(\\d%|\\d\\d%|100%|0\\.\\d+|1\\.0)';
    $_enforce_font_list = "(cursive|fantasy|monospace|serif|sans-serif|Georgia|Times|Trebuchet|Tahoma|Geneva|Verdana|Arial|Helvetica|Courier|Courier New|Impact|'Georgia'|'Times'|'Trebuchet'|'Tahoma'|'Geneva'|'Verdana'|'Arial'|'Helvetica'|'Courier'|'Courier New'|'Impact')";
    $enforce_font_list = '((([A-Za-z]+)|("[A-Za-z ]+")|(\'[A-Za-z ]+\')),\\s*)*' . $_enforce_font_list;
    $enforce_functional_url = '(url\\(\'.+\'\\)|url\\(".+"\\)|url\\([^\\(\\);]+\\))';
    $enforce_functional_url_or_none = '(' . $enforce_functional_url . '|none)';
    $enforce_border_style = '(none|dotted|dashed|solid|double|groove|ridge|inset|outset)';
    $enforce_background_repeat = '(repeat|repeat-x|repeat-y|no-repeat)';
    $enforce_attachment = '(scroll|fixed)';
    $_enforce_background_position = '((' . $enforce_length . '|top|center|bottom)|(' . $enforce_length . '|left|center|right))';
    $enforce_background_position = '((' . $_enforce_background_position . ')|(' . $_enforce_background_position . ' ' . $_enforce_background_position . '))';
    $enforce_border = '((' . $enforce_border_width . '|' . $enforce_border_style . '|' . $enforce_css_color . ')( |$))+';
    $enforce_potential_4d_length = $enforce_length . '( ' . $enforce_length . '( ' . $enforce_length . '( ' . $enforce_length . '|)|)|)';
    $enforce_potential_4d_length_auto = $enforce_auto_or_length . '( ' . $enforce_auto_or_length . '( ' . $enforce_auto_or_length . '( ' . $enforce_auto_or_length . '|)|)|)';
    $enforce_potential_4d_ilength = $enforce_ilength . '( ' . $enforce_ilength . '( ' . $enforce_ilength . '( ' . $enforce_ilength . '|)|)|)';
    $enforce_potential_4d_ilength_auto = $enforce_auto_or_ilength . '( ' . $enforce_auto_or_ilength . '( ' . $enforce_auto_or_ilength . '( ' . $enforce_auto_or_ilength . '|)|)|)';
    $enforce_font_style = '(normal|italic|oblique)';
    $enforce_font_variant = '(normal|small-caps)';
    $enforce_font_weight = '(lighter|normal|bold|bolder|((\\d)+))';
    $enforce_list_style_position = '(inside|outside)';
    $enforce_list_style_type = '(none|disc|circle|square|decimal|lower-roman|upper-roman|lower-alpha|upper-alpha' . (!$is_ie ? '|decimal-leading-zero|lower-greek|lower-latin|upper-latin|hebrew|armenian|georgian|cjk-ideographic|hiragana|katakana|hiragana-iroha|katakana-iroha' : '') . ')';
    $enforce_list_style_image = '(none|' . $enforce_functional_url . ')';
    $enforce_id = '[a-zA-Z][\\w\\-\\:\\.]*';
    $enforce_name = $enforce_id . '(\\[\\])?';
    // Only used for <select> tag, as it has to allow multi-selection-lists
    $enforce_link = (get_forum_type() == 'none' ? '(mailto:.*)?' : '') . '(' . str_replace('#', '\\#', preg_quote(mailto_obfuscated())) . '.*)?[^\\s\\#]*(\\#[^\\s\\#]*)?';
    $enforce_class = '[ \\w-]*';
    $enforce_zoom = '(normal|' . $enforce_fraction . ')';
    global $CSS_PROPERTIES;
    $CSS_PROPERTIES = array('background' => '((' . $enforce_transparent_or_color . '|' . $enforce_functional_url_or_none . '|' . $enforce_background_repeat . '|' . $enforce_attachment . '|' . $enforce_background_position . ')( |$))+', 'background-attachment' => $enforce_attachment, 'background-color' => $enforce_transparent_or_color, 'background-image' => $enforce_functional_url_or_none, 'background-repeat' => $enforce_background_repeat, 'background-position' => $enforce_background_position, 'border' => $enforce_border, 'border-collapse' => '(collapse|separate)', 'border-color' => $enforce_transparent_or_color . '( ' . $enforce_transparent_or_color . '( ' . $enforce_transparent_or_color . '( ' . $enforce_transparent_or_color . '|)|)|)', 'border-spacing' => $enforce_length . ' ' . $enforce_length, 'border-style' => $enforce_border_style, 'border-width' => $enforce_potential_4d_border_width, 'border-bottom' => $enforce_border, 'border-bottom-color' => $enforce_transparent_or_color, 'border-bottom-style' => $enforce_border_style, 'border-bottom-width' => $enforce_border_width, 'border-left' => $enforce_border, 'border-left-color' => $enforce_transparent_or_color, 'border-left-style' => $enforce_border_style, 'border-left-width' => $enforce_border_width, 'border-right' => $enforce_border, 'border-right-color' => $enforce_transparent_or_color, 'border-right-style' => $enforce_border_style, 'border-right-width' => $enforce_border_width, 'border-top' => $enforce_border, 'border-top-color' => $enforce_transparent_or_color, 'border-top-style' => $enforce_border_style, 'border-top-width' => $enforce_border_width, 'bottom' => $enforce_auto_or_length, 'clear' => '(both|left|right|none)', 'clip' => 'auto|(rect\\(' . $enforce_potential_4d_length . '\\))', 'color' => $enforce_css_color, 'cursor' => '(' . $enforce_functional_url . '|default|auto|n-resize|ne-resize|e-resize|se-resize|s-resize|sw-resize|w-resize|nw-resize|crosshair|pointer|move|text|wait|help' . (!$is_ie ? '|progress' : '') . ')', 'direction' => '(ltr|rtl)', 'display' => '(none|inline|block|list-item|table|table-header-group|table-footer-group|inline-block|run-in' . (!$is_ie ? '|inline-table|table-row|table-row-group|table-column-group|table-column|table-cell|table-caption' : '') . ')', 'float' => '(left|right|none)', 'font' => '((caption|icon|menu|message-box|small-caption|status-bar|' . $enforce_font_style . '|' . $enforce_font_variant . '|' . $enforce_font_weight . '|' . $enforce_length . '|' . $enforce_normal_or_length . '|' . $enforce_font_list . ')( |$))+', 'font-family' => $enforce_font_list, 'font-size' => 'larger|smaller|xx-small|x-small|small|medium|large|x-large|xx-large|' . $enforce_length, 'font-style' => $enforce_font_style, 'font-variant' => $enforce_font_variant, 'font-weight' => $enforce_font_weight, 'height' => $enforce_auto_or_length, 'left' => $enforce_auto_or_length, 'right' => $enforce_auto_or_length, 'letter-spacing' => $enforce_normal_or_length, 'line-height' => $enforce_normal_or_length, 'list-style' => '((' . $enforce_list_style_type . '|' . $enforce_list_style_position . '|' . $enforce_list_style_image . ')( |$))+', 'list-style-image' => $enforce_functional_url, 'list-style-position' => $enforce_list_style_position, 'list-style-type' => $enforce_list_style_type, 'margin' => $enforce_potential_4d_length_auto, 'margin-bottom' => $enforce_auto_or_length, 'margin-left' => $enforce_auto_or_length, 'margin-right' => $enforce_auto_or_length, 'margin-top' => $enforce_auto_or_length, 'overflow' => '(visible|hidden|scroll|auto)', 'padding' => $enforce_potential_4d_ilength, 'padding-bottom' => $enforce_auto_or_ilength, 'padding-left' => $enforce_auto_or_ilength, 'padding-right' => $enforce_auto_or_ilength, 'padding-top' => $enforce_auto_or_ilength, 'page-break-after' => '(auto|left|right|always)', 'page-break-before' => '(auto|left|right|always)', 'position' => '(static|relative|absolute' . (!$is_ie ? '|fixed' : '') . ')', 'table-layout' => '(auto|fixed)', 'text-align' => '(left|right|center|justify)', 'text-decoration' => '(underline|line-through|none' . (!$is_ie ? '|blink' : '') . ')', 'text-indent' => $enforce_length, 'text-transform' => '(capitalize|uppercase|lowercase|none)', 'top' => $enforce_auto_or_length, 'unicode-bidi' => '(bidi-override|normal|embed)', 'vertical-align' => '(baseline|sub|super|top|text-top|middle|bottom|text-bottom)', 'visibility' => '(hidden|visible|collapse)', 'white-space' => '(normal|pre|nowrap' . (!$is_ie ? '|pre-wrap|pre-line' : '') . ')', 'width' => $enforce_auto_or_length, 'word-spacing' => $enforce_normal_or_length, 'z-index' => '(auto|(\\d+))', 'zoom' => $enforce_zoom, 'opacity' => $enforce_fraction, 'overflow-x' => '(visible|hidden|scroll|auto)', 'overflow-y' => '(visible|hidden|scroll|auto)');
    $_counter_increment = '((\\w+( \\d+)?)+)';
    $enforce_counter_increment = $_counter_increment . '( ' . $_counter_increment . ')*';
    global $CSS_NON_IE_PROPERTIES;
    $CSS_NON_IE_PROPERTIES = array('content' => '.+', 'quotes' => '.+ .+', 'max-width' => $enforce_auto_or_length, 'min-width' => $enforce_auto_or_length, 'max-height' => $enforce_auto_or_length, 'min-height' => $enforce_auto_or_length, 'marker-offset' => $enforce_auto_or_length, 'caption-side' => 'top|bottom|left|right', 'empty-cells' => 'show|hide', 'counter-increment' => $enforce_counter_increment, 'counter-reset' => $enforce_counter_increment, 'outline' => $enforce_border, 'outline-color' => $enforce_transparent_or_color, 'outline-style' => $enforce_border_style, 'outline-width' => $enforce_border_width);
    global $TAG_ATTRIBUTES;
    $TAG_ATTRIBUTES = array('a.accesskey' => $enforce_character, 'a.charset' => '.+', 'a.class' => $enforce_class, 'a.coords' => '.+', 'a.dir' => $enforce_direction, 'a.href' => $enforce_link, 'a.hreflang' => $enforce_lang, 'a.id' => $enforce_id, 'a.lang' => $enforce_lang, 'a.name' => $enforce_id, 'a.onblur' => $enforce_javascript, 'a.onclick' => $enforce_javascript, 'a.ondblclick' => $enforce_javascript, 'a.onfocus' => $enforce_javascript, 'a.onkeydown' => $enforce_javascript, 'a.onkeypress' => $enforce_javascript, 'a.onkeyup' => $enforce_javascript, 'a.onmousedown' => $enforce_javascript, 'a.onmousemove' => $enforce_javascript, 'a.onmouseout' => $enforce_javascript, 'a.onmouseover' => $enforce_javascript, 'a.onmouseup' => $enforce_javascript, 'a.rel' => '.*', 'a.rev' => '.+', 'a.shape' => '(rect|circle|poly|default)', 'a.style' => '.*', 'a.tabindex' => $enforce_inumber, 'a.title' => '.*', 'a.type' => '.+', 'abbr.class' => $enforce_class, 'abbr.dir' => $enforce_direction, 'abbr.id' => $enforce_id, 'abbr.lang' => $enforce_lang, 'abbr.onclick' => $enforce_javascript, 'abbr.ondblclick' => $enforce_javascript, 'abbr.onkeydown' => $enforce_javascript, 'abbr.onkeypress' => $enforce_javascript, 'abbr.onkeyup' => $enforce_javascript, 'abbr.onmousedown' => $enforce_javascript, 'abbr.onmousemove' => $enforce_javascript, 'abbr.onmouseout' => $enforce_javascript, 'abbr.onmouseover' => $enforce_javascript, 'abbr.onmouseup' => $enforce_javascript, 'abbr.style' => '.*', 'abbr.title' => '.+', 'acronym.class' => $enforce_class, 'acronym.dir' => $enforce_direction, 'acronym.id' => $enforce_id, 'acronym.lang' => $enforce_lang, 'acronym.onclick' => $enforce_javascript, 'acronym.ondblclick' => $enforce_javascript, 'acronym.onkeydown' => $enforce_javascript, 'acronym.onkeypress' => $enforce_javascript, 'acronym.onkeyup' => $enforce_javascript, 'acronym.onmousedown' => $enforce_javascript, 'acronym.onmousemove' => $enforce_javascript, 'acronym.onmouseout' => $enforce_javascript, 'acronym.onmouseover' => $enforce_javascript, 'acronym.onmouseup' => $enforce_javascript, 'acronym.style' => '.*', 'acronym.title' => '.+', 'address.class' => $enforce_class, 'address.dir' => $enforce_direction, 'address.id' => $enforce_id, 'address.lang' => $enforce_lang, 'address.onclick' => $enforce_javascript, 'address.ondblclick' => $enforce_javascript, 'address.onkeydown' => $enforce_javascript, 'address.onkeypress' => $enforce_javascript, 'address.onkeyup' => $enforce_javascript, 'address.onmousedown' => $enforce_javascript, 'address.onmousemove' => $enforce_javascript, 'address.onmouseout' => $enforce_javascript, 'address.onmouseover' => $enforce_javascript, 'address.onmouseup' => $enforce_javascript, 'address.style' => '.*', 'address.title' => '.+', 'area.accesskey' => $enforce_character, 'area.alt' => '.*', 'area.class' => $enforce_class, 'area.coords' => '.+', 'area.dir' => $enforce_direction, 'area.href' => $enforce_link, 'area.id' => $enforce_id, 'area.lang' => $enforce_lang, 'area.nohref' => 'nohref', 'area.onblur' => '.+', 'area.onclick' => $enforce_javascript, 'area.ondblclick' => $enforce_javascript, 'area.onfocus' => $enforce_javascript, 'area.onkeydown' => $enforce_javascript, 'area.onkeypress' => $enforce_javascript, 'area.onkeyup' => $enforce_javascript, 'area.onmousedown' => $enforce_javascript, 'area.onmousemove' => $enforce_javascript, 'area.onmouseout' => $enforce_javascript, 'area.onmouseover' => $enforce_javascript, 'area.onmouseup' => $enforce_javascript, 'area.shape' => '(rect|circle|poly|default)', 'area.style' => '.*', 'area.tabindex' => $enforce_inumber, 'area.title' => '.+', 'b.class' => $enforce_class, 'b.dir' => $enforce_direction, 'b.id' => $enforce_id, 'b.lang' => $enforce_lang, 'b.onclick' => $enforce_javascript, 'b.ondblclick' => $enforce_javascript, 'b.onkeydown' => $enforce_javascript, 'b.onkeypress' => $enforce_javascript, 'b.onkeyup' => $enforce_javascript, 'b.onmousedown' => $enforce_javascript, 'b.onmousemove' => $enforce_javascript, 'b.onmouseout' => $enforce_javascript, 'b.onmouseover' => $enforce_javascript, 'b.onmouseup' => $enforce_javascript, 'b.style' => '.*', 'b.title' => '.+', 'base.href' => $enforce_link, 'bdo.class' => $enforce_class, 'bdo.dir' => $enforce_direction, 'bdo.id' => $enforce_id, 'bdo.lang' => $enforce_lang, 'bdo.style' => '.*', 'bdo.title' => '.+', 'big.class' => $enforce_class, 'big.dir' => $enforce_direction, 'big.id' => $enforce_id, 'big.lang' => $enforce_lang, 'big.onclick' => $enforce_javascript, 'big.ondblclick' => $enforce_javascript, 'big.onkeydown' => $enforce_javascript, 'big.onkeypress' => $enforce_javascript, 'big.onkeyup' => $enforce_javascript, 'big.onmousedown' => $enforce_javascript, 'big.onmousemove' => $enforce_javascript, 'big.onmouseout' => $enforce_javascript, 'big.onmouseover' => $enforce_javascript, 'big.onmouseup' => $enforce_javascript, 'big.style' => '.*', 'big.title' => '.+', 'blockquote.cite' => '.+', 'blockquote.class' => $enforce_class, 'blockquote.dir' => $enforce_direction, 'blockquote.id' => $enforce_id, 'blockquote.lang' => $enforce_lang, 'blockquote.onclick' => $enforce_javascript, 'blockquote.ondblclick' => $enforce_javascript, 'blockquote.onkeydown' => $enforce_javascript, 'blockquote.onkeypress' => $enforce_javascript, 'blockquote.onkeyup' => $enforce_javascript, 'blockquote.onmousedown' => $enforce_javascript, 'blockquote.onmousemove' => $enforce_javascript, 'blockquote.onmouseout' => $enforce_javascript, 'blockquote.onmouseover' => $enforce_javascript, 'blockquote.onmouseup' => $enforce_javascript, 'blockquote.style' => '.*', 'blockquote.title' => '.+', 'body.background' => '.+', 'body.class' => $enforce_class, 'body.dir' => $enforce_direction, 'body.id' => $enforce_id, 'body.lang' => $enforce_lang, 'body.onclick' => $enforce_javascript, 'body.ondblclick' => $enforce_javascript, 'body.onkeydown' => $enforce_javascript, 'body.onkeypress' => $enforce_javascript, 'body.onkeyup' => $enforce_javascript, 'body.onload' => $enforce_javascript, 'body.onmousedown' => $enforce_javascript, 'body.onmousemove' => $enforce_javascript, 'body.onmouseout' => $enforce_javascript, 'body.onmouseover' => $enforce_javascript, 'body.onmouseup' => $enforce_javascript, 'body.onunload' => $enforce_javascript, 'body.style' => '.*', 'body.title' => '.+', 'br.class' => $enforce_class, 'br.id' => $enforce_id, 'br.style' => '.*', 'br.title' => '.+', 'button.accesskey' => $enforce_character, 'button.class' => $enforce_class, 'button.dir' => $enforce_direction, 'button.disabled' => 'disabled', 'button.id' => $enforce_id, 'button.lang' => $enforce_lang, 'button.name' => $enforce_id, 'button.onblur' => $enforce_javascript, 'button.onclick' => $enforce_javascript, 'button.ondblclick' => $enforce_javascript, 'button.onfocus' => $enforce_javascript, 'button.onkeydown' => $enforce_javascript, 'button.onkeypress' => $enforce_javascript, 'button.onkeyup' => $enforce_javascript, 'button.onmousedown' => $enforce_javascript, 'button.onmousemove' => $enforce_javascript, 'button.onmouseout' => $enforce_javascript, 'button.onmouseover' => $enforce_javascript, 'button.onmouseup' => $enforce_javascript, 'button.style' => '.*', 'button.tabindex' => $enforce_inumber, 'button.title' => '.+', 'button.type' => '(button|submit|reset)', 'button.value' => '.+', 'caption.class' => $enforce_class, 'caption.dir' => $enforce_direction, 'caption.id' => $enforce_id, 'caption.lang' => $enforce_lang, 'caption.onclick' => $enforce_javascript, 'caption.ondblclick' => $enforce_javascript, 'caption.onkeydown' => $enforce_javascript, 'caption.onkeypress' => $enforce_javascript, 'caption.onkeyup' => $enforce_javascript, 'caption.onmousedown' => $enforce_javascript, 'caption.onmousemove' => $enforce_javascript, 'caption.onmouseout' => $enforce_javascript, 'caption.onmouseover' => $enforce_javascript, 'caption.onmouseup' => $enforce_javascript, 'caption.style' => '.*', 'caption.title' => '.+', 'cite.class' => $enforce_class, 'cite.dir' => $enforce_direction, 'cite.id' => $enforce_id, 'cite.lang' => $enforce_lang, 'cite.onclick' => $enforce_javascript, 'cite.ondblclick' => $enforce_javascript, 'cite.onkeydown' => $enforce_javascript, 'cite.onkeypress' => $enforce_javascript, 'cite.onkeyup' => $enforce_javascript, 'cite.onmousedown' => $enforce_javascript, 'cite.onmousemove' => $enforce_javascript, 'cite.onmouseout' => $enforce_javascript, 'cite.onmouseover' => $enforce_javascript, 'cite.onmouseup' => $enforce_javascript, 'cite.style' => '.*', 'cite.title' => '.+', 'code.class' => $enforce_class, 'code.dir' => $enforce_direction, 'code.id' => $enforce_id, 'code.lang' => $enforce_lang, 'code.onclick' => $enforce_javascript, 'code.ondblclick' => $enforce_javascript, 'code.onkeydown' => $enforce_javascript, 'code.onkeypress' => $enforce_javascript, 'code.onkeyup' => $enforce_javascript, 'code.onmousedown' => $enforce_javascript, 'code.onmousemove' => $enforce_javascript, 'code.onmouseout' => $enforce_javascript, 'code.onmouseover' => $enforce_javascript, 'code.onmouseup' => $enforce_javascript, 'code.style' => '.*', 'code.title' => '.+', 'col.align' => $enforce_align, 'col.char' => $enforce_character, 'col.charoff' => $enforce_length, 'col.class' => $enforce_class, 'col.dir' => $enforce_direction, 'col.id' => $enforce_id, 'col.lang' => $enforce_lang, 'col.onclick' => $enforce_javascript, 'col.ondblclick' => $enforce_javascript, 'col.onkeydown' => $enforce_javascript, 'col.onkeypress' => $enforce_javascript, 'col.onkeyup' => $enforce_javascript, 'col.onmousedown' => $enforce_javascript, 'col.onmousemove' => $enforce_javascript, 'col.onmouseout' => $enforce_javascript, 'col.onmouseover' => $enforce_javascript, 'col.onmouseup' => $enforce_javascript, 'col.span' => $enforce_inumber, 'col.style' => '.*', 'col.title' => '.+', 'col.width' => $enforce_length, 'colgroup.align' => $enforce_align, 'colgroup.char' => $enforce_character, 'colgroup.charoff' => $enforce_length, 'colgroup.class' => $enforce_class, 'colgroup.dir' => $enforce_direction, 'colgroup.id' => $enforce_id, 'colgroup.lang' => $enforce_lang, 'colgroup.onclick' => $enforce_javascript, 'colgroup.ondblclick' => $enforce_javascript, 'colgroup.onkeydown' => $enforce_javascript, 'colgroup.onkeypress' => $enforce_javascript, 'colgroup.onkeyup' => $enforce_javascript, 'colgroup.onmousedown' => $enforce_javascript, 'colgroup.onmousemove' => $enforce_javascript, 'colgroup.onmouseout' => $enforce_javascript, 'colgroup.onmouseover' => $enforce_javascript, 'colgroup.onmouseup' => $enforce_javascript, 'colgroup.span' => $enforce_inumber, 'colgroup.style' => '.*', 'colgroup.title' => '.+', 'colgroup.width' => $enforce_length, 'dd.class' => $enforce_class, 'dd.dir' => $enforce_direction, 'dd.id' => $enforce_id, 'dd.lang' => $enforce_lang, 'dd.onclick' => $enforce_javascript, 'dd.ondblclick' => $enforce_javascript, 'dd.onkeydown' => $enforce_javascript, 'dd.onkeypress' => $enforce_javascript, 'dd.onkeyup' => $enforce_javascript, 'dd.onmousedown' => $enforce_javascript, 'dd.onmousemove' => $enforce_javascript, 'dd.onmouseout' => $enforce_javascript, 'dd.onmouseover' => $enforce_javascript, 'dd.onmouseup' => $enforce_javascript, 'dd.style' => '.*', 'dd.title' => '.+', 'del.cite' => '.+', 'del.class' => $enforce_class, 'del.datetime' => '.+', 'del.dir' => $enforce_direction, 'del.id' => $enforce_id, 'del.lang' => $enforce_lang, 'del.onclick' => $enforce_javascript, 'del.ondblclick' => $enforce_javascript, 'del.onkeydown' => $enforce_javascript, 'del.onkeypress' => $enforce_javascript, 'del.onkeyup' => $enforce_javascript, 'del.onmousedown' => $enforce_javascript, 'del.onmousemove' => $enforce_javascript, 'del.onmouseout' => $enforce_javascript, 'del.onmouseover' => $enforce_javascript, 'del.onmouseup' => $enforce_javascript, 'del.style' => '.*', 'del.title' => '.+', 'dfn.class' => $enforce_class, 'dfn.dir' => $enforce_direction, 'dfn.id' => $enforce_id, 'dfn.lang' => $enforce_lang, 'dfn.onclick' => $enforce_javascript, 'dfn.ondblclick' => $enforce_javascript, 'dfn.onkeydown' => $enforce_javascript, 'dfn.onkeypress' => $enforce_javascript, 'dfn.onkeyup' => $enforce_javascript, 'dfn.onmousedown' => $enforce_javascript, 'dfn.onmousemove' => $enforce_javascript, 'dfn.onmouseout' => $enforce_javascript, 'dfn.onmouseover' => $enforce_javascript, 'dfn.onmouseup' => $enforce_javascript, 'dfn.style' => '.*', 'dfn.title' => '.+', 'div.class' => $enforce_class, 'div.dir' => $enforce_direction, 'div.id' => $enforce_id, 'div.xml:lang' => $enforce_lang, 'div.lang' => $enforce_lang, 'div.onclick' => $enforce_javascript, 'div.ondblclick' => $enforce_javascript, 'div.onkeydown' => $enforce_javascript, 'div.onkeypress' => $enforce_javascript, 'div.onkeyup' => $enforce_javascript, 'div.onmousedown' => $enforce_javascript, 'div.onmousemove' => $enforce_javascript, 'div.onmouseout' => $enforce_javascript, 'div.onmouseover' => $enforce_javascript, 'div.onmouseup' => $enforce_javascript, 'div.style' => '.*', 'div.title' => '.+', 'dl.class' => $enforce_class, 'dl.dir' => $enforce_direction, 'dl.id' => $enforce_id, 'dl.lang' => $enforce_lang, 'dl.onclick' => $enforce_javascript, 'dl.ondblclick' => $enforce_javascript, 'dl.onkeydown' => $enforce_javascript, 'dl.onkeypress' => $enforce_javascript, 'dl.onkeyup' => $enforce_javascript, 'dl.onmousedown' => $enforce_javascript, 'dl.onmousemove' => $enforce_javascript, 'dl.onmouseout' => $enforce_javascript, 'dl.onmouseover' => $enforce_javascript, 'dl.onmouseup' => $enforce_javascript, 'dl.style' => '.*', 'dl.title' => '.+', 'dt.class' => $enforce_class, 'dt.dir' => $enforce_direction, 'dt.id' => $enforce_id, 'dt.lang' => $enforce_lang, 'dt.onclick' => $enforce_javascript, 'dt.ondblclick' => $enforce_javascript, 'dt.onkeydown' => $enforce_javascript, 'dt.onkeypress' => $enforce_javascript, 'dt.onkeyup' => $enforce_javascript, 'dt.onmousedown' => $enforce_javascript, 'dt.onmousemove' => $enforce_javascript, 'dt.onmouseout' => $enforce_javascript, 'dt.onmouseover' => $enforce_javascript, 'dt.onmouseup' => $enforce_javascript, 'dt.style' => '.*', 'dt.title' => '.+', 'em.class' => $enforce_class, 'em.dir' => $enforce_direction, 'em.id' => $enforce_id, 'em.lang' => $enforce_lang, 'em.onclick' => $enforce_javascript, 'em.ondblclick' => $enforce_javascript, 'em.onkeydown' => $enforce_javascript, 'em.onkeypress' => $enforce_javascript, 'em.onkeyup' => $enforce_javascript, 'em.onmousedown' => $enforce_javascript, 'em.onmousemove' => $enforce_javascript, 'em.onmouseout' => $enforce_javascript, 'em.onmouseover' => $enforce_javascript, 'em.onmouseup' => $enforce_javascript, 'em.style' => '.*', 'em.title' => '.+', 'fieldset.class' => $enforce_class, 'fieldset.dir' => $enforce_direction, 'fieldset.id' => $enforce_id, 'fieldset.lang' => $enforce_lang, 'fieldset.onclick' => $enforce_javascript, 'fieldset.ondblclick' => $enforce_javascript, 'fieldset.onkeydown' => $enforce_javascript, 'fieldset.onkeypress' => $enforce_javascript, 'fieldset.onkeyup' => $enforce_javascript, 'fieldset.onmousedown' => $enforce_javascript, 'fieldset.onmousemove' => $enforce_javascript, 'fieldset.onmouseout' => $enforce_javascript, 'fieldset.onmouseover' => $enforce_javascript, 'fieldset.onmouseup' => $enforce_javascript, 'fieldset.style' => '.*', 'fieldset.title' => '.+', 'form.accept-charset' => '.+', 'form.action' => $enforce_link, 'form.class' => $enforce_class, 'form.dir' => $enforce_direction, 'form.id' => $enforce_id, 'form.enctype' => 'multipart/form-data|application/x-www-form-urlencoded', 'form.lang' => $enforce_lang, 'form.method' => '(get|post)', 'form.onclick' => $enforce_javascript, 'form.ondblclick' => $enforce_javascript, 'form.onkeydown' => $enforce_javascript, 'form.onkeypress' => $enforce_javascript, 'form.onkeyup' => $enforce_javascript, 'form.onmousedown' => $enforce_javascript, 'form.onmousemove' => $enforce_javascript, 'form.onmouseout' => $enforce_javascript, 'form.onmouseover' => $enforce_javascript, 'form.onmouseup' => $enforce_javascript, 'form.onreset' => '.+', 'form.style' => '.*', 'form.title' => '.+', 'form.onsubmit' => '.+', 'h1.class' => $enforce_class, 'h1.dir' => $enforce_direction, 'h1.id' => $enforce_id, 'h1.lang' => $enforce_lang, 'h1.onclick' => $enforce_javascript, 'h1.ondblclick' => $enforce_javascript, 'h1.onkeydown' => $enforce_javascript, 'h1.onkeypress' => $enforce_javascript, 'h1.onkeyup' => $enforce_javascript, 'h1.onmousedown' => $enforce_javascript, 'h1.onmousemove' => $enforce_javascript, 'h1.onmouseout' => $enforce_javascript, 'h1.onmouseover' => $enforce_javascript, 'h1.onmouseup' => $enforce_javascript, 'h1.style' => '.*', 'h1.title' => '.+', 'h2.class' => $enforce_class, 'h2.dir' => $enforce_direction, 'h2.id' => $enforce_id, 'h2.lang' => $enforce_lang, 'h2.onclick' => $enforce_javascript, 'h2.ondblclick' => $enforce_javascript, 'h2.onkeydown' => $enforce_javascript, 'h2.onkeypress' => $enforce_javascript, 'h2.onkeyup' => $enforce_javascript, 'h2.onmousedown' => $enforce_javascript, 'h2.onmousemove' => $enforce_javascript, 'h2.onmouseout' => $enforce_javascript, 'h2.onmouseover' => $enforce_javascript, 'h2.onmouseup' => $enforce_javascript, 'h2.style' => '.*', 'h2.title' => '.+', 'h3.class' => $enforce_class, 'h3.dir' => $enforce_direction, 'h3.id' => $enforce_id, 'h3.lang' => $enforce_lang, 'h3.onclick' => $enforce_javascript, 'h3.ondblclick' => $enforce_javascript, 'h3.onkeydown' => $enforce_javascript, 'h3.onkeypress' => $enforce_javascript, 'h3.onkeyup' => $enforce_javascript, 'h3.onmousedown' => $enforce_javascript, 'h3.onmousemove' => $enforce_javascript, 'h3.onmouseout' => $enforce_javascript, 'h3.onmouseover' => $enforce_javascript, 'h3.onmouseup' => $enforce_javascript, 'h3.style' => '.*', 'h3.title' => '.+', 'h4.class' => $enforce_class, 'h4.dir' => $enforce_direction, 'h4.id' => $enforce_id, 'h4.lang' => $enforce_lang, 'h4.onclick' => $enforce_javascript, 'h4.ondblclick' => $enforce_javascript, 'h4.onkeydown' => $enforce_javascript, 'h4.onkeypress' => $enforce_javascript, 'h4.onkeyup' => $enforce_javascript, 'h4.onmousedown' => $enforce_javascript, 'h4.onmousemove' => $enforce_javascript, 'h4.onmouseout' => $enforce_javascript, 'h4.onmouseover' => $enforce_javascript, 'h4.onmouseup' => $enforce_javascript, 'h4.style' => '.*', 'h4.title' => '.+', 'h5.class' => $enforce_class, 'h5.dir' => $enforce_direction, 'h5.id' => $enforce_id, 'h5.lang' => $enforce_lang, 'h5.onclick' => $enforce_javascript, 'h5.ondblclick' => $enforce_javascript, 'h5.onkeydown' => $enforce_javascript, 'h5.onkeypress' => $enforce_javascript, 'h5.onkeyup' => $enforce_javascript, 'h5.onmousedown' => $enforce_javascript, 'h5.onmousemove' => $enforce_javascript, 'h5.onmouseout' => $enforce_javascript, 'h5.onmouseover' => $enforce_javascript, 'h5.onmouseup' => $enforce_javascript, 'h5.style' => '.*', 'h5.title' => '.+', 'h6.class' => $enforce_class, 'h6.dir' => $enforce_direction, 'h6.id' => $enforce_id, 'h6.lang' => $enforce_lang, 'h6.onclick' => $enforce_javascript, 'h6.ondblclick' => $enforce_javascript, 'h6.onkeydown' => $enforce_javascript, 'h6.onkeypress' => $enforce_javascript, 'h6.onkeyup' => $enforce_javascript, 'h6.onmousedown' => $enforce_javascript, 'h6.onmousemove' => $enforce_javascript, 'h6.onmouseout' => $enforce_javascript, 'h6.onmouseover' => $enforce_javascript, 'h6.onmouseup' => $enforce_javascript, 'h6.style' => '.*', 'h6.title' => '.+', 'head.dir' => $enforce_direction, 'head.lang' => $enforce_lang, 'head.profile' => '.+', 'hr.class' => $enforce_class, 'hr.id' => $enforce_id, 'hr.onclick' => $enforce_javascript, 'hr.ondblclick' => $enforce_javascript, 'hr.onkeydown' => $enforce_javascript, 'hr.onkeypress' => $enforce_javascript, 'hr.onkeyup' => $enforce_javascript, 'hr.onmousedown' => $enforce_javascript, 'hr.onmousemove' => $enforce_javascript, 'hr.onmouseout' => $enforce_javascript, 'hr.onmouseover' => $enforce_javascript, 'hr.onmouseup' => $enforce_javascript, 'hr.style' => '.*', 'hr.title' => '.+', 'hr.width' => $enforce_length, 'html.dir' => $enforce_direction, 'html.lang' => $enforce_lang, 'html.xml:lang' => $enforce_lang, 'html.version' => '.+', 'html.xmlns' => '.+', 'i.class' => $enforce_class, 'i.dir' => $enforce_direction, 'i.id' => $enforce_id, 'i.lang' => $enforce_lang, 'i.onclick' => $enforce_javascript, 'i.ondblclick' => $enforce_javascript, 'i.onkeydown' => $enforce_javascript, 'i.onkeypress' => $enforce_javascript, 'i.onkeyup' => $enforce_javascript, 'i.onmousedown' => $enforce_javascript, 'i.onmousemove' => $enforce_javascript, 'i.onmouseout' => $enforce_javascript, 'i.onmouseover' => $enforce_javascript, 'i.onmouseup' => $enforce_javascript, 'i.style' => '.*', 'i.title' => '.+', 'img.alt' => '.*', 'img.class' => $enforce_class, 'img.dir' => $enforce_direction, 'img.height' => $enforce_number, 'img.id' => $enforce_id, 'img.ismap' => 'ismap', 'img.lang' => $enforce_lang, 'img.longdesc' => '.+', 'img.onclick' => $enforce_javascript, 'img.ondblclick' => $enforce_javascript, 'img.onkeydown' => $enforce_javascript, 'img.onkeypress' => $enforce_javascript, 'img.onkeyup' => $enforce_javascript, 'img.onmousedown' => $enforce_javascript, 'img.onmousemove' => $enforce_javascript, 'img.onmouseout' => $enforce_javascript, 'img.onmouseover' => $enforce_javascript, 'img.onmouseup' => $enforce_javascript, 'img.src' => $enforce_link, 'img.style' => '.*', 'img.title' => '.*', 'img.usemap' => '.+', 'img.width' => $enforce_number, 'input.accept' => '.+', 'input.accesskey' => $enforce_character, 'input.alt' => '.*', 'input.checked' => 'checked', 'input.class' => $enforce_class, 'input.dir' => $enforce_direction, 'input.disabled' => 'disabled', 'input.id' => $enforce_id, 'input.lang' => $enforce_lang, 'input.maxlength' => $enforce_inumber, 'input.name' => $enforce_id, 'input.onblur' => '.+', 'input.onchange' => '.+', 'input.onclick' => $enforce_javascript, 'input.ondblclick' => $enforce_javascript, 'input.onfocus' => $enforce_javascript, 'input.onkeydown' => $enforce_javascript, 'input.onkeypress' => $enforce_javascript, 'input.onkeyup' => $enforce_javascript, 'input.onmousedown' => $enforce_javascript, 'input.onmousemove' => $enforce_javascript, 'input.onmouseout' => $enforce_javascript, 'input.onmouseover' => $enforce_javascript, 'input.onmouseup' => $enforce_javascript, 'input.onselect' => '.+', 'input.readonly' => 'readonly', 'input.size' => '.+', 'input.src' => '.+', 'input.style' => '.*', 'input.tabindex' => $enforce_inumber, 'input.title' => '.+', 'input.type' => '(text|password|checkbox|radio|submit|reset|file|hidden|image|button)', 'input.usemap' => '.+', 'input.value' => '.' . ($strict_form_accessibility ? '+' : '*'), 'ins.cite' => '.+', 'ins.class' => $enforce_class, 'ins.datetime' => '.+', 'ins.dir' => $enforce_direction, 'ins.id' => $enforce_id, 'ins.lang' => $enforce_lang, 'ins.onclick' => $enforce_javascript, 'ins.ondblclick' => $enforce_javascript, 'ins.onkeydown' => $enforce_javascript, 'ins.onkeypress' => $enforce_javascript, 'ins.onkeyup' => $enforce_javascript, 'ins.onmousedown' => $enforce_javascript, 'ins.onmousemove' => $enforce_javascript, 'ins.onmouseout' => $enforce_javascript, 'ins.onmouseover' => $enforce_javascript, 'ins.onmouseup' => $enforce_javascript, 'ins.style' => '.*', 'ins.title' => '.+', 'kbd.class' => $enforce_class, 'kbd.dir' => $enforce_direction, 'kbd.id' => $enforce_id, 'kbd.lang' => $enforce_lang, 'kbd.onclick' => $enforce_javascript, 'kbd.ondblclick' => $enforce_javascript, 'kbd.onkeydown' => $enforce_javascript, 'kbd.onkeypress' => $enforce_javascript, 'kbd.onkeyup' => $enforce_javascript, 'kbd.onmousedown' => $enforce_javascript, 'kbd.onmousemove' => $enforce_javascript, 'kbd.onmouseout' => $enforce_javascript, 'kbd.onmouseover' => $enforce_javascript, 'kbd.onmouseup' => $enforce_javascript, 'kbd.style' => '.*', 'kbd.title' => '.+', 'label.accesskey' => $enforce_character, 'label.class' => $enforce_class, 'label.dir' => $enforce_direction, 'label.for' => '.+', 'label.id' => $enforce_id, 'label.lang' => $enforce_lang, 'label.onblur' => '.+', 'label.onclick' => $enforce_javascript, 'label.ondblclick' => $enforce_javascript, 'label.onfocus' => $enforce_javascript, 'label.onkeydown' => $enforce_javascript, 'label.onkeypress' => $enforce_javascript, 'label.onkeyup' => $enforce_javascript, 'label.onmousedown' => $enforce_javascript, 'label.onmousemove' => $enforce_javascript, 'label.onmouseout' => $enforce_javascript, 'label.onmouseover' => $enforce_javascript, 'label.onmouseup' => $enforce_javascript, 'label.style' => '.*', 'label.title' => '.+', 'legend.accesskey' => $enforce_character, 'legend.align' => $enforce_align4, 'legend.class' => $enforce_class, 'legend.dir' => $enforce_direction, 'legend.id' => $enforce_id, 'legend.lang' => $enforce_lang, 'legend.onclick' => $enforce_javascript, 'legend.ondblclick' => $enforce_javascript, 'legend.onkeydown' => $enforce_javascript, 'legend.onkeypress' => $enforce_javascript, 'legend.onkeyup' => $enforce_javascript, 'legend.onmousedown' => $enforce_javascript, 'legend.onmousemove' => $enforce_javascript, 'legend.onmouseout' => $enforce_javascript, 'legend.onmouseover' => $enforce_javascript, 'legend.onmouseup' => $enforce_javascript, 'legend.style' => '.*', 'legend.title' => '.+', 'li.class' => $enforce_class, 'li.dir' => $enforce_direction, 'li.id' => $enforce_id, 'li.lang' => $enforce_lang, 'li.onclick' => $enforce_javascript, 'li.ondblclick' => $enforce_javascript, 'li.onkeydown' => $enforce_javascript, 'li.onkeypress' => $enforce_javascript, 'li.onkeyup' => $enforce_javascript, 'li.onmousedown' => $enforce_javascript, 'li.onmousemove' => $enforce_javascript, 'li.onmouseout' => $enforce_javascript, 'li.onmouseover' => $enforce_javascript, 'li.onmouseup' => $enforce_javascript, 'li.style' => '.*', 'li.title' => '.+', 'link.charset' => '.+', 'link.class' => $enforce_class, 'link.dir' => $enforce_direction, 'link.href' => $enforce_link, 'link.hreflang' => $enforce_lang, 'link.id' => $enforce_id, 'link.lang' => $enforce_lang, 'link.media' => '.+', 'link.onclick' => $enforce_javascript, 'link.ondblclick' => $enforce_javascript, 'link.onkeydown' => $enforce_javascript, 'link.onkeypress' => $enforce_javascript, 'link.onkeyup' => $enforce_javascript, 'link.onmousedown' => $enforce_javascript, 'link.onmousemove' => $enforce_javascript, 'link.onmouseout' => $enforce_javascript, 'link.onmouseover' => $enforce_javascript, 'link.onmouseup' => $enforce_javascript, 'link.rel' => '.+', 'link.rev' => '.+', 'link.style' => '.*', 'link.title' => '.+', 'link.type' => '.+', 'map.class' => $enforce_class, 'map.dir' => $enforce_direction, 'map.id' => $enforce_id, 'map.lang' => $enforce_lang, 'map.onclick' => $enforce_javascript, 'map.ondblclick' => $enforce_javascript, 'map.onkeydown' => $enforce_javascript, 'map.onkeypress' => $enforce_javascript, 'map.onkeyup' => $enforce_javascript, 'map.onmousedown' => $enforce_javascript, 'map.onmousemove' => $enforce_javascript, 'map.onmouseout' => $enforce_javascript, 'map.onmouseover' => $enforce_javascript, 'map.onmouseup' => $enforce_javascript, 'map.style' => '.*', 'map.title' => '.+', 'meta.content' => '.*', 'meta.dir' => $enforce_direction, 'meta.http-equiv' => '[a-zA-Z].+', 'meta.lang' => $enforce_lang, 'meta.name' => '[a-zA-Z].+', 'meta.scheme' => '.+', 'noscript.class' => $enforce_class, 'noscript.dir' => $enforce_direction, 'noscript.id' => $enforce_id, 'noscript.lang' => $enforce_lang, 'noscript.onclick' => $enforce_javascript, 'noscript.ondblclick' => $enforce_javascript, 'noscript.onkeydown' => $enforce_javascript, 'noscript.onkeypress' => $enforce_javascript, 'noscript.onkeyup' => $enforce_javascript, 'noscript.onmousedown' => $enforce_javascript, 'noscript.onmousemove' => $enforce_javascript, 'noscript.onmouseout' => $enforce_javascript, 'noscript.onmouseover' => $enforce_javascript, 'noscript.onmouseup' => $enforce_javascript, 'noscript.style' => '.*', 'noscript.title' => '.+', 'object.archive' => '.+', 'object.class' => $enforce_class, 'object.classid' => '.+', 'object.codebase' => $enforce_link, 'object.codetype' => '.+', 'object.data' => $enforce_link, 'object.declare' => 'declare', 'object.dir' => $enforce_direction, 'object.height' => $enforce_length, 'object.id' => $enforce_id, 'object.lang' => $enforce_lang, 'object.name' => $enforce_id, 'object.onclick' => $enforce_javascript, 'object.ondblclick' => $enforce_javascript, 'object.onkeydown' => $enforce_javascript, 'object.onkeypress' => $enforce_javascript, 'object.onkeyup' => $enforce_javascript, 'object.onmousedown' => $enforce_javascript, 'object.onmousemove' => $enforce_javascript, 'object.onmouseout' => $enforce_javascript, 'object.onmouseover' => $enforce_javascript, 'object.onmouseup' => $enforce_javascript, 'object.standby' => '.+', 'object.style' => '.*', 'object.tabindex' => $enforce_inumber, 'object.title' => '.+', 'object.type' => '.+', 'object.usemap' => '.+', 'object.width' => $enforce_length, 'ol.class' => $enforce_class, 'ol.dir' => $enforce_direction, 'ol.id' => $enforce_id, 'ol.lang' => $enforce_lang, 'ol.onclick' => $enforce_javascript, 'ol.ondblclick' => $enforce_javascript, 'ol.onkeydown' => $enforce_javascript, 'ol.onkeypress' => $enforce_javascript, 'ol.onkeyup' => $enforce_javascript, 'ol.onmousedown' => $enforce_javascript, 'ol.onmousemove' => $enforce_javascript, 'ol.onmouseout' => $enforce_javascript, 'ol.onmouseover' => $enforce_javascript, 'ol.onmouseup' => $enforce_javascript, 'ol.style' => '.*', 'ol.title' => '.+', 'optgroup.class' => $enforce_class, 'optgroup.dir' => $enforce_direction, 'optgroup.disabled' => 'disabled', 'optgroup.id' => $enforce_id, 'optgroup.label' => '.+', 'optgroup.lang' => $enforce_lang, 'optgroup.onclick' => $enforce_javascript, 'optgroup.ondblclick' => $enforce_javascript, 'optgroup.onkeydown' => $enforce_javascript, 'optgroup.onkeypress' => $enforce_javascript, 'optgroup.onkeyup' => $enforce_javascript, 'optgroup.onmousedown' => $enforce_javascript, 'optgroup.onmousemove' => $enforce_javascript, 'optgroup.onmouseout' => $enforce_javascript, 'optgroup.onmouseover' => $enforce_javascript, 'optgroup.onmouseup' => $enforce_javascript, 'optgroup.style' => '.*', 'optgroup.title' => '.+', 'option.class' => $enforce_class, 'option.dir' => $enforce_direction, 'option.disabled' => 'disabled', 'option.id' => $enforce_id, 'option.label' => '.+', 'option.lang' => $enforce_lang, 'option.onclick' => $enforce_javascript, 'option.ondblclick' => $enforce_javascript, 'option.onkeydown' => $enforce_javascript, 'option.onkeypress' => $enforce_javascript, 'option.onkeyup' => $enforce_javascript, 'option.onmousedown' => $enforce_javascript, 'option.onmousemove' => $enforce_javascript, 'option.onmouseout' => $enforce_javascript, 'option.onmouseover' => $enforce_javascript, 'option.onmouseup' => $enforce_javascript, 'option.selected' => 'selected', 'option.style' => '.*', 'option.title' => '.+', 'option.value' => '.*', 'p.class' => $enforce_class, 'p.dir' => $enforce_direction, 'p.id' => $enforce_id, 'p.lang' => $enforce_lang, 'p.onclick' => $enforce_javascript, 'p.ondblclick' => $enforce_javascript, 'p.onkeydown' => $enforce_javascript, 'p.onkeypress' => $enforce_javascript, 'p.onkeyup' => $enforce_javascript, 'p.onmousedown' => $enforce_javascript, 'p.onmousemove' => $enforce_javascript, 'p.onmouseout' => $enforce_javascript, 'p.onmouseover' => $enforce_javascript, 'p.onmouseup' => $enforce_javascript, 'p.style' => '.*', 'p.title' => '.+', 'param.id' => $enforce_id, 'param.name' => $enforce_id, 'param.type' => '.+', 'param.value' => '.+', 'param.valuetype' => '(data|ref|object)', 'pre.class' => $enforce_class, 'pre.dir' => $enforce_direction, 'pre.id' => $enforce_id, 'pre.lang' => $enforce_lang, 'pre.onclick' => $enforce_javascript, 'pre.ondblclick' => $enforce_javascript, 'pre.onkeydown' => $enforce_javascript, 'pre.onkeypress' => $enforce_javascript, 'pre.onkeyup' => $enforce_javascript, 'pre.onmousedown' => $enforce_javascript, 'pre.onmousemove' => $enforce_javascript, 'pre.onmouseout' => $enforce_javascript, 'pre.onmouseover' => $enforce_javascript, 'pre.onmouseup' => $enforce_javascript, 'pre.style' => '.*', 'pre.title' => '.+', 'q.cite' => '.+', 'q.class' => $enforce_class, 'q.dir' => $enforce_direction, 'q.id' => $enforce_id, 'q.lang' => $enforce_lang, 'q.onclick' => $enforce_javascript, 'q.ondblclick' => $enforce_javascript, 'q.onkeydown' => $enforce_javascript, 'q.onkeypress' => $enforce_javascript, 'q.onkeyup' => $enforce_javascript, 'q.onmousedown' => $enforce_javascript, 'q.onmousemove' => $enforce_javascript, 'q.onmouseout' => $enforce_javascript, 'q.onmouseover' => $enforce_javascript, 'q.onmouseup' => $enforce_javascript, 'q.style' => '.*', 'q.title' => '.+', 'samp.class' => $enforce_class, 'samp.dir' => $enforce_direction, 'samp.id' => $enforce_id, 'samp.lang' => $enforce_lang, 'samp.onclick' => $enforce_javascript, 'samp.ondblclick' => $enforce_javascript, 'samp.onkeydown' => $enforce_javascript, 'samp.onkeypress' => $enforce_javascript, 'samp.onkeyup' => $enforce_javascript, 'samp.onmousedown' => $enforce_javascript, 'samp.onmousemove' => $enforce_javascript, 'samp.onmouseout' => $enforce_javascript, 'samp.onmouseover' => $enforce_javascript, 'samp.onmouseup' => $enforce_javascript, 'samp.style' => '.*', 'samp.title' => '.+', 'script.charset' => '.+', 'script.defer' => 'defer', 'script.event' => '.+', 'script.for' => '.+', 'script.src' => '.+', 'script.type' => 'text/javascript', 'select.class' => $enforce_class, 'select.dir' => $enforce_direction, 'select.disabled' => 'disabled', 'select.id' => $enforce_id, 'select.lang' => $enforce_lang, 'select.multiple' => 'multiple', 'select.name' => $enforce_name, 'select.onblur' => '.+', 'select.onchange' => '.+', 'select.onclick' => $enforce_javascript, 'select.ondblclick' => $enforce_javascript, 'select.onfocus' => $enforce_javascript, 'select.onkeydown' => $enforce_javascript, 'select.onkeypress' => $enforce_javascript, 'select.onkeyup' => $enforce_javascript, 'select.onmousedown' => $enforce_javascript, 'select.onmousemove' => $enforce_javascript, 'select.onmouseout' => $enforce_javascript, 'select.onmouseover' => $enforce_javascript, 'select.onmouseup' => $enforce_javascript, 'select.size' => $enforce_inumber, 'select.style' => '.*', 'select.tabindex' => $enforce_inumber, 'select.title' => '.*', 'small.class' => $enforce_class, 'small.dir' => $enforce_direction, 'small.id' => $enforce_id, 'small.lang' => $enforce_lang, 'small.onclick' => $enforce_javascript, 'small.ondblclick' => $enforce_javascript, 'small.onkeydown' => $enforce_javascript, 'small.onkeypress' => $enforce_javascript, 'small.onkeyup' => $enforce_javascript, 'small.onmousedown' => $enforce_javascript, 'small.onmousemove' => $enforce_javascript, 'small.onmouseout' => $enforce_javascript, 'small.onmouseover' => $enforce_javascript, 'small.onmouseup' => $enforce_javascript, 'small.style' => '.*', 'small.title' => '.+', 'span.class' => $enforce_class, 'span.dir' => $enforce_direction, 'span.id' => $enforce_id, 'span.xml:lang' => $enforce_lang, 'span.lang' => $enforce_lang, 'span.onclick' => $enforce_javascript, 'span.ondblclick' => $enforce_javascript, 'span.onkeydown' => $enforce_javascript, 'span.onkeypress' => $enforce_javascript, 'span.onkeyup' => $enforce_javascript, 'span.onmousedown' => $enforce_javascript, 'span.onmousemove' => $enforce_javascript, 'span.onmouseout' => $enforce_javascript, 'span.onmouseover' => $enforce_javascript, 'span.onmouseup' => $enforce_javascript, 'span.style' => '.*', 'span.title' => '.+', 'strong.class' => $enforce_class, 'strong.dir' => $enforce_direction, 'strong.id' => $enforce_id, 'strong.lang' => $enforce_lang, 'strong.onclick' => $enforce_javascript, 'strong.ondblclick' => $enforce_javascript, 'strong.onkeydown' => $enforce_javascript, 'strong.onkeypress' => $enforce_javascript, 'strong.onkeyup' => $enforce_javascript, 'strong.onmousedown' => $enforce_javascript, 'strong.onmousemove' => $enforce_javascript, 'strong.onmouseout' => $enforce_javascript, 'strong.onmouseover' => $enforce_javascript, 'strong.onmouseup' => $enforce_javascript, 'strong.style' => '.*', 'strong.title' => '.+', 'style.dir' => $enforce_direction, 'style.lang' => $enforce_lang, 'style.media' => '.+', 'style.title' => '.+', 'style.type' => 'text/css', 'sub.class' => $enforce_class, 'sub.dir' => $enforce_direction, 'sub.id' => $enforce_id, 'sub.lang' => $enforce_lang, 'sub.onclick' => $enforce_javascript, 'sub.ondblclick' => $enforce_javascript, 'sub.onkeydown' => $enforce_javascript, 'sub.onkeypress' => $enforce_javascript, 'sub.onkeyup' => $enforce_javascript, 'sub.onmousedown' => $enforce_javascript, 'sub.onmousemove' => $enforce_javascript, 'sub.onmouseout' => $enforce_javascript, 'sub.onmouseover' => $enforce_javascript, 'sub.onmouseup' => $enforce_javascript, 'sub.style' => '.*', 'sub.title' => '.+', 'sup.class' => $enforce_class, 'sup.dir' => $enforce_direction, 'sup.id' => $enforce_id, 'sup.lang' => $enforce_lang, 'sup.onclick' => $enforce_javascript, 'sup.ondblclick' => $enforce_javascript, 'sup.onkeydown' => $enforce_javascript, 'sup.onkeypress' => $enforce_javascript, 'sup.onkeyup' => $enforce_javascript, 'sup.onmousedown' => $enforce_javascript, 'sup.onmousemove' => $enforce_javascript, 'sup.onmouseout' => $enforce_javascript, 'sup.onmouseover' => $enforce_javascript, 'sup.onmouseup' => $enforce_javascript, 'sup.style' => '.*', 'sup.title' => '.+', 'table.border' => $enforce_pixels, 'table.cellpadding' => $enforce_length, 'table.cellspacing' => $enforce_length, 'table.class' => $enforce_class, 'table.dir' => $enforce_direction, 'table.frame' => '(void|above|below|hsides|lhs|rhs|vsides|box|border)', 'table.id' => $enforce_id, 'table.lang' => $enforce_lang, 'table.onclick' => $enforce_javascript, 'table.ondblclick' => $enforce_javascript, 'table.onkeydown' => $enforce_javascript, 'table.onkeypress' => $enforce_javascript, 'table.onkeyup' => $enforce_javascript, 'table.onmousedown' => $enforce_javascript, 'table.onmousemove' => $enforce_javascript, 'table.onmouseout' => $enforce_javascript, 'table.onmouseover' => $enforce_javascript, 'table.onmouseup' => $enforce_javascript, 'table.rules' => '(none|groups|rows|cols|all)', 'table.style' => '.*', 'table.summary' => '.*', 'table.title' => '.+', 'table.width' => $enforce_length, 'tbody.align' => $enforce_align, 'tbody.char' => $enforce_character, 'tbody.charoff' => $enforce_length, 'tbody.class' => $enforce_class, 'tbody.dir' => $enforce_direction, 'tbody.id' => $enforce_id, 'tbody.lang' => $enforce_lang, 'tbody.onclick' => $enforce_javascript, 'tbody.ondblclick' => $enforce_javascript, 'tbody.onkeydown' => $enforce_javascript, 'tbody.onkeypress' => $enforce_javascript, 'tbody.onkeyup' => $enforce_javascript, 'tbody.onmousedown' => $enforce_javascript, 'tbody.onmousemove' => $enforce_javascript, 'tbody.onmouseout' => $enforce_javascript, 'tbody.onmouseover' => $enforce_javascript, 'tbody.onmouseup' => $enforce_javascript, 'tbody.style' => '.*', 'tbody.title' => '.+', 'td.abbr' => '.+', 'td.align' => $enforce_align, 'td.axis' => '.+', 'td.char' => $enforce_character, 'td.charoff' => $enforce_length, 'td.class' => $enforce_class, 'td.colspan' => $enforce_inumber, 'td.dir' => $enforce_direction, 'td.headers' => '.+', 'td.id' => $enforce_id, 'td.lang' => $enforce_lang, 'td.onclick' => $enforce_javascript, 'td.ondblclick' => $enforce_javascript, 'td.onkeydown' => $enforce_javascript, 'td.onkeypress' => $enforce_javascript, 'td.onkeyup' => $enforce_javascript, 'td.onmousedown' => $enforce_javascript, 'td.onmousemove' => $enforce_javascript, 'td.onmouseout' => $enforce_javascript, 'td.onmouseover' => $enforce_javascript, 'td.onmouseup' => $enforce_javascript, 'td.rowspan' => $enforce_inumber, 'td.scope' => '(row|col|rowgroup|colgroup)', 'td.style' => '.*', 'td.title' => '.+', 'textarea.accesskey' => $enforce_character, 'textarea.class' => $enforce_class, 'textarea.cols' => $enforce_inumber, 'textarea.dir' => $enforce_direction, 'textarea.disabled' => 'disabled', 'textarea.id' => $enforce_id, 'textarea.lang' => $enforce_lang, 'textarea.name' => $enforce_id, 'textarea.onblur' => '.+', 'textarea.onchange' => '.+', 'textarea.onclick' => $enforce_javascript, 'textarea.ondblclick' => $enforce_javascript, 'textarea.onfocus' => $enforce_javascript, 'textarea.onkeydown' => $enforce_javascript, 'textarea.onkeypress' => $enforce_javascript, 'textarea.onkeyup' => $enforce_javascript, 'textarea.onmousedown' => $enforce_javascript, 'textarea.onmousemove' => $enforce_javascript, 'textarea.onmouseout' => $enforce_javascript, 'textarea.onmouseover' => $enforce_javascript, 'textarea.onmouseup' => $enforce_javascript, 'textarea.onselect' => '.+', 'textarea.readonly' => 'readonly', 'textarea.rows' => $enforce_inumber, 'textarea.style' => '.*', 'textarea.tabindex' => $enforce_inumber, 'textarea.title' => '.+', 'tfoot.align' => $enforce_align, 'tfoot.char' => $enforce_character, 'tfoot.charoff' => $enforce_length, 'tfoot.class' => $enforce_class, 'tfoot.dir' => $enforce_direction, 'tfoot.id' => $enforce_id, 'tfoot.lang' => $enforce_lang, 'tfoot.onclick' => $enforce_javascript, 'tfoot.ondblclick' => $enforce_javascript, 'tfoot.onkeydown' => $enforce_javascript, 'tfoot.onkeypress' => $enforce_javascript, 'tfoot.onkeyup' => $enforce_javascript, 'tfoot.onmousedown' => $enforce_javascript, 'tfoot.onmousemove' => $enforce_javascript, 'tfoot.onmouseout' => $enforce_javascript, 'tfoot.onmouseover' => $enforce_javascript, 'tfoot.onmouseup' => $enforce_javascript, 'tfoot.style' => '.*', 'tfoot.title' => '.+', 'th.abbr' => '.+', 'th.align' => $enforce_align, 'th.axis' => '.+', 'th.char' => $enforce_character, 'th.charoff' => $enforce_length, 'th.class' => $enforce_class, 'th.colspan' => $enforce_inumber, 'th.dir' => $enforce_direction, 'th.headers' => '.+', 'th.height' => $enforce_length, 'th.id' => $enforce_id, 'th.lang' => $enforce_lang, 'th.onclick' => $enforce_javascript, 'th.ondblclick' => $enforce_javascript, 'th.onkeydown' => $enforce_javascript, 'th.onkeypress' => $enforce_javascript, 'th.onkeyup' => $enforce_javascript, 'th.onmousedown' => $enforce_javascript, 'th.onmousemove' => $enforce_javascript, 'th.onmouseout' => $enforce_javascript, 'th.onmouseover' => $enforce_javascript, 'th.onmouseup' => $enforce_javascript, 'th.rowspan' => $enforce_inumber, 'th.scope' => '(row|col|rowgroup|colgroup)', 'th.style' => '.*', 'th.title' => '.+', 'th.width' => $enforce_length, 'thead.align' => $enforce_align, 'thead.char' => $enforce_character, 'thead.charoff' => $enforce_length, 'thead.class' => $enforce_class, 'thead.dir' => $enforce_direction, 'thead.id' => $enforce_id, 'thead.lang' => $enforce_lang, 'thead.onclick' => $enforce_javascript, 'thead.ondblclick' => $enforce_javascript, 'thead.onkeydown' => $enforce_javascript, 'thead.onkeypress' => $enforce_javascript, 'thead.onkeyup' => $enforce_javascript, 'thead.onmousedown' => $enforce_javascript, 'thead.onmousemove' => $enforce_javascript, 'thead.onmouseout' => $enforce_javascript, 'thead.onmouseover' => $enforce_javascript, 'thead.onmouseup' => $enforce_javascript, 'thead.style' => '.*', 'thead.title' => '.+', 'title.dir' => $enforce_direction, 'title.lang' => $enforce_lang, 'tr.align' => $enforce_align, 'tr.char' => $enforce_character, 'tr.charoff' => $enforce_length, 'tr.class' => $enforce_class, 'tr.dir' => $enforce_direction, 'tr.id' => $enforce_id, 'tr.lang' => $enforce_lang, 'tr.onclick' => $enforce_javascript, 'tr.ondblclick' => $enforce_javascript, 'tr.onkeydown' => $enforce_javascript, 'tr.onkeypress' => $enforce_javascript, 'tr.onkeyup' => $enforce_javascript, 'tr.onmousedown' => $enforce_javascript, 'tr.onmousemove' => $enforce_javascript, 'tr.onmouseout' => $enforce_javascript, 'tr.onmouseover' => $enforce_javascript, 'tr.onmouseup' => $enforce_javascript, 'tr.style' => '.*', 'tr.title' => '.+', 'tt.class' => $enforce_class, 'tt.dir' => $enforce_direction, 'tt.id' => $enforce_id, 'tt.lang' => $enforce_lang, 'tt.onclick' => $enforce_javascript, 'tt.ondblclick' => $enforce_javascript, 'tt.onkeydown' => $enforce_javascript, 'tt.onkeypress' => $enforce_javascript, 'tt.onkeyup' => $enforce_javascript, 'tt.onmousedown' => $enforce_javascript, 'tt.onmousemove' => $enforce_javascript, 'tt.onmouseout' => $enforce_javascript, 'tt.onmouseover' => $enforce_javascript, 'tt.onmouseup' => $enforce_javascript, 'tt.style' => '.*', 'tt.title' => '.+', 'ul.class' => $enforce_class, 'ul.dir' => $enforce_direction, 'ul.id' => $enforce_id, 'ul.lang' => $enforce_lang, 'ul.onclick' => $enforce_javascript, 'ul.ondblclick' => $enforce_javascript, 'ul.onkeydown' => $enforce_javascript, 'ul.onkeypress' => $enforce_javascript, 'ul.onkeyup' => $enforce_javascript, 'ul.onmousedown' => $enforce_javascript, 'ul.onmousemove' => $enforce_javascript, 'ul.onmouseout' => $enforce_javascript, 'ul.onmouseover' => $enforce_javascript, 'ul.onmouseup' => $enforce_javascript, 'ul.style' => '.*', 'ul.title' => '.+', 'var.class' => $enforce_class, 'var.dir' => $enforce_direction, 'var.id' => $enforce_id, 'var.lang' => $enforce_lang, 'var.onclick' => $enforce_javascript, 'var.ondblclick' => $enforce_javascript, 'var.onkeydown' => $enforce_javascript, 'var.onkeypress' => $enforce_javascript, 'var.onkeyup' => $enforce_javascript, 'var.onmousedown' => $enforce_javascript, 'var.onmousemove' => $enforce_javascript, 'var.onmouseout' => $enforce_javascript, 'var.onmouseover' => $enforce_javascript, 'var.onmouseup' => $enforce_javascript, 'var.style' => '.*', 'var.title' => '.+', 'map.name' => $enforce_id, 'a.target' => '.+', 'base.target' => '.+', 'form.target' => '.+', 'iframe.align' => $enforce_align2, 'iframe.class' => $enforce_class, 'iframe.height' => $enforce_length, 'iframe.id' => $enforce_id, 'iframe.longdesc' => '.+', 'iframe.name' => $enforce_id, 'iframe.scrolling' => '(yes|no|auto)', 'iframe.src' => '.+', 'iframe.style' => '.*', 'iframe.title' => '.*', 'iframe.frameborder' => '(1|0)', 'iframe.marginheight' => $enforce_pixels, 'iframe.marginwidth' => $enforce_pixels, 'ruby.class' => $enforce_class, 'ruby.dir' => $enforce_direction, 'ruby.id' => $enforce_id, 'ruby.lang' => $enforce_lang, 'ruby.onclick' => $enforce_javascript, 'ruby.ondblclick' => $enforce_javascript, 'ruby.onkeydown' => $enforce_javascript, 'ruby.onkeypress' => $enforce_javascript, 'ruby.onkeyup' => $enforce_javascript, 'ruby.onmousedown' => $enforce_javascript, 'ruby.onmousemove' => $enforce_javascript, 'ruby.onmouseout' => $enforce_javascript, 'ruby.onmouseover' => $enforce_javascript, 'ruby.onmouseup' => $enforce_javascript, 'ruby.style' => '.*', 'ruby.title' => '.+', 'rbc.class' => $enforce_class, 'rbc.dir' => $enforce_direction, 'rbc.id' => $enforce_id, 'rbc.lang' => $enforce_lang, 'rbc.onclick' => $enforce_javascript, 'rbc.ondblclick' => $enforce_javascript, 'rbc.onkeydown' => $enforce_javascript, 'rbc.onkeypress' => $enforce_javascript, 'rbc.onkeyup' => $enforce_javascript, 'rbc.onmousedown' => $enforce_javascript, 'rbc.onmousemove' => $enforce_javascript, 'rbc.onmouseout' => $enforce_javascript, 'rbc.onmouseover' => $enforce_javascript, 'rbc.onmouseup' => $enforce_javascript, 'rbc.style' => '.*', 'rbc.title' => '.+', 'rtc.class' => $enforce_class, 'rtc.dir' => $enforce_direction, 'rtc.id' => $enforce_id, 'rtc.lang' => $enforce_lang, 'rtc.onclick' => $enforce_javascript, 'rtc.ondblclick' => $enforce_javascript, 'rtc.onkeydown' => $enforce_javascript, 'rtc.onkeypress' => $enforce_javascript, 'rtc.onkeyup' => $enforce_javascript, 'rtc.onmousedown' => $enforce_javascript, 'rtc.onmousemove' => $enforce_javascript, 'rtc.onmouseout' => $enforce_javascript, 'rtc.onmouseover' => $enforce_javascript, 'rtc.onmouseup' => $enforce_javascript, 'rtc.style' => '.*', 'rtc.title' => '.+', 'rb.class' => $enforce_class, 'rb.dir' => $enforce_direction, 'rb.id' => $enforce_id, 'rb.lang' => $enforce_lang, 'rb.onclick' => $enforce_javascript, 'rb.ondblclick' => $enforce_javascript, 'rb.onkeydown' => $enforce_javascript, 'rb.onkeypress' => $enforce_javascript, 'rb.onkeyup' => $enforce_javascript, 'rb.onmousedown' => $enforce_javascript, 'rb.onmousemove' => $enforce_javascript, 'rb.onmouseout' => $enforce_javascript, 'rb.onmouseover' => $enforce_javascript, 'rb.onmouseup' => $enforce_javascript, 'rb.style' => '.*', 'rb.title' => '.+', 'rt.class' => $enforce_class, 'rt.dir' => $enforce_direction, 'rt.id' => $enforce_id, 'rt.lang' => $enforce_lang, 'rt.onclick' => $enforce_javascript, 'rt.ondblclick' => $enforce_javascript, 'rt.onkeydown' => $enforce_javascript, 'rt.onkeypress' => $enforce_javascript, 'rt.onkeyup' => $enforce_javascript, 'rt.onmousedown' => $enforce_javascript, 'rt.onmousemove' => $enforce_javascript, 'rt.onmouseout' => $enforce_javascript, 'rt.onmouseover' => $enforce_javascript, 'rt.onmouseup' => $enforce_javascript, 'rt.style' => '.*', 'rt.title' => '.+', 'rt.rbspan' => $enforce_inumber);
    global $TAG_ATTRIBUTES_DEPRECATED;
    $TAG_ATTRIBUTES_DEPRECATED = array('img.align' => $enforce_align2, 'iframe.width' => $enforce_length, 'script.language' => 'Javascript', 'dir.class' => $enforce_class, 'dir.compact' => 'compact', 'dir.dir' => $enforce_direction, 'dir.id' => $enforce_id, 'dir.lang' => $enforce_lang, 'dir.onclick' => $enforce_javascript, 'dir.ondblclick' => $enforce_javascript, 'dir.onkeydown' => $enforce_javascript, 'dir.onkeypress' => $enforce_javascript, 'dir.onkeyup' => $enforce_javascript, 'dir.onmousedown' => $enforce_javascript, 'dir.onmousemove' => $enforce_javascript, 'dir.onmouseout' => $enforce_javascript, 'dir.onmouseover' => $enforce_javascript, 'dir.onmouseup' => $enforce_javascript, 'dir.style' => '.*', 'dir.title' => '.+', 'menu.class' => $enforce_class, 'menu.compact' => 'compact', 'menu.dir' => $enforce_direction, 'menu.id' => $enforce_id, 'menu.lang' => $enforce_lang, 'menu.onclick' => $enforce_javascript, 'menu.ondblclick' => $enforce_javascript, 'menu.onkeydown' => $enforce_javascript, 'menu.onkeypress' => $enforce_javascript, 'menu.onkeyup' => $enforce_javascript, 'menu.onmousedown' => $enforce_javascript, 'menu.onmousemove' => $enforce_javascript, 'menu.onmouseout' => $enforce_javascript, 'menu.onmouseover' => $enforce_javascript, 'menu.onmouseup' => $enforce_javascript, 'menu.style' => '.*', 'menu.title' => '.+', 'center.class' => $enforce_class, 'center.dir' => $enforce_direction, 'center.id' => $enforce_id, 'center.lang' => $enforce_lang, 'center.onclick' => $enforce_javascript, 'center.ondblclick' => $enforce_javascript, 'center.onkeydown' => $enforce_javascript, 'center.onkeypress' => $enforce_javascript, 'center.onkeyup' => $enforce_javascript, 'center.onmousedown' => $enforce_javascript, 'center.onmousemove' => $enforce_javascript, 'center.onmouseout' => $enforce_javascript, 'center.onmouseover' => $enforce_javascript, 'center.onmouseup' => $enforce_javascript, 'center.style' => '.*', 'center.title' => '.+', 'applet.align' => $enforce_align2, 'applet.alt' => '.*', 'applet.archive' => '.+', 'applet.class' => $enforce_class, 'applet.code' => '.+', 'applet.codebase' => '.+', 'applet.height' => $enforce_length, 'applet.hspace' => $enforce_pixels, 'applet.id' => $enforce_id, 'applet.name' => $enforce_id, 'applet.object' => '.+', 'applet.style' => '.*', 'applet.title' => '.+', 'applet.vspace' => $enforce_pixels, 'applet.width' => $enforce_length, 'font.class' => $enforce_class, 'font.color' => $enforce_color, 'font.dir' => $enforce_direction, 'font.face' => '.+', 'font.id' => $enforce_id, 'font.lang' => $enforce_lang, 'font.size' => '.+', 'font.style' => '.*', 'font.title' => '.+', 'basefont.color' => $enforce_color, 'basefont.face' => '.+', 'basefont.id' => $enforce_id, 'basefont.size' => '.+', 's.class' => $enforce_class, 's.dir' => $enforce_direction, 's.id' => $enforce_id, 's.lang' => $enforce_lang, 's.onclick' => $enforce_javascript, 's.ondblclick' => $enforce_javascript, 's.onkeydown' => $enforce_javascript, 's.onkeypress' => $enforce_javascript, 's.onkeyup' => $enforce_javascript, 's.onmousedown' => $enforce_javascript, 's.onmousemove' => $enforce_javascript, 's.onmouseout' => $enforce_javascript, 's.onmouseover' => $enforce_javascript, 's.onmouseup' => $enforce_javascript, 's.style' => '.*', 's.title' => '.+', 'strike.class' => $enforce_class, 'strike.dir' => $enforce_direction, 'strike.id' => $enforce_id, 'strike.lang' => $enforce_lang, 'strike.onclick' => $enforce_javascript, 'strike.ondblclick' => $enforce_javascript, 'strike.onkeydown' => $enforce_javascript, 'strike.onkeypress' => $enforce_javascript, 'strike.onkeyup' => $enforce_javascript, 'strike.onmousedown' => $enforce_javascript, 'strike.onmousemove' => $enforce_javascript, 'strike.onmouseout' => $enforce_javascript, 'strike.onmouseover' => $enforce_javascript, 'strike.onmouseup' => $enforce_javascript, 'strike.style' => '.*', 'strike.title' => '.+', 'u.class' => $enforce_class, 'u.dir' => $enforce_direction, 'u.id' => $enforce_id, 'u.lang' => $enforce_lang, 'u.onclick' => $enforce_javascript, 'u.ondblclick' => $enforce_javascript, 'u.onkeydown' => $enforce_javascript, 'u.onkeypress' => $enforce_javascript, 'u.onkeyup' => $enforce_javascript, 'u.onmousedown' => $enforce_javascript, 'u.onmousemove' => $enforce_javascript, 'u.onmouseout' => $enforce_javascript, 'u.onmouseover' => $enforce_javascript, 'u.onmouseup' => $enforce_javascript, 'u.style' => '.*', 'u.title' => '.+', 'base.target' => '.+', 'link.target' => '.+', 'body.bgcolor' => $enforce_color, 'body.text' => $enforce_color, 'body.vlink' => $enforce_color, 'body.link' => $enforce_color, 'body.alink' => $enforce_color, 'div.align' => $enforce_align3, 'p.align' => $enforce_align3, 'h1.align' => $enforce_align3, 'h2.align' => $enforce_align3, 'h3.align' => $enforce_align3, 'h4.align' => $enforce_align3, 'h5.align' => $enforce_align3, 'h6.align' => $enforce_align3, 'ul.compact' => 'compact', 'ul.type' => '(disc|square|circle)', 'ol.compact' => 'compact', 'ol.start' => $enforce_inumber, 'ol.type' => '.+', 'li.type' => '.+', 'li.value' => $enforce_inumber, 'dl.compact' => 'compact', 'hr.align' => '(left|center|right)', 'hr.noshade' => 'noshade', 'hr.size' => '.+', 'pre.width' => $enforce_inumber, 'br.clear' => '(left|all|right|none)', 'object.align' => $enforce_align2, 'object.border' => $enforce_pixels, 'object.hspace' => $enforce_pixels, 'object.vspace' => $enforce_pixels, 'img.hspace' => $enforce_pixels, 'img.vspace' => $enforce_pixels, 'input.align' => $enforce_align2, 'table.align' => '(left|center|right)', 'table.bgcolor' => $enforce_color, 'caption.align' => $enforce_align4, 'tr.bgcolor' => $enforce_color, 'th.nowrap' => 'nowrap', 'th.bgcolor' => $enforce_color, 'td.bgcolor' => $enforce_color, 'td.nowrap' => 'nowrap', 'td.width' => $enforce_number, 'td.height' => $enforce_number);
    global $TAG_ATTRIBUTES_REQUIRED;
    $TAG_ATTRIBUTES_REQUIRED = array('base' => array('href'), 'html' => array('xmlns', 'xml:lang'), 'meta' => array('content'), 'style' => array('type'), 'script' => array('type'), 'bdo' => array('dir'), 'basefont' => array('size'), 'iframe' => array('src', 'title'), 'img' => array('src', 'alt'), 'label' => array('for'), 'map' => array('id'), 'area' => array('alt'), 'form' => array('action'), 'textarea' => array('cols', 'rows'), 'table' => array('summary'), 'optgroup' => array('label'));
    // B's may not appear under A
    global $PROHIBITIONS;
    $PROHIBITIONS = array('a' => array('a'), 'button' => array('input', 'select', 'textarea', 'label', 'button', 'form', 'fieldset', 'iframe'), 'p' => array('p', 'table', 'div', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pre', 'hr'), 'form' => array('form'), 'em' => array('em'), 'abbr' => array('abbr'), 'acronym' => array('acronym'), 'strong' => array('strong'), 'label' => array('label', 'div'));
    // Only B's can be under A
    global $ONLY_CHILDREN;
    $ONLY_CHILDREN = array('ruby' => array('rbc', 'rtc', 'rp'), 'tr' => array('td', 'th'), 'thead' => array('tr'), 'tbody' => array('tr'), 'tfoot' => array('tr'), 'table' => array('tbody', 'thead', 'tfoot', 'tr', 'colgroup', 'col', 'caption'), 'colgroup' => array('col'), 'select' => array('option'), 'legend' => array('ins', 'del'), 'html' => array('head', 'body'), 'object' => array('param', 'object', 'embed'), 'embed' => array('noembed'), 'applet' => array('param'), 'head' => array('meta', 'base', 'basefont', 'script', 'link', 'noscript', 'map', 'title', 'style'), 'ul' => array('li'), 'ol' => array('li'), 'menu' => array('li'), 'dl' => array('li', 'dt', 'dd'), 'dir' => array('li'), 'hr' => array(), 'img' => array(), 'input' => array(), 'br' => array(), 'meta' => array(), 'base' => array(), 'title' => array(), 'textarea' => array(), 'style' => array(), 'pre' => array(), 'script' => array(), 'param' => array(), 'area' => array(), 'link' => array('link'), 'basefont' => array(), 'col' => array());
    // A can only occur underneath B's
    global $ONLY_PARENT;
    $ONLY_PARENT = array('rb' => array('rbc'), 'rt' => array('rtc'), 'rbc' => array('ruby'), 'rtc' => array('ruby'), 'rp' => array('ruby'), 'area' => array('map'), 'base' => array('head'), 'body' => array('html'), 'head' => array('html'), 'param' => array('script', 'object'), 'meta' => array('head'), 'link' => array('head', 'link'), 'li' => array('ul', 'ol', 'dd', 'menu', 'dt', 'dl', 'dir'), 'style' => array('head'), 'tbody' => array('table'), 'tfoot' => array('table'), 'thead' => array('table'), 'th' => array('tr'), 'td' => array('tr'), 'tr' => array('table', 'thead', 'tbody', 'tfoot'), 'title' => array('head'), 'caption' => array('table'), 'col' => array('colgroup', 'table'), 'colgroup' => array('table'), 'option' => array('select'), 'noembed' => array('embed'));
    global $REQUIRE_ANCESTER;
    $REQUIRE_ANCESTER = array('legend' => 'fieldset', 'textarea' => 'form', 'input' => 'form', 'option' => 'form', 'optgroup' => 'form', 'select' => 'form');
    global $TEXT_NO_BLOCK;
    $TEXT_NO_BLOCK = array('table' => 1, 'tr' => 1, 'tfoot' => 1, 'thead' => 1, 'ul' => 1, 'ol' => 1, 'dl' => 1, 'optgroup' => 1, 'select' => 1, 'colgroup' => 1, 'map' => 1, 'body' => 1, 'form' => 1);
    define('IN_XML_TAG', -3);
    define('IN_DTD_TAG', -2);
    define('NO_MANS_LAND', -1);
    define('IN_COMMENT', 0);
    define('IN_TAG_NAME', 1);
    define('STARTING_TAG', 2);
    define('IN_TAG_BETWEEN_ATTRIBUTES', 3);
    define('IN_TAG_ATTRIBUTE_NAME', 4);
    define('IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_LEFT', 5);
    define('IN_TAG_BETWEEN_ATTRIBUTE_NAME_VALUE_RIGHT', 7);
    define('IN_TAG_ATTRIBUTE_VALUE_BIG_QUOTES', 10);
    define('IN_TAG_ATTRIBUTE_VALUE_NO_QUOTES', 12);
    define('IN_TAG_EMBEDDED_COMMENT', 9);
    define('IN_TAG_ATTRIBUTE_VALUE_LITTLE_QUOTES', 8);
    define('IN_CDATA', 11);
    define('CSS_AT_RULE_BLOCK', -4);
    define('CSS_AT_RULE', -3);
    define('CSS_NO_MANS_LAND', -2);
    define('CSS_EXPECTING_CLASS_NAME', -1);
    define('CSS_IN_COMMENT', 0);
    define('CSS_IN_CLASS', 1);
    define('CSS_EXPECTING_SEP_OR_CLASS_NAME_OR_CLASS', 2);
    define('CSS_IN_CLASS_NAME', 3);
    define('_CSS_NO_MANS_LAND', 0);
    define('_CSS_IN_PROPERTY_KEY', 1);
    define('_CSS_IN_PROPERTY_BETWEEN', 2);
    define('_CSS_IN_PROPERTY_VALUE', 3);
    define('_CSS_IN_COMMENT', 4);
    define('_CSS_EXPECTING_END', 5);
}
Esempio n. 2
0
/**
 * Standard code module initialisation function.
 */
function init__validation2()
{
    global $TAGS_BLOCK;
    $TAGS_BLOCK = array('div' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'p' => 1, 'blockquote' => 1, 'pre' => 1, 'br' => 1, 'hr' => 1, 'fieldset' => 1, 'address' => 1, 'iframe' => 1, 'noscript' => 1, 'table' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1, 'dd' => 1, 'dt' => 1, 'dl' => 1, 'li' => 1, 'ol' => 1, 'ul' => 1, 'rbc' => 1, 'rtc' => 1, 'rb' => 1, 'rt' => 1, 'rp' => 1);
    if (get_value('html5') == '1') {
        $TAGS_BLOCK += array('video' => 1, 'details' => 1, 'summary' => 1, 'section' => 1, 'nav' => 1, 'hgroup' => 1, 'header' => 1, 'footer' => 1, 'figure' => 1, 'canvas' => 1, 'audio' => 1, 'aside' => 1, 'article' => 1);
    }
    global $TAGS_INLINE;
    $TAGS_INLINE = array('span' => 1, 'abbr' => 1, 'cite' => 1, 'code' => 1, 'dfn' => 1, 'em' => 1, 'strong' => 1, 'kbd' => 1, 'q' => 1, 'samp' => 1, 'var' => 1, 'sub' => 1, 'sup' => 1, 'del' => 1, 'ruby' => 1, 'a' => 1, 'bdo' => 1, 'img' => 1, 'ins' => 1, 'param' => 1, 'textarea' => 1, 'button' => 1, 'input' => 1, 'select' => 1, 'object' => 1, 'caption' => 1, 'label' => 1, 'b' => 1, 'i' => 1, 'small' => 1, 'big' => 1);
    if (get_value('html5') == '1') {
        $TAGS_INLINE += array('wbr' => 1, 'time' => 1, 'progress' => 1, 'output' => 1, 'meter' => 1, 'mark' => 1, 'keygen' => 1, 'datalist' => 1, 'command' => 1);
    }
    global $TAGS_NORMAL;
    $TAGS_NORMAL = array('base' => 1, 'body' => 1, 'col' => 1, 'colgroup' => 1, 'head' => 1, 'html' => 1, 'link' => 1, 'map' => 1, 'meta' => 1, 'optgroup' => 1, 'option' => 1, 'style' => 1, 'title' => 1, 'legend' => 1, 'script' => 1, 'area' => 1, 'form' => 1);
    if (get_value('html5') == '1') {
        $TAGS_NORMAL += array('source' => 1);
    }
    global $TAGS_BLOCK_DEPRECATED;
    $TAGS_BLOCK_DEPRECATED = array('dir' => 1, 'menu' => 1);
    global $TAGS_INLINE_DEPRECATED;
    $TAGS_INLINE_DEPRECATED = array('center' => 1, 'applet' => 1, 'font' => 1, 's' => 1, 'strike' => 1, 'u' => 1);
    global $TAGS_NORMAL_DEPRECATED;
    $TAGS_NORMAL_DEPRECATED = array('basefont' => 1);
    $browser = strtolower(ocp_srv('HTTP_USER_AGENT'));
    $is_ie = strpos($browser, 'msie') !== false && strpos($browser, 'opera') === false;
    $enforce_javascript = '([^\\n]+)';
    $enforce_lang = '[a-zA-Z][a-zA-Z](-[a-zA-Z]+)?';
    $enforce_direction = '(ltr|rtl)';
    $enforce_align = '(left|center|right|justify|char)';
    $enforce_align2 = '(top|middle|bottom|left|right)';
    $enforce_align3 = '(left|center|right|justify)';
    $enforce_align4 = '(top|bottom|left|right)';
    $enforce_valign = '(top|middle|bottom|baseline)';
    $enforce_number = '(-?[0-9]+)';
    $enforce_inumber = '[0-9]+';
    //$enforce_plain_or_html='(plaintext|html)';
    $enforce_character = '.';
    $enforce_color = '(black|silver|gray|white|maroon|purple|fuchsia|green|lime|olive|yellow|navy|blue|teal|aqua|orange|red|(\\#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f])|(\\#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]))';
    // orange and red aren't 'official' -- but kind of handy ;). In reality, the colour codes were never properly defined, and these two are obvious names for obviously needed ones-- they'll be supported
    $enforce_length = '((0)|(' . $enforce_number . '(|in|cm|mm|ex|pt|pc|px|em|%))|((' . $enforce_number . ')?\\.' . $enforce_number . '(in|cm|mm|ex|em|%)))';
    // |ex|pt|in|cm|mm|pc	We don't want these in our XHTML... preferably we only want em when it comes to font size!
    $enforce_ilength = '((0)|(' . $enforce_inumber . '(|in|cm|mm|ex|pt|pc|px|em|%))|((' . $enforce_inumber . ')?\\.' . $enforce_inumber . '(in|cm|mm|ex|em|%)))';
    // |ex|pt|in|cm|mm|pc	We don't want these in our XHTML... preferably we only want em when it comes to font size!
    $enforce_pixels = '[0-9]+';
    $enforce_auto_or_length = '(auto|' . $enforce_length . ')';
    $enforce_auto_or_ilength = '(auto|' . $enforce_ilength . ')';
    $enforce_normal_or_length = '(normal|' . $enforce_length . ')';
    $enforce_border_width = '(thin|medium|thick|' . $enforce_length . ')';
    $enforce_potential_4d_border_width = $enforce_border_width . '( ' . $enforce_border_width . '( ' . $enforce_border_width . '( ' . $enforce_border_width . '|)|)|)';
    $enforce_css_color = '((rgb\\(' . $enforce_inumber . '%,' . $enforce_inumber . '%,' . $enforce_inumber . '%\\))|(rgb\\(' . $enforce_inumber . ',' . $enforce_inumber . ',' . $enforce_inumber . '\\))|(rgba\\(' . $enforce_inumber . '%,' . $enforce_inumber . '%,' . $enforce_inumber . '%,' . $enforce_inumber . '%\\))|(rgba\\(' . $enforce_inumber . ',' . $enforce_inumber . ',' . $enforce_inumber . ',' . $enforce_inumber . '\\))|(\\#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f])|' . $enforce_color . '|ActiveBorder|ActiveCaption|AppWorkspace|Background|Buttonface|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText)';
    $enforce_transparent_or_color = '(transparent|' . $enforce_css_color . ')';
    $enforce_fraction = '(\\d%|\\d\\d%|100%|0\\.\\d+|1\\.0)';
    $_enforce_font_list = "(cursive|fantasy|monospace|serif|sans-serif|Georgia|Times|Trebuchet|Tahoma|Geneva|Verdana|Arial|Helvetica|Courier|Courier New|Impact|'Georgia'|'Times'|'Trebuchet'|'Tahoma'|'Geneva'|'Verdana'|'Arial'|'Helvetica'|'Courier'|'Courier New'|'Impact')";
    $enforce_font_list = '((([A-Za-z]+)|("[A-Za-z ]+")|(\'[A-Za-z ]+\')),\\s*)*' . $_enforce_font_list;
    $enforce_functional_url = '(url\\(\'.+\'\\)|url\\(".+"\\)|url\\([^\\(\\);]+\\))';
    $enforce_functional_url_or_none = '(' . $enforce_functional_url . '|none)';
    $enforce_border_style = '(none|dotted|dashed|solid|double|groove|ridge|inset|outset|transparent)';
    // 'transparent' not supported in IE6
    $enforce_background_repeat = '(repeat|repeat-x|repeat-y|no-repeat)';
    $enforce_attachment = '(scroll|fixed)';
    $_enforce_background_position = '((' . $enforce_length . '|top|center|bottom)|(' . $enforce_length . '|left|center|right))';
    $enforce_background_position = '((' . $_enforce_background_position . ')|(' . $_enforce_background_position . ' ' . $_enforce_background_position . '))';
    $enforce_border = '((' . $enforce_border_width . '|' . $enforce_border_style . '|' . $enforce_css_color . ')( |$))+';
    $enforce_potential_4d_length = $enforce_length . '( ' . $enforce_length . '( ' . $enforce_length . '( ' . $enforce_length . '|)|)|)';
    $enforce_potential_4d_length_auto = $enforce_auto_or_length . '( ' . $enforce_auto_or_length . '( ' . $enforce_auto_or_length . '( ' . $enforce_auto_or_length . '|)|)|)';
    $enforce_potential_4d_ilength = $enforce_ilength . '( ' . $enforce_ilength . '( ' . $enforce_ilength . '( ' . $enforce_ilength . '|)|)|)';
    $enforce_potential_4d_ilength_auto = $enforce_auto_or_ilength . '( ' . $enforce_auto_or_ilength . '( ' . $enforce_auto_or_ilength . '( ' . $enforce_auto_or_ilength . '|)|)|)';
    $enforce_font_style = '(normal|italic|oblique)';
    $enforce_font_variant = '(normal|small-caps)';
    $enforce_font_weight = '(lighter|normal|bold|bolder|((\\d)+))';
    $enforce_list_style_position = '(inside|outside)';
    $enforce_list_style_type = '(none|disc|circle|square|decimal|lower-roman|upper-roman|lower-alpha|upper-alpha' . (!$is_ie ? '|decimal-leading-zero|lower-greek|lower-latin|upper-latin|hebrew|armenian|georgian|cjk-ideographic|hiragana|katakana|hiragana-iroha|katakana-iroha' : '') . ')';
    $enforce_list_style_image = '(none|' . $enforce_functional_url . ')';
    $enforce_id = '[a-zA-Z][\\w\\-\\:\\.]*';
    $enforce_name = '[\\w\\-\\:\\.]+(\\[\\])?';
    $enforce_link = (get_forum_type() == 'none' ? '(mailto:.*)?' : '') . '(' . str_replace('#', '\\#', preg_quote(mailto_obfuscated())) . '.*)?[^\\s\\#]*(\\#[^\\s\\#]*)?';
    $enforce_class = '[ \\w-]*';
    $enforce_zoom = '(normal|' . $enforce_fraction . '|(\\d*(\\.\\d+)?))';
    global $CSS_PROPERTIES;
    $CSS_PROPERTIES = array('background' => '((' . $enforce_transparent_or_color . '|' . $enforce_functional_url_or_none . '|' . $enforce_background_repeat . '|' . $enforce_attachment . '|' . $enforce_background_position . ')( |$))+', 'background-attachment' => $enforce_attachment, 'background-color' => $enforce_transparent_or_color, 'background-image' => $enforce_functional_url_or_none, 'background-repeat' => $enforce_background_repeat, 'background-position' => $enforce_background_position, 'border' => $enforce_border, 'border-collapse' => '(collapse|separate)', 'border-color' => $enforce_transparent_or_color . '( ' . $enforce_transparent_or_color . '( ' . $enforce_transparent_or_color . '( ' . $enforce_transparent_or_color . '|)|)|)', 'border-spacing' => $enforce_length . ' ' . $enforce_length, 'border-style' => $enforce_border_style, 'border-width' => $enforce_potential_4d_border_width, 'border-bottom' => $enforce_border, 'border-bottom-color' => $enforce_transparent_or_color, 'border-bottom-style' => $enforce_border_style, 'border-bottom-width' => $enforce_border_width, 'border-left' => $enforce_border, 'border-left-color' => $enforce_transparent_or_color, 'border-left-style' => $enforce_border_style, 'border-left-width' => $enforce_border_width, 'border-right' => $enforce_border, 'border-right-color' => $enforce_transparent_or_color, 'border-right-style' => $enforce_border_style, 'border-right-width' => $enforce_border_width, 'border-top' => $enforce_border, 'border-top-color' => $enforce_transparent_or_color, 'border-top-style' => $enforce_border_style, 'border-top-width' => $enforce_border_width, 'bottom' => $enforce_auto_or_length, 'clear' => '(both|left|right|none)', 'clip' => 'auto|(rect\\(' . $enforce_potential_4d_length . '\\))', 'color' => $enforce_css_color, 'cursor' => '(' . $enforce_functional_url . '|default|auto|n-resize|ne-resize|e-resize|se-resize|s-resize|sw-resize|w-resize|nw-resize|crosshair|pointer|move|text|wait|help' . (!$is_ie ? '|progress' : '') . ')', 'direction' => '(ltr|rtl)', 'display' => '(none|inline|block|list-item|table|table-header-group|table-footer-group|inline-block|run-in' . (!$is_ie ? '|inline-table|table-row|table-row-group|table-column-group|table-column|table-cell|table-caption' : '') . ')', 'float' => '(left|right|none)', 'font' => '((caption|icon|menu|message-box|small-caption|status-bar|' . $enforce_font_style . '|' . $enforce_font_variant . '|' . $enforce_font_weight . '|' . $enforce_length . '|' . $enforce_normal_or_length . '|' . $enforce_font_list . ')( |$))+', 'font-family' => $enforce_font_list, 'font-size' => 'larger|smaller|xx-small|x-small|small|medium|large|x-large|xx-large|' . $enforce_length, 'font-style' => $enforce_font_style, 'font-variant' => $enforce_font_variant, 'font-weight' => $enforce_font_weight, 'height' => $enforce_auto_or_length, 'left' => $enforce_auto_or_length, 'right' => $enforce_auto_or_length, 'letter-spacing' => $enforce_normal_or_length, 'line-height' => $enforce_normal_or_length, 'list-style' => '((' . $enforce_list_style_type . '|' . $enforce_list_style_position . '|' . $enforce_list_style_image . ')( |$))+', 'list-style-image' => '(' . $enforce_functional_url . '|none)', 'list-style-position' => $enforce_list_style_position, 'list-style-type' => $enforce_list_style_type, 'margin' => $enforce_potential_4d_length_auto, 'margin-bottom' => $enforce_auto_or_length, 'margin-left' => $enforce_auto_or_length, 'margin-right' => $enforce_auto_or_length, 'margin-top' => $enforce_auto_or_length, 'overflow' => '(visible|hidden|scroll|auto)', 'padding' => $enforce_potential_4d_ilength, 'padding-bottom' => $enforce_auto_or_ilength, 'padding-left' => $enforce_auto_or_ilength, 'padding-right' => $enforce_auto_or_ilength, 'padding-top' => $enforce_auto_or_ilength, 'page-break-after' => '(auto|left|right|always)', 'page-break-before' => '(auto|left|right|always)', 'position' => '(static|relative|absolute' . (!$is_ie ? '|fixed' : '') . ')', 'table-layout' => '(auto|fixed)', 'text-align' => '(left|right|center|justify)', 'text-decoration' => '(underline|line-through|none' . (!$is_ie ? '|blink' : '') . ')', 'text-indent' => $enforce_length, 'text-transform' => '(capitalize|uppercase|lowercase|none)', 'top' => $enforce_auto_or_length, 'unicode-bidi' => '(bidi-override|normal|embed)', 'vertical-align' => '(baseline|sub|super|top|text-top|middle|bottom|text-bottom)', 'visibility' => '(hidden|visible|collapse)', 'white-space' => '(normal|pre|nowrap' . (!$is_ie ? '|pre-wrap|pre-line' : '') . ')', 'word-wrap' => '(normal|break-word)', 'width' => $enforce_auto_or_length, 'word-spacing' => $enforce_normal_or_length, 'z-index' => '(auto|(\\d+))', 'zoom' => $enforce_zoom, 'opacity' => $enforce_fraction, 'overflow-x' => '(visible|hidden|scroll|auto)', 'overflow-y' => '(visible|hidden|scroll|auto)', 'box-shadow' => '(' . $enforce_length . ' ' . $enforce_length . ' ' . $enforce_length . ' ' . $enforce_css_color . ')', 'text-shadow' => '(' . $enforce_length . ' ' . $enforce_length . ' ' . $enforce_length . ' ' . $enforce_css_color . ')', 'border-radius' => '(' . $enforce_length . ' ' . $enforce_length . ' ' . $enforce_length . ' ' . $enforce_length . ')', 'border-top-left-radius' => $enforce_length, 'border-top-right-radius' => $enforce_length, 'border-bottom-left-radius' => $enforce_length, 'border-bottom-right-radius' => $enforce_length, 'box-sizing' => '(border-box|content-box|padding-box)', 'transition-property' => '\\w+', 'transition-duration' => '\\d[\\d\\.]*s', 'filter' => '.*');
    $_counter_increment = '((\\w+( \\d+)?)+)';
    $enforce_counter_increment = $_counter_increment . '( ' . $_counter_increment . ')*';
    global $CSS_NON_IE_PROPERTIES;
    $CSS_NON_IE_PROPERTIES = array('content' => '.+', 'quotes' => '.+ .+', 'max-width' => $enforce_auto_or_length, 'min-width' => $enforce_auto_or_length, 'max-height' => $enforce_auto_or_length, 'min-height' => $enforce_auto_or_length, 'marker-offset' => $enforce_auto_or_length, 'caption-side' => 'top|bottom|left|right', 'empty-cells' => 'show|hide', 'counter-increment' => $enforce_counter_increment, 'counter-reset' => $enforce_counter_increment, 'outline' => $enforce_border, 'outline-color' => $enforce_transparent_or_color, 'outline-style' => $enforce_border_style, 'outline-width' => $enforce_border_width);
    $strict_form_accessibility = false;
    // Form fields may not be empty with this strict rule
    global $TAG_ATTRIBUTES;
    $TAG_ATTRIBUTES = array();
    // Split up to workaround bug in HipHop PHP
    $TAG_ATTRIBUTES += array('a.accesskey' => $enforce_character, 'a.charset' => '.+', 'a.coords' => '.+', 'a.href' => $enforce_link, 'a.hreflang' => $enforce_lang, 'a.name' => $enforce_id, 'a.onblur' => $enforce_javascript, 'a.onfocus' => $enforce_javascript, 'a.rel' => '.*', 'a.rev' => '.+', 'a.shape' => '(rect|circle|poly|default)', 'a.tabindex' => $enforce_inumber, 'a.type' => '.+', 'area.accesskey' => $enforce_character, 'area.alt' => '.*', 'area.coords' => '.+', 'area.href' => $enforce_link, 'area.nohref' => 'nohref', 'area.onblur' => '.+', 'area.onfocus' => $enforce_javascript, 'area.shape' => '(rect|circle|poly|default)', 'area.tabindex' => $enforce_inumber);
    $TAG_ATTRIBUTES += array('base.href' => $enforce_link, 'blockquote.cite' => '.+', 'body.background' => '.+', 'body.onload' => $enforce_javascript, 'body.onunload' => $enforce_javascript, 'button.accesskey' => $enforce_character, 'button.disabled' => 'disabled', 'button.name' => $enforce_name, 'button.onblur' => $enforce_javascript, 'button.onfocus' => $enforce_javascript, 'button.tabindex' => $enforce_inumber, 'button.type' => '(button|submit|reset)', 'button.value' => '.+');
    $TAG_ATTRIBUTES += array('col.align' => $enforce_align, 'col.char' => $enforce_character, 'col.charoff' => $enforce_length, 'col.span' => $enforce_inumber, 'col.width' => $enforce_length . '|\\*', 'colgroup.align' => $enforce_align, 'colgroup.char' => $enforce_character, 'colgroup.charoff' => $enforce_length, 'colgroup.span' => $enforce_inumber, 'colgroup.width' => $enforce_length, 'del.cite' => '.+', 'del.datetime' => '.+', 'div.xml:lang' => $enforce_lang);
    $TAG_ATTRIBUTES += array('form.accept-charset' => '.+', 'form.action' => $enforce_link, 'form.enctype' => 'multipart/form-data|application/x-www-form-urlencoded', 'form.method' => '(get|post)', 'form.onreset' => '.+', 'form.onsubmit' => '.+');
    $TAG_ATTRIBUTES += array('head.profile' => '.+', 'hr.width' => $enforce_length, 'html.xml:lang' => $enforce_lang, 'html.version' => '.+', 'html.xmlns' => '.+', 'img.alt' => '.*', 'img.height' => $enforce_inumber, 'img.ismap' => 'ismap', 'img.longdesc' => '.+', 'img.src' => $enforce_link, 'img.usemap' => '.+', 'img.width' => $enforce_inumber, 'input.accept' => '.+', 'input.accesskey' => $enforce_character, 'input.alt' => '.*', 'input.checked' => 'checked', 'input.disabled' => 'disabled', 'input.maxlength' => $enforce_inumber, 'input.name' => $enforce_name, 'input.onblur' => '.+', 'input.onchange' => '.+', 'input.onfocus' => $enforce_javascript, 'input.onselect' => '.+', 'input.readonly' => 'readonly', 'input.size' => '.+', 'input.src' => '.+', 'input.tabindex' => $enforce_inumber, 'input.type' => '(text|password|checkbox|radio|submit|reset|file|hidden|image|button|color|date|datetime|datetime-local|email|month|number|range|search|tel|time|url|week)', 'input.usemap' => '.+', 'input.value' => '.' . ($strict_form_accessibility ? '+' : '*'), 'ins.cite' => '.+', 'ins.datetime' => '.+');
    $TAG_ATTRIBUTES += array('label.accesskey' => $enforce_character, 'label.for' => $enforce_id, 'label.onblur' => '.+', 'label.onfocus' => $enforce_javascript, 'legend.accesskey' => $enforce_character, 'legend.align' => $enforce_align4, 'link.charset' => '.+', 'link.href' => $enforce_link, 'link.hreflang' => $enforce_lang, 'link.media' => '.+', 'link.rel' => '.+', 'link.rev' => '.+', 'link.type' => '.+');
    $TAG_ATTRIBUTES += array('meta.content' => '.*', 'meta.http-equiv' => '[a-zA-Z].+', 'meta.name' => '[a-zA-Z].+', 'meta.scheme' => '.+', 'object.archive' => '.+', 'object.classid' => '.+', 'object.codebase' => $enforce_link, 'object.codetype' => '.+', 'object.data' => $enforce_link, 'object.declare' => 'declare', 'object.height' => $enforce_length, 'object.name' => $enforce_name, 'object.standby' => '.+', 'object.tabindex' => $enforce_inumber, 'object.type' => '.+', 'object.usemap' => '.+', 'object.width' => $enforce_length, 'optgroup.disabled' => 'disabled', 'optgroup.label' => '.+', 'option.disabled' => 'disabled', 'option.label' => '.+', 'option.selected' => 'selected', 'option.value' => '.*');
    $TAG_ATTRIBUTES += array('param.name' => $enforce_name, 'param.type' => '.+', 'param.value' => '.+', 'param.valuetype' => '(data|ref|object)', 'q.cite' => '.+', 'script.charset' => '.+', 'script.defer' => 'defer', 'script.event' => '.+', 'script.for' => '.+', 'script.src' => '.+', 'script.type' => 'text/javascript', 'select.disabled' => 'disabled', 'select.multiple' => 'multiple', 'select.name' => $enforce_name, 'select.onblur' => '.+', 'select.onchange' => '.+', 'select.onfocus' => $enforce_javascript, 'select.size' => $enforce_inumber, 'select.tabindex' => $enforce_inumber, 'span.xml:lang' => $enforce_lang, 'style.media' => '.+', 'style.type' => 'text/css');
    $TAG_ATTRIBUTES += array('table.border' => $enforce_pixels, 'table.cellpadding' => $enforce_length, 'table.cellspacing' => $enforce_length, 'table.frame' => '(void|above|below|hsides|lhs|rhs|vsides|box|border)', 'table.rules' => '(none|groups|rows|cols|all)', 'table.summary' => '.*', 'table.width' => $enforce_length, 'tbody.align' => $enforce_align, 'tbody.char' => $enforce_character, 'tbody.charoff' => $enforce_length, 'td.abbr' => '.+', 'td.align' => $enforce_align, 'td.axis' => '.+', 'td.char' => $enforce_character, 'td.charoff' => $enforce_length, 'td.colspan' => $enforce_inumber, 'td.headers' => '.+', 'td.rowspan' => $enforce_inumber, 'td.scope' => '(row|col|rowgroup|colgroup)', 'textarea.accesskey' => $enforce_character, 'textarea.cols' => $enforce_inumber, 'textarea.disabled' => 'disabled', 'textarea.name' => $enforce_name, 'textarea.onblur' => '.+', 'textarea.onchange' => '.+', 'textarea.onfocus' => $enforce_javascript, 'textarea.onselect' => '.+', 'textarea.readonly' => 'readonly', 'textarea.rows' => $enforce_inumber, 'textarea.tabindex' => $enforce_inumber, 'tfoot.align' => $enforce_align, 'tfoot.char' => $enforce_character, 'tfoot.charoff' => $enforce_length, 'th.abbr' => '.+', 'th.align' => $enforce_align, 'th.axis' => '.+', 'th.char' => $enforce_character, 'th.charoff' => $enforce_length, 'th.colspan' => $enforce_inumber, 'th.headers' => '.+', 'th.height' => $enforce_length, 'th.rowspan' => $enforce_inumber, 'th.scope' => '(row|col|rowgroup|colgroup)', 'th.width' => $enforce_length, 'thead.align' => $enforce_align, 'thead.char' => $enforce_character, 'thead.charoff' => $enforce_length, 'tr.align' => $enforce_align, 'tr.char' => $enforce_character, 'tr.charoff' => $enforce_length);
    $TAG_ATTRIBUTES += array('map.name' => $enforce_name, 'a.target' => '.+', 'base.target' => '.+', 'form.target' => '.+', 'iframe.align' => $enforce_align2, 'iframe.height' => $enforce_length, 'iframe.longdesc' => '.+', 'iframe.name' => $enforce_name, 'iframe.src' => '.+');
    $TAG_ATTRIBUTES += array('*.class' => $enforce_class, '*.dir' => $enforce_direction, '*.id' => $enforce_id, '*.lang' => $enforce_lang, '*.onclick' => $enforce_javascript, '*.ondblclick' => $enforce_javascript, '*.onkeydown' => $enforce_javascript, '*.onkeypress' => $enforce_javascript, '*.onkeyup' => $enforce_javascript, '*.onmousedown' => $enforce_javascript, '*.onmousemove' => $enforce_javascript, '*.onmouseout' => $enforce_javascript, '*.onmouseover' => $enforce_javascript, '*.onmouseup' => $enforce_javascript, '*.style' => '.*', '*.title' => '.*', 'rt.rbspan' => $enforce_inumber);
    global $TAG_ATTRIBUTES_REQUIRED;
    $TAG_ATTRIBUTES_REQUIRED = array('base' => array('href'), 'html' => array('xmlns', 'xml:lang'), 'meta' => array('content'), 'style' => array('type'), 'script' => array('type'), 'bdo' => array('dir'), 'basefont' => array('size'), 'iframe' => array('src', 'title'), 'img' => array('src', 'alt'), 'label' => array('for'), 'map' => array('id'), 'area' => array('alt'), 'form' => array('action', 'title'), 'textarea' => array('cols', 'rows'), 'table' => array('summary'), 'optgroup' => array('label'));
    if (get_value('html5') == '1') {
        $TAG_ATTRIBUTES += array('a.media' => '.+', 'ol.reversed' => '(reversed)', 'fieldset.disabled' => '(disabled)', 'fieldset.form' => $enforce_name, 'fieldset.name' => $enforce_name, 'form.oninput' => '.+', 'html.manifest' => '.+', 'input.height' => $enforce_inumber, 'input.width' => $enforce_inumber, 'input.step' => $enforce_number, 'input.required' => '(required)', 'input.placeholder' => '.+', 'input.pattern' => '.+', 'input.multiple' => '(multiple)', 'input.min' => '.+', 'input.max' => '.+', 'input.list' => $enforce_name, 'input.formtarget' => $enforce_name, 'input.formnovalidate' => '(formnovalidate)', 'input.formmethod' => '(get|post)', 'input.formenctype' => '(application/x-www-form-urlencoded|multipart/form-data|text/plain)', 'input.formaction' => '.+', 'input.form' => $enforce_name, 'input.autofocus' => '(autofocus)', 'input.autocomplete' => '(on|off)', 'button.formtarget' => $enforce_name, 'button.formnovalidate' => '(formnovalidate)', 'button.formmethod' => '(get|post)', 'button.formenctype' => '(application/x-www-form-urlencoded|multipart/form-data|text/plain)', 'button.formaction' => '.+', 'button.form' => $enforce_name, 'label.form' => $enforce_name, 'link.sizes' => '.+', 'video.audio' => '(muted)', 'video.autoplay' => '(autoplay)', 'video.controls' => '(controls)', 'video.height' => $enforce_length, 'video.loop' => '(loop)', 'video.poster' => '.*', 'video.preload' => '(preload)', 'video.src' => '.*', 'video.width' => $enforce_length, 'time.datetime' => '.*', 'time.pubdate' => '(pubdate)', 'source.media' => '.*', 'source.src' => '.*', 'source.type' => '.*', 'progress.max' => $enforce_number, 'progress.value' => $enforce_number, 'output.for' => $enforce_id, 'output.form' => $enforce_name, 'output.name' => $enforce_name, 'meter.form' => $enforce_name, 'meter.high' => $enforce_number, 'meter.low' => $enforce_number, 'meter.max' => $enforce_number, 'meter.min' => $enforce_number, 'meter.optimum' => $enforce_number, 'meter.value' => $enforce_number, 'keygen.autofocus' => '(autofocus)', 'keygen.challenge' => '(challenge)', 'keygen.disabled' => '(disabled)', 'keygen.keytype' => '(rsa|other)', 'keygen.name' => $enforce_name, 'command.checked' => '(checked)', 'command.disabled' => '(disabled)', 'command.icon' => '.+', 'command.label' => $enforce_id, 'command.radiogroup' => $enforce_name, 'command.type' => '(checkbox|command|radio)', 'canvas.height' => $enforce_length, 'canvas.width' => $enforce_length, 'audio.autoplay' => '(autoplay)', 'audio.controls' => '(controls)', 'audio.loop' => '(loop)', 'audio.preload' => '(auto|metadata|none)', 'audio.src' => '.*', 'meta.charset' => '.+', 'meta.property' => '[a-zA-Z].+', 'object.form' => $enforce_name, 'script.async' => '(async)', 'select.autofocus' => '(autofocus)', 'select.form' => $enforce_name, 'style.scoped' => '(scoped)', 'textarea.maxlength' => $enforce_inumber, 'textarea.rows' => $enforce_inumber, 'textarea.required' => '(required)', 'textarea.form' => $enforce_name, 'textarea.dirname' => $enforce_name, 'textarea.placeholder' => '.+', 'textarea.autofocus' => '(autofocus)', 'textarea.wrap' => '(hard|soft)', 'menu.label' => '.*', 'menu.type' => '(context|toolbar|list)', 'form.autocomplete' => '(autocomplete)', 'form.novalidate' => '(novalidate)', 'details.open' => '(open)', 'iframe.srcdoc' => '.+', 'iframe.sandbox' => '(allow-forms|allow-same-origin|allow-scripts|allow-top-navigation)', 'iframe.seamless' => '(seamless)', '*.draggable' => '(true|false|auto)', '*.dropzone' => '(copy|move|link)', '*.hidden' => '(hidden)', '*.spellcheck' => '(true|false)', '*.contenteditable' => '(true|false)', '*.contextmenu' => $enforce_id, '*.itemscope' => '.*', '*.itemtype' => '.*', '*.itemprop' => '.*');
    }
    define('CSS_AT_RULE_BLOCK', -4);
    define('CSS_AT_RULE', -3);
    define('CSS_NO_MANS_LAND', -2);
    define('CSS_EXPECTING_CLASS_NAME', -1);
    define('CSS_IN_COMMENT', 0);
    define('CSS_IN_CLASS', 1);
    define('CSS_EXPECTING_SEP_OR_CLASS_NAME_OR_CLASS', 2);
    define('CSS_IN_CLASS_NAME', 3);
    define('_CSS_NO_MANS_LAND', 0);
    define('_CSS_IN_PROPERTY_KEY', 1);
    define('_CSS_IN_PROPERTY_BETWEEN', 2);
    define('_CSS_IN_PROPERTY_VALUE', 3);
    define('_CSS_IN_COMMENT', 4);
    define('_CSS_EXPECTING_END', 5);
}
Esempio n. 3
0
/**
 * Convert Semi-HTML into comcode. Cleanup where possible
 *
 * @param  LONG_TEXT		The Semi-HTML to converted
 * @param  boolean		Whether to force full conversion regardless of settings
 * @return LONG_TEXT		The equivalent comcode
 */
function semihtml_to_comcode($semihtml, $force = false)
{
    require_code('obfuscate');
    $semihtml = trim($semihtml);
    @ini_set('pcre.backtrack_limit', '10000000');
    do {
        $semihtml_before = $semihtml;
        $semihtml = preg_replace_callback('#<input [^>]*class="ocp_keep_ui_controlled" [^>]*title="([^"]*)" [^>]*type="text" [^>]*value="[^"]*"[^>]*/?' . '>#siU', 'debuttonise', $semihtml_before);
    } while ($semihtml != $semihtml_before);
    $array_html_preg_replace = array();
    $semihtml = str_replace('&#8203;', '', $semihtml);
    if (strtolower(get_charset()) == 'utf-8') {
        $semihtml = str_replace(chr(hexdec('e2')) . chr(hexdec('80')) . chr(hexdec('8b')), '', $semihtml);
    }
    $array_html_preg_replace[] = array('#^<kbd class="(ocp_keep|ocp_keep_block)"[^>]*>(.*)</kbd>$#siU', "\${2}");
    $semihtml = array_html_preg_replace('kbd', $array_html_preg_replace, $semihtml);
    $semihtml = str_replace('<!-- >', '', $semihtml);
    $semihtml = preg_replace('#<span id="cke_bm_[^"]+" style="display: none;\\s*">&nbsp;</span>#', '', $semihtml);
    require_code('xhtml');
    $semihtml = xhtmlise_html($semihtml, true);
    // Needed so we can parse it right
    $semihtml = preg_replace('#(\\[[\\w\\_]+)&nbsp;#', '${1} ', $semihtml);
    $matches = array();
    if (!$force && (get_option('eager_wysiwyg') == '0' && (substr_count($semihtml, '://') <= preg_match_all('#(href|src)="[^"]*://[^"]*"#', $semihtml, $matches) || count(find_all_hooks('systems', 'comcode_link_handlers')) == 0) && has_specific_permission(get_member(), 'allow_html')) || strpos($semihtml, '{$,page hint: no_smart_conversion}') !== false) {
        $semihtml = preg_replace_callback('#<img([^>]*) src="([^"]*)"([^>]*) />#siU', '_img_tag_fixup_raw', $semihtml);
        // Resolve relative URLs
        $semihtml = preg_replace_callback('#<img([^>]*) src="([^"]*)"([^>]*)>#siU', '_img_tag_fixup_raw', $semihtml);
        // Resolve relative URLs
        if (strpos($semihtml, 'data:') === false) {
            $count = substr_count($semihtml, '[/') + substr_count($semihtml, '{') + substr_count($semihtml, '[[') + substr_count($semihtml, '<h1');
            if ($count == 0 && strpos($semihtml, '<h1') === false) {
                return $semihtml == '' ? '' : '[html]' . $semihtml . '[/html]';
            }
            $count2 = substr_count($semihtml, '[/attachment]') + substr_count($semihtml, '<h1');
            if ($count2 == $count) {
                if ($semihtml != '') {
                    $semihtml = '[html]' . $semihtml . '[/html]';
                }
                $semihtml = preg_replace('#<h1[^>]*>\\s*<span class="inner">(.*)</span>\\s*</h1>#Us', '[/html][semihtml][title]${1}[/title][/semihtml][html]', $semihtml);
                $semihtml = preg_replace('#<h1[^>]*>(.*)</h1>#Us', '[/html][semihtml][title]${1}[/title][/semihtml][html]', $semihtml);
                $semihtml = str_replace('[attachment', '[/html][semihtml][attachment', str_replace('[/attachment]', '[/attachment][/semihtml][html]', $semihtml));
                $semihtml = str_replace('[/html][html]', '', $semihtml);
                $semihtml = str_replace('[html][/html]', '', $semihtml);
                return $semihtml;
            }
        }
        if ($semihtml != '') {
            $semihtml = '[semihtml]' . $semihtml . '[/semihtml]';
        }
        $semihtml = preg_replace('#<h1[^>]*>\\s*<span class="inner">(.*)</span>\\s*</h1>#Us', '[title]${1}[/title]', $semihtml);
        $semihtml = preg_replace('#<h1[^>]*>(.*)</h1>#Us', '[title]${1}[/title]', $semihtml);
        return $semihtml;
    }
    // Safety from if these are typed in (could cause problems)
    $semihtml = str_replace('[html', '[ html', $semihtml);
    $semihtml = str_replace('[semihtml', '[ semihtml', $semihtml);
    $semihtml = str_replace('[/html', '[ / html', $semihtml);
    $semihtml = str_replace('[/semihtml', '[ / semihtml', $semihtml);
    // Try and retain image attachments
    $semihtml = preg_replace('#<script[^>]*>(//\\s*<!\\[CDATA\\[)?(<!--)?\\s*var te_[\\d\\w\\-]*="[^"]*&for\\_session=[^"]*";\\s*(//\\]\\]>)?(-->)?</script>#', '', $semihtml);
    foreach (array('&amp;thumb=0[^"]*' => ' thumb="0"', '&amp;thumb=1[^"]*' => ' thumb="1"', '' => '') as $thumb_bit => $comcode_to) {
        $semihtml = preg_replace('#<div [^>]*class="attachment_left"[^>]*>\\s*<img src="[^"]*?id=(\\d+)[^"]*' . $thumb_bit . '(&amp;for_session=[\\w\\d]+)?" /></div>#i', '[attachment_safe' . $comcode_to . ' type="inline_left"]${1}[/attachment_safe]', $semihtml);
        $semihtml = preg_replace('#<div [^>]*class="attachment_right"[^>]*>\\s*<img src="[^"]*?id=(\\d+)[^"]*' . $thumb_bit . '(&amp;for_session=[\\w\\d]+)?" /></div>#i', '[attachment_safe' . $comcode_to . ' type="inline_right"]${1}[/attachment_safe]', $semihtml);
        $regexp = '#';
        $regexp .= $comcode_to == ' thumb="1"' ? '(<a [^>]*>)?\\s*' : '()';
        $regexp .= '<img [^>]*[^>]*src="[^"]*?id=(\\d+)[^"]*' . $thumb_bit . '(&amp;for_session=[\\w\\d]+)?" [^>]*title="([^"]*)" [^>]*/?' . '>\\s*';
        $regexp .= $comcode_to == ' thumb="1"' ? '(</a>)?' : '()';
        $regexp .= '#i';
        $semihtml = preg_replace($regexp, '[attachment_safe' . $comcode_to . ' type="inline" description="${4}"]${2}[/attachment_safe]', $semihtml);
    }
    $semihtml = preg_replace('#&amp;keep_session=[\\d]*(&amp;for_session=[\\w\\d]*)?#', '', $semihtml);
    // This is useful for generally stripping sensitive information anyway. Should be null-op if anti-leech was on, but worth doing just-in-case.
    // We must protect anything that is in CDATA from whitespace/entity cleanup (HTML or XHTML - we have to use lowest common denominator)
    $semihtml = preg_replace_callback('#(<script[^>]*>)(.*)(</script>)#siU', '_cdata_protect', $semihtml);
    $semihtml = preg_replace_callback('#(<style[^>]*>)(.*)(</style>)#siU', '_cdata_protect', $semihtml);
    $semihtml = preg_replace_callback('#(<textarea[^>]*>)(.*)(</textarea>)#siU', '_cdata_protect', $semihtml);
    $semihtml = preg_replace_callback('#(<pre[^>]*>)(.*)(</pre>)#siU', '_cdata_protect', $semihtml);
    $semihtml = preg_replace_callback('#(<![CDATA[)(.*)(]]>)#siU', '_cdata_protect', $semihtml);
    // And use same method to protect our code tags
    /*	foreach (array_keys($GLOBALS['CODE_TAGS']) as $code_tag)
    		$semihtml=preg_replace_callback('#(\['.$code_tag.'[^\]]*\])(.*)(\[/'.$code_tag.'\])#siU','_codetag_protect',$semihtml);
    Actually no, we don't want this. These tags are typed potentially to show HTML and thus the entities must get decoded
    */
    // Cleanup from certain word processors
    // LibreOffice
    $semihtml = str_replace('<h2 class="western">', '<h2>', $semihtml);
    $semihtml = preg_replace('#</(ul|ol|h1|h2|h3|h4|h5|h6)>\\s*<p style="margin-bottom: 0(cm|em|px)?">\\s*&nbsp;\\s*</p>\\s*#Us', '</${1}>', $semihtml);
    $semihtml = preg_replace('#<p style="margin-bottom: 0(cm|em|px)?">\\s*&nbsp;\\s*</p>\\s*#Us', '', $semihtml);
    $semihtml = preg_replace('#<li>\\s*<p style="margin-bottom: 0(cm|em|px)?">(.*)</p>\\s*</li>#Us', '<li>${2}</li>', $semihtml);
    $semihtml = preg_replace('#<p style="margin-bottom: 0(cm|em|px)?">(.*)</p>\\s*<(ul|ol|h1|h2|h3|h4|h5|h6)>#Us', '${2}<${3}>', $semihtml);
    $semihtml = str_replace('<p style="margin-bottom: 0cm">', '<p>', $semihtml);
    $semihtml = preg_replace('#(<style[^>]*>)(.*)(</style>)#siU', '', $semihtml);
    // We shouldn't allow this nested anyway (invalid XHTML), and word abuses it
    $semihtml = preg_replace('#<span class="Apple-style-span"[^>]*>(.*)</span>#siU', '${1}', $semihtml);
    // webkit
    $semihtml = preg_replace('#<meta[^>]*>#siU', '', $semihtml);
    // We shouldn't allow this nested anyway (invalid XHTML), and word abuses it
    $semihtml = preg_replace('#(<[^>]*) lang="[^"]*"#i', '${1}', $semihtml);
    $semihtml = preg_replace('#(<[^>]*) style="margin-right: 0\\w*;?"#i', '${1}', $semihtml);
    $semihtml = preg_replace('#(<[^>]*) dir="' . do_lang('dir') . '"#i', '${1}', $semihtml);
    $semihtml = preg_replace_callback('#<[^>"]* style="([^">]*&quot;[^">]*)*"#i', '_css_quot_fixup', $semihtml);
    $semihtml = preg_replace('#<a name="OLE_LINK1">([^<]*)</a>#siU', '${1}', $semihtml);
    $semihtml = preg_replace('#(<[^>]* align="right"[^>]*) style="(margin-right: [\\d\\.]+pt;\\s*)?text-align: right;?"#is', '${1}', $semihtml);
    // trim off redundancy
    $semihtml = preg_replace('#(<[^>]* align="center"[^>]*) style="(margin-right: [\\d\\.]+pt;\\s*)?text-align: center;?"#is', '${1}', $semihtml);
    // trim off redundancy
    $semihtml = preg_replace('#(?U)(<[^>]* style="[^"]*)(?-U);?\\s*page-break-after: avoid;?"#is', '${1}"', $semihtml);
    $semihtml = str_replace('<place>', '', $semihtml);
    $semihtml = str_replace('</place>', '', $semihtml);
    $semihtml = preg_replace('#<link [^>]*href="file://[^"]*"[^>]*/>#sU', '', $semihtml);
    $semihtml = preg_replace('#<!--\\[if(.*)-->#sU', '', $semihtml);
    $semihtml = preg_replace('#<!--(.*)\\[endif(.*)-->#sU', '', $semihtml);
    $semihtml = str_replace('<!-- >', '', $semihtml);
    $semihtml = preg_replace('#</?[ovw]:[^>]*>#s', '', $semihtml);
    $semihtml = preg_replace('#(<[^>]*) [ovw]:[^>"]*"[^"]*"([^>]*>)#s', '${1}${2}', $semihtml);
    $semihtml = preg_replace('#</?st1:[^>]*>#', '', $semihtml);
    // Word smart tags
    $semihtml = str_replace('<br class="Apple-interchange-newline" />', '<br />', $semihtml);
    $semihtml = str_replace(chr(10), ' ', $semihtml);
    // Clean some whitespace (they have a special Comcode meaning, but no special HTML meaning)
    $inline_elements = array('font', 's', 'u', 'strike', 'span', 'abbr', 'acronym', 'cite', 'code', 'dfn', 'em', 'strong', 'kbd', 'q', 'samp', 'var', 'sub', 'sup', 'tt', 'del', 'ruby', 'a', 'bdo', 'img', 'ins', 'param', 'textarea', 'button', 'input', 'select', 'object', 'caption', 'label', 'b', 'i', 'small', 'big');
    $semihtml = preg_replace('#(<(' . implode('|', $inline_elements) . ')( [^>]*)?' . '>)\\s+#', '${1}</CDATA__space>', $semihtml);
    $semihtml = preg_replace('#\\s+(</(' . implode('|', $inline_elements) . ')>)#', '</CDATA__space>${1}', $semihtml);
    $semihtml = preg_replace('#([^\\>\\s])\\s+(<(' . implode('|', $inline_elements) . ')( [^>]*)?' . '>)#', '${1}</CDATA__space>${2}', $semihtml);
    $semihtml = preg_replace('#(</(' . implode('|', $inline_elements) . ')>)\\s+#', '${1}</CDATA__space>', $semihtml);
    $semihtml = preg_replace('#>\\s+#', '>', $semihtml);
    $semihtml = preg_replace('#\\s+<#', '<', $semihtml);
    $semihtml = preg_replace('#\\s+#', ' ', $semihtml);
    // Cleanup impossible stuff in code tags
    global $CODE_TAGS;
    foreach (array_keys($CODE_TAGS) as $tag) {
        $semihtml = comcode_preg_replace($tag, '#^(\\[' . $tag . '\\])(.*)(\\[/' . $tag . '\\])$#si', array('comcode_strip_html_tags'), $semihtml);
    }
    // Cleanup how blocks are converted into a line break model. We need to clean up the case where inline leads onto block, by adding a linebreak inbetween. Note that this kind of break does not go *between* blocks, which is the reason we can't arbitrarily place it later on.
    $semihtml = preg_replace('#([^\\s<>]|</(' . implode('|', $inline_elements) . ')>)(<(div|p))#', '${1}<br />${3}', $semihtml);
    // Reorder XHTML attributes alphabetically, so our regexp's match better
    $semihtml = preg_replace_callback('#<([^>\\s]+)\\s([^>]+)>#', '_reorder_xhtml_attributes', $semihtml);
    // Reorder style properties alphabetically, so our regexp's match better
    $semihtml = preg_replace_callback('#(<[^>]*style=")([^"]*)("[^>]*>)#', '_reorder_css_properties', $semihtml);
    $semihtml = str_replace('<p  />', '<br /><br />', str_replace('<p />', '<br /><br />', $semihtml));
    // Remove proprietary stylings put in by RTF->HTML conversions performed by certain browsers
    $old_semihtml = '';
    do {
        $old_semihtml = $semihtml;
        $semihtml = preg_replace('#(<[^>]* style="(?U)[^">]*(?-U))-\\w+-[^";>]*(;\\s*)?#s', '${1}', $semihtml);
    } while ($semihtml != $old_semihtml);
    // Perform lots of conversions. We can't convert everything. Sometimes we reverse-convert what Comcode forward-converts; sometimes we match generic HTML; sometimes we match Microsoft Word or Open Office; sometimes we do lossy match
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<h1 id="screen_title">\\s*<span class="inner">(.*)</span>\\s*</h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 class="screen_title">\\s*<span class="inner">(.*)</span>\\s*</h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 id="screen_title" class="screen_title">\\s*<span class="inner">(.*)</span>\\s*</h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 id="screen_title">(.*)</h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 class="screen_title">(.*)</h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 id="screen_title" class="screen_title">(.*)</h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1>(.*)</h1>$#siU', '[title="1"]${1}[/title]');
    $semihtml = array_html_preg_replace('h1', $array_html_preg_replace, $semihtml);
    $semihtml = preg_replace('#^\\s*<h1[^>]+>(.*)</h1>#siU', '[title="1"]${1}[/title]', $semihtml);
    for ($i = 2; $i <= 4; $i++) {
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<h' . strval($i) . '><span class="inner">(.*)</span></h' . strval($i) . '>$#siU', '[title="' . strval($i) . '"]${1}[/title]');
        $array_html_preg_replace[] = array('#^<h' . strval($i) . '>(.*)</h' . strval($i) . '>$#siU', '[title="' . strval($i) . '"]${1}[/title]');
        $semihtml = array_html_preg_replace('h' . strval($i) . '', $array_html_preg_replace, $semihtml);
    }
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<h1 id="screen_title"[^<>]*><span class="inner">(.*)</span></h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 class="screen_title"[^<>]*><span class="inner">(.*)</span></h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 id="screen_title" class="screen_title"><span class="inner">(.*)</span></h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 id="screen_title"[^<>]*>(.*)</h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 class="screen_title"[^<>]*>(.*)</h1>$#siU', '[title="1"]${1}[/title]');
    $array_html_preg_replace[] = array('#^<h1 id="screen_title" class="screen_title"[^<>]*>(.*)</h1>$#siU', '[title="1"]${1}[/title]');
    $semihtml = array_html_preg_replace('h1', $array_html_preg_replace, $semihtml);
    $semihtml = preg_replace('#^\\s*<h1[^>]+>(.*)</h1>#siU', '[title="1"]${1}[/title]', $semihtml);
    for ($i = 2; $i <= 4; $i++) {
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<h' . strval($i) . '><span class="inner">(.*)</span></h' . strval($i) . '>$#siU', '[title="' . strval($i) . '"]${1}[/title]');
        $array_html_preg_replace[] = array('#^<h' . strval($i) . '>(.*)</h' . strval($i) . '>$#siU', '[title="' . strval($i) . '"]${1}[/title]');
        $semihtml = array_html_preg_replace('h' . strval($i), $array_html_preg_replace, $semihtml);
    }
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<span>(.*)</span>$#siU', '${1}');
    $array_html_preg_replace[] = array('#^<span( charset="[^"]*")?( content="[^"]*")?( name="[^"]*")?' . '>(.*)</span>$#siU', '${4}');
    $array_html_preg_replace[] = array('#^<span style="\\s*?font-family:\\s*monospace;\\s*?font-size:\\s*[\\d\\.]*em;?">(.*)</span>$#siU', '[tt]${1}[/tt]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?font-weight:\\s*bold;?">(.*)</span>$#siU', '[b]${1}[/b]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?font-style:\\s*italic;?">(.*)</span>$#siU', '[i]${1}[/i]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?text-decoration:\\s*underline;?">(.*)</span>$#siU', '[u]${1}[/u]');
    $array_html_preg_replace[] = array('#^<span( href="[^"]*")?( rel="[^"]*")?' . '>(.*)</span>$#siU', '${3}');
    $array_html_preg_replace[] = array('#^<span style="\\s*?font-weight:\\s*bold;?">(.*)</span>$#siU', '[b]${1}[/b]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?font-style:\\s*italic;?">(.*)</span>$#siU', '[i]${1}[/i]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?text-decoration:\\s*underline;?">(.*)</span>$#siU', '[u]${1}[/u]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?color:\\s*?([^";]+);\\s*?font-family:\\s*?([^";]+);\\s*?font-size:\\s*?([^";]+);?"([^>]*)>(.*)</span>$#siU', '[font param="${2}" color="${1}" size="${3}"]${5}[/font]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?color:\\s*?([^";]+);\\s*?font-size:\\s*?([^";]+);?"([^>]*)>(.*)</span>$#siU', '[font color="${1}" size="${2}"]${4}[/font]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?color:\\s*?([^";]+);\\s*?font-family:\\s*?([^";]+);?"([^>]*)>(.*)</span>$#siU', '[font param="${2}" color="${1}"]${4}[/font]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?color:\\s*?([^";]+);?\\s*?"([^>]*)>(.*)</span>$#siU', '[font color="${1}"]${3}[/font]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?font-family:\\s*?([^";]+);\\s*?font-size:\\s*?([^";]+);?"([^>]*)>(.*)</span>$#siU', '[font param="${1}" size="${2}"]${4}[/font]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?font-size:\\s*?([0-9\\.]+\\w\\w);?\\s*?"([^>]*)>(.*)</span>$#siU', '[font size="${1}"]${3}[/font]');
    $array_html_preg_replace[] = array('#^<span style="\\s*?font-family:\\s*?([^";]+);?\\s*?"([^>]*)>(.*)</span>$#siU', '[font param="${1}"]${3}[/font]');
    $complex_equivs = array('<span class="comcode_highlight">(.*)</span>' => 'highlight', '<span class="comcode_bold">(.*)</span>' => 'b', '<span class="comcode_italic">(.*)</span>' => 'i', '<span class="comcode_underline">(.*)</span>' => 'u');
    foreach ($complex_equivs as $from => $to) {
        $array_html_preg_replace[] = array('#^' . $from . '$#siU', '[' . $to . ']${1}[/' . $to . ']');
    }
    $semihtml = array_html_preg_replace('span', $array_html_preg_replace, $semihtml);
    $_array_html_preg_replace = array();
    foreach ($array_html_preg_replace as $i => $x) {
        $_array_html_preg_replace[$i] = array();
        $_array_html_preg_replace[$i][0] = str_replace('span', 'div', $x[0]);
        $_array_html_preg_replace[$i][1] = '<div>' . $x[1] . '</div>';
    }
    $semihtml = array_html_preg_replace('div', $_array_html_preg_replace, $semihtml);
    $_array_html_preg_replace = array();
    foreach ($array_html_preg_replace as $i => $x) {
        $_array_html_preg_replace[$i] = array();
        $_array_html_preg_replace[$i][0] = str_replace('div', 'p', $x[0]);
        $_array_html_preg_replace[$i][1] = '<p>' . $x[1] . '</p>';
    }
    $semihtml = array_html_preg_replace('p', $_array_html_preg_replace, $semihtml);
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<font>(.*)</font>$#siU', '${1}');
    $array_html_preg_replace[] = array('#^<font ([^>]*)size="(\\d+)"([^>]*)>(.*)</font>$#siU', '[font ${1}${3} size="${2}of"]${4}[/font]');
    $array_html_preg_replace[] = array('#^<font([^>]*)>(.*)</font>$#siU', '[font${1}]${2}[/font]');
    $semihtml = array_html_preg_replace('font', $array_html_preg_replace, $semihtml);
    $semihtml = preg_replace_callback('#(\\[font [^\\]]*color=")rgb\\((\\s*\\d+\\s*),(\\s*\\d+\\s*),(\\s*\\d+\\s*)\\)("[^\\]]*\\])#', '_css_color_fixup', $semihtml);
    $semihtml = preg_replace_callback('#<a ([^>]*)href="([^"]*)"([^>]*)>#', '_a_tag_link_fixup', $semihtml);
    $array_html_preg_replace = array();
    require_code('obfuscate');
    $array_html_preg_replace[] = array('#^<a ([^>]*)href="mailto:(?-U) ?(?U)([^"]+)"([^>]*)>(.*)</a>$#siU', '[email="${2}"]${4}[/email]');
    $array_html_preg_replace[] = array('#^<a ([^>]*)href="' . str_replace('#', '\\#', str_replace('&', '\\&', mailto_obfuscated())) . '([^"]+)"([^>]*)>(.*)</a>$#siU', '[email="${4}"]${2}[/email]');
    $array_html_preg_replace[] = array('#^<a ([^>]*)href="([^"]+)"([^>]*) target="([^"]*)"([^>]*)>(.*)</a>$#siU', '[url="${2}" target="${4}"]${6}[/url]');
    $array_html_preg_replace[] = array('#^<a ([^>]*)href="([^"]+)"([^>]*)>(.*)</a>$#siU', '[url="${2}"]${4}[/url]');
    $semihtml = array_html_preg_replace('a', $array_html_preg_replace, $semihtml);
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<p class="msoNormal">\\s*(.*)\\s*</p>$#siU', '${1}<br />');
    $array_html_preg_replace[] = array('#^<p align="(\\w+)" class="msoNormal">\\s*(.*)\\s*</p>$#siU', '[align="${1}"]${2}[/align]');
    $array_html_preg_replace[] = array('#^<p class="msoNormal" style="margin: \\d+pt 0[\\w;]*">\\s*(.*)\\s*</p>$#siU', '<br />${1}<br />');
    // Cleanup from Word
    $array_html_preg_replace[] = array('#^<p class="msoNormal" style="margin: 0[\\w;]* 0[\\w;]* 0[\\w;]*">\\s*(.*)\\s*</p>$#siU', '${1}<br />');
    // Cleanup from Word
    $array_html_preg_replace[] = array('#^<p style="margin: \\d+pt 0[\\w;]*">\\s*(.*)\\s*</p>$#siU', '<br />${1}<br />');
    // Cleanup from Word
    $array_html_preg_replace[] = array('#^<p style="margin: 0[\\w;]* 0[\\w;]* 0[\\w;]*">\\s*(.*)\\s*</p>$#siU', '${1}<br />');
    // Cleanup from Word
    $array_html_preg_replace[] = array('#^<p class="Mso\\w*" style="[^"]*">\\s*(.*)\\s*</p>$#siU', '<br />${1}<br />');
    // Aggressive cleanup from Word (it's here last because we want the nicer matches to get a chance to work instead. It's a shame we need to do this, as we are throwing away potentially important styling (although actually the spans etc far above will have got most of this - we only match p level styling here)- but Word throws so much into a mix it's impossible to "remove the wheat from the chaff". People will need to put it back in using the WYSIWYG editor directly.
    $array_html_preg_replace[] = array('#^<p>\\s*(.*)\\s*</p>$#siU', '${1}<br /><br />');
    $array_html_preg_replace[] = array('#^<p align="(\\w+)">\\s*(.*)\\s*</p>$#siU', '[align="${1}"]${2}[/align]');
    $semihtml = array_html_preg_replace('p', $array_html_preg_replace, $semihtml);
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<div align="justify">(.*)</div>$#siU', '[align="justify"]${1}[/align]');
    $array_html_preg_replace[] = array('#^<div style="text-align:\\s*?justify;?">(.*)</div>$#siU', '[align="justify"]${1}[/align]');
    $complex_equivs = array('<div align="right">(.*)</div>' => 'right', '<div align="left">(.*)</div>' => 'left', '<div align="center">(.*)</div>' => 'center', '<div style="text-align:\\s*?right;?">(.*)</div>' => 'right', '<div style="text-align:\\s*?left;?">(.*)</div>' => 'left', '<div style="text-align:\\s*?center;*">(.*)</div>' => 'center');
    foreach ($complex_equivs as $from => $to) {
        $array_html_preg_replace[] = array('#^' . $from . '$#siU', '[' . $to . ']${1}[/' . $to . ']');
    }
    $array_html_preg_replace[] = array('#^<div style="margin-left:\\s*?(\\d+)px;?">(.*)</div>$#siU', '[indent="${1}"]${2}[/indent]');
    $array_html_preg_replace[] = array('#^<div class="([^"]+)">(.*)</div>$#siU', '[surround="${1}"]${2}[/surround]');
    $array_html_preg_replace[] = array('#^<div>(.*)</div>$#siU', '${1}<br />');
    $semihtml = array_html_preg_replace('div', $array_html_preg_replace, $semihtml);
    $_array_html_preg_replace = array();
    foreach ($array_html_preg_replace as $i => $x) {
        $_array_html_preg_replace[$i] = array();
        $_array_html_preg_replace[$i][0] = str_replace('div', 'span', $x[0]);
        $_array_html_preg_replace[$i][1] = $x[1];
    }
    $semihtml = array_html_preg_replace('span', $_array_html_preg_replace, $semihtml);
    $_array_html_preg_replace = array();
    foreach ($array_html_preg_replace as $i => $x) {
        $_array_html_preg_replace[$i] = array();
        $_array_html_preg_replace[$i][0] = str_replace('div', 'p', $x[0]);
        $_array_html_preg_replace[$i][1] = str_replace('<br />', '<br /><br />', $x[1]);
    }
    $semihtml = array_html_preg_replace('p', $_array_html_preg_replace, $semihtml);
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<kbd>(.*)</kbd>$#siU', "[tt]\${1}[/tt]");
    $semihtml = array_html_preg_replace('kbd', $array_html_preg_replace, $semihtml);
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<ul dir="ltr">(.*)</ul>$#siU', '[list]' . '${1}[/list]');
    $array_html_preg_replace[] = array('#^<ul>(.*)</ul>$#siU', '[list]' . '${1}[/list]');
    $semihtml = array_html_preg_replace('ul', $array_html_preg_replace, $semihtml);
    $array_html_preg_replace = array();
    $array_html_preg_replace[] = array('#^<ol>(.*)</ol>$#siU', '[list="1"]' . '${1}[/list]');
    $array_html_preg_replace[] = array('#^<ol style="list-style-type:\\s*?([^";]*);?">(.*)(</ol>|<ol />)$#siU', '[list="${1}"]' . '${2}[/list]');
    $array_html_preg_replace[] = array('#^<ol type="([^"]*)">(.*)</ol>$#siU', '[list="${1}"]' . '${2}[/list]');
    $semihtml = array_html_preg_replace('ol', $array_html_preg_replace, $semihtml);
    $array_html_preg_replace = array();
    if (strpos($semihtml, '[list') !== false) {
        $array_html_preg_replace[] = array('#^<li>(.*)</li>$#siU', '[*]${1}[/*]' . chr(10));
        $semihtml = array_html_preg_replace('li', $array_html_preg_replace, $semihtml);
    }
    $semihtml = str_replace('<strong class="comcode_bold">', '<strong>', $semihtml);
    $semihtml = str_replace('<em class="comcode_italic">', '<em>', $semihtml);
    $equivs = array('blockquote' => 'indent', 'code' => 'code', 'tt' => 'tt', 'sub' => 'sub', 'sup' => 'sup', 'center' => 'center', '!abbr' => 'abbr', '!acronym' => 'acronym', 'address' => 'address', 'dfn' => 'dfn', 'cite' => 'cite', 'strong' => 'b', 'b' => 'b', 'em' => 'i', 'i' => 'i', 'u' => 'u', 'strike' => 's', 'del' => 'del', 'ins' => 'ins');
    foreach ($equivs as $from => $to) {
        $array_html_preg_replace = array();
        if ($from[0] == '!') {
            $from = substr($from, 1);
            $array_html_preg_replace[] = array('#^<' . $from . '([^>]*)>(.*)</' . $from . '>$#siU', '[' . $to . '${1}]${2}[/' . $to . ']');
        } else {
            $array_html_preg_replace[] = array('#^<' . $from . '>(.*)</' . $from . '>$#siU', '[' . $to . ']${1}[/' . $to . ']');
        }
        $semihtml = array_html_preg_replace($from, $array_html_preg_replace, $semihtml);
    }
    // Fonts that set nothing
    $test = preg_replace('#\\[font param="verdana,arial,helvetica,sans-serif"#', '', $semihtml);
    $test = preg_replace('#\\[font="verdana,arial,helvetica,sans-serif"#', '', $test);
    if (strpos($test, '[font=') === false && strpos($test, '[font param=') === false) {
        $semihtml = comcode_preg_replace('font', '#^\\[font( param)?="verdana,arial,helvetica,sans-serif"](.*)\\[/font\\]$#si', '${2}', $semihtml);
        $semihtml = str_replace(' param="verdana,arial,helvetica,sans-serif"', '', $semihtml);
        $semihtml = str_replace('="verdana,arial,helvetica,sans-serif"', '', $semihtml);
    }
    // Our cleanup loop. These optimisations trickle-through, as they depend on each other. We keep looping until we've done all we can.
    $old_semihtml = '';
    $text_formatting_tags = array('b', 'i', 'u', 'tt', 'font', 'title', 'center', 'left', 'right', 'color');
    do {
        $old_semihtml = $semihtml;
        // Empty tags
        $semihtml = preg_replace('#\\<(\\w+)\\>\\</\\1\\>#', '', $semihtml);
        $semihtml = preg_replace('#\\[font[^\\]]*\\]\\[/font\\]#', '', $semihtml);
        $semihtml = preg_replace('#\\[b[^\\]]*\\]\\[/b\\]#', '', $semihtml);
        $semihtml = preg_replace('#\\[i[^\\]]*\\]\\[/i\\]#', '', $semihtml);
        // Canonical order to make sure we can find pointless nestings. Unfortunately we can only bubble out one level due to constraints in our regexp checking (we need to make sure we don't cross-tags, but we can't in a regexp unless we make sure we have no nesting at all)
        foreach ($text_formatting_tags as $i => $tag) {
            foreach ($text_formatting_tags as $j => $tag_2) {
                if ($i < $j) {
                    $semihtml = comcode_preg_replace($tag_2, '#^(\\[' . $tag_2 . '( [^\\]]*)?\\])(\\[' . $tag . '( [^\\]]*\\])?)([^\\[\\]]*)(\\[/' . $tag . '[^\\]]*\\])(\\[/' . $tag_2 . '[^\\]]*\\])$#si', '${3}${1}${5}${7}${6}', $semihtml);
                }
            }
        }
        // Cleanup nested fonts
        $semihtml = preg_replace('#<span[^<>]*></span>#siU', '', $semihtml);
        $semihtml = comcode_preg_replace('font', '#^\\[font([^\\]]*)\\](\\s*)\\[font([^\\]]*)\\](.*)\\[/font\\](\\s*)\\[/font\\]$#si', '[font${1}${3}]${2}${4}${5}[/font]', $semihtml);
        $semihtml = preg_replace('#\\[font ([^\\]]*)face="([^"]*)"([^\\]]*)face="([^"]*)"([^\\]]*)\\]#si', '[font ${1}${3}${5} face="${4}"]', $semihtml);
        $semihtml = preg_replace('#\\[font ([^\\]]*)size="([^"]*)"([^\\]]*)size="([^"]*)"([^\\]]*)\\]#si', '[font ${1}${3}${5} size="${4}"]', $semihtml);
        // This is imperfect (due to relative font sizes), but at least it encourages cleanup
        $semihtml = preg_replace('#\\[font ([^\\]]*)color="([^"]*)"([^\\]]*)color="([^"]*)"([^\\]]*)\\]#si', '[font ${1}${3}${5} color="${4}"]', $semihtml);
        $semihtml = preg_replace('#\\[font ([^\\]]*)param="([^"]*)"([^\\]]*)param="([^"]*)"([^\\]]*)\\]#si', '[font ${1}${3}${5} param="${4}"]', $semihtml);
        $semihtml = preg_replace('#(\\[font.*)(?-U)\\s+(?U)(.*\\])#U', '${1} ${2}', $semihtml);
        // safe because no whitespace runs can be expected within a font tag
        // Cleanup other nestings / close then reopen patterns
        foreach (array('b', 'i', 'u', 'tt', 'font size="[^"]*"') as $tag) {
            $tagx = strpos($tag, ' ') !== false ? substr($tag, 0, strpos($tag, ' ')) : $tag;
            $semihtml = comcode_preg_replace($tagx, '#^(\\[' . $tag . '\\])(.*)\\1(.*)\\[/' . $tagx . '\\](.*)\\[/' . $tagx . '\\]$#si', '${1}${2}${3}${4}[/' . $tagx . ']', $semihtml);
            $semihtml = preg_replace('#(\\[' . $tag . '\\])([^\\[\\]]*)\\[/' . $tagx . '\\]((&nbsp;|</CDATA\\_\\_space>|\\s)*)\\1#si', '${1}${2}${3}', $semihtml);
            // Only works in simple case, not when there are tags nested within first tag. Can't use comcode_preg_replace as we are joining two tags (i.e. not operating over single bind)
        }
        // Cleanup lines filled with spaces/font-junk
        foreach ($text_formatting_tags as $tag) {
            $semihtml = preg_replace('#(\\[' . $tag . '[^\\]]*\\])((&nbsp;|</CDATA\\_\\_space>|\\s|<br\\s*/>|\\n)*)#i', '${2}${1}', $semihtml);
            // Tag starting unnecessarily early -> Move it back
            $semihtml = preg_replace('#((&nbsp;|</CDATA\\_\\_space>|\\s|<br\\s*/>|\\n)*)(\\[/' . $tag . '\\])#i', '${3}${1}', $semihtml);
            // Tag ending unnecessarily late -> Move it back
            $semihtml = preg_replace('#\\[' . $tag . '[^\\]]*\\]((&nbsp;|</CDATA\\_\\_space>|\\s|<br\\s*/>|\\n)*)\\[/' . $tag . '\\]#i', '${1}', $semihtml);
            // Tag wrapping whitespace -> White space
        }
        $semihtml = preg_replace('#(&nbsp;|</CDATA\\_\\_space>|\\s)*<br\\s*/>#i', '<br />', $semihtml);
        // Spaces on end of line -> (Remove)
    } while ($semihtml != $old_semihtml);
    // Undone center tagging
    $semihtml = comcode_preg_replace('left', '#^\\[left\\]\\[center\\](.*)\\[/center\\]\\[/left\\]$#si', '[left]${1}[/left]', $semihtml);
    $semihtml = comcode_preg_replace('right', '#^\\[right\\]\\[center\\](.*)\\[/center\\]\\[/right\\]$#si', '[right]${1}[/right]', $semihtml);
    $semihtml = comcode_preg_replace('center', '#^\\[center\\]\\[left\\](.*)\\[/left\\]\\[/center\\]$#si', '[center]${1}[/center]', $semihtml);
    $semihtml = comcode_preg_replace('center', '#^\\[center\\]\\[right\\](.*)\\[/right\\]\\[/center\\]$#si', '[center]${1}[/center]', $semihtml);
    // Cleanup list Comcode (nice and pretty)
    $semihtml = preg_replace('#(&nbsp;|</CDATA\\_\\_space>|\\s|<br\\s*/>|\\n)*\\[/\\*\\](&nbsp;|</CDATA\\_\\_space>|\\s|<br\\s*/>|\\n)*#', '[/*]', $semihtml);
    $semihtml = preg_replace('#(&nbsp;|</CDATA\\_\\_space>|\\s|<br\\s*/>|\\n)*\\[\\*\\](&nbsp;|</CDATA\\_\\_space>|\\s|<br\\s*/>|\\n)*#', '[*]', $semihtml);
    $semihtml = preg_replace('#\\[/\\*\\]([^\\s])#', '[/*]<ocpbr />${1}', $semihtml);
    $semihtml = preg_replace('#\\[list\\]([^\\s])#', '[list]<ocpbr />${1}', $semihtml);
    // Cleanup various blocks where we can afford a blank line
    global $BLOCK_TAGS;
    foreach (array_keys($BLOCK_TAGS) as $tag) {
        if (strpos($semihtml, '[' . $tag) !== false) {
            $semihtml = preg_replace('#( |</CDATA\\_\\_space>)*(\\[' . $tag . '[\\] ])#', '${2}', $semihtml);
            $semihtml = preg_replace('#\\[/' . $tag . '\\](?!\\[/)(?!<br)#', '[/' . $tag . ']' . ($tag == 'title' ? '<ocpbr /><ocpbr />' : '<ocpbr />'), $semihtml);
        }
    }
    // Remove our CDATA protections
    $semihtml = str_replace('</CDATA__space>', ' ', $semihtml);
    $semihtml = str_replace('</CDATA__tab>', "\t", $semihtml);
    $semihtml = str_replace('</CDATA__nl>', chr(10), $semihtml);
    $semihtml = str_replace('</CDATA__lf>', chr(13), $semihtml);
    $semihtml = str_replace('</CDATA__amp>', '&', $semihtml);
    /*// And use same method to protect our code tags
    	foreach (array_keys($GLOBALS['CODE_TAGS']) as $code_tag)
    		$semihtml=preg_replace_callback('#(\['.$code_tag.'[^\]]*\])(.*)(\[/'.$code_tag.'\])#siU','_codetag_unprotect',$semihtml);*/
    // Tempcode escaping
    /*$semihtml=str_replace('{+','\{+',$semihtml);	No - people should be able to type this if they want
    	$semihtml=str_replace('{$','\{$',$semihtml);
    	$semihtml=str_replace('{!','\{!',$semihtml);*/
    $semihtml = str_replace('[ html', '[html', $semihtml);
    $semihtml = str_replace('[ semihtml', '[semihtml', $semihtml);
    $semihtml = str_replace('[ / html', '[/html', $semihtml);
    $semihtml = str_replace('[ / semihtml', '[/semihtml', $semihtml);
    // People without comcode_dangerous have further cleanups, that might lose some quality...
    if (!has_specific_permission(get_member(), 'allow_html')) {
        $semihtml2 = $semihtml;
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<table summary="([^"]*)"([^>]*)>(.*)</table>$#siU', chr(10) . "{| \${2}\${3}'.chr(10).'|}" . chr(10));
        $array_html_preg_replace[] = array('#^<table([^>]*)>(.*)</table>$#siU', chr(10) . "{|" . chr(10) . "\${2}" . chr(10) . "|}" . chr(10));
        $semihtml2 = array_html_preg_replace('table', $array_html_preg_replace, $semihtml2);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<thead([^>]*)>(.*)</thead>$#siU', '');
        $semihtml2 = array_html_preg_replace('thead', $array_html_preg_replace, $semihtml2);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<tbody([^>]*)>(.*)</tbody>$#siU', '${2}');
        $semihtml2 = array_html_preg_replace('tbody', $array_html_preg_replace, $semihtml2);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<tfoot([^>]*)>(.*)</tfoot>$#siU', '');
        $semihtml2 = array_html_preg_replace('tfoot', $array_html_preg_replace, $semihtml2);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<tr([^>]*)>(.*)</tr>$#siU', chr(10) . "|-" . chr(10) . "\${2}");
        $semihtml2 = array_html_preg_replace('tr', $array_html_preg_replace, $semihtml2);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<th([^>]*)>(.*)</th>$#siU', chr(10) . chr(10) . "! \${2}");
        $semihtml2 = array_html_preg_replace('th', $array_html_preg_replace, $semihtml2);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<td([^>]*)>(.*)</td>$#siU', chr(10) . "| \${2}");
        $semihtml2 = array_html_preg_replace('td', $array_html_preg_replace, $semihtml2);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<span style="font-family: monospace;  font-size: 1.2em;">(.*)</span>$#siU', "[tt]\${1}[/tt]");
        $semihtml2 = array_html_preg_replace('span', $array_html_preg_replace, $semihtml2);
        if (strpos($semihtml, '[code') === false) {
            $array_html_preg_replace = array();
            $array_html_preg_replace[] = array('#^<pre>(.*)</pre>$#siU', "[code]\${1}[/code]");
            $semihtml2 = array_html_preg_replace('pre', $array_html_preg_replace, $semihtml2);
        }
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<table([^>]*)>(.*)</table>$#siU', "<table class=\"bordered_table\">\${2}</table>");
        $semihtml = array_html_preg_replace('table', $array_html_preg_replace, $semihtml);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<tr([^>]*)>(.*)</tr>$#siU', "<tr>\${2}</tr>");
        $semihtml = array_html_preg_replace('tr', $array_html_preg_replace, $semihtml);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<th([^>]*)>(.*)</th>$#siU', "<th>\${2}</th>");
        $semihtml = array_html_preg_replace('th', $array_html_preg_replace, $semihtml);
        $array_html_preg_replace = array();
        $array_html_preg_replace[] = array('#^<td([^>]*)>(.*)</td>$#siU', "<td>\${2}</td>");
        $semihtml = array_html_preg_replace('td', $array_html_preg_replace, $semihtml);
    } else {
        $semihtml2 = $semihtml;
    }
    // Cleanup impossible stuff in code tags
    foreach (array_keys($CODE_TAGS) as $tag) {
        $semihtml2 = comcode_preg_replace($tag, '#^(\\[' . $tag . '\\])([.\\n]*)(\\[/' . $tag . '\\])$#i', array('semihtml_to_comcode_wrap'), $semihtml2);
    }
    // These can only be used outside semihtml - so we do them in a copy of our output, and only use that copy if we find we are able to do a 100% Comcode conversion
    $semihtml2 = str_replace('<ocpbr />', chr(10), $semihtml2);
    $semihtml2 = str_replace('<br />', chr(10), $semihtml2);
    $semihtml2 = str_replace('<br  />', chr(10), $semihtml2);
    $semihtml2 = str_replace('<br>', chr(10), $semihtml2);
    $semihtml2 = str_replace('<hr width="100%" size="2" />', '<hr />', $semihtml2);
    $semihtml2 = str_replace('<hr size="2" width="100%" />', '<hr />', $semihtml2);
    $semihtml2 = str_replace('<hr width="100%" />', '<hr />', $semihtml2);
    $semihtml2 = str_replace(chr(10) . '<hr />', chr(10) . "---------------" . chr(10), $semihtml2);
    $semihtml2 = str_replace(chr(10) . '<hr>', chr(10) . "---------------" . chr(10), $semihtml2);
    $semihtml2 = preg_replace('#<hr\\s*/>#', chr(10) . "---------------" . chr(10), $semihtml2);
    $semihtml2 = str_replace('<hr>', chr(10) . "---------------" . chr(10), $semihtml2);
    // We transform any HTML in there to Comcode if we can
    $smilies = $GLOBALS['FORUM_DRIVER']->find_emoticons();
    foreach ($smilies as $code => $imgcode) {
        if ($imgcode[0] == 'EMOTICON_IMG_CODE_THEMED') {
            $imgcode[1] = find_theme_image($imgcode[1], true);
            if ($imgcode[1] == '') {
                continue;
            }
            // Theme image gone missing
        }
        $imgcode[1] = str_replace(get_base_url(), '', $imgcode[1]);
        $semihtml2 = preg_replace('#<img [^>]*src="[^"]*' . str_replace('#', '\\#', preg_quote(escape_html($imgcode[1]))) . '"[^>]*>\\s*#si', $code, $semihtml2);
    }
    $semihtml2 = preg_replace_callback('#<img([^>]*) src="([^"]*)"([^>]*) />#siU', '_img_tag_fixup', $semihtml2);
    $semihtml2 = preg_replace_callback('#<img([^>]*) src="([^"]*)"([^>]*)>#siU', '_img_tag_fixup', $semihtml2);
    // Then, if there is no HTML left, we can avoid the 'semihtml' tag
    if (strpos($semihtml2, '<') === false) {
        //		$semihtml2=str_replace(array('&lt;','&gt;','&amp;'),array('___lt___','___gt___','___amp___'),$semihtml2);
        $semihtml2 = @html_entity_decode($semihtml2, ENT_QUOTES, get_charset());
        //		$semihtml2=str_replace(array('___lt___','___gt___','___amp___'),array('&lt;','&gt;','&amp;'),$semihtml2);
        return $semihtml2;
    }
    // Oh well, we couldn't do a perfect conversion, so we'll have to use semihtml.
    $semihtml = preg_replace_callback('#<img([^>]*) src="([^"]*)"([^>]*) />#siU', '_img_tag_fixup', $semihtml);
    $semihtml = preg_replace_callback('#<img([^>]*) src="([^"]*)"([^>]*)>#siU', '_img_tag_fixup', $semihtml);
    $semihtml = str_replace('<ocpbr />', chr(10), $semihtml);
    // Make it look slightly reasonable first (to the reader of the Comcode)
    $semihtml = str_replace('<br  />', '<br />', $semihtml);
    $semihtml = str_replace('<br />', '<br />' . chr(10), $semihtml);
    $semihtml = str_replace('</p>', '</p>' . chr(10), $semihtml);
    $semihtml = str_replace('[/align]', '[/align]' . chr(10), $semihtml);
    return '[semihtml]' . $semihtml . '[/semihtml]';
}
Esempio n. 4
0
/**
 * Take a URL and base-URL, and fully qualify the URL according to it.
 *
 * @param  URLPATH		The URL to fully qualified
 * @param  URLPATH		The base-URL
 * @return URLPATH		Fully qualified URL
 */
function _qualify_url($url, $url_base)
{
    require_code('obfuscate');
    if ($url != '' && $url[0] != '#' && substr($url, 0, 5) != 'data:' && substr($url, 0, 7) != 'mailto:' && substr($url, 0, strlen(mailto_obfuscated())) != mailto_obfuscated()) {
        if (url_is_local($url)) {
            if ($url[0] == '/') {
                $parsed = @parse_url($url_base);
                if ($parsed === false) {
                    return '';
                }
                if (!array_key_exists('scheme', $parsed)) {
                    $parsed['scheme'] = 'http';
                }
                if (!array_key_exists('host', $parsed)) {
                    $parsed['host'] = 'localhost';
                }
                if (substr($url, 0, 2) == '//') {
                    $url = $parsed['scheme'] . ':' . $url;
                } else {
                    $url = $parsed['scheme'] . '://' . $parsed['host'] . (array_key_exists('port', $parsed) ? ':' . $parsed['port'] : '') . $url;
                }
            } else {
                $url = $url_base . '/' . $url;
            }
        }
    }
    $url = str_replace('/./', '/', $url);
    $pos = strpos($url, '/../');
    while ($pos !== false) {
        $pos_2 = strrpos(substr($url, 0, $pos - 1), '/');
        if ($pos_2 === false) {
            break;
        }
        $url = substr($url, 0, $pos_2) . '/' . substr($url, $pos + 4);
        $pos = strpos($url, '/../');
    }
    return $url;
}
Esempio n. 5
0
 /**
  * Standard modular run function for OcCLE hooks.
  *
  * @param  array	The options with which the command was called
  * @param  array	The parameters with which the command was called
  * @param  array	A reference to the OcCLE filesystem object
  * @return array	Array of stdcommand, stdhtml, stdout, and stderr responses
  */
 function run($options, $parameters, &$occle_fs)
 {
     require_code('obfuscate');
     if (array_key_exists('h', $options) || array_key_exists('help', $options)) {
         return array('', do_command_help('feed_display', array('h', 'm'), array(true)), '', '');
     } else {
         if (!array_key_exists(0, $parameters)) {
             return array('', '', '', do_lang('MISSING_PARAM', '1', 'feed_display'));
         }
         require_lang('news');
         require_code('rss');
         $rss = new rss($parameters[0]);
         if (!is_null($rss->error)) {
             return array('', '', '', $rss->error);
         }
         if (!array_key_exists('title', $rss->gleamed_feed)) {
             $rss->gleamed_feed['title'] = do_lang('RSS_STREAM');
         }
         if (!array_key_exists('copyright', $rss->gleamed_feed)) {
             $rss->gleamed_feed['copyright'] = '';
         }
         // Reduce what we collected about the feed to a minimum. This is very awkward, as we don't know what's here.
         if (array_key_exists('author', $rss->gleamed_feed)) {
             $__author = NULL;
             $_author = $rss->gleamed_feed['author'];
             if (array_key_exists('url', $rss->gleamed_feed)) {
                 $__author = hyperlink($rss->gleamed_feed['url'], escape_html($_author), true);
             } elseif (array_key_exists('author_url', $rss->gleamed_feed)) {
                 $__author = hyperlink($rss->gleamed_feed['author_url'], escape_html($_author), true);
             } elseif (array_key_exists('author_email', $rss->gleamed_feed)) {
                 $__author = hyperlink(mailto_obfuscated() . obfuscate_email_address($rss->gleamed_feed['author_email']), escape_html($_author), true);
             }
             if (!is_null($__author)) {
                 $_author = $__author->evaluate();
             }
             $_author = do_lang('RSS_SOURCE_FROM', $_author);
         } else {
             $_author = '';
         }
         // Now for the actual stream contents
         $max = array_key_exists('max', $options) ? intval($options['max']) : 5;
         $content = new ocp_tempcode();
         require_code('xhtml');
         foreach ($rss->gleamed_items as $i => $item) {
             if ($i >= $max) {
                 break;
             }
             if (array_key_exists('guid', $item)) {
                 $full_url = $item['guid'];
             } elseif (array_key_exists('comment_url', $item)) {
                 $full_url = $item['comment_url'];
             } elseif (array_key_exists('full_url', $item)) {
                 $full_url = $item['full_url'];
             } else {
                 $full_url = '';
             }
             $_title = $item['title'];
             $date = array_key_exists('clean_add_date', $item) ? get_timezoned_date($item['clean_add_date']) : array_key_exists('add_date', $item) ? $item['add_date'] : '';
             $content->attach(do_template('OCCLE_RSS_ITEM', array('_GUID' => 'd6b811d17956ebd82c9911fbda19eeec', 'FULL_URL' => $full_url, 'NEWS_TITLE' => $_title, 'DATE' => $date, 'SUMMARY' => xhtmlise_html($item['news']))));
         }
         return array('', do_template('OCCLE_RSS', array('TITLE' => $rss->gleamed_feed['title'], 'CONTENT' => $content)), '', '');
     }
 }
Esempio n. 6
0
 /**
  * Standard modular run function.
  *
  * @param  array		A map of parameters.
  * @return tempcode	The result of execution.
  */
 function run($map)
 {
     require_lang('news');
     require_css('news');
     require_css('side_blocks');
     require_code('obfuscate');
     $url = array_key_exists('param', $map) ? $map['param'] : 'http://ocportal.com/backend.php?type=rss&mode=news&filter=16,17,18,19,20';
     // http://channel9.msdn.com/Feeds/RSS/
     if (strpos($url, '{') !== false) {
         require_code('tempcode_compiler');
         $url = static_evaluate_tempcode(template_to_tempcode($url));
     }
     $ticker = array_key_exists('ticker', $map) && $map['ticker'] == '1';
     require_code('rss');
     $rss = new rss($url);
     if (!is_null($rss->error)) {
         $GLOBALS['DO_NOT_CACHE_THIS'] = true;
         require_code('failure');
         if (strpos($url, 'twitter') === false) {
             // Twitter is always failing ;).
             relay_error_notification(do_lang('ERROR_HANDLING_RSS_FEED', $url, $rss->error), false, 'error_occurred_rss');
         }
         if (cron_installed()) {
             if (!$GLOBALS['FORUM_DRIVER']->is_staff(get_member())) {
                 return new ocp_tempcode();
             }
         }
         return do_template('INLINE_WIP_MESSAGE', array('MESSAGE' => htmlentities($rss->error)));
     }
     // Sorting
     $items = array();
     foreach ($rss->gleamed_items as $item) {
         if (!array_key_exists('clean_add_date', $item)) {
             $item['clean_add_date'] = time();
         }
         $items[] = $item;
     }
     global $M_SORT_KEY;
     $M_SORT_KEY = 'clean_add_date';
     usort($items, 'multi_sort');
     $items = array_reverse($items);
     global $NEWS_CATS;
     $NEWS_CATS = $GLOBALS['SITE_DB']->query_select('news_categories', array('*'), array('nc_owner' => NULL));
     $NEWS_CATS = list_to_map('id', $NEWS_CATS);
     if (!array_key_exists('title', $rss->gleamed_feed)) {
         $rss->gleamed_feed['title'] = do_lang_tempcode('RSS_STREAM');
     }
     if (array_key_exists('title', $map)) {
         $rss->gleamed_feed['title'] = $map['title'];
     }
     // Reduce what we collected about the feed to a minimum. This is very awkward, as we don't know what's here.
     if (array_key_exists('author', $rss->gleamed_feed)) {
         $__author = NULL;
         $_author_string = $rss->gleamed_feed['author'];
         if (array_key_exists('url', $rss->gleamed_feed)) {
             $__author = hyperlink($rss->gleamed_feed['url'], escape_html($_author_string), true);
         } elseif (array_key_exists('author_url', $rss->gleamed_feed)) {
             $__author = hyperlink($rss->gleamed_feed['author_url'], escape_html($_author_string), true);
         } elseif (array_key_exists('author_email', $rss->gleamed_feed)) {
             $__author = hyperlink(mailto_obfuscated() . obfuscate_email_address($rss->gleamed_feed['author_email']), escape_html($_author_string), true);
         }
         if (!is_null($__author)) {
             $_author_string = $__author->evaluate();
         }
         $_author = do_lang_tempcode('RSS_SOURCE_FROM', $_author_string);
     } else {
         $_author = new ocp_tempcode();
     }
     if (!array_key_exists('copyright', $rss->gleamed_feed)) {
         $rss->gleamed_feed['copyright'] = '';
     }
     if (array_key_exists('copyright', $map)) {
         $rss->gleamed_feed['copyright'] = $map['copyright'];
     }
     // Now for the actual stream contents
     $max = array_key_exists('max_entries', $map) ? intval($map['max_entries']) : 5;
     $content = new ocp_tempcode();
     foreach ($items as $i => $item) {
         if ($i >= $max) {
             break;
         }
         if (array_key_exists('full_url', $item)) {
             $full_url = $item['full_url'];
         } elseif (array_key_exists('guid', $item)) {
             $full_url = $item['guid'];
         } elseif (array_key_exists('comment_url', $item)) {
             $full_url = $item['comment_url'];
         } else {
             $full_url = '';
         }
         $_title = $item['title'];
         $_title = array_key_exists('title', $item) ? $item['title'] : '';
         $date = array_key_exists('clean_add_date', $item) ? get_timezoned_date($item['clean_add_date']) : (array_key_exists('add_date', $item) ? $item['add_date'] : '');
         $content->attach(do_template('BLOCK_SIDE_RSS_SUMMARY', array('_GUID' => '18f6d1ccfe980cc01bbdd2ee178c2410', 'TICKER' => $ticker, 'FEED_URL' => $url, 'FULL_URL' => $full_url, 'NEWS_TITLE' => $_title, 'DATE' => $date, 'DATE_RAW' => array_key_exists('clean_add_date', $item) ? strval($item['clean_add_date']) : '', 'SUMMARY' => array_key_exists('news', $item) ? $item['news'] : (array_key_exists('news_article', $item) ? $item['news_article'] : ''))));
     }
     return do_template('BLOCK_SIDE_RSS', array('_GUID' => 'fe3319e942d75fedb83e4cf80f80e19f', 'TICKER' => $ticker, 'FEED_URL' => $url, 'TITLE' => $rss->gleamed_feed['title'], 'CONTENT' => $content));
 }
Esempio n. 7
0
/**
 * Evaluate a conventional tempcode variable, handling escaping
 *
 * @param  LANGUAGE_NAME	The language to evaluate this symbol in (some symbols refer to language elements)
 * @param  array				Array of escaping operations
 * @param  integer			The type of symbol this is (TC_SYMBOL, TC_LANGUAGE_REFERENCE)
 * @set    0 2
 * @param  ID_TEXT			The name of the symbol
 * @param  array				Parameters to the symbol. For all but directive it is an array of strings. For directives it is an array of Tempcode objects. Actually there may be template-style parameters in here, as an influence of singular_bind and these may be Tempcode, but we ignore them.
 * @return mixed				The result. Either tempcode, or a string.
 */
function ecv($lang, $escaped, $type, $name, $param)
{
    global $TEMPCODE_SETGET, $CYCLES, $PREPROCESSABLE_SYMBOLS, $DISPLAYED_TITLE;
    //echo '<!--'.$name.'-->'."\n";
    if ($type == TC_SYMBOL) {
        $escaped_codes = $name . ($escaped == array() ? '' : serialize($escaped));
        $cacheable = $param == array() && !isset($GLOBALS['NON_CACHEABLE_SYMBOLS'][$name]);
        if ($cacheable) {
            global $SYMBOL_CACHE;
            if (isset($SYMBOL_CACHE[$escaped_codes])) {
                return $SYMBOL_CACHE[$escaped_codes];
            }
        }
        $value = '';
        if ($GLOBALS['XSS_DETECT']) {
            ocp_mark_as_escaped($value);
        }
        $temp_array = array();
        if (isset($PREPROCESSABLE_SYMBOLS[$name]) && $name != 'PAGE_LINK') {
            handle_symbol_preprocessing(array($escaped, $type, $name, $param), $temp_array);
        }
        // Late preprocessing. Should not be needed in case of full screen output (as this was properly preprocessed), but is in other cases
        switch ($name) {
            case 'PAGE_LINK':
                if (isset($param[0])) {
                    list($zone, $map, $hash) = page_link_decode(is_object($param[0]) ? $param[0]->evaluate() : $param[0]);
                    $skip = NULL;
                    if (isset($param[4])) {
                        $skip = array_flip(explode('|', $param[4]));
                    }
                    $avoid_remap = isset($param[1]) && $param[1] == '1';
                    $skip_keep = isset($param[2]) && $param[2] == '1';
                    $keep_all = isset($param[3]) && $param[3] == '1';
                    foreach ($map as $key => $val) {
                        if (is_object($val)) {
                            $map[$key] = $val->evaluate();
                        }
                    }
                    $value = _build_url($map, $zone, $skip, $keep_all, $avoid_remap, $skip_keep, $hash);
                } else {
                    $value = get_zone_name() . ':' . get_page_name();
                    foreach ($_GET as $key => $val) {
                        if ($key == 'page') {
                            continue;
                        }
                        if (is_array($val)) {
                            continue;
                        }
                        if (substr($key, 0, 5) == 'keep_' && !skippable_keep($key, $val)) {
                            continue;
                        }
                        $value .= ':' . $key . '=' . $val;
                    }
                }
                break;
            case 'SET':
                if (isset($param[1])) {
                    if (isset($param[1]) && is_object($param[1])) {
                        $TEMPCODE_SETGET[$param[0]] = $param[1];
                    } else {
                        $param_copy = $param;
                        unset($param_copy[0]);
                        $TEMPCODE_SETGET[$param[0]] = implode(',', $param_copy);
                    }
                }
                break;
            case 'GET':
                if (isset($param[0])) {
                    if (isset($TEMPCODE_SETGET[$param[0]])) {
                        if (is_object($TEMPCODE_SETGET[$param[0]])) {
                            $TEMPCODE_SETGET[$param[0]] = $TEMPCODE_SETGET[$param[0]]->evaluate();
                        }
                        $value = $TEMPCODE_SETGET[$param[0]];
                    }
                }
                break;
            case 'EQ':
                if (isset($param[1])) {
                    $first = array_shift($param);
                    $count = 0;
                    foreach ($param as $test) {
                        if ($first == $test) {
                            $count++;
                            break;
                        }
                    }
                    $value = $count != 0 ? '1' : '0';
                }
                break;
            case 'NEQ':
                if (isset($param[1])) {
                    $first = array_shift($param);
                    $count = 0;
                    foreach ($param as $test) {
                        if ($first == $test) {
                            $count++;
                        }
                    }
                    $value = $count == 0 ? '1' : '0';
                }
                break;
            case 'NOT':
                if (isset($param[0])) {
                    $value = $param[0] == '1' || $param[0] == '1' ? '0' : '1';
                }
                break;
            case 'OR':
                $count = 0;
                foreach ($param as $test) {
                    if ($test == '1' || $test == '1') {
                        $count++;
                    }
                }
                $value = $count > 0 ? '1' : '0';
                break;
            case 'AND':
                $count = 0;
                foreach ($param as $test) {
                    if ($test == '1' || $test == '1') {
                        $count++;
                    }
                }
                $value = $count == count($param) ? '1' : '0';
                break;
            case 'HAS_ACTUAL_PAGE_ACCESS':
                if (isset($param[0])) {
                    $value = has_actual_page_access($param !== NULL && isset($param[2]) ? intval($param[2]) : get_member(), $param[0], isset($param[1]) ? $param[1] : NULL) ? '1' : '0';
                }
                break;
            case '?':
                if (isset($param[1])) {
                    $value = $param[0] == '1' || $param[0] == '1' ? $param[1] : (isset($param[2]) ? $param[2] : $value);
                }
                break;
            case 'IMG':
                if (isset($param[0]) && isset($GLOBALS['SITE_DB']) && function_exists('find_theme_image') && $GLOBALS['IN_MINIKERNEL_VERSION'] == 0) {
                    $value = find_theme_image($param[0], isset($param[3]) && $param[3] == '1', false, array_key_exists(2, $param) && $param[2] != '' ? $param[2] : NULL, NULL, isset($param[1]) && $param[1] == '1' ? $GLOBALS['FORUM_DB'] : $GLOBALS['SITE_DB']);
                }
                break;
            case '':
                break;
            case 'META_DATA':
                if (isset($param[0])) {
                    global $META_DATA;
                    if (isset($param[1])) {
                        $matches = array();
                        if ($param[0] == 'image' && preg_match('#^' . preg_quote(find_script('attachment'), '#') . '\\?id=(\\d+)#', $param[1], $matches) != 0) {
                            require_code('attachments');
                            if (!has_attachment_access($GLOBALS['FORUM_DRIVER']->get_guest_id(), intval($matches[1]))) {
                                break;
                            }
                        }
                        $META_DATA[$param[0]] = $param[1];
                    } else {
                        $value = isset($META_DATA[$param[0]]) ? strip_comcode($META_DATA[$param[0]]) : '';
                        if ($value === NULL) {
                            $value = '';
                        }
                    }
                }
                break;
            case 'SPECIAL_CLICK_TO_EDIT':
                $_value = do_lang_tempcode('SPECIAL_CLICK_TO_EDIT');
                $value = $_value->evaluate();
                break;
            case 'KEEP':
                // What needs preserving in the URL
                $value = keep_symbol($param);
                break;
            case 'BROWSER':
                if (isset($param[1])) {
                    $q = false;
                    foreach (explode('|', $param[0]) as $browser) {
                        $q = browser_matches($browser);
                        if ($q) {
                            break;
                        }
                    }
                    $value = $q ? $param[1] : (isset($param[2]) ? $param[2] : '');
                    if ($GLOBALS['XSS_DETECT']) {
                        ocp_mark_as_escaped($value);
                    }
                }
                break;
            case 'JAVASCRIPT_INCLUDE':
                if (isset($param[0])) {
                    require_javascript($param[0]);
                    /*// Has to do this inline, as you're not allowed to reference scripts outside head
                    		if (!array_key_exists($param[0],$GLOBALS['JAVASCRIPTS']))
                    		{
                    			$GLOBALS['JAVASCRIPTS'][$param[0]]=1;
                    			$file=javascript_enforce($param[0]);
                    			$_value=do_template('JAVASCRIPT_NEED_INLINE',array('_GUID'=>'d6c907e26c5a8dd8c65f1d36a1a674a9','CODE'=>file_get_contents($file,FILE_TEXT)));
                    			$value=$_value->evaluate();
                    		}*/
                }
                break;
            case 'FACILITATE_AJAX_BLOCK_CALL':
                if (isset($param[0])) {
                    require_javascript('javascript_ajax');
                    require_code('blocks');
                    $_block_constraints = block_params_to_block_signature(block_params_str_to_arr($param[0]));
                    if (array_key_exists(1, $param)) {
                        $_block_constraints = array_merge($_block_constraints, block_params_str_to_arr($param[1]));
                        ksort($_block_constraints);
                    }
                    $block_constraints = block_params_arr_to_str($_block_constraints);
                    // Store permissions
                    $_auth_key = $GLOBALS['SITE_DB']->query_select('temp_block_permissions', array('id', 'p_time'), array('p_session_id' => get_session_id(), 'p_block_constraints' => $block_constraints), '', 1);
                    if (!array_key_exists(0, $_auth_key)) {
                        $auth_key = $GLOBALS['SITE_DB']->query_insert('temp_block_permissions', array('p_session_id' => get_session_id(), 'p_block_constraints' => $block_constraints, 'p_time' => time()), true);
                    } else {
                        $auth_key = $_auth_key[0]['id'];
                        if (time() - $_auth_key[0]['p_time'] > 100) {
                            $GLOBALS['SITE_DB']->query_update('temp_block_permissions', array('p_time' => time()), array('p_session_id' => get_session_id(), 'p_block_constraints' => $block_constraints), '', 1);
                        }
                    }
                    $keep = symbol_tempcode('KEEP');
                    $value = find_script('snippet') . '?snippet=block&auth_key=' . urlencode(strval($auth_key)) . '&block_map=' . urlencode($param[0]) . $keep->evaluate();
                }
                break;
            case 'LANG':
                $value = user_lang();
                break;
            case '_GET':
                if (isset($param[0])) {
                    $value = get_param($param[0], isset($param[1]) ? $param[1] : '', true);
                }
                break;
            case 'QUERY_STRING':
                $value = ocp_srv('QUERY_STRING');
                break;
            case 'USER_AGENT':
                $value = ocp_srv('HTTP_USER_AGENT');
                break;
            case 'STRIP_TAGS':
                if (isset($param[0])) {
                    if (isset($param[1]) && $param[1] == '1') {
                        $value = strip_tags(str_replace('))', ')', str_replace('((', '(', str_replace('<em>', '(', str_replace('</em>', ')', $param[0])))));
                    } else {
                        $value = strip_tags($param[0], array_key_exists(2, $param) ? $param[2] : '');
                    }
                    if (isset($param[1]) && $param[1] == '1') {
                        $value = @html_entity_decode($value, ENT_QUOTES, get_charset());
                    }
                }
                break;
            case 'CONFIG_OPTION':
                if (isset($param[0])) {
                    if (!isset($GLOBALS['OPTIONS'])) {
                        $value = '0';
                    } else {
                        $value = get_option($param[0], true);
                        if ($value === NULL) {
                            $value = '';
                        }
                    }
                }
                break;
            case 'TRUNCATE_LEFT':
                // Truncate the left length of a string. 0: text to truncate, 1: the truncate length, 2: whether to use a tooltip mouse-over if it is truncated, 3: whether it is encoded as HTML (0=no [default, plain-text], 1=yes)
                $value = symbol_truncator($param, 'left');
                break;
            case 'TRUNCATE_RIGHT':
                $value = symbol_truncator($param, 'right');
                break;
            case 'TRUNCATE_SPREAD':
                $value = symbol_truncator($param, 'spread');
                break;
            case 'TRUNCATE_EXPAND':
                $value = symbol_truncator($param, 'expand');
                break;
            case 'THEME':
                if (isset($GLOBALS['FORUM_DRIVER'])) {
                    $value = $GLOBALS['FORUM_DRIVER']->get_theme();
                } else {
                    $value = 'default';
                }
                break;
            case 'REVERSE':
                if (isset($param[0])) {
                    $value = implode(',', array_reverse(explode(',', $param[0])));
                }
                break;
            case 'COMMA_LIST_GET':
                if (isset($param[1])) {
                    require_code('blocks');
                    $values = block_params_str_to_arr($param[0]);
                    $value = isset($values[$param[1]]) ? $values[$param[1]] : '';
                }
                break;
            case 'COMMA_LIST_SET':
                if (isset($param[2])) {
                    require_code('blocks');
                    $values = block_params_str_to_arr($param[0]);
                    $values[$param[1]] = $param[2];
                    $value = block_params_arr_to_str($values);
                }
                break;
            case 'IS_EMPTY':
                if (isset($param[0])) {
                    $value = $param[0] == '' ? '1' : '0';
                }
                break;
            case 'IS_NON_EMPTY':
                if (isset($param[0])) {
                    $value = $param[0] != '' ? '1' : '0';
                }
                break;
            case 'CUSTOM_BASE_URL':
                $value = get_custom_base_url(isset($param[0]) && $param[0] != '' ? $param[0] == '1' : NULL);
                if (isset($param[1]) && $param[1] == '1') {
                    $value = cdn_filter($value);
                }
                break;
            case 'LOAD_PANEL':
                foreach ($param as $i => $p) {
                    if (is_object($p)) {
                        $param[$i] = $p->evaluate();
                    }
                }
                global $LOADED_PANELS;
                if (strpos($param[0], ':') !== false) {
                    $param = array_reverse(explode(':', $param[0], 2));
                }
                if (substr($param[0], 0, 6) == 'panel_') {
                    $param[0] = substr($param[0], 6);
                }
                $sr = serialize($param);
                $value = array_key_exists($sr, $LOADED_PANELS) ? $LOADED_PANELS[$sr] : '';
                break;
            case 'HAS_JS':
            case 'JS_ON':
                if (isset($param[1])) {
                    $value = has_js() ? $param[0] : $param[1];
                } else {
                    $value = has_js() ? '1' : '0';
                }
                break;
            case 'BASE_URL_NOHTTP':
                $value = preg_replace('#^https?://[^/]+#', '', get_base_url());
                if (substr($value, 0, 2) == '//') {
                    $value = substr($value, 1);
                }
                if (!$GLOBALS['DEBUG_MODE']) {
                    break;
                }
                // Debug mode changes base domain so we need to actually use it in full (fine, we don't have HTTPS in debug mode). Bubble on...
            // Debug mode changes base domain so we need to actually use it in full (fine, we don't have HTTPS in debug mode). Bubble on...
            case 'CUSTOM_BASE_URL_NOHTTP':
                $value = preg_replace('#^https?://[^/]+/#', '/', get_custom_base_url());
                if (substr($value, 0, 2) == '//') {
                    $value = substr($value, 1);
                }
                if (!$GLOBALS['DEBUG_MODE']) {
                    break;
                }
                // Debug mode changes base domain so we need to actually use it in full (fine, we don't have HTTPS in debug mode). Bubble on...
            // Debug mode changes base domain so we need to actually use it in full (fine, we don't have HTTPS in debug mode). Bubble on...
            case 'BASE_URL':
                $value = get_base_url(isset($param[0]) ? $param[0] == '1' : NULL);
                break;
            case 'ZONE':
                $value = get_zone_name();
                break;
            case 'PAGE':
                $value = get_page_name();
                break;
            case 'SITE_NAME':
                $value = get_site_name();
                break;
            case 'HEADER_TEXT':
                global $ZONE;
                $value = $ZONE['zone_header_text_trans'];
                break;
            case 'PANEL_WIDTH':
                if (isset($TEMPCODE_SETGET['PANEL_WIDTH']) && $TEMPCODE_SETGET['PANEL_WIDTH'] != '') {
                    $value = $TEMPCODE_SETGET['PANEL_WIDTH'];
                } else {
                    $value = get_option('panel_width', true);
                    if ($value === NULL) {
                        $value = '13.3em';
                    }
                }
                break;
            case 'PANEL_WIDTH_SPACED':
                if (isset($TEMPCODE_SETGET['PANEL_WIDTH_SPACED']) && $TEMPCODE_SETGET['PANEL_WIDTH_SPACED'] != '') {
                    $value = $TEMPCODE_SETGET['PANEL_WIDTH_SPACED'];
                } else {
                    $value = get_option('panel_width_spaced', true);
                    if (is_null($value)) {
                        $value = '14.3em';
                    }
                }
                break;
            case 'TRIM':
                if (isset($param[0])) {
                    $value = preg_replace(array('#^\\s+#', '#^(<br\\s*/?' . '>\\s*)+#', '#^(&nbsp;)+#', '#\\s+$#', '#(<br\\s*/?' . '>\\s*)+$#', '#(&nbsp;)+$#'), array('', '', '', '', '', ''), $param[0]);
                }
                break;
            case 'CPF_VALUE':
                if (isset($param[0])) {
                    if (is_numeric($param[0])) {
                        require_code('ocf_members');
                        $fields = ocf_get_custom_fields_member(isset($param[1]) ? intval($param[1]) : get_member());
                        if (array_key_exists(intval($param[0]), $fields)) {
                            $_value = $fields[intval($param[0])];
                        }
                    } elseif (substr($param[0], 0, 2) == 'm_' && strpos(strtolower($param[0]), 'hash') === false && strpos(strtolower($param[0]), 'salt') === false) {
                        $_value = $GLOBALS['FORUM_DRIVER']->get_member_row_field(isset($param[1]) ? intval($param[1]) : get_member(), $param[0]);
                    } else {
                        $_value = get_ocp_cpf($param[0], isset($param[1]) ? intval($param[1]) : NULL);
                    }
                    if (!is_string($_value)) {
                        $value = is_null($_value) ? '' : strval($_value);
                    } else {
                        $value = $_value;
                    }
                }
                break;
            case 'BANNER':
                if (addon_installed('banners')) {
                    global $SITE_INFO;
                    $is_on_banners = get_option('is_on_banners') == '1' && (!has_specific_permission(get_member(), 'banner_free') || $GLOBALS['FORUM_DRIVER']->is_super_admin(get_member()) && get_option('admin_banners') == '1' || !is_null($GLOBALS['CURRENT_SHARE_USER']));
                    if (array_key_exists('throttle_bandwidth_registered', $SITE_INFO)) {
                        $views_till_now = intval(get_value('page_views'));
                        $bandwidth_allowed = $SITE_INFO['throttle_bandwidth_registered'];
                        $total_bandwidth = intval(get_value('download_bandwidth'));
                        if ($bandwidth_allowed * 1024 * 1024 >= $total_bandwidth) {
                            $is_on_banners = false;
                        }
                    }
                    if ($is_on_banners && !is_page_https(get_zone_name(), get_page_name())) {
                        require_code('banners');
                        $b_type = isset($param[0]) ? $param[0] : '';
                        $internal_only = isset($param[1]) ? intval($param[1]) : ($b_type == '' ? 0 : 1);
                        if (isset($GLOBALS['NON_CACHEABLE_SYMBOLS']['SET_RAND'])) {
                            $_value = banners_script(true, '', '', $b_type, $internal_only, '');
                            $value = $_value->evaluate();
                        } else {
                            $value = 'Banner goes here';
                        }
                    }
                }
                break;
            case 'AVATAR':
                $value = $GLOBALS['FORUM_DRIVER']->get_member_avatar_url(isset($param[0]) ? intval($param[0]) : get_member());
                if (url_is_local($value) && $value != '') {
                    $value = get_custom_base_url() . '/' . $value;
                }
                break;
            case 'IS_GUEST':
                if (isset($param[0])) {
                    $value = is_guest(intval($param[0])) ? '1' : '0';
                } else {
                    $value = is_guest() ? '1' : '0';
                }
                break;
            case 'MEMBER':
                $value = strval(get_member());
                break;
            case 'USER':
                if (!isset($param[0])) {
                    $value = strval(get_member());
                } else {
                    $member_id = $GLOBALS['FORUM_DRIVER']->get_member_from_username($param[0]);
                    $value = is_null($member_id) ? '' : strval($member_id);
                }
                break;
            case 'CSS_INCLUDE':
                if (isset($param[0])) {
                    require_css($param[0]);
                    /*// Has to do this inline, as you're not allowed to reference sheets outside head
                    		if (!array_key_exists($param[0],$GLOBALS['CSSS']))
                    		{
                    			$GLOBALS['CSSS'][$param[0]]=1;
                    			$file=css_enforce($param[0]);
                    			$_value=do_template('CSS_NEED_INLINE',array('_GUID'=>'9de994d2f6d47a622d49347feb7ebe96','CSS'=>str_replace('../../../../',get_base_url().'/',file_get_contents($file,FILE_TEXT))));
                    			$value=$_value->evaluate();
                    		}*/
                }
                break;
            case 'USER_OVERIDE':
                $value = get_param('id', '');
                if (!is_numeric($value) || $value == '') {
                    $value = strval(get_member());
                }
                break;
            case 'IS_HTTPAUTH_LOGIN':
                $value = is_httpauth_login() ? '1' : '0';
                break;
            case 'MEMBER_PROFILE_LINK':
                $value = $GLOBALS['FORUM_DRIVER']->member_profile_url(!is_null($param) && isset($param[0]) ? intval($param[0]) : get_member(), false, true);
                if (is_null($value)) {
                    $value = '';
                }
                break;
            case 'USERNAME':
                $value = $GLOBALS['FORUM_DRIVER']->get_username(!is_null($param) && isset($param[0]) ? intval($param[0]) : get_member());
                if (is_null($value)) {
                    $value = do_lang('UNKNOWN');
                }
                break;
            case 'CYCLE':
                if (isset($param[0])) {
                    if (!isset($CYCLES[$param[0]])) {
                        $CYCLES[$param[0]] = 0;
                    }
                    if (!isset($param[1])) {
                        $value = strval($CYCLES[$param[0]]);
                    } else {
                        if (count($param) == 2) {
                            $param = array_merge(array($param[0]), explode(',', $param[1]));
                        }
                        ++$CYCLES[$param[0]];
                        if (!array_key_exists($CYCLES[$param[0]], $param)) {
                            $CYCLES[$param[0]] = 1;
                        }
                        $value = $param[$CYCLES[$param[0]]];
                    }
                }
                break;
            case 'THUMBNAIL':
                require_code('images');
                $value = _symbol_thumbnail($param);
                break;
            case 'IMAGE_WIDTH':
                require_code('images');
                list($value, ) = _symbol_image_dims($param);
                break;
            case 'IMAGE_HEIGHT':
                require_code('images');
                list(, $value) = _symbol_image_dims($param);
                break;
            case 'IS_IN_GROUP':
                if (isset($param[0])) {
                    if (in_array($param[count($param) - 1], array('', 'primary', 'secondary'))) {
                        $last_param = $param[count($param) - 1];
                        unset($param[count($param) - 1]);
                    } else {
                        $last_param = '';
                    }
                    $member_id = get_member();
                    $new_param = '';
                    $param_2 = array();
                    foreach ($param as $group) {
                        if (substr($group, 0, 1) == '!' && is_numeric(substr($group, 1))) {
                            $member_id = intval(substr($group, 1));
                        } else {
                            $param_2 = array_merge($param_2, explode(',', $group));
                        }
                    }
                    foreach ($param_2 as $group) {
                        if ($new_param != '') {
                            $new_param .= ',';
                        }
                        $new_param .= $group;
                    }
                    if ($last_param == 'primary') {
                        $member_row = $GLOBALS['FORUM_DRIVER']->get_member_row($member_id);
                        $real_group_list = array($GLOBALS['FORUM_DRIVER']->pname_group($member_row));
                    } elseif ($last_param == 'secondary') {
                        $real_group_list = $GLOBALS['FORUM_DRIVER']->get_members_groups($member_id);
                        $member_row = $GLOBALS['FORUM_DRIVER']->get_member_row($member_id);
                        $real_group_list = array_diff($real_group_list, array($GLOBALS['FORUM_DRIVER']->pname_group($member_row)));
                    } else {
                        $real_group_list = $GLOBALS['FORUM_DRIVER']->get_members_groups($member_id);
                    }
                    require_code('ocfiltering');
                    $value = count(array_intersect(ocfilter_to_idlist_using_memory($new_param, $GLOBALS['FORUM_DRIVER']->get_usergroup_list()), $real_group_list)) != 0 ? '1' : '0';
                }
                break;
            case 'IS_STAFF':
                if (isset($GLOBALS['FORUM_DRIVER'])) {
                    $value = $GLOBALS['FORUM_DRIVER']->is_staff(!is_null($param) && isset($param[0]) ? intval($param[0]) : get_member()) ? '1' : '0';
                } else {
                    $value = '0';
                }
                break;
            case 'IS_SUPER_ADMIN':
                if (isset($GLOBALS['FORUM_DRIVER'])) {
                    $value = $GLOBALS['FORUM_DRIVER']->is_super_admin(!is_null($param) && isset($param[0]) ? intval($param[0]) : get_member()) ? '1' : '0';
                } else {
                    $value = '0';
                }
                break;
            case 'PHOTO':
                if (isset($param[0])) {
                    $value = $GLOBALS['FORUM_DRIVER']->get_member_photo_url(intval($param[0]));
                    if (url_is_local($value) && $value != '') {
                        $value = get_custom_base_url() . '/' . $value;
                    }
                }
                break;
            case 'OCF_RANK_IMAGE':
                if (addon_installed('ocf_forum')) {
                    require_code('ocf_groups');
                    $rank_images = new ocp_tempcode();
                    $member_id = isset($param[0]) ? intval($param[0]) : get_member();
                    $posters_groups = $GLOBALS['FORUM_DRIVER']->get_members_groups($member_id, true);
                    foreach ($posters_groups as $group) {
                        $rank_image = ocf_get_group_property($group, 'rank_image');
                        $group_leader = ocf_get_group_property($group, 'group_leader');
                        $group_name = ocf_get_group_name($group);
                        $rank_image_pri_only = ocf_get_group_property($group, 'rank_image_pri_only');
                        if ($rank_image != '' && ($rank_image_pri_only == 0 || $group == $GLOBALS['FORUM_DRIVER']->get_member_row_field($member_id, 'm_primary_group'))) {
                            $rank_images->attach(do_template('OCF_RANK_IMAGE', array('USERNAME' => $GLOBALS['FORUM_DRIVER']->get_username($member_id), 'GROUP_NAME' => $group_name, 'IMG' => $rank_image, 'IS_LEADER' => $group_leader == $member_id)));
                        }
                    }
                    $value = $rank_images->evaluate();
                }
                break;
            case 'TOTAL_POINTS':
                if (addon_installed('points')) {
                    require_code('points');
                    $value = strval(total_points(isset($param[0]) ? intval($param[0]) : get_member()));
                }
                break;
            case 'POINTS_USED':
                if (addon_installed('points')) {
                    require_code('points');
                    $value = strval(points_used(isset($param[0]) ? intval($param[0]) : get_member()));
                }
                break;
            case 'AVAILABLE_POINTS':
                if (addon_installed('points')) {
                    require_code('points');
                    $value = strval(available_points(isset($param[0]) ? intval($param[0]) : get_member()));
                }
                break;
            case 'URL_FOR_GET_FORM':
                if (isset($param[0])) {
                    $url_bits = parse_url($param[0]);
                    if (array_key_exists('scheme', $url_bits)) {
                        $value = $url_bits['scheme'] . '://' . (array_key_exists('host', $url_bits) ? $url_bits['host'] : 'localhost');
                        if (array_key_exists('port', $url_bits) && $url_bits['port'] != 80) {
                            $value .= ':' . strval($url_bits['port']);
                        }
                    }
                    if (array_key_exists('path', $url_bits)) {
                        $value .= $url_bits['path'];
                    }
                }
                break;
            case 'HIDDENS_FOR_GET_FORM':
                $_value = new ocp_tempcode();
                $url_bits = parse_url($param[0]);
                if (array_key_exists('query', $url_bits) && $url_bits['query'] != '') {
                    foreach (explode('&', $url_bits['query']) as $exp) {
                        $parts = explode('=', $exp, 2);
                        if (count($parts) == 2) {
                            if (!in_array($parts[0], $param)) {
                                $_value->attach(form_input_hidden($parts[0], urldecode($parts[1])));
                            }
                        }
                    }
                }
                $value = $_value->evaluate();
                break;
            case 'NOTIFICATIONS_ENABLED':
                $value = '';
                if (array_key_exists(0, $param)) {
                    require_code('notifications');
                    $value = notifications_enabled(array_key_exists(1, $param) ? $param[1] : get_page_name(), $param[0]) ? '1' : '0';
                }
                break;
            case 'DOCUMENT_HELP':
                global $DOCUMENT_HELP, $HELPER_PANEL_TUTORIAL;
                $value = $DOCUMENT_HELP;
                if ($value == '' && $HELPER_PANEL_TUTORIAL != '') {
                    $value = brand_base_url() . '/docs' . strval(ocp_version()) . '/pg/' . $HELPER_PANEL_TUTORIAL;
                }
                break;
            case 'HTTP_STATUS_CODE':
                global $HTTP_STATUS_CODE;
                $value = $HTTP_STATUS_CODE;
                break;
            case 'TEMPCODE':
                if (isset($param[0])) {
                    require_code('tempcode_compiler');
                    $_value = template_to_tempcode($param[0]);
                    $value = $_value->evaluate();
                }
                break;
            case 'COMCODE':
                if (isset($param[0])) {
                    $_value = comcode_to_tempcode($param[0], NULL, true);
                    $value = $_value->evaluate();
                }
                break;
            case 'FLAGRANT':
                $_value = get_flagrant();
                $value = $_value->evaluate();
                break;
            case 'IMG_WIDTH':
            case 'IMG_HEIGHT':
                if (isset($param[0]) && isset($GLOBALS['SITE_DB']) && function_exists('find_theme_image') && $GLOBALS['IN_MINIKERNEL_VERSION'] == 0) {
                    global $THEME_IMG_DIMS_CACHE;
                    if (!isset($THEME_IMG_DIMS_CACHE)) {
                        $THEME_IMG_DIMS_CACHE = function_exists('persistant_cache_get') ? persistant_cache_get('THEME_IMG_DIMS') : array();
                    }
                    if (isset($THEME_IMG_DIMS_CACHE[$param[0]])) {
                        list($width, $height) = $THEME_IMG_DIMS_CACHE[$param[0]];
                        $value = $name == 'IMG_WIDTH' ? $width : $height;
                    } else {
                        if (strpos($param[0], '://') === false) {
                            $img_url = find_theme_image($param[0], false, false, array_key_exists(2, $param) ? $param[2] : NULL, NULL, isset($param[1]) && $param[1] == '1' ? $GLOBALS['FORUM_DB'] : $GLOBALS['SITE_DB']);
                        } else {
                            $img_url = $param[0];
                        }
                        require_code('images');
                        list($width, $height) = _symbol_image_dims(array($img_url));
                        $value = $name == 'IMG_WIDTH' ? $width : $height;
                        $THEME_IMG_DIMS_CACHE[$param[0]] = array($width, $height);
                        if (function_exists('persistant_cache_set')) {
                            persistant_cache_set('THEME_IMG_DIMS', $THEME_IMG_DIMS_CACHE);
                        }
                    }
                }
                break;
            case 'CLEAN_FILE_SIZE':
                if (isset($param[0])) {
                    $bytes = is_numeric($param[0]) ? intval($param[0]) : NULL;
                    require_code('files');
                    $value = clean_file_size($bytes);
                }
                break;
            case 'TIME_PERIOD':
                if (isset($param[0])) {
                    $value = display_time_period(intval($param[0]));
                }
                break;
            case 'MAKE_RELATIVE_DATE':
                if (isset($param[0])) {
                    if (get_option('use_contextual_dates') == '0' && (!array_key_exists(1, $param) || $param[1] != '1')) {
                        $value = get_timezoned_date(intval($param[0]));
                    } else {
                        $value = display_time_period(time() - intval($param[0]));
                    }
                }
                break;
            case 'TIMEZONE':
                $value = make_nice_timezone_name(get_site_timezone());
                break;
            case 'LOAD_PAGE':
                foreach ($param as $i => $p) {
                    if (is_object($p)) {
                        $param[$i] = $p->evaluate();
                    }
                }
                global $LOADED_PAGES;
                if (strpos($param[0], ':') !== false) {
                    $param = array_reverse(explode(':', $param[0], 2));
                }
                $_value = $LOADED_PAGES[serialize($param)];
                $value = $_value->evaluate();
                break;
            case 'RUNNING_SCRIPT':
                if (isset($param[0])) {
                    $value = running_script($param[0]) ? '1' : '0';
                }
                break;
            case 'MATCH_KEY_MATCH':
                $value = '0';
                foreach ($param as $match_key) {
                    if ($match_key == '1' || $match_key == '0' || $match_key == '') {
                        continue;
                    }
                    if (match_key_match($match_key, isset($param[1]) && $match_key == '1')) {
                        $value = '1';
                    }
                }
                break;
            case 'VERSION':
                $value = strval(ocp_version());
                break;
            case 'PREVIEW_VALIDATION':
                $value = get_option('is_on_preview_validation') == '1' ? '1' : '0';
                break;
            case 'BLOCK':
                if (isset($GLOBALS['NON_CACHEABLE_SYMBOLS']['SET_RAND'])) {
                    foreach ($param as $i => $p) {
                        if (is_object($p)) {
                            $param[$i] = $p->evaluate();
                        }
                    }
                    if (count($param) == 1 && strpos($param[0], ',') !== false) {
                        $param = preg_split('#((?<!\\\\)|(?<=\\\\\\\\)|(?<=^)),#', $param[0]);
                        foreach ($param as $key => $val) {
                            $param[$key] = str_replace('\\,', ',', $val);
                        }
                    }
                    global $LOADED_BLOCKS;
                    if (isset($LOADED_BLOCKS[serialize($param)])) {
                        // Will always be set
                        $value = $LOADED_BLOCKS[serialize($param)]->evaluate();
                    }
                }
                break;
            case 'CURRENCY':
                if (addon_installed('ecommerce')) {
                    if (isset($param[0])) {
                        require_code('currency');
                        $value = currency_convert(floatval(str_replace(',', '', $param[0])), isset($param[1]) && $param[1] != '' ? $param[1] : get_option('currency'), isset($param[2]) && $param[2] != '' ? $param[2] : NULL, isset($param[3]) && $param[3] == '1');
                        if (is_null($value)) {
                            $value = do_lang('INTERNAL_ERROR');
                        }
                    } else {
                        $value = get_option('currency');
                    }
                }
                break;
            case 'CURRENCY_SYMBOL':
                if (addon_installed('ecommerce')) {
                    require_code('ecommerce');
                    $value = ecommerce_get_currency_symbol();
                }
                break;
            case 'GEOLOCATE':
                $value = geolocate_ip(isset($param[0]) ? $param[0] : NULL);
                break;
            case 'NO_SAFE_MODE':
                $value = str_replace(array('on', 'true', 'yes'), array('1', '1', '1'), strtolower(ini_get('safe_mode'))) == '1' ? '0' : '1';
                break;
            case 'FORCE_PREVIEWS':
                if (get_option('forced_preview_option') == '1') {
                    if (get_forum_type() == 'ocf') {
                        if (is_guest() && get_option('default_preview_guests') == '0') {
                            $value = '0';
                        } else {
                            $value = $GLOBALS['FORUM_DRIVER']->get_member_row_field(get_member(), 'm_preview_posts') == 1 ? '1' : '0';
                        }
                    } else {
                        $value = get_option('default_preview_guests') == '0' ? '0' : '1';
                    }
                } else {
                    $value = '0';
                }
                break;
            case 'PREVIEW_URL':
                $value = find_script('preview');
                $value .= '?page=' . get_page_name();
                $value .= '&type=' . get_param('type', '', true);
                break;
            case 'ADDON_INSTALLED':
                if (isset($param[0]) && !running_script('install')) {
                    $value = addon_installed($param[0]) ? '1' : '0';
                }
                break;
            case 'VALUE_OPTION':
                if (isset($param[0])) {
                    $value = function_exists('get_value') ? get_value($param[0]) : '';
                    if (is_null($value)) {
                        $value = function_exists('get_long_value') ? get_long_value($param[0]) : '';
                        if (is_null($value)) {
                            $value = isset($param[1]) ? $param[1] : '';
                            if ($param[0] == 'textmate' && (ocp_srv('HTTP_HOST') == 'localhost' && strpos(ocp_srv('HTTP_USER_AGENT'), 'Macintosh') !== false)) {
                                $value = '1';
                            }
                        }
                    }
                }
                break;
            case 'KEEP_INDEX':
                // What needs preserving in the URL
                $value = 'index.php';
                if (count($_GET) > 0) {
                    foreach ($_GET as $key => $val) {
                        if (is_array($val)) {
                            continue;
                        }
                        if (get_magic_quotes_gpc()) {
                            $val = stripslashes($val);
                        }
                        if (substr($key, 0, 5) == 'keep_' && !skippable_keep($key, $val) && strpos($key, '_expand_') === false) {
                            $value .= ($value == 'index.php' ? '?' : '&') . urlencode($key) . '=' . ocp_url_encode($val);
                        }
                    }
                }
                break;
            case 'HIDE_HELP_PANEL':
                $value = array_key_exists('hide_help_panel', $_COOKIE) && $_COOKIE['hide_help_panel'] == '1' ? '1' : '0';
                break;
            case 'URLISE_LANG':
                if (isset($param[1])) {
                    $_value = urlise_lang($param[0], $param[1], isset($param[2]) ? $param[2] : '', isset($param[3]) ? $param[3] == '1' : false);
                    $value = $_value->evaluate();
                }
                break;
            case 'FIND_SCRIPT_NOHTTP':
                if (isset($param[0]) && function_exists('find_script')) {
                    $value = preg_replace('#^https?://[^/]+#', '', find_script($param[0], false, isset($param[1]) ? intval($param[1]) : 0));
                }
                if (!$GLOBALS['DEBUG_MODE']) {
                    break;
                }
                // Debug mode changes base domain so we need to actually use it in full (fine, we don't have HTTPS in debug mode). Bubble on...
            // Debug mode changes base domain so we need to actually use it in full (fine, we don't have HTTPS in debug mode). Bubble on...
            case 'FIND_SCRIPT':
                if (isset($param[0]) && function_exists('find_script')) {
                    $value = find_script($param[0], false, isset($param[1]) ? intval($param[1]) : 0);
                }
                break;
            case 'MOBILE':
                $value = is_mobile(NULL, array_key_exists(0, $param) ? $param[0] == '1' : false) ? '1' : '0';
                break;
            case 'VALID_FILE_TYPES':
                $value = get_option('valid_types');
                $types = array_flip(explode(',', $value));
                $value = '';
                ksort($types);
                foreach (array_flip($types) as $val) {
                    $value .= $val . ',';
                }
                $value = substr($value, 0, strlen($value) - 1);
                break;
            case 'BROWSER_UA':
                $browser = get_browser_string();
                $value = $browser;
                break;
            case 'OS':
                $os = get_os_string();
                if (is_null($os)) {
                    $os = '';
                }
                $value = $os;
                break;
            case 'ANCHOR':
                if (isset($param[0])) {
                    $_value = do_template('ANCHOR', array('_GUID' => '8795c70c9dd7c6217bb765264ac24092', 'NAME' => $param[0]));
                    $value = $_value->evaluate();
                }
                break;
            case 'CSS_TEMPCODE':
                $_value = css_tempcode();
                $value = $_value->evaluate();
                break;
            case 'JS_TEMPCODE':
                $_value = javascript_tempcode(isset($param[0]) ? $param[0] : NULL);
                $value = $_value->evaluate();
                break;
            case 'PAD_LEFT':
                if (array_key_exists(1, $param)) {
                    $value = str_pad($param[0], intval($param[1]), array_key_exists(2, $param) ? $param[2] : '', STR_PAD_LEFT);
                }
                break;
            case 'PAD_RIGHT':
                if (array_key_exists(1, $param)) {
                    $value = str_pad($param[0], intval($param[1]), array_key_exists(2, $param) ? $param[2] : '', STR_PAD_RIGHT);
                }
                break;
            case 'PAGE_TITLE':
                $value = is_null($DISPLAYED_TITLE) ? '' : $DISPLAYED_TITLE->evaluate();
                break;
            case 'SET_TITLE':
                if (array_key_exists(0, $param)) {
                    get_page_title($param[0], false);
                }
                break;
            case 'EXTRA_HEAD':
                $_value = $GLOBALS['EXTRA_HEAD'];
                if ($_value === NULL) {
                    $_value = new ocp_tempcode();
                }
                $value = $_value->evaluate();
                break;
            case 'EXTRA_FOOT':
                if ($GLOBALS['EXTRA_FOOT'] === NULL) {
                    $GLOBALS['EXTRA_FOOT'] = new ocp_tempcode();
                }
                $_value = $GLOBALS['EXTRA_FOOT'];
                if (array_key_exists(0, $param)) {
                    $GLOBALS['EXTRA_FOOT']->attach($param[0]);
                } else {
                    $value = $_value->evaluate();
                }
                break;
            case 'RAND':
                if (isset($GLOBALS['NON_CACHEABLE_SYMBOLS']['RAND'])) {
                    $GLOBALS['NO_EVAL_CACHE'] = true;
                    $value = strval(mt_rand(0, 32000));
                } else {
                    $value = '4';
                }
                break;
            case 'SET_RAND':
                if (isset($param[0])) {
                    if (isset($GLOBALS['NON_CACHEABLE_SYMBOLS']['SET_RAND'])) {
                        $GLOBALS['NO_EVAL_CACHE'] = true;
                        $value = $param[mt_rand(0, count($param) - 1)];
                    } else {
                        $value = $param[0];
                    }
                }
                break;
            case 'COPYRIGHT':
                $value = str_replace('$CURRENT_YEAR', date('Y'), get_option('copyright'));
                break;
            case 'KEYWORDS_SPACED':
                $value = str_replace(',', ' ', get_option('keywords'));
                break;
            case 'STAFF_ADDRESS_PURE':
                $value = get_option('staff_address');
                break;
            case 'STAFF_ADDRESS':
                require_code('obfuscate');
                $value = obfuscate_email_address(get_option('staff_address'));
                break;
            case 'DOMAIN':
                $value = get_domain();
                break;
            case 'BRAND_NAME':
                $value = function_exists('get_value') ? get_value('rebrand_name') : NULL;
                if (is_null($value)) {
                    $value = 'ocPortal';
                }
                break;
            case 'BRAND_BASE_URL':
                $value = brand_base_url();
                break;
            case 'SHOW_DOCS':
                $value = get_option('show_docs') === '0' ? '0' : '1';
                break;
            case 'MEMBER_EMAIL':
                $value = $GLOBALS['FORUM_DRIVER']->get_member_email_address(isset($param[0]) ? intval($param[0]) : get_member());
                break;
            case 'OCF_MEMBER_HTML':
                if (get_forum_type() == 'ocf') {
                    require_code('ocf_members');
                    require_code('ocf_members2');
                    $_value = ocf_show_member_box(isset($param[0]) ? intval($param[0]) : get_member());
                    $value = $_value->evaluate();
                }
                break;
            case 'HAS_SPECIFIC_PERMISSION':
                if (isset($param[0])) {
                    $value = has_specific_permission(!is_null($param) && isset($param[1]) ? intval($param[1]) : get_member(), $param[0]) ? '1' : '0';
                }
                break;
            case 'HAS_ZONE_ACCESS':
                if (isset($param[0])) {
                    $value = has_zone_access(!is_null($param) && isset($param[1]) ? intval($param[1]) : get_member(), $param[0]) ? '1' : '0';
                }
                break;
            case 'HAS_PAGE_ACCESS':
                if (isset($param[0]) && isset($param[1])) {
                    $value = has_page_access(!is_null($param) && isset($param[2]) ? intval($param[2]) : get_member(), $param[0], $param[1], !is_null($param) && isset($param[3]) ? $param[3] == '1' : false) ? '1' : '0';
                }
                break;
            case 'HAS_CATEGORY_ACCESS':
                if (isset($param[0])) {
                    $value = has_category_access(!is_null($param) && isset($param[2]) ? intval($param[2]) : get_member(), $param[0], $param[1]) ? '1' : '0';
                }
                break;
            case 'HAS_ATTACHMENT_ACCESS':
                if (isset($param[0])) {
                    require_code('attachments');
                    $value = has_attachment_access(!is_null($param) && isset($param[1]) ? intval($param[1]) : get_member(), $param[0]) ? '1' : '0';
                }
                break;
            case 'HAS_SUBMIT_PERMISSION':
                if (isset($param[0]) && (strtolower($param[0]) == 'low' || strtolower($param[0]) == 'mid' || strtolower($param[0]) == 'high')) {
                    $value = has_submit_permission(strtolower($param[0]), !is_null($param) && isset($param[1]) ? intval($param[1]) : get_member(), !is_null($param) && isset($param[2]) ? $param[2] : get_ip_address(), !is_null($param) && isset($param[3]) ? $param[3] : get_page_name()) ? '1' : '0';
                }
                break;
            case 'HAS_DELETE_PERMISSION':
                if (isset($param[0]) && (strtolower($param[0]) == 'low' || strtolower($param[0]) == 'mid' || strtolower($param[0]) == 'high') && isset($param[1])) {
                    $value = has_delete_permission(strtolower($param[0]), !is_null($param) && isset($param[2]) ? intval($param[2]) : get_member(), intval($param[1]), !is_null($param) && isset($param[3]) ? $param[3] : get_page_name()) ? '1' : '0';
                }
                break;
            case 'HAS_EDIT_PERMISSION':
                if (isset($param[0]) && (strtolower($param[0]) == 'low' || strtolower($param[0]) == 'mid' || strtolower($param[0]) == 'high') && isset($param[1])) {
                    $value = has_edit_permission(strtolower($param[0]), !is_null($param) && isset($param[2]) ? intval($param[2]) : get_member(), intval($param[1]), !is_null($param) && isset($param[3]) ? $param[3] : get_page_name()) ? '1' : '0';
                }
                break;
            case 'ENTITY_DECODE':
                if (isset($param[0])) {
                    $value = @html_entity_decode($param[0], ENT_QUOTES, get_charset());
                }
                break;
            case 'RESET_CYCLE':
                if (isset($param[0])) {
                    $CYCLES[$param[0]] = 0;
                }
                break;
            case 'SITE_SCOPE':
                $value = get_option('site_scope');
                break;
            case 'LAST_VISIT_TIME':
                if (get_forum_type() == 'ocf') {
                    $member_info = ocf_read_in_member_profile(get_member(), true);
                    $value = strval($member_info['last_visit_time']);
                }
                break;
            case 'NUM_NEW_TOPICS':
                if (get_forum_type() == 'ocf') {
                    $member_info = ocf_read_in_member_profile(get_member(), true);
                    $_new_topics = $GLOBALS['FORUM_DB']->query('SELECT COUNT(*) AS mycnt FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_topics WHERE NOT t_forum_id IS NULL AND t_cache_first_time>' . strval((int) $member_info['last_visit_time']));
                    $new_topics = $_new_topics[0]['mycnt'];
                    $value = strval($new_topics);
                }
                break;
            case 'NUM_NEW_POSTS':
                if (get_forum_type() == 'ocf') {
                    $member_info = ocf_read_in_member_profile(get_member(), true);
                    $_new_posts = $GLOBALS['FORUM_DB']->query('SELECT COUNT(*) AS mycnt FROM ' . $GLOBALS['FORUM_DB']->get_table_prefix() . 'f_posts WHERE NOT p_cache_forum_id IS NULL AND p_time>' . strval((int) $member_info['last_visit_time']));
                    $new_posts = $_new_posts[0]['mycnt'];
                    $value = strval($new_posts);
                }
                break;
            case 'HAS_FORUM':
                $value = has_no_forum() ? '0' : '1';
                break;
            case 'OCF':
                $value = get_forum_type() == 'ocf' ? '1' : '0';
                break;
            case 'BOARD_PREFIX':
                $value = get_forum_base_url();
                break;
            case 'DATE_AND_TIME':
                $use_contextual_dates = isset($param[0]) && $param[0] == '1';
                $verbose = isset($param[1]) && $param[1] == '1';
                $server_time = isset($param[2]) && $param[2] == '1';
                $time = isset($param[3]) ? intval($param[3]) : time();
                $value = get_timezoned_date($time, true, $verbose, $server_time, !$use_contextual_dates);
                break;
            case 'DATE':
                $use_contextual_dates = isset($param[0]) && $param[0] == '1';
                $verbose = isset($param[1]) && $param[1] == '1';
                $server_time = isset($param[2]) && $param[2] == '1';
                $time = isset($param[3]) ? intval($param[3]) : time();
                $value = get_timezoned_date($time, false, $verbose, $server_time, !$use_contextual_dates);
                break;
            case 'TIME':
                $time = isset($param[0]) ? intval($param[0]) : time();
                $value = get_timezoned_time($time);
                break;
            case 'SECONDS_PERIOD':
                if (array_key_exists(0, $param)) {
                    $value = display_seconds_period(intval($param[0]));
                }
                break;
            case 'FROM_TIMESTAMP':
                if (isset($param[0])) {
                    $timestamp = isset($param[1]) ? intval($param[1]) : time();
                    if (!array_key_exists(2, $param) || $param[2] == '1') {
                        $timestamp = utctime_to_usertime($timestamp);
                    }
                    $value = locale_filter(my_strftime($param[0], $timestamp));
                    if ($value == $param[0]) {
                        // If no conversion happened then the syntax must have been for 'date' not 'strftime'
                        $value = date($param[0], $timestamp);
                    }
                } else {
                    $timestamp = time();
                    $value = strval($timestamp);
                }
                break;
            case 'TO_TIMESTAMP':
                if (isset($param[0])) {
                    $value = strval(strtotime($param[0]));
                    if (array_key_exists(1, $param) && $param[1] == '1') {
                        $value = strval(usertime_to_utctime(intval($value)));
                    }
                    // '1' means date was in user-time so needs converting to a UTC timestamp
                } else {
                    $value = strval(time());
                }
                break;
            case 'SESSION_HASHED':
                $value = md5(strval(get_session_id()));
                break;
            case 'SESSION':
                $value = strval(get_session_id());
                break;
            case 'IN_ARRAY':
                if (isset($param[1])) {
                    $array = array_slice($param, 1);
                    $value = in_array($param[0], $array) ? '1' : '0';
                }
                break;
            case 'MULT':
                if (isset($param[1])) {
                    $value = float_to_raw_string(floatval($param[0]) * floatval($param[1]), 2, true);
                }
                break;
            case 'ROUND':
                if (isset($param[0])) {
                    $amount = isset($param[1]) ? intval($param[1]) : 0;
                    if ($amount > 0) {
                        $value = float_format(floatval($param[0]), $amount);
                    } else {
                        $value = strval(intval(round(floatval($param[0]), $amount)));
                    }
                }
                break;
            case 'DEV_MODE':
                $value = $GLOBALS['DEBUG_MODE'] ? '1' : '0';
                break;
            case 'BROWSER_MATCHES':
                if (isset($param[0])) {
                    $q = false;
                    foreach (explode('|', $param[0]) as $browser) {
                        $q = browser_matches($browser);
                        if ($q) {
                            break;
                        }
                    }
                    $value = $q ? '1' : '0';
                }
                break;
            case 'ISSET':
                if (isset($param[0])) {
                    $value = isset($TEMPCODE_SETGET[$param[0]]) ? '1' : '0';
                }
                break;
            case 'INIT':
                if (isset($param[1])) {
                    if (!isset($TEMPCODE_SETGET[$param[0]])) {
                        $TEMPCODE_SETGET[$param[0]] = $param[1];
                    }
                }
                break;
            case 'INC':
                if (isset($param[0])) {
                    if (!isset($TEMPCODE_SETGET[$param[0]])) {
                        $TEMPCODE_SETGET[$param[0]] = '0';
                    }
                    $TEMPCODE_SETGET[$param[0]] = strval(intval($TEMPCODE_SETGET[$param[0]]) + 1);
                }
                break;
            case 'DEC':
                if (isset($param[0])) {
                    if (!isset($TEMPCODE_SETGET[$param[0]])) {
                        $TEMPCODE_SETGET[$param[0]] = '0';
                    }
                    $TEMPCODE_SETGET[$param[0]] = strval(intval($TEMPCODE_SETGET[$param[0]]) - 1);
                }
                break;
            case 'PREG_MATCH':
                if (isset($param[1])) {
                    $value = preg_match('#' . str_replace('#', '\\#', $param[0]) . '#' . (isset($param[2]) ? str_replace('e', '', $param[2]) : ''), $param[1]) != 0 ? '1' : '0';
                }
                break;
            case 'PREG_REPLACE':
                if (isset($param[2])) {
                    $value = preg_replace('#' . str_replace('#', '\\#', $param[0]) . '#' . (isset($param[3]) ? str_replace('e', '', $param[3]) : ''), $param[1], $param[2]);
                }
                break;
            case 'MAX':
                if (isset($param[0])) {
                    $value = strval(max(intval($param[0]), intval($param[1])));
                }
                break;
            case 'MIN':
                if (isset($param[0])) {
                    $value = strval(min(intval($param[0]), intval($param[1])));
                }
                break;
            case 'MOD':
                if (isset($param[0])) {
                    $value = strval(max(intval($param[0]), -intval($param[0])));
                }
                break;
            case 'REM':
                if (isset($param[1])) {
                    $value = strval(intval($param[0]) % intval($param[1]));
                }
                break;
            case 'DIV_FLOAT':
                if (isset($param[1])) {
                    $value = float_to_raw_string(floatval($param[0]) / floatval($param[1]), 2, true);
                }
                break;
            case 'DIV':
                if (isset($param[1])) {
                    $value = strval(intval(floor(floatval($param[0]) / floatval($param[1]))));
                }
                break;
            case 'SUBTRACT':
                if (isset($param[1])) {
                    $value = float_to_raw_string(floatval(str_replace(',', '', $param[0])) - floatval(str_replace(',', '', $param[1])), 2, true);
                }
                break;
            case 'ADD':
                if (isset($param[1])) {
                    $value = float_to_raw_string(floatval(str_replace(',', '', $param[0])) + floatval(str_replace(',', '', $param[1])), 2, true);
                }
                break;
            case 'WCASE':
                if (isset($param[0])) {
                    $value = ucwords($param[0]);
                }
                break;
            case 'LCASE':
                if (isset($param[0])) {
                    $value = ocp_mb_strtolower($param[0]);
                }
                break;
            case 'UCASE':
                if (isset($param[0])) {
                    $value = ocp_mb_strtoupper($param[0]);
                }
                break;
            case '_POST':
                if (isset($param[0])) {
                    $value = post_param($param[0], isset($param[1]) ? $param[1] : '');
                }
                break;
            case 'REPLACE':
                if (isset($param[2])) {
                    $value = str_replace($param[0], $param[1], $param[2]);
                    if ($GLOBALS['XSS_DETECT'] && ocp_is_escaped($param[0])) {
                        ocp_mark_as_escaped($value);
                    }
                }
                break;
            case 'AT':
                if (isset($param[1])) {
                    $value = ocp_mb_substr($param[0], intval($param[1]), 1);
                }
                break;
            case 'STRPOS':
                if (isset($param[1])) {
                    $t_value = strpos($param[0], $param[1]);
                    $value = $t_value === false ? '0' : strval($t_value);
                }
                break;
            case 'IN_STR':
                if (isset($param[1])) {
                    if ($param[1] == '') {
                        $value = '0';
                    } else {
                        $value = '0';
                        foreach ($param as $i => $check) {
                            if (is_integer($i) && $i != 0 && $check != '') {
                                if (strpos($param[0], $check) !== false) {
                                    $value = '1';
                                    break;
                                }
                            }
                        }
                    }
                }
                break;
            case 'SUBSTR_COUNT':
                if (isset($param[1])) {
                    $value = strval(substr_count($param[0], $param[1]));
                }
                break;
            case 'SUBSTR':
                if (isset($param[1])) {
                    $value = ocp_mb_substr($param[0], intval($param[1]), isset($param[2]) ? intval($param[2]) : strlen($param[0]));
                }
                break;
            case 'LENGTH':
                if (isset($param[0])) {
                    $value = strval(ocp_mb_strlen($param[0]));
                }
                break;
            case 'WORDWRAP':
                if (isset($param[1])) {
                    $cut = isset($param[3]) && $param[3] == '1';
                    $value = wordwrap($param[0], intval($param[1]), isset($param[2]) ? $param[2] : '<br />', $cut);
                    if ($GLOBALS['XSS_DETECT'] && ocp_is_escaped($param[0])) {
                        ocp_mark_as_escaped($value);
                    }
                }
                break;
            case 'ALTERNATOR_TRUNCATED':
                // Alternate values according to whether some given text WOULD have been truncated. 0: text to check against, 1: the truncate length, 2:IF would not be do this, 3: if it would be do this, 4: whether given text is encoded as HTML (0=no [default, plain-text], 1=yes)
                if (isset($param[3])) {
                    $amount = intval($param[1]);
                    $is_html = isset($param[4]) && $param[4] == '1';
                    if (strlen($is_html ? strip_tags($param[0]) : $param[0]) > $amount) {
                        $value = $param[3];
                    } else {
                        $value = $param[2];
                    }
                }
                break;
            case 'ESCAPE':
                if (isset($param[0])) {
                    $d_escaping = array(isset($param[1]) ? constant($param[1]) : ENTITY_ESCAPED);
                    if (is_string($param[0])) {
                        apply_tempcode_escaping($d_escaping, $param[0]);
                    }
                    $value = $param[0];
                }
                break;
            case 'COOKIE_PATH':
                $value = function_exists('get_cookie_path') ? get_cookie_path() : '/';
                break;
            case 'COOKIE_DOMAIN':
                $s_value = function_exists('get_cookie_domain') ? get_cookie_domain() : '';
                $value = is_null($s_value) ? '' : $s_value;
                break;
            case 'IS_A_COOKIE_LOGIN':
                global $IS_A_COOKIE_LOGIN;
                $value = $IS_A_COOKIE_LOGIN && ini_get('suhosin.cookie.max_name_length') !== '64' ? '1' : '0';
                break;
            case 'GROUP_ID':
                if (isset($param[0])) {
                    $groups = $GLOBALS['FORUM_DRIVER']->get_members_groups(isset($param[1]) ? intval($param[1]) : get_member());
                    $value = array_key_exists(intval($param[0]), $groups) ? strval($groups[intval($param[0])]) : '';
                }
                break;
            case 'GROUP_NAME':
                if (isset($param[0])) {
                    $groups = $GLOBALS['FORUM_DRIVER']->get_members_groups(isset($param[1]) ? intval($param[1]) : get_member());
                    if (array_key_exists(intval($param[0]), $groups)) {
                        $all_usergroups = $GLOBALS['FORUM_DRIVER']->get_usergroup_list();
                        $value = $all_usergroups[$groups[intval($param[0])]];
                    }
                    if ($GLOBALS['XSS_DETECT'] && ocp_is_escaped($param[0])) {
                        ocp_mark_as_escaped($value);
                    }
                }
                break;
            case 'NEGATE':
                if (isset($param[0])) {
                    $value = strval(-intval($param[0]));
                }
                break;
            case 'XOR':
                $count = 0;
                foreach ($param as $test) {
                    if ($test == '1' || $test == '1') {
                        $count++;
                    }
                }
                $value = $count == 1 ? '1' : '0';
                break;
            case 'NOR':
                $count = 0;
                foreach ($param as $test) {
                    if ($test == '1' || $test == '1') {
                        $count++;
                    }
                }
                $value = $count > 0 ? '0' : '1';
                break;
            case 'NAND':
                $count = 0;
                foreach ($param as $test) {
                    if ($test == '1' || $test == '1') {
                        $count++;
                    }
                }
                $value = $count == count($param) ? '0' : '1';
                break;
            case 'LT':
                if (isset($param[1])) {
                    $value = intval($param[0]) < intval($param[1]) ? '1' : '0';
                }
                break;
            case 'GT':
                if (isset($param[1])) {
                    $value = intval($param[0]) > intval($param[1]) ? '1' : '0';
                }
                break;
            case 'COPPA_ON':
                $value = get_option('is_on_coppa') == '1' ? '1' : '0';
                break;
            case 'OBFUSCATE':
                if (isset($param[0])) {
                    require_code('obfuscate');
                    $value = obfuscate_entities($param[0]);
                }
                break;
            case 'FIX_ID':
                if (isset($param[0])) {
                    $value = fix_id($param[0]);
                    if ($GLOBALS['XSS_DETECT']) {
                        ocp_mark_as_escaped($value);
                    }
                }
                break;
            case 'MAILTO':
                require_code('obfuscate');
                $value = mailto_obfuscated();
                break;
            case 'INLINE_STATS':
                $value = get_option('show_inline_stats') == '1' ? '1' : '0';
                break;
            case 'ATTACHMENT_DOWNLOADS':
                if (isset($param[0])) {
                    $db = $GLOBALS['SITE_DB'];
                    if (isset($param[1]) && $param[1] == '1') {
                        $db = $GLOBALS['FORUM_DB'];
                    }
                    $_value = $db->query_value_null_ok('attachments', 'a_num_downloads', array('id' => intval($param[0])));
                    $value = is_null($_value) ? '?' : strval($_value);
                }
                break;
            case 'CSS_DIMENSION_REDUCE':
                if (isset($param[1])) {
                    $value = $param[0];
                    if (substr($value, -2) == 'px') {
                        $b = $param[1];
                        $value = strval(intval(substr($value, 0, -2)) - intval($b)) . 'px';
                    }
                    if ($value == '') {
                        $value = '0px';
                    }
                }
                break;
            case 'COMMENT_COUNT':
                if (isset($param[1])) {
                    if (get_option('is_on_comments') == '1') {
                        $count = 0;
                        $_comments = $GLOBALS['FORUM_DRIVER']->get_forum_topic_posts($GLOBALS['FORUM_DRIVER']->find_topic_id_for_topic_identifier(get_option('comments_forum_name'), $param[0] . '_' . $param[1]), $count, 0, 0, false);
                        $_value = do_lang_tempcode('_COMMENTS', integer_format(0));
                        if (is_array($_comments)) {
                            $_value = do_lang_tempcode('_COMMENTS', escape_html(integer_format($count)));
                        }
                        $value = $_value->evaluate();
                    } else {
                        $value = do_lang('VIEW');
                    }
                }
                break;
            case 'CAN_SPELLCHECK':
                $value = function_exists('pspell_check') ? '1' : '0';
                break;
            case 'AWARD_ID':
                if (array_key_exists(0, $param)) {
                    $value = $GLOBALS['SITE_DB']->query_value_null_ok('award_archive', 'content_id', array('a_type_id' => intval($param[0])), 'ORDER BY date_and_time DESC');
                    if (is_null($value)) {
                        $value = '';
                    }
                }
                break;
            case 'SELF_PAGE_LINK':
                $value = '';
                if (running_script('index') || running_script('iframe')) {
                    $value = get_zone_name() . ':' . get_page_name();
                    foreach ($_GET as $key => $val) {
                        if ($key == 'page') {
                            continue;
                        }
                        if (is_array($val)) {
                            continue;
                        }
                        if (substr($key, 0, 5) == 'keep_') {
                            continue;
                        }
                        $value .= ':' . $key . '=' . $val;
                    }
                }
                break;
            case 'SET_TUTORIAL_LINK':
                $value = '';
                if (array_key_exists(1, $param) && $param[1] != '' && $param[1][0] != '#') {
                    set_tutorial_link($param[0], $param[1]);
                }
                break;
            case 'DISPLAY_CONCEPT':
                $value = '';
                if (array_key_exists(0, $param)) {
                    $key = $param[0];
                    $page_link = get_tutorial_link('concept___' . preg_replace('#[^\\w_]#', '_', $key));
                    if (is_null($page_link)) {
                        $temp_tpl = make_string_tempcode($key);
                    } else {
                        list($zone, $attributes, $hash) = page_link_decode($page_link);
                        $_url = build_url($attributes, $zone, NULL, false, false, false, $hash);
                        $temp_tpl = do_template('COMCODE_CONCEPT', array('_GUID' => 'ee0cd05f87329923f05145180004d8a8', 'TEXT' => $key, 'URL' => $_url));
                    }
                    $value = $temp_tpl->evaluate();
                }
                break;
            case 'SELF_URL':
                $extra_params = NULL;
                if (isset($param[3])) {
                    $extra_params = array();
                    $i = 3;
                    while (isset($param[$i])) {
                        $bits = explode('=', $param[$i], 2);
                        if ($bits[1] == '<null>') {
                            $bits[1] = NULL;
                        }
                        $extra_params[$bits[0]] = $bits[1];
                        $i++;
                    }
                }
                $value = get_self_url(true, isset($param[0]) && $param[0] == '1', $extra_params, isset($param[1]) && $param[1] == '1', isset($param[2]) && $param[2] == '1');
                break;
            case 'SHIFT_DECODE':
                if (isset($param[0])) {
                    global $SHIFT_VARIABLES;
                    $key = $param[0];
                    $value = isset($SHIFT_VARIABLES[$key]) ? $SHIFT_VARIABLES[$key]->evaluate() : '';
                }
                break;
            case 'NUMBER_FORMAT':
                if (isset($param[0])) {
                    $value = integer_format(intval($param[0]));
                }
                break;
            case 'FLOAT_FORMAT':
                if (isset($param[0])) {
                    $value = float_format(floatval($param[0]));
                }
                break;
            case 'CURRENTLY_INVISIBLE':
                $value = is_invisible() ? '1' : '0';
                break;
            case 'IS_FRIEND':
                if (isset($param[0])) {
                    $test = $GLOBALS['SITE_DB']->query_value_null_ok('chat_buddies', 'member_likes', array('member_likes' => isset($param[1]) ? intval($param[1]) : get_member(), 'member_liked' => intval($param[0])));
                    $value = is_null($test) ? '0' : '1';
                }
                break;
            case 'SSW':
                $value = get_option('ssw') == '1' ? '1' : '0';
                break;
            case 'RATING':
                if (isset($param[1])) {
                    require_code('feedback');
                    $rating = get_rating_simple_array(array_key_exists(3, $param) ? $param[3] : get_self_url(true), array_key_exists(4, $param) ? $param[4] : (is_null($DISPLAYED_TITLE) ? '' : $DISPLAYED_TITLE->evaluate()), $param[0], $param[1], array_key_exists(5, $param) ? $param[5] : 'RATING_FORM', array_key_exists(2, $param) ? $param[2] : NULL);
                    if ($rating !== NULL) {
                        if (!array_key_exists(2, $param) || $param[2] == '0') {
                            $value = isset($rating['ALL_RATING_CRITERIA'][0]['RATING']) ? $rating['ALL_RATING_CRITERIA'][0]['RATING'] : '';
                        } else {
                            $value = do_template('RATING_INLINE_STATIC', $rating);
                        }
                        if (is_object($value)) {
                            $value = $value->evaluate();
                        }
                    }
                }
                break;
            case 'VIEWS':
                if (isset($param[2])) {
                    $id_field = 'id';
                    // Not allowed for security reasons
                    if (preg_match('#^\\w*views\\w*$#', $param[1]) != 0) {
                        $test = $GLOBALS['SITE_DB']->query_value_null_ok($param[0], $param[1], array($id_field => $param[2]));
                        if (!is_null($test)) {
                            $value = integer_format($test);
                        }
                    }
                }
                break;
            default:
                global $EXTRA_SYMBOLS;
                if (is_null($EXTRA_SYMBOLS)) {
                    $EXTRA_SYMBOLS = array();
                    $hooks = find_all_hooks('systems', 'symbols');
                    foreach (array_keys($hooks) as $hook) {
                        $EXTRA_SYMBOLS[$hook] = array();
                    }
                }
                if (array_key_exists($name, $EXTRA_SYMBOLS)) {
                    if (!array_key_exists('ob', $EXTRA_SYMBOLS[$name])) {
                        require_code('hooks/systems/symbols/' . filter_naughty_harsh($name));
                        $EXTRA_SYMBOLS[$name]['ob'] = object_factory('Hook_symbol_' . filter_naughty_harsh($name));
                    }
                    $value = $EXTRA_SYMBOLS[$name]['ob']->run($param);
                    break;
                }
                if (defined($name)) {
                    $value = @strval(constant($name));
                    break;
                }
                $value = '';
                require_code('site');
                attach_message(do_lang_tempcode('MISSING_SYMBOL', escape_html($name)), 'warn');
        }
        if ($escaped != array()) {
            if (is_object($value)) {
                $value = $value->evaluate();
            }
            apply_tempcode_escaping($escaped, $value);
        }
        if ($cacheable) {
            $SYMBOL_CACHE[$escaped_codes] = $value;
        }
        return $value;
    }
    // Is it a directive?
    if ($type == TC_DIRECTIVE) {
        $value = '';
        if ($GLOBALS['XSS_DETECT']) {
            ocp_mark_as_escaped($value);
        }
        // In our param we should have a map of bubbled template parameters (under 'vars') and our numbered directive parameters
        if ($param === NULL) {
            $param = array();
        }
        // Closure-based Tempcode parser may send in strings, so we need to adapt...
        foreach ($param as $key => $val) {
            if (is_string($val)) {
                $param[$key] = make_string_tempcode($val);
            }
        }
        if (!isset($param['vars'])) {
            $param['vars'] = array();
        }
        switch ($name) {
            case 'SHIFT_ENCODE':
                break;
            case 'PARAM_INFO':
                $_value = do_template('PARAM_INFO', array('MAP' => $param['vars']));
                $value = $_value->evaluate();
                break;
            case 'CSS_INHERIT':
                // e.g. {+START,CSS_INHERIT,global,default,#886aa9}{+END}
                if (isset($param[0])) {
                    require_code('css_and_js');
                    $css_file = $param[0]->evaluate();
                    $theme = isset($param[1]) ? $param[1]->evaluate() : 'default';
                    $seed = isset($param[2]) ? $param[2]->evaluate() : NULL;
                    if ($seed == '') {
                        $seed = NULL;
                    }
                    $dark = isset($param[3]) ? $param[3]->evaluate() == '1' : false;
                    $algorithm = isset($param[4]) ? $param[4]->evaluate() : 'equations';
                    $value = css_inherit($css_file, $theme, $GLOBALS['FORUM_DRIVER']->get_theme(), $seed, $dark, $algorithm);
                }
                break;
            case 'FRACTIONAL_EDITABLE':
                foreach (array_keys($param) as $key) {
                    if (!is_numeric($key)) {
                        unset($param[$key]);
                    }
                }
                if (isset($param[3])) {
                    $edit_text = $param[0]->evaluate();
                    $edit_param_name = $param[1]->evaluate();
                    $edit_pagelink = $param[2]->evaluate();
                    $supports_comcode = (isset($param[4]) ? $param[3]->evaluate() : '0') == '1';
                    list($zone, $attributes, ) = page_link_decode($edit_pagelink);
                    if ($zone == '_SEARCH') {
                        $zone = get_module_zone($attributes['page']);
                    }
                    if (has_actual_page_access(get_member(), $attributes['page'], $zone) && has_zone_access(get_member(), 'adminzone')) {
                        $keep = symbol_tempcode('KEEP');
                        $url = find_script('fractional_edit') . '?edit_param_name=' . urlencode($edit_param_name) . '&supports_comcode=' . ($supports_comcode ? '1' : '0') . '&zone=' . urlencode($zone) . $keep->evaluate();
                        foreach ($attributes as $key => $val) {
                            $url .= '&' . $key . '=' . urlencode($val);
                        }
                        $_value = $param[count($param) - 1];
                        $_value = do_template('FRACTIONAL_EDIT', array('_GUID' => '075ac126c427d28b309004bc67b32b08', 'VALUE' => $_value, 'URL' => $url, 'EDIT_TEXT' => $edit_text, 'EDIT_PARAM_NAME' => $edit_param_name));
                        $value = $_value->evaluate();
                    } else {
                        $value = $param[count($param) - 1]->evaluate();
                    }
                }
                break;
            case 'SET':
                if (isset($param[1])) {
                    $var = $param[0]->evaluate();
                    $set_val = '';
                    $i = 1;
                    while (isset($param[$i])) {
                        if ($i != 1) {
                            $set_val .= ',';
                        }
                        $set_val .= $param[1]->evaluate();
                        $i++;
                    }
                    $TEMPCODE_SETGET[$var] = $set_val;
                }
                break;
            case 'IN_ARRAY':
                if (isset($param[1])) {
                    $key = $param[1]->evaluate();
                    $array = array_key_exists($key, $param['vars']) ? $param['vars'][$key] : array();
                    $value = in_array($param[0]->evaluate(), $array) ? '1' : '0';
                }
                break;
            case 'NOT_IN_ARRAY':
                if (isset($param[1])) {
                    $key = $param[1]->evaluate();
                    $array = array_key_exists($key, $param['vars']) ? $param['vars'][$key] : array();
                    $value = in_array($param[0]->evaluate(), $array) ? '0' : '1';
                }
                break;
            case 'IF_IN_ARRAY':
                if (isset($param[2])) {
                    $key = $param[1]->evaluate();
                    $array = array_key_exists($key, $param['vars']) ? $param['vars'][$key] : array();
                    $value = in_array($param[0]->evaluate(), $array) ? $param[2]->evaluate() : '';
                }
                break;
            case 'IF_NOT_IN_ARRAY':
                if (isset($param[2])) {
                    $key = $param[1]->evaluate();
                    $array = array_key_exists($key, $param['vars']) ? $param['vars'][$key] : array();
                    $value = in_array($param[0]->evaluate(), $array) ? '' : $param[2]->evaluate();
                }
                break;
            case 'IMPLODE':
                if (isset($param[1])) {
                    $key = $param[1]->evaluate();
                    $array = array_key_exists($key, $param['vars']) ? $param['vars'][$key] : array();
                    if (isset($param[2]) && $param[2]->evaluate() == '1') {
                        $delim = $param[0]->evaluate();
                        foreach ($array as $key => $val) {
                            if ($value != '') {
                                $value .= $delim;
                            }
                            $value .= (is_integer($key) ? integer_format($key) : $key) . ' = ' . $val;
                        }
                    } else {
                        $value = implode($param[0]->evaluate(), $array);
                    }
                }
                break;
            case 'COUNT':
                if (isset($param[0])) {
                    $key = $param[0]->evaluate();
                    $array = array_key_exists($key, $param['vars']) ? $param['vars'][$key] : array();
                    $value = strval(count($array));
                }
                break;
            case 'BOX':
                unset($param['vars']);
                $title = isset($param[1]) ? $param[0]->evaluate() : '';
                $dimensions = isset($param[2]) ? $param[1]->evaluate() : '100%';
                if ($dimensions == '') {
                    $dimensions = '100%';
                }
                $box_type = isset($param[3]) ? $param[2]->evaluate() : 'classic';
                $options = isset($param[4]) ? $param[3]->evaluate() : '';
                $meta = isset($param[5]) ? $param[4]->evaluate() : '';
                $links = isset($param[6]) ? $param[5]->evaluate() : '';
                $expand = isset($param[7]) ? $param[6]->evaluate() == '1' : false;
                $toplink = isset($param[8]) ? $param[7]->evaluate() : '';
                $tmp = put_in_standard_box(array_pop($param), $title, $dimensions, $box_type, $options, $meta, $links, $expand, $toplink);
                $value = $tmp->evaluate();
                break;
            case 'IF_NON_EMPTY':
                if (isset($param[1])) {
                    if (!$param[0]->is_really_empty()) {
                        $value = $param[1]->evaluate();
                    }
                }
                break;
            case 'IF_PASSED':
                if (isset($param[1])) {
                    $t = $param[0]->evaluate();
                    if (isset($param['vars'][$t])) {
                        $value = $param[1]->evaluate();
                    }
                }
                break;
            case 'IF_NON_PASSED':
                if (isset($param[1])) {
                    $t = $param[0]->evaluate();
                    if (!isset($param['vars'][$t])) {
                        $value = $param[1]->evaluate();
                    }
                }
                break;
            case 'IF_EMPTY':
                if (isset($param[1])) {
                    if ($param[0]->is_really_empty()) {
                        $value = $param[1]->evaluate();
                    }
                }
                break;
            case 'IF_ARRAY_EMPTY':
                if (isset($param[0])) {
                    $looking_at = $param[0]->evaluate();
                    if (array_key_exists($looking_at, $param['vars'])) {
                        if (count($param['vars'][$looking_at]) == 0) {
                            $value = $param[1]->evaluate();
                        }
                    }
                }
                break;
            case 'IF_ARRAY_NON_EMPTY':
                if (isset($param[0])) {
                    $looking_at = $param[0]->evaluate();
                    if (array_key_exists($looking_at, $param['vars'])) {
                        if (count($param['vars'][$looking_at]) != 0) {
                            $value = $param[1]->evaluate();
                        }
                    }
                }
                break;
            case 'OF':
                if (isset($param[1])) {
                    $key = $param[0]->evaluate();
                    $x = $param[1]->evaluate();
                    $array = array_key_exists($key, $param['vars']) ? $param['vars'][$key] : array();
                    $x2 = is_numeric($x) ? intval($x) : $x;
                    if (is_integer($x2)) {
                        if ($x2 < 0) {
                            $x2 = count($array) - 1;
                        } elseif ($x2 >= count($array)) {
                            $x2 -= count($array);
                        }
                    }
                    $value = array_key_exists($x2, $array) ? $array[$x2] : '';
                    if (is_object($value)) {
                        $value = $value->evaluate();
                    }
                }
                break;
            case 'INCLUDE':
                if (isset($param[1])) {
                    $tpl_params = $param['vars'];
                    $explode = explode(chr(10), $param[1]->evaluate());
                    foreach ($explode as $val) {
                        $bits = explode('=', $val, 2);
                        if (count($bits) == 2) {
                            $tpl_params[ltrim($bits[0])] = $bits[1];
                        }
                    }
                    $td = isset($param[3]) ? $param[2]->evaluate() : '';
                    if ($td == '') {
                        $td = 'templates';
                    }
                    $ex = isset($param[2]) ? $param[1]->evaluate() : '';
                    if ($ex == '') {
                        $ex = '.tpl';
                    }
                    $_value = do_template($param[0]->evaluate(), $tpl_params, NULL, false, NULL, $ex, $td);
                    $value = $_value->evaluate();
                }
                break;
            case 'WHILE':
                if (isset($param[1])) {
                    $_p = $param[0]->evaluate();
                    if ($_p == '1' || $_p == '1') {
                        $value = '';
                        $value .= $param[1]->evaluate();
                        $value .= ecv($lang, $escaped, $type, $name, $param);
                    }
                }
                break;
            case 'IF':
                if (isset($param[1])) {
                    $_p = $param[0]->evaluate();
                    if ($_p == '1' || $_p == '1') {
                        $value = $param[1]->evaluate();
                    }
                }
                break;
            case 'LOOP':
                if (isset($param[0])) {
                    if (!array_key_exists($param[0]->evaluate(), $param['vars'])) {
                        require_code('site');
                        attach_message(do_lang_tempcode('MISSING_TEMPLATE_PARAMETER', $param[0]->evaluate(), '???'), 'warn');
                        return '';
                    }
                    $array_key = $param[0]->evaluate();
                    if (is_numeric($array_key) || strpos($array_key, ',') !== false) {
                        $array = explode(',', $array_key);
                    } else {
                        $array = array_key_exists($array_key, $param['vars']) ? $param['vars'][$array_key] : array();
                        if (!is_array($array)) {
                            $array = array();
                        }
                    }
                    $value = '';
                    if (array_key_exists(1 + 1, $param)) {
                        $columns = $param[1]->evaluate();
                        $row_starter = array_key_exists(2 + 1, $param) ? $param[2]->evaluate() : '<tr>';
                        $row_terminator = array_key_exists(3 + 1, $param) ? $param[3]->evaluate() : '</tr>';
                        $value .= $row_starter;
                        // Sorting
                        if (array_key_exists(4 + 1, $param)) {
                            $sort_key = $param[4]->evaluate();
                            $rev = array_key_exists(5 + 1, $param) && $param[5]->evaluate() == 'DESC';
                            if ($sort_key != '') {
                                global $M_SORT_KEY;
                                $M_SORT_KEY = $sort_key;
                                uasort($array, 'multi_sort');
                            }
                            if ($rev) {
                                $array = array_reverse($array);
                            }
                        }
                    }
                    $last = count($param) - 2;
                    $col = 0;
                    $first = true;
                    foreach ($array as $go_key => $go) {
                        if (!is_array($go)) {
                            $go = array('_loop_key' => make_string_tempcode(is_integer($go_key) ? strval($go_key) : $go_key), '_loop_var' => make_string_tempcode($go));
                        }
                        // In case it's not a list of maps, but just a list
                        if (isset($param[2]) && $col % $columns == 0 && $col != 0) {
                            $value .= $row_starter;
                        }
                        $ps = $go + $param['vars'] + array('_loop_key' => make_string_tempcode(is_integer($go_key) ? strval($go_key) : $go_key), '_i' => strval($col), '_first' => $first, '_last' => $col == count($array) - 1);
                        $bound = $param[$last]->bind($ps, '');
                        $value .= $bound->evaluate();
                        ++$col;
                        if (isset($param[3]) && $col % $columns == 0) {
                            $value .= $row_terminator;
                        }
                        $first = false;
                    }
                    if (isset($param[2]) && $col % $columns != 0) {
                        $value .= $row_terminator;
                    }
                }
                break;
            default:
                require_code('site');
                attach_message(do_lang_tempcode('UNKNOWN_DIRECTIVE', escape_html($name)), 'warn');
        }
        if ($escaped != array()) {
            apply_tempcode_escaping($escaped, $value);
        }
        return $value;
    }
    // By elimination, it's language
    $a = isset($param[0]) ? is_object($param[0]) ? $param[0]->evaluate() : $param[0] : NULL;
    $b = isset($param[1]) ? is_object($param[1]) ? $param[1]->evaluate() : $param[1] : NULL;
    $c = isset($param[2]) ? array_splice($param, 2) : NULL;
    if ($c !== NULL) {
        foreach ($c as $i => $cc) {
            if (is_object($cc)) {
                $c[$i] = $cc->evaluate();
            }
        }
    }
    static $dle = false;
    if (!$dle) {
        $dle = function_exists('do_lang');
    }
    $ret = $dle ? do_lang($name, $a, $b, $c, $lang, false) : escape_html($name . ':' . (!is_null($a) ? $a : '') . ',' . (!is_null($b) ? $b : ''));
    if ($ret === NULL) {
        if ($type != TC_PARAMETER) {
            require_code('site');
            attach_message(do_lang_tempcode('MISSING_LANG_ENTRY', escape_html($name)), 'warn');
        }
        $value = '';
        if ($GLOBALS['XSS_DETECT']) {
            ocp_mark_as_escaped($value);
        }
        return $value;
    }
    if ($escaped != array() && $escaped != array(ENTITY_ESCAPED)) {
        apply_tempcode_escaping(array_diff($escaped, array(ENTITY_ESCAPED)), $ret);
    }
    // Escape but without ENTITY_ESCAPED because we don't do that on lang strings
    return $ret;
}
Esempio n. 8
0
 /**
  * Standard modular run function.
  *
  * @param  array		A map of parameters.
  * @return tempcode	The result of execution.
  */
 function run($map)
 {
     require_lang('news');
     require_css('news');
     require_code('obfuscate');
     $url = array_key_exists('param', $map) ? $map['param'] : 'http://ocportal.com/backend.php?type=rss&mode=news&filter=1,2,17,18,29,30';
     // http://news.google.co.uk/news?hs=UTT&tab=wn&topic=w&output=atom
     require_code('rss');
     $rss_feeds = array();
     $urls = preg_split('#\\s+#', $url);
     $error = NULL;
     foreach (array_reverse($urls) as $url) {
         $url = trim($url);
         if ($url == '') {
             continue;
         }
         $rss = new rss($url);
         if (!is_null($rss->error)) {
             $error = $rss->error;
             continue;
         }
         $rss_feeds[] = $rss;
     }
     if (!is_null($error) && count($rss_feeds) == 0) {
         $GLOBALS['DO_NOT_CACHE_THIS'] = true;
         require_code('failure');
         if (strpos($url, 'twitter') === false) {
             // Twitter is always failing ;).
             relay_error_notification(do_lang('ERROR_HANDLING_RSS_FEED', $url, $error), false, 'error_occurred_rss');
         }
         if (cron_installed()) {
             if (!$GLOBALS['FORUM_DRIVER']->is_staff(get_member())) {
                 return new ocp_tempcode();
             }
         }
         return do_template('INLINE_WIP_MESSAGE', array('MESSAGE' => htmlentities($error)));
     }
     global $NEWS_CATS;
     $NEWS_CATS = $GLOBALS['SITE_DB']->query_select('news_categories', array('*'), array('nc_owner' => NULL));
     $NEWS_CATS = list_to_map('id', $NEWS_CATS);
     if (!array_key_exists('title', $rss->gleamed_feed)) {
         $rss->gleamed_feed['title'] = do_lang_tempcode('RSS_STREAM');
     }
     if (array_key_exists('title', $map)) {
         $rss->gleamed_feed['title'] = $map['title'];
     }
     // Reduce what we collected about the feed to a minimum. This is very awkward, as we don't know what's here.
     if (!array_key_exists('copyright', $rss->gleamed_feed)) {
         $rss->gleamed_feed['copyright'] = '';
     }
     if (array_key_exists('copyright', $map)) {
         $rss->gleamed_feed['copyright'] = $map['copyright'];
     }
     // Now for the actual stream contents
     $max = array_key_exists('max_entries', $map) ? intval($map['max_entries']) : 10;
     $content = new ocp_tempcode();
     $items = array();
     foreach ($rss_feeds as $_rss) {
         foreach ($_rss->gleamed_items as $item) {
             if (!array_key_exists('clean_add_date', $item)) {
                 $item['clean_add_date'] = time();
             }
             $items[] = $item;
         }
     }
     global $M_SORT_KEY;
     $M_SORT_KEY = 'clean_add_date';
     usort($items, 'multi_sort');
     $items = array_reverse($items);
     foreach ($items as $i => $item) {
         if ($i >= $max) {
             break;
         }
         if (array_key_exists('full_url', $item)) {
             $_full_url = $item['full_url'];
         } elseif (array_key_exists('guid', $item)) {
             $_full_url = $item['guid'];
         } elseif (array_key_exists('comment_url', $item)) {
             $_full_url = $item['comment_url'];
         } else {
             $_full_url = '';
         }
         $_title = $item['title'];
         $_title = array_key_exists('title', $item) ? $item['title'] : '';
         $full_url = $_full_url != '' ? hyperlink($_full_url, do_lang_tempcode('VIEW'), true, false, $_title) : new ocp_tempcode();
         if (array_key_exists('category', $rss->gleamed_items)) {
             $_title = do_template('BLOCK_MAIN_RSS_TITLE', array('_GUID' => 'd962c1165564f080329decffeab88ba7', 'CATEGORY' => $rss->gleamed_items['category'], 'TITLE' => $_title));
         }
         if (!array_key_exists('news', $item)) {
             $news = array_key_exists('news_article', $item) ? $item['news_article'] : '';
             $news_full = new ocp_tempcode();
         } else {
             $news = $item['news'];
             if (array_key_exists('news_article', $item)) {
                 $news_full = do_template('BLOCK_MAIN_RSS_FULL', array('_GUID' => 'adcd82c64966f54fb0173b8edc626bd7', 'RAND' => strval(mt_rand(0, 999999)), 'NEWS_FULL' => $item['news_article']));
             } else {
                 $news_full = new ocp_tempcode();
             }
         }
         if (array_key_exists('author', $item)) {
             $_author = $item['author'];
             if (array_key_exists('author_url', $item)) {
                 $__author = hyperlink($item['author_url'], escape_html($_author));
             } elseif (array_key_exists('author_email', $item)) {
                 $__author = hyperlink(protect_from_escaping(mailto_obfuscated() . (strpos($item['author_email'], '&') !== false ? $item['author_email'] : obfuscate_email_address($item['author_email']))), escape_html($_author));
             } else {
                 $__author = make_string_tempcode($_author);
             }
             $author = do_lang_tempcode('SUBMITTED_BY', $__author->evaluate());
         } else {
             $author = new ocp_tempcode();
         }
         // If we want to show in a tails arrangement (by default, we won't)
         if (!$author->is_empty()) {
             $tails = do_template('BLOCK_MAIN_RSS_LIST_FIRST', array('_GUID' => '5ce8a5f1fd8a9487c01b63e791618589', 'X' => $author));
             $tails->attach(do_template('BLOCK_MAIN_RSS_LIST_LAST', array('_GUID' => 'f199850d1b76cc4a6774731e1f89762e', 'X' => $full_url)));
         } else {
             $tails = new ocp_tempcode();
         }
         if (array_key_exists('category', $item)) {
             global $IMG_CODES;
             $cat = NULL;
             foreach ($NEWS_CATS as $_cat => $news_cat) {
                 if (get_translated_text($news_cat['nc_title']) == $item['category']) {
                     $cat = $_cat;
                 }
             }
             if (!is_null($cat)) {
                 $img = find_theme_image($NEWS_CATS[$cat]['nc_img']);
                 if (is_null($img)) {
                     $img = '';
                 }
                 if ($img != '' && url_is_local($img)) {
                     $img = get_custom_base_url() . '/' . $img;
                 }
                 $category = do_template('BLOCK_MAIN_RSS_CATEGORY', array('_GUID' => '9b70a0d7524b62ea74bdb8071f4e88b5', 'IMG' => $img, 'CATEGORY' => $item['category']));
             } else {
                 $category = do_template('BLOCK_MAIN_RSS_CATEGORY_NO_IMG', array('_GUID' => '772e44215bd2682e51a96b7480753ded', 'CATEGORY' => $item['category']));
             }
         } else {
             $category = new ocp_tempcode();
         }
         if (array_key_exists('add_date', $item)) {
             $__title = do_template('BLOCK_MAIN_RSS_FROM_TITLE', array('_GUID' => 'ba9d262682d2e7d74c393508c8d49dd6', 'FEED_URL' => $url, 'NEWS_TITLE' => $_title, 'DATE' => $item['add_date']));
         } else {
             $__title = $_title;
         }
         $content->attach(do_template('BLOCK_MAIN_RSS_SUMMARY', array('_GUID' => '9ca64090348263449ea1fcea75c8ed5f', 'FEED_URL' => $url, 'NEWS_FULL' => $news_full, 'DATE' => array_key_exists('add_date', $item) ? $item['add_date'] : '', 'DATE_RAW' => array_key_exists('clean_add_date', $item) ? strval($item['clean_add_date']) : '', 'TAILS' => $tails, 'AUTHOR' => $author, 'CATEGORY' => $category, 'FULL_URL' => $full_url, 'FULL_URL_RAW' => $_full_url, 'NEWS_TITLE' => $__title, 'NEWS' => $news)));
     }
     if (array_key_exists('author', $rss->gleamed_feed)) {
         $__author = NULL;
         $_author_string = $rss->gleamed_feed['author'];
         if (array_key_exists('url', $rss->gleamed_feed)) {
             $__author = hyperlink($rss->gleamed_feed['url'], escape_html($_author_string), true);
         } elseif (array_key_exists('author_url', $rss->gleamed_feed)) {
             $__author = hyperlink($rss->gleamed_feed['author_url'], escape_html($_author_string), true);
         } elseif (array_key_exists('author_email', $rss->gleamed_feed)) {
             $__author = hyperlink(mailto_obfuscated() . obfuscate_email_address($rss->gleamed_feed['author_email']), escape_html($_author_string), true);
         }
         if (!is_null($__author)) {
             $_author_string = $__author->evaluate();
         }
         $author = do_lang_tempcode('RSS_SOURCE_FROM', $_author_string);
     } else {
         $author = new ocp_tempcode();
     }
     return do_template('BLOCK_MAIN_RSS', array('_GUID' => '6c9c1287abff88fda881e3e25ef7b296', 'FEED_URL' => $url, 'TITLE' => $rss->gleamed_feed['title'], 'COPYRIGHT' => $rss->gleamed_feed['copyright'], 'AUTHOR' => $author, 'CONTENT' => $content));
 }