public static function validate_regex($regex, $element) { if (is_string($regex) && @get_class($element) == CRAYON_ELEMENT_CLASS) { // If the (?alt) tag has been used, insert the file into the regex $file = self::regex_match('#\\(\\?alt:(.+?)\\)#', $regex); if (count($file) == 2) { // Element 0 has full match, 1 has captured groups for ($i = 0; $i < count($file[1]); $i++) { $file_lines = CrayonUtil::lines(dirname($element->path()) . crayon_s() . $file[1][$i], 'rcwh'); if ($file_lines !== FALSE) { $file_lines = implode('|', $file_lines); // If any spaces exist, treat them as whitespace $file_lines = preg_replace('#[ \\t]+#msi', '\\s+', $file_lines); $regex = str_replace($file[0][$i], "(?:{$file_lines})", $regex); } else { CrayonLog::syslog("Parsing of '{$element->path()}' failed, an (?alt) tag failed for the element '{$element->name()}'"); return FALSE; } } } // If the (?default:element) function is used, replace the regex with the default, if exists $def = self::regex_match('#\\(\\?default(?:\\:(\\w+))?\\)#', $regex); if (count($def) == 2) { // Load default language $default = CrayonResources::langs()->get(CrayonLangs::DEFAULT_LANG); // If default has not been loaded, we can't use it, skip the element if (!$default) { CrayonLog::syslog("Could not use default regex in the element '{$element->name()}' in '{$element->path()}'"); return FALSE; } for ($i = 0; $i < count($def[1]); $i++) { // If an element has been provided $element_name = !empty($def[1][$i]) ? $def[1][$i] : $element->name(); if (($default_element = $default->element($element_name)) != FALSE) { $regex = str_replace($def[0][$i], '(?:' . $default_element->regex() . ')', $regex); } else { CrayonLog::syslog("The language at '{$element->path()}' referred to the Default Language regex for element '{$element->name()}', which did not exist."); return FALSE; } } } // If the (?html) tag is used, escape characters in html (<, > and &) $html = self::regex_match('#\\(\\?html:(.+?)\\)#', $regex); if (count($html) == 2) { for ($i = 0; $i < count($html[1]); $i++) { $regex = str_replace($html[0][$i], htmlentities($html[1][$i]), $regex); } } // Ensure all parenthesis are atomic to avoid conflicting with element matches $regex = CrayonUtil::esc_atomic($regex); // Escape #, this is our delimiter $regex = CrayonUtil::esc_hash($regex); // Test if regex is valid if (@preg_match("#{$regex}#", '') === FALSE) { CrayonLog::syslog("The regex for the element '{$element->name()}' in '{$element->path()}' is not valid."); return FALSE; } return $regex; } else { return ''; } }
private static function init_tags_regex($force = FALSE, $flags = NULL, &$tags_regex = NULL) { CrayonSettingsWP::load_settings(); self::init_tag_bits(); // Default output if ($tags_regex === NULL) { $tags_regex =& self::$tags_regex; } if ($force || $tags_regex === "") { // Check which tags are in $flags. If it's NULL, then all flags are true. $in_flag = self::in_flag($flags); if ($in_flag[CrayonSettings::CAPTURE_MINI_TAG] && CrayonGlobalSettings::val(CrayonSettings::CAPTURE_MINI_TAG) || $force || ($in_flag[CrayonSettings::INLINE_TAG] && (CrayonGlobalSettings::val(CrayonSettings::INLINE_TAG) && CrayonGlobalSettings::val(CrayonSettings::INLINE_TAG_CAPTURE)) || $force)) { $aliases = CrayonResources::langs()->ids_and_aliases(); self::$alias_regex = ''; for ($i = 0; $i < count($aliases); $i++) { $alias = $aliases[$i]; $alias_regex = CrayonUtil::esc_hash(CrayonUtil::esc_regex($alias)); if ($i != count($aliases) - 1) { $alias_regex .= '|'; } self::$alias_regex .= $alias_regex; } } // Add other tags $tags_regex = '#(?<!\\$)(?:(\\s*\\[\\s*crayon\\b)'; // TODO this is duplicated in capture_crayons() $tag_regexes = array(CrayonSettings::CAPTURE_MINI_TAG => '(\\[\\s*(' . self::$alias_regex . ')\\b)', CrayonSettings::CAPTURE_PRE => '(<\\s*pre\\b)', CrayonSettings::INLINE_TAG => '(' . self::REGEX_INLINE_CLASS . ')' . '|(\\{\\s*(' . self::$alias_regex . ')\\b([^\\}]*)\\})', CrayonSettings::PLAIN_TAG => '(\\s*\\[\\s*plain\\b)', CrayonSettings::BACKQUOTE => '(`[^`]*`)'); foreach ($tag_regexes as $tag => $regex) { if ($in_flag[$tag] && (CrayonGlobalSettings::val($tag) || $force)) { $tags_regex .= '|' . $regex; } } $tags_regex .= ')#msi'; } }
private static function init_tags_regex() { if (!self::$is_tags_regex_init) { if (CrayonGlobalSettings::val(CrayonSettings::CAPTURE_MINI_TAG) || CrayonGlobalSettings::val(CrayonSettings::INLINE_TAG)) { $aliases = CrayonResources::langs()->ids_and_aliases(); for ($i = 0; $i < count($aliases); $i++) { $alias = $aliases[$i]; $alias_regex = CrayonUtil::esc_hash(CrayonUtil::esc_regex($alias)); if ($i != count($aliases) - 1) { $alias_regex .= '|'; } self::$alias_regex .= $alias_regex; } } // Add other tags self::$tags_regex = '#(\\s*\\[\\s*crayon\\b)'; if (CrayonGlobalSettings::val(CrayonSettings::CAPTURE_MINI_TAG)) { self::$tags_regex .= '|([\\[]\\s*(' . self::$alias_regex . '))'; } if (CrayonGlobalSettings::val(CrayonSettings::CAPTURE_PRE)) { self::$tags_regex .= '|(<\\s*pre\\b)'; } if (CrayonGlobalSettings::val(CrayonSettings::INLINE_TAG)) { self::$tags_regex .= '|(' . self::REGEX_INLINE_CLASS . ')' . '|([\\{]\\s*(' . self::$alias_regex . '))'; } if (CrayonGlobalSettings::val(CrayonSettings::PLAIN_TAG)) { self::$tags_regex .= '|(\\s*\\[\\s*plain\\b)'; } if (CrayonGlobalSettings::val(CrayonSettings::BACKQUOTE)) { self::$tags_regex .= '|(`[^`]*`)'; } self::$tags_regex .= '#msi'; self::$is_tags_regex_init = TRUE; } }