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.

556 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. if (isset($prismatic_options_prism['command_line']) && $prismatic_options_prism['command_line']) {
  82. wp_enqueue_script('prismatic-command-line', PRISMATIC_URL .'lib/prism/js/plugin-command-line.js', array('prismatic-prism'), PRISMATIC_VERSION, true);
  83. }
  84. $prefix = array('lang-', 'language-');
  85. foreach ($languages as $language) {
  86. $language = str_replace($prefix, '', $language);
  87. $file = PRISMATIC_DIR . 'lib/prism/js/lang-'. $language .'.js';
  88. if (file_exists($file)) {
  89. wp_enqueue_script('prismatic-prism-'. $language, PRISMATIC_URL .'lib/prism/js/lang-'. $language .'.js', array('prismatic-prism'), PRISMATIC_VERSION, true);
  90. }
  91. }
  92. if (is_admin()) {
  93. // todo: once gutenberg is further developed, find a better way to add editor support
  94. function prismatic_prism_inline_js() {
  95. ?>
  96. <script type="text/javascript">
  97. document.onreadystatechange = function () {
  98. if (document.readyState == 'complete') {
  99. Prism.highlightAll();
  100. }
  101. }
  102. </script>
  103. <?php
  104. }
  105. add_action('admin_print_footer_scripts', 'prismatic_prism_inline_js');
  106. }
  107. }
  108. }
  109. function prismatic_highlight_enqueue() {
  110. global $prismatic_options_highlight;
  111. if (isset($prismatic_options_highlight['singular_only']) && $prismatic_options_highlight['singular_only'] && !is_singular() && !is_admin()) return;
  112. $always_load = (isset($prismatic_options_highlight['noprefix_classes']) && $prismatic_options_highlight['noprefix_classes']) ? true : false;
  113. $languages = prismatic_active_languages('highlight');
  114. $languages = array_filter($languages);
  115. if (!empty($languages) || $always_load) {
  116. $theme = (isset($prismatic_options_highlight['highlight_theme'])) ? $prismatic_options_highlight['highlight_theme'] : 'default';
  117. wp_enqueue_style('prismatic-highlight', PRISMATIC_URL .'lib/highlight/css/'. $theme .'.css', array(), PRISMATIC_VERSION, 'all');
  118. wp_enqueue_script('prismatic-highlight', PRISMATIC_URL .'lib/highlight/js/highlight-core.js', array(), PRISMATIC_VERSION, true);
  119. $init = (isset($prismatic_options_highlight['init_javascript'])) ? $prismatic_options_highlight['init_javascript'] : '';
  120. if ($init) {
  121. wp_add_inline_script('prismatic-highlight', $init, 'after');
  122. }
  123. if (is_admin()) {
  124. // todo: once gutenberg is further developed, find a better way to add editor support
  125. function prismatic_highlight_inline_js() {
  126. ?>
  127. <script type="text/javascript">
  128. document.onreadystatechange = function () {
  129. if (document.readyState == 'complete') {
  130. jQuery('pre > code').each(function() {
  131. hljs.highlightBlock(this);
  132. });
  133. }
  134. }
  135. </script>
  136. <?php
  137. }
  138. add_action('admin_print_footer_scripts', 'prismatic_highlight_inline_js');
  139. }
  140. }
  141. }
  142. function prismatic_active_languages($library) {
  143. global $posts, $post;
  144. $languages = array();
  145. if (is_admin()) {
  146. $content = $post->post_content;
  147. $languages = prismatic_active_languages_loop($library, '', $content, array(), null);
  148. } else {
  149. if (is_singular()) {
  150. $excerpt = $post->post_excerpt;
  151. $content = $post->post_content;
  152. $comments = ($post->comment_count) ? get_comments(array('post_id' => $post->ID, 'status' => 'approve')) : array();
  153. $fields = function_exists('get_fields') ? get_fields($post->ID) : null; // ACF
  154. $languages = prismatic_active_languages_loop($library, $excerpt, $content, $comments, $fields);
  155. } else {
  156. foreach ($posts as $post) {
  157. $excerpt = $post->post_excerpt;
  158. $content = $post->post_content;
  159. $comments = array();
  160. $langs_array[] = prismatic_active_languages_loop($library, $excerpt, $content, $comments, null);
  161. }
  162. if (!empty($langs_array) && is_array($langs_array)) {
  163. foreach($langs_array as $key => $value) {
  164. foreach ($value as $k => $v) {
  165. $languages[] = $v;
  166. }
  167. }
  168. }
  169. }
  170. }
  171. return $languages;
  172. }
  173. function prismatic_active_languages_loop($library, $excerpt, $content, $comments, $fields) {
  174. $languages = array();
  175. $classes = ($library === 'prism') ? prismatic_prism_classes() : prismatic_highlight_classes();
  176. foreach ($classes as $class) {
  177. foreach($class as $cls) {
  178. if (strpos($excerpt, $cls) !== false) {
  179. $languages[] = $cls;
  180. }
  181. if (strpos($content, $cls) !== false) {
  182. $languages[] = $cls;
  183. }
  184. foreach ($comments as $comment) {
  185. if (strpos($comment->comment_content, $cls) !== false) {
  186. $languages[] = $cls;
  187. }
  188. }
  189. if ($fields) {
  190. foreach ($fields as $key => $value) {
  191. if (is_string($value) && strpos($value, $cls) !== false) {
  192. $languages[] = $cls;
  193. }
  194. }
  195. }
  196. }
  197. }
  198. $languages = array_unique($languages);
  199. return $languages;
  200. }
  201. function prismatic_prism_classes() {
  202. $classes = array(
  203. array(
  204. 'language-apacheconf',
  205. 'language-applescript',
  206. 'language-arduino',
  207. 'language-atom',
  208. 'language-bash',
  209. 'language-batch',
  210. 'language-c',
  211. 'language-csharp',
  212. 'language-cpp',
  213. 'language-clike',
  214. 'language-coffeescript',
  215. 'language-css',
  216. 'language-d',
  217. 'language-dart',
  218. 'language-diff',
  219. 'language-elixir',
  220. 'language-gcode',
  221. 'language-git',
  222. 'language-go',
  223. 'language-graphql',
  224. 'language-groovy',
  225. 'language-hcl',
  226. 'language-html',
  227. 'language-http',
  228. 'language-ini',
  229. 'language-java',
  230. 'language-javascript',
  231. 'language-json',
  232. 'language-jsx',
  233. 'language-kotlin',
  234. 'language-latex',
  235. 'language-liquid',
  236. 'language-lua',
  237. 'language-makefile',
  238. 'language-markdown',
  239. 'language-markup',
  240. 'language-mathml',
  241. 'language-nginx',
  242. 'language-objectivec',
  243. 'language-pascal',
  244. 'language-perl',
  245. 'language-php',
  246. 'language-powerquery',
  247. 'language-powershell',
  248. 'language-python',
  249. 'language-r',
  250. 'language-rss',
  251. 'language-ruby',
  252. 'language-rust',
  253. 'language-sass',
  254. 'language-scala',
  255. 'language-scss',
  256. 'language-shell-session',
  257. 'language-solidity',
  258. 'language-splunk-spl',
  259. 'language-sql',
  260. 'language-ssml',
  261. 'language-svg',
  262. 'language-swift',
  263. 'language-tsx',
  264. 'language-twig',
  265. 'language-typescript',
  266. 'language-visual-basic',
  267. 'language-xml',
  268. 'language-yaml',
  269. 'language-none',
  270. ),
  271. array(
  272. 'lang-apacheconf',
  273. 'lang-applescript',
  274. 'lang-arduino',
  275. 'lang-atom',
  276. 'lang-bash',
  277. 'lang-batch',
  278. 'lang-c',
  279. 'lang-csharp',
  280. 'lang-cpp',
  281. 'lang-clike',
  282. 'lang-coffeescript',
  283. 'lang-css',
  284. 'lang-d',
  285. 'lang-dart',
  286. 'lang-diff',
  287. 'lang-elixir',
  288. 'lang-gcode',
  289. 'lang-git',
  290. 'lang-go',
  291. 'lang-graphql',
  292. 'lang-groovy',
  293. 'lang-hcl',
  294. 'lang-html',
  295. 'lang-http',
  296. 'lang-ini',
  297. 'lang-java',
  298. 'lang-javascript',
  299. 'lang-json',
  300. 'lang-jsx',
  301. 'lang-kotlin',
  302. 'lang-latex',
  303. 'lang-liquid',
  304. 'lang-lua',
  305. 'lang-makefile',
  306. 'lang-markdown',
  307. 'lang-markup',
  308. 'lang-mathml',
  309. 'lang-nginx',
  310. 'lang-objectivec',
  311. 'lang-pascal',
  312. 'lang-perl',
  313. 'lang-php',
  314. 'lang-powerquery',
  315. 'lang-powershell',
  316. 'lang-python',
  317. 'lang-r',
  318. 'lang-rss',
  319. 'lang-ruby',
  320. 'lang-rust',
  321. 'lang-sass',
  322. 'lang-scala',
  323. 'lang-scss',
  324. 'lang-shell-session',
  325. 'lang-solidity',
  326. 'lang-splunk-spl',
  327. 'lang-sql',
  328. 'lang-ssml',
  329. 'lang-svg',
  330. 'lang-swift',
  331. 'lang-tsx',
  332. 'lang-twig',
  333. 'lang-typescript',
  334. 'lang-visual-basic',
  335. 'lang-xml',
  336. 'lang-yaml',
  337. 'lang-none',
  338. )
  339. );
  340. return $classes;
  341. }
  342. function prismatic_highlight_classes() {
  343. $classes = array(
  344. array(
  345. 'language-'
  346. ),
  347. array(
  348. 'lang-',
  349. )
  350. );
  351. return $classes;
  352. }