You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

446 lines
9.5KB

  1. <?php // Prismatic - Enqueue Resources
  2. if (!defined('ABSPATH')) exit;
  3. function prismatic_enqueue() {
  4. global $prismatic_options_general;
  5. $library = (isset($prismatic_options_general['library'])) ? $prismatic_options_general['library'] : 'none';
  6. if (is_admin()) {
  7. $screen = get_current_screen();
  8. if (!property_exists($screen, 'id')) return;
  9. if ($screen->id === 'post' || $screen->id === 'page') {
  10. if ($library === 'prism') {
  11. prismatic_prism_enqueue();
  12. } elseif ($library === 'highlight') {
  13. prismatic_highlight_enqueue();
  14. }
  15. }
  16. } else {
  17. if ($library === 'prism') {
  18. prismatic_prism_enqueue();
  19. } elseif ($library === 'highlight') {
  20. prismatic_highlight_enqueue();
  21. }
  22. }
  23. }
  24. function prismatic_enqueue_settings() {
  25. $screen = get_current_screen();
  26. if (!property_exists($screen, 'id')) return;
  27. if ($screen->id === 'settings_page_prismatic') {
  28. wp_enqueue_style('prismatic-font-icons', PRISMATIC_URL .'css/styles-font-icons.css', array(), null);
  29. wp_enqueue_style('prismatic-settings', PRISMATIC_URL .'css/styles-settings.css', array(), null);
  30. wp_enqueue_style('wp-jquery-ui-dialog');
  31. $js_deps = array('jquery', 'jquery-ui-core', 'jquery-ui-dialog');
  32. wp_enqueue_script('prismatic-settings', PRISMATIC_URL .'js/scripts-settings.js', $js_deps, null);
  33. $data = prismatic_get_vars_admin();
  34. wp_localize_script('prismatic-settings', 'prismatic_settings', $data);
  35. }
  36. }
  37. function prismatic_get_vars_admin() {
  38. $data = array(
  39. 'reset_title' => __('Confirm Reset', 'prismatic'),
  40. 'reset_message' => __('Restore default options?', 'prismatic'),
  41. 'reset_true' => __('Yes, make it so.', 'prismatic'),
  42. 'reset_false' => __('No, abort mission.', 'prismatic'),
  43. );
  44. return $data;
  45. }
  46. function prismatic_prism_enqueue() {
  47. global $prismatic_options_prism;
  48. if (isset($prismatic_options_prism['singular_only']) && $prismatic_options_prism['singular_only'] && !is_singular() && !is_admin()) return;
  49. $languages = prismatic_active_languages('prism');
  50. $languages = array_filter($languages);
  51. if (!empty($languages)) {
  52. $theme = (isset($prismatic_options_prism['prism_theme'])) ? $prismatic_options_prism['prism_theme'] : 'default';
  53. wp_enqueue_style('prismatic-prism', PRISMATIC_URL .'lib/prism/css/theme-'. $theme .'.css', array(), null, 'all');
  54. wp_enqueue_script('prismatic-prism', PRISMATIC_URL .'lib/prism/js/prism-core.js', array(), null, true);
  55. if (isset($prismatic_options_prism['line_highlight']) && $prismatic_options_prism['line_highlight']) {
  56. wp_enqueue_script('prismatic-prism-line-highlight', PRISMATIC_URL .'lib/prism/js/plugin-line-highlight.js', array('prismatic-prism'), null, true);
  57. }
  58. if (isset($prismatic_options_prism['line_numbers']) && $prismatic_options_prism['line_numbers']) {
  59. wp_enqueue_script('prismatic-prism-line-numbers', PRISMATIC_URL .'lib/prism/js/plugin-line-numbers.js', array('prismatic-prism'), null, true);
  60. }
  61. if (isset($prismatic_options_prism['show_language']) && $prismatic_options_prism['show_language']) {
  62. wp_enqueue_script('prismatic-prism-show-language', PRISMATIC_URL .'lib/prism/js/plugin-show-language.js', array('prismatic-prism'), null, true);
  63. }
  64. $prefix = array('lang-', 'language-');
  65. foreach ($languages as $language) {
  66. $language = str_replace($prefix, '', $language);
  67. $file = PRISMATIC_DIR . 'lib/prism/js/lang-'. $language .'.js';
  68. if (file_exists($file)) {
  69. wp_enqueue_script('prismatic-prism-'. $language, PRISMATIC_URL .'lib/prism/js/lang-'. $language .'.js', array('prismatic-prism'), null, true);
  70. }
  71. }
  72. if (is_admin()) {
  73. // todo: once gutenberg is further developed, find a better way to add editor support
  74. function prismatic_prism_inline_js() {
  75. ?>
  76. <script type="text/javascript">
  77. document.onreadystatechange = function () {
  78. if (document.readyState == 'complete') {
  79. Prism.highlightAll();
  80. }
  81. }
  82. </script>
  83. <?php
  84. }
  85. add_action('admin_print_footer_scripts', 'prismatic_prism_inline_js');
  86. }
  87. }
  88. }
  89. function prismatic_highlight_enqueue() {
  90. global $prismatic_options_highlight;
  91. if (isset($prismatic_options_highlight['singular_only']) && $prismatic_options_highlight['singular_only'] && !is_singular() && !is_admin()) return;
  92. $always_load = (isset($prismatic_options_highlight['noprefix_classes']) && $prismatic_options_highlight['noprefix_classes']) ? true : false;
  93. $languages = prismatic_active_languages('highlight');
  94. $languages = array_filter($languages);
  95. if (!empty($languages) || $always_load) {
  96. $theme = (isset($prismatic_options_highlight['highlight_theme'])) ? $prismatic_options_highlight['highlight_theme'] : 'default';
  97. wp_enqueue_style('prismatic-highlight', PRISMATIC_URL .'lib/highlight/css/'. $theme .'.css', array(), null, 'all');
  98. wp_enqueue_script('prismatic-highlight', PRISMATIC_URL .'lib/highlight/js/highlight-core.js', array(), null, true);
  99. $init = (isset($prismatic_options_highlight['init_javascript'])) ? $prismatic_options_highlight['init_javascript'] : '';
  100. if ($init) {
  101. wp_add_inline_script('prismatic-highlight', $init, 'after');
  102. }
  103. if (is_admin()) {
  104. // todo: once gutenberg is further developed, find a better way to add editor support
  105. function prismatic_highlight_inline_js() {
  106. ?>
  107. <script type="text/javascript">
  108. document.onreadystatechange = function () {
  109. if (document.readyState == 'complete') {
  110. jQuery('pre > code').each(function() {
  111. hljs.highlightBlock(this);
  112. });
  113. }
  114. }
  115. </script>
  116. <?php
  117. }
  118. add_action('admin_print_footer_scripts', 'prismatic_highlight_inline_js');
  119. }
  120. }
  121. }
  122. function prismatic_active_languages($library) {
  123. global $posts, $post;
  124. $languages = array();
  125. if (is_admin()) {
  126. $content = $post->post_content;
  127. $languages = prismatic_active_languages_loop($library, '', $content, array());
  128. } else {
  129. if (is_singular()) {
  130. $excerpt = $post->post_excerpt;
  131. $content = $post->post_content;
  132. $comments = ($post->comment_count) ? get_comments(array('post_id' => $post->ID, 'status' => 'approve')) : array();
  133. $languages = prismatic_active_languages_loop($library, $excerpt, $content, $comments);
  134. } else {
  135. foreach ($posts as $post) {
  136. $excerpt = $post->post_excerpt;
  137. $content = $post->post_content;
  138. $comments = array();
  139. $langs_array[] = prismatic_active_languages_loop($library, $excerpt, $content, $comments);
  140. }
  141. if (!empty($langs_array) && is_array($langs_array)) {
  142. foreach($langs_array as $key => $value) {
  143. foreach ($value as $k => $v) {
  144. $languages[] = $v;
  145. }
  146. }
  147. }
  148. }
  149. }
  150. return $languages;
  151. }
  152. function prismatic_active_languages_loop($library, $excerpt, $content, $comments) {
  153. $languages = array();
  154. $classes = ($library === 'prism') ? prismatic_prism_classes() : prismatic_highlight_classes();
  155. foreach ($classes as $class) {
  156. foreach($class as $cls) {
  157. if (strpos($excerpt, $cls) !== false) {
  158. $languages[] = $cls;
  159. }
  160. if (strpos($content, $cls) !== false) {
  161. $languages[] = $cls;
  162. }
  163. foreach ($comments as $comment) {
  164. if (strpos($comment->comment_content, $cls) !== false) {
  165. $languages[] = $cls;
  166. }
  167. }
  168. }
  169. }
  170. $languages = array_unique($languages);
  171. return $languages;
  172. }
  173. function prismatic_prism_classes() {
  174. $classes = array(
  175. array(
  176. 'language-apacheconf',
  177. 'language-applescript',
  178. 'language-bash',
  179. 'language-c',
  180. 'language-csharp',
  181. 'language-cpp',
  182. 'language-clike',
  183. 'language-coffeescript',
  184. 'language-css',
  185. 'language-diff',
  186. 'language-git',
  187. 'language-go',
  188. 'language-graphql',
  189. 'language-groovy',
  190. 'language-http',
  191. 'language-ini',
  192. 'language-java',
  193. 'language-javascript',
  194. 'language-json',
  195. 'language-kotlin',
  196. 'language-latex',
  197. 'language-lua',
  198. 'language-makefile',
  199. 'language-markdown',
  200. 'language-markup',
  201. 'language-nginx',
  202. 'language-objectivec',
  203. 'language-pascal',
  204. 'language-perl',
  205. 'language-php',
  206. 'language-powershell',
  207. 'language-python',
  208. 'language-ruby',
  209. 'language-sass',
  210. 'language-scss',
  211. 'language-sql',
  212. 'language-swift',
  213. 'language-twig',
  214. 'language-typescript',
  215. 'language-visual-basic',
  216. 'language-yaml',
  217. ),
  218. array(
  219. 'lang-apacheconf',
  220. 'lang-applescript',
  221. 'lang-bash',
  222. 'lang-c',
  223. 'lang-csharp',
  224. 'lang-cpp',
  225. 'lang-clike',
  226. 'lang-coffeescript',
  227. 'lang-css',
  228. 'lang-diff',
  229. 'lang-git',
  230. 'lang-go',
  231. 'lang-graphql',
  232. 'lang-groovy',
  233. 'lang-http',
  234. 'lang-ini',
  235. 'lang-java',
  236. 'lang-javascript',
  237. 'lang-json',
  238. 'lang-kotlin',
  239. 'lang-latex',
  240. 'lang-lua',
  241. 'lang-makefile',
  242. 'lang-markdown',
  243. 'lang-markup',
  244. 'lang-nginx',
  245. 'lang-objectivec',
  246. 'lang-pascal',
  247. 'lang-perl',
  248. 'lang-php',
  249. 'lang-powershell',
  250. 'lang-python',
  251. 'lang-ruby',
  252. 'lang-sass',
  253. 'lang-scss',
  254. 'lang-sql',
  255. 'lang-swift',
  256. 'lang-twig',
  257. 'lang-typescript',
  258. 'lang-visual-basic',
  259. 'lang-yaml',
  260. )
  261. );
  262. return $classes;
  263. }
  264. function prismatic_highlight_classes() {
  265. $classes = array(
  266. array(
  267. 'language-'
  268. ),
  269. array(
  270. 'lang-',
  271. )
  272. );
  273. return $classes;
  274. }