options = get_option(APHSH_OPTION); // Check the compiled file of css and js file of syntaxhighlighter $this->check_file(); /** * Regex to match all
tag that have class value of lang: * Pattern:]* - class - space character(s) - = - space character(s) - " or ' - space character(s) - any character(s) - > any character until next group (.*)example:]*class\s*=\s*[\"\']lang\s*:[^>]*>)(.*)(<\s*\/pre\s*>)/isU"; add_action('wp_enqueue_scripts', array($this, 'load_scripts') ); add_filter( 'the_content', array($this, 'filter_content'), 10, 1 ); add_filter( 'comment_text', array($this, 'filter_comments'), 10, 1); } private function check_file() { $css_file = APHSH_PLUGIN_PATH . APHSH_DS . 'css' . APHSH_DS . 'syntaxhighlighter' . APHSH_DS . 'aphsh-syntaxhighlighter-' . $this->options['token'] . '.css'; $js_file = APHSH_PLUGIN_PATH . APHSH_DS . 'js' . APHSH_DS . 'syntaxhighlighter' . APHSH_DS . 'aphsh-syntaxhighlighter-' . $this->options['token'] . '.js'; if (!file_exists($css_file) || !file_exists($js_file)) { require_once 'aphsh-build.php'; $obj = new Aphsh_Build(); $obj->build_files(); } } public function load_scripts() { // If not post or page, we cannot check this earlier if (!is_single()) return; /** Only load javascript and css file when needed, we check it in the post and comment content */ global $post; preg_match_all($this->regex, $post->post_content, $match_post); if ($match_post[0]) { $this->match_post = $match_post; } if ($post->comment_count) { $comments = get_comments( array('post_id' => $post->ID, 'status' => 'approve') ); if ($comments) { foreach ($comments as $comment) { preg_match_all($this->regex, $comment->comment_content, $match_comment); if ($match_comment[0]) { $this->match_comment = true; break; } } } } if ($this->match_post || $this->match_comment) { wp_enqueue_script( 'aphsh-syntaxhighlighter', APHSH_PLUGIN_URL . '/js/syntaxhighlighter/aphsh-syntaxhighlighter-' . $this->options['token'] . '.js' ); wp_enqueue_style( 'aphsh-' . $this->options['theme'], APHSH_PLUGIN_URL . '/css/syntaxhighlighter/aphsh-syntaxhighlighter-'.$this->options['token'].'.css' ); } } public function filter_comments($comment) { if ($this->match_comment) { preg_match_all($this->regex, $comment, $matches); if ($matches[0]) { $comment = $this->alter_content($comment, $matches); } } return $comment; } public function filter_content($content) { // If not post or page, we cannot check this earlier if (is_single()) { if ($this->match_post) { return $this->alter_content($content, $this->match_post); } } return $content; } public function alter_content($content, $matches) { /** Merge pre tag that have same value*/ $matches[1] = array_unique($matches[1]); /* * Make new variable $matches_fix to save new pre tag to acomodate the default title * $matches[0] =* $matches[1] =* $matches_fix[0] =* $matches_fix[1] =* Then, after we convert the class in the $matches_fix[0], we replace $matches[0] with $matches_fix[0] */ $matches_fix = $matches[1]; foreach ($matches_fix as $tag_index => $tag) { // Get class value preg_match('/class\s*=\s*[\"\']([^\"\']*)[\"\']/si', $tag, $attr_class); /** * fix class value by removing space between : sign => lang : php become lang:php */ $fixed_class = preg_replace('/(\s*:\s*)/', ':', trim($attr_class[1])); $exp = explode(' ', $fixed_class); $add_language = ''; foreach ($exp as $key => $class_item) { $split = explode(':', $class_item); $param = trim($split[0]); $value = trim($split[1]); if (strpos($value,'add') !== false) { $add_language = $value; continue; } // Used to compare with default options $param_list[$param] = $param; /* As is: html-script, auto-links*/ // language if ($param == 'lang') { if ($value == 'markup') $value = 'xml'; $curr_lang = $value; $exp[$key] = 'brush:' . $value; } // highlight elseif ($param == 'mark') { $exp[$key] = 'highlight:' . $value; } // class-name elseif ($param == 'class') { if ($this->options['class']) $value = $this->options['class'] . ' ' . $value; $exp[$key] = "class-name:'" . str_replace(';', ' ', $value) . "'"; } // gutter elseif ($param == 'start') { $exp[$key] = 'first-line:' . $value; } } /* TITLE */ $title = ''; preg_match('/title\s*=\s*[\"\']([^\"\']*)[\"\']/si', $tag, $attr_title); if ($attr_title[1]) { $title = $all_attr[1]['title']; } else if ($this->options['title']) { $title = $this->options['title']; } if ($title) { $title = str_replace('{language}', $this->options_data['lang-list'][$this->options['lang-pack']][$curr_lang], $title); $tag = preg_replace('/([^>]*)>/', '$1'. ' title="'.$title.'">', $tag); } // Add default options as nedded $def_options = array('gutter', 'auto-links', 'tab-size', 'class'); foreach($def_options as $opt) { if (!key_exists($opt, $param_list)) { $exp[] = $opt . ':' . $this->options[$opt]; if ($opt == 'gutter') { $exp['first-line'] = 'first-line:' . $this->options['start-number']; } } } if ($this->options['smart-tab']) { $exp[] = 'smart-tabs:' . $this->options['smart-tab']; } if ($this->options['tab-size'] != 4) { $exp[] = 'tab-size:' . $this->options['tab-size']; } if ($add_language) { $exp = array('aphsh-' . $add_language); } $new_class = join($exp, ';'); $tag = preg_replace('/'.$attr_class[1].'/', $new_class, $tag); $content = preg_replace('/'.$matches[1][$tag_index].'/', $tag, $content); } return $content; } }