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.

502 lines
11KB

  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_enqueue_buttons() {
  38. $screen = get_current_screen();
  39. if (!property_exists($screen, 'id')) return;
  40. if ($screen->id === 'post' || $screen->id === 'page') {
  41. wp_enqueue_style('prismatic-buttons', PRISMATIC_URL .'css/styles-buttons.css', array(), null);
  42. }
  43. }
  44. function prismatic_get_vars_admin() {
  45. $data = array(
  46. 'reset_title' => __('Confirm Reset', 'prismatic'),
  47. 'reset_message' => __('Restore default options?', 'prismatic'),
  48. 'reset_true' => __('Yes, make it so.', 'prismatic'),
  49. 'reset_false' => __('No, abort mission.', 'prismatic'),
  50. );
  51. return $data;
  52. }
  53. function prismatic_prism_enqueue() {
  54. global $prismatic_options_prism;
  55. if (isset($prismatic_options_prism['singular_only']) && $prismatic_options_prism['singular_only'] && !is_singular() && !is_admin()) return;
  56. $languages = prismatic_active_languages('prism');
  57. $languages = array_filter($languages);
  58. if (!empty($languages)) {
  59. $theme = (isset($prismatic_options_prism['prism_theme'])) ? $prismatic_options_prism['prism_theme'] : 'default';
  60. wp_enqueue_style('prismatic-prism', PRISMATIC_URL .'lib/prism/css/theme-'. $theme .'.css', array(), null, 'all');
  61. wp_enqueue_script('prismatic-prism', PRISMATIC_URL .'lib/prism/js/prism-core.js', array(), null, true);
  62. if (
  63. (isset($prismatic_options_prism['show_language']) && $prismatic_options_prism['show_language']) ||
  64. (isset($prismatic_options_prism['copy_clipboard']) && $prismatic_options_prism['copy_clipboard'])
  65. ) {
  66. wp_enqueue_style('prismatic-plugin-styles', PRISMATIC_URL .'lib/prism/css/plugin-styles.css', array(), null, 'all');
  67. wp_enqueue_script('prismatic-prism-toolbar', PRISMATIC_URL .'lib/prism/js/plugin-toolbar.js', array('prismatic-prism'), null, true);
  68. }
  69. if (isset($prismatic_options_prism['line_highlight']) && $prismatic_options_prism['line_highlight']) {
  70. wp_enqueue_script('prismatic-prism-line-highlight', PRISMATIC_URL .'lib/prism/js/plugin-line-highlight.js', array('prismatic-prism'), null, true);
  71. }
  72. if (isset($prismatic_options_prism['line_numbers']) && $prismatic_options_prism['line_numbers']) {
  73. wp_enqueue_script('prismatic-prism-line-numbers', PRISMATIC_URL .'lib/prism/js/plugin-line-numbers.js', array('prismatic-prism'), null, true);
  74. }
  75. if (isset($prismatic_options_prism['show_language']) && $prismatic_options_prism['show_language']) {
  76. wp_enqueue_script('prismatic-prism-show-language', PRISMATIC_URL .'lib/prism/js/plugin-show-language.js', array('prismatic-prism'), null, true);
  77. }
  78. if (isset($prismatic_options_prism['copy_clipboard']) && $prismatic_options_prism['copy_clipboard']) {
  79. wp_enqueue_script('prismatic-copy-clipboard', PRISMATIC_URL .'lib/prism/js/plugin-copy-clipboard.js', array('prismatic-prism'), null, true);
  80. }
  81. $prefix = array('lang-', 'language-');
  82. foreach ($languages as $language) {
  83. $language = str_replace($prefix, '', $language);
  84. $file = PRISMATIC_DIR . 'lib/prism/js/lang-'. $language .'.js';
  85. if (file_exists($file)) {
  86. wp_enqueue_script('prismatic-prism-'. $language, PRISMATIC_URL .'lib/prism/js/lang-'. $language .'.js', array('prismatic-prism'), null, true);
  87. }
  88. }
  89. if (is_admin()) {
  90. // todo: once gutenberg is further developed, find a better way to add editor support
  91. function prismatic_prism_inline_js() {
  92. ?>
  93. <script type="text/javascript">
  94. document.onreadystatechange = function () {
  95. if (document.readyState == 'complete') {
  96. Prism.highlightAll();
  97. }
  98. }
  99. </script>
  100. <?php
  101. }
  102. add_action('admin_print_footer_scripts', 'prismatic_prism_inline_js');
  103. }
  104. }
  105. }
  106. function prismatic_highlight_enqueue() {
  107. global $prismatic_options_highlight;
  108. if (isset($prismatic_options_highlight['singular_only']) && $prismatic_options_highlight['singular_only'] && !is_singular() && !is_admin()) return;
  109. $always_load = (isset($prismatic_options_highlight['noprefix_classes']) && $prismatic_options_highlight['noprefix_classes']) ? true : false;
  110. $languages = prismatic_active_languages('highlight');
  111. $languages = array_filter($languages);
  112. if (!empty($languages) || $always_load) {
  113. $theme = (isset($prismatic_options_highlight['highlight_theme'])) ? $prismatic_options_highlight['highlight_theme'] : 'default';
  114. wp_enqueue_style('prismatic-highlight', PRISMATIC_URL .'lib/highlight/css/'. $theme .'.css', array(), null, 'all');
  115. wp_enqueue_script('prismatic-highlight', PRISMATIC_URL .'lib/highlight/js/highlight-core.js', array(), null, true);
  116. $init = (isset($prismatic_options_highlight['init_javascript'])) ? $prismatic_options_highlight['init_javascript'] : '';
  117. if ($init) {
  118. wp_add_inline_script('prismatic-highlight', $init, 'after');
  119. }
  120. if (is_admin()) {
  121. // todo: once gutenberg is further developed, find a better way to add editor support
  122. function prismatic_highlight_inline_js() {
  123. ?>
  124. <script type="text/javascript">
  125. document.onreadystatechange = function () {
  126. if (document.readyState == 'complete') {
  127. jQuery('pre > code').each(function() {
  128. hljs.highlightBlock(this);
  129. });
  130. }
  131. }
  132. </script>
  133. <?php
  134. }
  135. add_action('admin_print_footer_scripts', 'prismatic_highlight_inline_js');
  136. }
  137. }
  138. }
  139. function prismatic_active_languages($library) {
  140. global $posts, $post;
  141. $languages = array();
  142. if (is_admin()) {
  143. $content = $post->post_content;
  144. $languages = prismatic_active_languages_loop($library, '', $content, array(), null);
  145. } else {
  146. if (is_singular()) {
  147. $excerpt = $post->post_excerpt;
  148. $content = $post->post_content;
  149. $comments = ($post->comment_count) ? get_comments(array('post_id' => $post->ID, 'status' => 'approve')) : array();
  150. $fields = function_exists('get_fields') ? get_fields($post->ID) : null; // ACF
  151. $languages = prismatic_active_languages_loop($library, $excerpt, $content, $comments, $fields);
  152. } else {
  153. foreach ($posts as $post) {
  154. $excerpt = $post->post_excerpt;
  155. $content = $post->post_content;
  156. $comments = array();
  157. $langs_array[] = prismatic_active_languages_loop($library, $excerpt, $content, $comments, null);
  158. }
  159. if (!empty($langs_array) && is_array($langs_array)) {
  160. foreach($langs_array as $key => $value) {
  161. foreach ($value as $k => $v) {
  162. $languages[] = $v;
  163. }
  164. }
  165. }
  166. }
  167. }
  168. return $languages;
  169. }
  170. function prismatic_active_languages_loop($library, $excerpt, $content, $comments, $fields) {
  171. $languages = array();
  172. $classes = ($library === 'prism') ? prismatic_prism_classes() : prismatic_highlight_classes();
  173. foreach ($classes as $class) {
  174. foreach($class as $cls) {
  175. if (strpos($excerpt, $cls) !== false) {
  176. $languages[] = $cls;
  177. }
  178. if (strpos($content, $cls) !== false) {
  179. $languages[] = $cls;
  180. }
  181. foreach ($comments as $comment) {
  182. if (strpos($comment->comment_content, $cls) !== false) {
  183. $languages[] = $cls;
  184. }
  185. }
  186. if ($fields) {
  187. foreach ($fields as $key => $value) {
  188. if (strpos($value, $cls) !== false) {
  189. $languages[] = $cls;
  190. }
  191. }
  192. }
  193. }
  194. }
  195. $languages = array_unique($languages);
  196. return $languages;
  197. }
  198. function prismatic_prism_classes() {
  199. $classes = array(
  200. array(
  201. 'language-apacheconf',
  202. 'language-applescript',
  203. 'language-arduino',
  204. 'language-bash',
  205. 'language-c',
  206. 'language-csharp',
  207. 'language-cpp',
  208. 'language-clike',
  209. 'language-coffeescript',
  210. 'language-css',
  211. 'language-d',
  212. 'language-dart',
  213. 'language-diff',
  214. 'language-git',
  215. 'language-go',
  216. 'language-graphql',
  217. 'language-groovy',
  218. 'language-http',
  219. 'language-ini',
  220. 'language-java',
  221. 'language-javascript',
  222. 'language-json',
  223. 'language-jsx',
  224. 'language-kotlin',
  225. 'language-latex',
  226. 'language-lua',
  227. 'language-makefile',
  228. 'language-markdown',
  229. 'language-markup',
  230. 'language-nginx',
  231. 'language-objectivec',
  232. 'language-pascal',
  233. 'language-perl',
  234. 'language-php',
  235. 'language-powershell',
  236. 'language-python',
  237. 'language-ruby',
  238. 'language-sass',
  239. 'language-scala',
  240. 'language-scss',
  241. 'language-sql',
  242. 'language-swift',
  243. 'language-tsx',
  244. 'language-twig',
  245. 'language-typescript',
  246. 'language-visual-basic',
  247. 'language-yaml',
  248. 'language-none',
  249. ),
  250. array(
  251. 'lang-apacheconf',
  252. 'lang-applescript',
  253. 'lang-arduino',
  254. 'lang-bash',
  255. 'lang-c',
  256. 'lang-csharp',
  257. 'lang-cpp',
  258. 'lang-clike',
  259. 'lang-coffeescript',
  260. 'lang-css',
  261. 'lang-d',
  262. 'lang-dart',
  263. 'lang-diff',
  264. 'lang-git',
  265. 'lang-go',
  266. 'lang-graphql',
  267. 'lang-groovy',
  268. 'lang-http',
  269. 'lang-ini',
  270. 'lang-java',
  271. 'lang-javascript',
  272. 'lang-json',
  273. 'lang-jsx',
  274. 'lang-kotlin',
  275. 'lang-latex',
  276. 'lang-lua',
  277. 'lang-makefile',
  278. 'lang-markdown',
  279. 'lang-markup',
  280. 'lang-nginx',
  281. 'lang-objectivec',
  282. 'lang-pascal',
  283. 'lang-perl',
  284. 'lang-php',
  285. 'lang-powershell',
  286. 'lang-python',
  287. 'lang-ruby',
  288. 'lang-sass',
  289. 'lang-scala',
  290. 'lang-scss',
  291. 'lang-sql',
  292. 'lang-swift',
  293. 'lang-tsx',
  294. 'lang-twig',
  295. 'lang-typescript',
  296. 'lang-visual-basic',
  297. 'lang-yaml',
  298. )
  299. );
  300. return $classes;
  301. }
  302. function prismatic_highlight_classes() {
  303. $classes = array(
  304. array(
  305. 'language-'
  306. ),
  307. array(
  308. 'lang-',
  309. )
  310. );
  311. return $classes;
  312. }