apfw_init_settings(); } //late init add_action('wp_enqueue_scripts',array($this,'apfw_user_style'),99); add_action('wp_enqueue_scripts',array($this,'apfw_user_script'),99); //add a button to mce editor //source: https://www.gavick.com/blog/wordpress-tinymce-custom-buttons/ add_action('admin_head', array($this,'apfw_add_editor_button')); add_action( 'admin_print_scripts', array($this,'apfw_admin_inline_script'),10 ); add_action( 'admin_print_styles', array($this,'apfw_admin_inline_style'),99 ); } private function apfw_settings_page_url() { return add_query_arg('page', APFW_PLUGIN_SLUG, 'options-general.php'); } function apfw_plugin_actions_links($links, $file) { static $plugin; $plugin = plugin_basename(__FILE__); if ($file == $plugin && current_user_can('manage_options')) { array_unshift( $links, sprintf('%s', esc_attr($this->apfw_settings_page_url()), __('Settings')) ); } return $links; } function apfw_plugin_meta_links($links,$file) { /* * additional link on plugin list page */ static $plugin; $plugin = plugin_basename( __FILE__ ); if ( $file == $plugin ) { $links[] = 'Read Me'; $links[] = 'Original Site'; } return $links; } function apfw_init_settings(){ $new_options=array( 'plugin_ver'=>APFW_PLUGIN_VERSION, 'theme'=>1, 'lang'=>array(), 'plugin'=>array(), ); add_option('ank_prism_for_wp', $new_options); } function apfw_theme_list() { $base_url='http://prismjs.com/index.html?theme='; $list=array( 1=>array('name'=>'Default','url'=>$base_url.'prism','file'=>'prism'), 2=>array('name'=>'Coy','url'=>$base_url.'prism-coy','file'=>'prism-coy'), 3=>array('name'=>'Dark','url'=>$base_url.'prism-dark','file'=>'prism-dark'), 4=>array('name'=>'Okaidia','url'=>$base_url.'prism-okaidia','file'=>'prism-okaidia'), 5=>array('name'=>'Tomorrow','url'=>$base_url.'prism-tomorrow','file'=>'prism-tomorrow'), 6=>array('name'=>'Twilight','url'=>$base_url.'prism-twilight','file'=>'prism-twilight'), ); return $list; } function apfw_plugin_list() { //$base_url, lets not repeat code ,domains are subject to change $base_url='http://prismjs.com/plugins/'; //JS and related CSS file name must be same, except extension $list=array( 1=>array('name'=>'Autolinker ','url'=>$base_url.'autolinker/','file'=>'prism-autolinker','need_css'=>1), 2=>array('name'=>'File Highlight ','url'=>$base_url.'file-highlight/','file'=>'prism-file-highlight','need_css'=>0), 3=>array('name'=>'Line Highlight','url'=>$base_url.'line-highlight/','file'=>'prism-line-highlight','need_css'=>1), 4=>array('name'=>'Line Numbers','url'=>$base_url.'line-numbers/','file'=>'prism-line-numbers','need_css'=>1), 5=>array('name'=>'Show Invisibles','url'=>$base_url.'show-invisibles/','file'=>'prism-show-invisibles','need_css'=>1), 6=>array('name'=>'Show Language','url'=>$base_url.'show-language/','file'=>'prism-show-language','need_css'=>1), 7=>array('name'=>'WebPlatform Docs','url'=>$base_url.'wpd/','file'=>'prism-wpd','need_css'=>1), ); return $list; } function apfw_lang_list() { //lets keep order and requirement //require is the id of some other lang //id will be used in tiny mce popup too $list=array( 1=>array('id'=>'markup','name'=>'Markup','file'=>'prism-markup','require'=>'','in_popup'=>1), 2=>array('id'=>'css','name'=>'CSS','file'=>'prism-css','require'=>'','in_popup'=>1), 3=>array('id'=>'css-extras','name'=>'CSS Extras','file'=>'prism-css-extras','require'=>'css','in_popup'=>0), 4=>array('id'=>'clike','name'=>'C-Like','file'=>'prism-clike','require'=>'','in_popup'=>1), 5=>array('id'=>'javascript','name'=>'Java-Script','file'=>'prism-javascript','require'=>'clike','in_popup'=>1), 6=>array('id'=>'php','name'=>'PHP','file'=>'prism-php','require'=>'clike','in_popup'=>1), 7=>array('id'=>'php-extras','name'=>'PHP Extras','file'=>'prism-php-extras','require'=>'php','in_popup'=>0), 8=>array('id'=>'sql','name'=>'SQL','file'=>'prism-sql','require'=>'','in_popup'=>1), ); return $list; } function apfw_user_style(){ //enqueue front end css if(!file_exists(__DIR__.'/prism-css.css')){ //try to create file $this->apfw_write_a_file($this->apfw_decide_css(),'prism-css.css'); } /* unique file version, every time the file get modified */ $file_ver=esc_attr(filemtime(__DIR__.'/prism-css.css')); wp_enqueue_style('prism-theme',plugins_url('prism-css.css',__FILE__),array(),$file_ver); } function apfw_user_script(){ //enqueue front end js if(!file_exists(__DIR__.'/prism-js.js')){ //try to create file $this->apfw_write_a_file($this->apfw_decide_js(),'prism-js.js'); } /* unique file version, every time the file get modified */ $file_ver=esc_attr(filemtime(__DIR__.'/prism-js.js')); //no dependency + enqueue to footer wp_enqueue_script('prism-script',plugins_url('prism-js.js',__FILE__),array(),$file_ver,true); } function apfw_decide_css(){ $options=get_option('ank_prism_for_wp'); $theme_list=$this->apfw_theme_list(); $plugin_list=$this->apfw_plugin_list(); $style=file_get_contents(__DIR__.'/themes/'.$theme_list[intval($options['theme'])]['file'].'.css') ; //check if selected plugins require css foreach($options['plugin'] as $plugin){ if($plugin_list[$plugin]['need_css']==1) { $style.= file_get_contents(__DIR__.'/plugins/'.$plugin_list[$plugin]['file'].'.css'); } } //minify css before saving to file if(APFW_MINIFY_CSS==true){ return $this->apfw_minify_css($style); } else{ return $style; } } function apfw_decide_js(){ $options=get_option('ank_prism_for_wp'); $lang_list=$this->apfw_lang_list(); $plugin_list=$this->apfw_plugin_list(); //always include core js file $script=file_get_contents(__DIR__.'/prism-core.js'); //include selected langs js foreach($options['lang'] as $lang){ $script.= file_get_contents(__DIR__.'/languages/'.$lang_list[$lang]['file'].'.js'); } //include selected plugin js foreach($options['plugin'] as $plugin){ $script.= file_get_contents(__DIR__.'/plugins/'.$plugin_list[$plugin]['file'].'.js'); } //all js file are already minified return $script; } function apfw_write_a_file($data,$file_name){ $file_name=__DIR__.'/'.$file_name; $handle = fopen($file_name, 'w'); if($handle){ if(!fwrite($handle, $data)){ //could not write file @fclose($handle); return false; }else{ //success @fclose($handle); return true; } }else{ //could not open handle return false; } } function apfw_minify_css($buffer) { /* remove comments */ $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer); /* remove tabs, spaces, newlines, etc. */ $buffer = str_replace(array("\r\n","\r","\n","\t",' ',' ',' '), '', $buffer); /* remove other spaces before/after ; */ $buffer = preg_replace(array('(( )+{)','({( )+)'), '{', $buffer); $buffer = preg_replace(array('(( )+})','(}( )+)','(;( )*})'), '}', $buffer); $buffer = preg_replace(array('(;( )+)','(( )+;)'), ';', $buffer); return $buffer; } public function apfw_add_editor_button() { global $typenow; // check user permissions if ( !current_user_can('edit_posts') && !current_user_can('edit_pages') ) { return; } // verify the post type if( ! in_array( $typenow, array( 'post', 'page' ) ) ) return; // check if WYSIWYG is enabled if ( get_user_option('rich_editing') == 'true') { add_filter("mce_external_plugins", array($this,"afpw_add_tinymce_plugin")); add_filter('mce_buttons', array($this,'afpw_register_tinymce_button')); } } function afpw_register_tinymce_button($buttons) { array_push($buttons, "afpw_assist_button"); return $buttons; } function afpw_add_tinymce_plugin($plugin_array) { $plugin_array['afpw_assist_button'] = plugins_url( '/apfw-editor-plugin.js', __FILE__ ); return $plugin_array; } function apfw_admin_inline_script($hook){ global $pagenow; $lang_list=$this->apfw_lang_list(); //print the code only to post pages if ($pagenow=='post-new.php' OR $pagenow=='post.php') { echo ""; } } function apfw_admin_inline_style($hook){ global $pagenow; //print the code only to post pages if ($pagenow=='post-new.php' OR $pagenow=='post.php') { ?>