/
a-zu
/
code_highlight
Обзор
Документация
Войти
/
a-zu
/
code_highlight
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
code-higlight.php
193 строки
7 KB
a-zu
Обновлён проверочный хэш.
26 сен 2025, 10:59
26 сен 2025, 10:59
35a9b94
Код
Авторство
О чём код?
<?php /* Plugin Name: Code Highlight Description: Подсветка синтаксиса в code-блоках. На основе Highlight.js Version: 1.0.0 | Highlight.js 11.11.1 Author: a-zu License: MIT */ if ( ! class_exists( 'Code_Highlight' ) ) : final class Code_Highlight { private static $instance; public static $version = '1.0.0'; public static $highlight_js_hash = '5163c2f7a59d7e6b64dd3b97ae3386cb'; public static $plugin_dir; public static $plugin_url; public static $plugin_file = __FILE__; private function __construct() { self::$plugin_dir = plugin_dir_path( __FILE__ ); self::$plugin_url = plugin_dir_url( __FILE__ ); } public static function instance() { if ( ! empty( self::$instance ) && ( self::$instance instanceof Code_Highlight ) ) { return self::$instance; } self::$instance = new Code_Highlight(); self::$instance->setup_plugin(); return self::$instance; } private function setup_plugin() { add_action('admin_menu', array( self::$instance, 'plugin_add_menu' )); add_action('admin_init', array( self::$instance, 'code_hightlight_settings_init' )); add_action( 'wp_enqueue_scripts', array( self::$instance, 'include_highlight_libs' )); add_action('wp_head', array( self::$instance, 'run_highlight' )); } // Добавление страницы с настройками. public function plugin_add_menu() { add_options_page( 'Настройки Code Highlight', 'Code Highlight', 'manage_options', 'code-hightlight-settings', array( self::$instance, 'plugin_content_page' ) ); } public function code_hightlight_settings_init() { /** * Регистрация новой опции - имя для сохранения настроек в БД. Вызывается на хуке admin_init. * @param1 {String} Название группы опций * @param2 {String} Название опции */ register_setting('code_hightlight_settings', 'code_hightlight_settings'); // Создние блока с полями настроек. add_settings_section( 'code-higlight_section', '', array( self::$instance, 'code_higlight_section_callback' ), 'code_hightlight_settings' ); // Добавление выпадающего списка с выбором тем. add_settings_field( 'select_theme', 'Выбор темы', array( self::$instance, 'select_theme_render' ), 'code_hightlight_settings', 'code-higlight_section' ); } public function select_theme_render() { $array = array(); try { foreach (array_filter(glob(self::$plugin_dir . 'styles/*.css'), 'is_file') as $filename) { $array[] = $filename; } } catch(Exception $err) {} $options = get_option('code_hightlight_settings'); ?> <select name="code_hightlight_settings[select_theme]"> <?php try { foreach ($array as $path) { $filename = basename($path); echo "<option value=$filename" . selected($options['select_theme'] ?? '', $filename). ">$filename</option>"; } } catch(Exception $err) {} ?> </select> <?php } // Чтение сохранённого названия темы. private function get_selected_theme_name() { $hightlight_setting = get_option('code_hightlight_settings'); $text_value = $hightlight_setting['select_theme'] ?? 'не выбрано'; return $text_value; } // Вывод сообщения с выбранной темой. public function code_higlight_section_callback() { $message = 'Текущая тема оформления: <strong>' . self::get_selected_theme_name() . '</strong>'; if(! self::check_lib_hash()) { $message = '<p style="background: red; font-weight: 700;padding:.5em;color:#fff;">Файл highlight.min.js изменён. В целях безопасности, плагин отключён.</p><br>' . $message; } echo $message; } public function plugin_content_page() { ?> <div class="wrap"> <h1>Настройки</h1> <form action="options.php" method="post"> <?php settings_fields('code_hightlight_settings'); do_settings_sections('code_hightlight_settings'); submit_button(); ?> </form> </div> <?php } /** * Проверка хэша файла. Если файл изменён, неизвестные правки на страницу не добавятся. * Для обновления файла на другую версию. Надо обновить файл и контрольный хэш. */ private function check_lib_hash() { return self::$highlight_js_hash == hash_file('md5', self::$plugin_dir . '/highlight.min.js'); } // Подключение необходимых библиотек Highlight.js и выбранной темы. public function include_highlight_libs() { // https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/default.min.css wp_enqueue_style( 'highlight_default_css', self::$plugin_url . '/default.min.css'); $theme_filename = self::get_selected_theme_name(); if ( file_exists(plugin_dir_path(__FILE__) . 'styles/' . $theme_filename) ) { wp_enqueue_style( 'highlight_theme_css', self::$plugin_url . 'styles/' . $theme_filename); } if( file_exists(self::$plugin_dir . '/highlight.min.js') && self::check_lib_hash() ) { // https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.j wp_enqueue_script( 'highlight_js', self::$plugin_url . '/highlight.min.js'); } else { echo '<script>console.error("Файл highlight.min.js изменён. В целях безопасности, плагин отключён.");</script>'; } } // Запуск Highlight.js public function run_highlight() { echo '<script> try { hljs.highlightAll(); } catch(err) { console.error("Ошибка запуcка highlight.js"); } </script>'; } } function code_highlight_get_instance() { return Code_Highlight::instance(); } code_highlight_get_instance(); endif;