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.

534 lines
12KB

  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(), PRISMATIC_VERSION);
  29. wp_enqueue_style('prismatic-settings', PRISMATIC_URL .'css/styles-settings.css', array(), PRISMATIC_VERSION);
  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, PRISMATIC_VERSION);
  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(), PRISMATIC_VERSION);
  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(), PRISMATIC_VERSION, 'all');
  61. wp_enqueue_script('prismatic-prism', PRISMATIC_URL .'lib/prism/js/prism-core.js', array(), PRISMATIC_VERSION, 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(), PRISMATIC_VERSION, 'all');
  67. wp_enqueue_script('prismatic-prism-toolbar', PRISMATIC_URL .'lib/prism/js/plugin-toolbar.js', array('prismatic-prism'), PRISMATIC_VERSION, 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'), PRISMATIC_VERSION, 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'), PRISMATIC_VERSION, 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'), PRISMATIC_VERSION, 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'), PRISMATIC_VERSION, 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'), PRISMATIC_VERSION, 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(), PRISMATIC_VERSION, 'all');
  115. wp_enqueue_script('prismatic-highlight', PRISMATIC_URL .'lib/highlight/js/highlight-core.js', array(), PRISMATIC_VERSION, 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 (is_string($value) && 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-atom',
  205. 'language-bash',
  206. 'language-batch',
  207. 'language-c',
  208. 'language-csharp',
  209. 'language-cpp',
  210. 'language-clike',
  211. 'language-coffeescript',
  212. 'language-css',
  213. 'language-d',
  214. 'language-dart',
  215. 'language-diff',
  216. 'language-elixir',
  217. 'language-gcode',
  218. 'language-git',
  219. 'language-go',
  220. 'language-graphql',
  221. 'language-groovy',
  222. 'language-hcl',
  223. 'language-html',
  224. 'language-http',
  225. 'language-ini',
  226. 'language-java',
  227. 'language-javascript',
  228. 'language-json',
  229. 'language-jsx',
  230. 'language-kotlin',
  231. 'language-latex',
  232. 'language-liquid',
  233. 'language-lua',
  234. 'language-makefile',
  235. 'language-markdown',
  236. 'language-markup',
  237. 'language-mathml',
  238. 'language-nginx',
  239. 'language-objectivec',
  240. 'language-pascal',
  241. 'language-perl',
  242. 'language-php',
  243. 'language-powershell',
  244. 'language-python',
  245. 'language-r',
  246. 'language-rss',
  247. 'language-ruby',
  248. 'language-rust',
  249. 'language-sass',
  250. 'language-scala',
  251. 'language-scss',
  252. 'language-shell-session',
  253. 'language-solidity',
  254. 'language-sql',
  255. 'language-ssml',
  256. 'language-svg',
  257. 'language-swift',
  258. 'language-tsx',
  259. 'language-twig',
  260. 'language-typescript',
  261. 'language-visual-basic',
  262. 'language-xml',
  263. 'language-yaml',
  264. 'language-none',
  265. ),
  266. array(
  267. 'lang-apacheconf',
  268. 'lang-applescript',
  269. 'lang-arduino',
  270. 'lang-atom',
  271. 'lang-bash',
  272. 'lang-batch',
  273. 'lang-c',
  274. 'lang-csharp',
  275. 'lang-cpp',
  276. 'lang-clike',
  277. 'lang-coffeescript',
  278. 'lang-css',
  279. 'lang-d',
  280. 'lang-dart',
  281. 'lang-diff',
  282. 'lang-elixir',
  283. 'lang-gcode',
  284. 'lang-git',
  285. 'lang-go',
  286. 'lang-graphql',
  287. 'lang-groovy',
  288. 'lang-hcl',
  289. 'lang-html',
  290. 'lang-http',
  291. 'lang-ini',
  292. 'lang-java',
  293. 'lang-javascript',
  294. 'lang-json',
  295. 'lang-jsx',
  296. 'lang-kotlin',
  297. 'lang-latex',
  298. 'lang-liquid',
  299. 'lang-lua',
  300. 'lang-makefile',
  301. 'lang-markdown',
  302. 'lang-markup',
  303. 'lang-mathml',
  304. 'lang-nginx',
  305. 'lang-objectivec',
  306. 'lang-pascal',
  307. 'lang-perl',
  308. 'lang-php',
  309. 'lang-powershell',
  310. 'lang-python',
  311. 'lang-r',
  312. 'lang-rss',
  313. 'lang-ruby',
  314. 'lang-rust',
  315. 'lang-sass',
  316. 'lang-scala',
  317. 'lang-scss',
  318. 'lang-shell-session',
  319. 'lang-solidity',
  320. 'lang-sql',
  321. 'lang-ssml',
  322. 'lang-svg',
  323. 'lang-swift',
  324. 'lang-tsx',
  325. 'lang-twig',
  326. 'lang-typescript',
  327. 'lang-visual-basic',
  328. 'lang-xml',
  329. 'lang-yaml',
  330. 'lang-none',
  331. )
  332. );
  333. return $classes;
  334. }
  335. function prismatic_highlight_classes() {
  336. $classes = array(
  337. array(
  338. 'language-'
  339. ),
  340. array(
  341. 'lang-',
  342. )
  343. );
  344. return $classes;
  345. }