ace.plugin.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. /**
  3. * Ace Source Editor Plugin
  4. *
  5. * Events: OnManagerPageBeforeRender, OnRichTextEditorRegister, OnSnipFormPrerender,
  6. * OnTempFormPrerender, OnChunkFormPrerender, OnPluginFormPrerender,
  7. * OnFileCreateFormPrerender, OnFileEditFormPrerender, OnDocFormPrerender
  8. *
  9. * @author Danil Kostin <danya.postfactum(at)gmail.com>
  10. *
  11. * @package ace
  12. *
  13. * @var array $scriptProperties
  14. * @var Ace $ace
  15. */
  16. if ($modx->event->name == 'OnRichTextEditorRegister') {
  17. $modx->event->output('Ace');
  18. return;
  19. }
  20. if ($modx->getOption('which_element_editor', null, 'Ace') !== 'Ace') {
  21. return;
  22. }
  23. $ace = $modx->getService('ace', 'Ace', $modx->getOption('ace.core_path', null, $modx->getOption('core_path').'components/ace/').'model/ace/');
  24. $ace->initialize();
  25. $extensionMap = array(
  26. 'tpl' => 'text/x-smarty',
  27. 'htm' => 'text/html',
  28. 'html' => 'text/html',
  29. 'css' => 'text/css',
  30. 'scss' => 'text/x-scss',
  31. 'less' => 'text/x-less',
  32. 'svg' => 'image/svg+xml',
  33. 'xml' => 'application/xml',
  34. 'xsl' => 'application/xml',
  35. 'js' => 'application/javascript',
  36. 'json' => 'application/json',
  37. 'php' => 'application/x-php',
  38. 'sql' => 'text/x-sql',
  39. 'md' => 'text/x-markdown',
  40. 'txt' => 'text/plain',
  41. 'twig' => 'text/x-twig'
  42. );
  43. // Define default mime for html elements(templates, chunks and html resources)
  44. $html_elements_mime=$modx->getOption('ace.html_elements_mime',null,false);
  45. if(!$html_elements_mime){
  46. // this may deprecated in future because components may set ace.html_elements_mime option now
  47. switch (true) {
  48. case $modx->getOption('twiggy_class'):
  49. $html_elements_mime = 'text/x-twig';
  50. break;
  51. case $modx->getOption('pdotools_fenom_parser'):
  52. $html_elements_mime = 'text/x-smarty';
  53. break;
  54. default:
  55. $html_elements_mime = 'text/html';
  56. }
  57. }
  58. // Defines wether we should highlight modx tags
  59. $modxTags = false;
  60. switch ($modx->event->name) {
  61. case 'OnSnipFormPrerender':
  62. $field = 'modx-snippet-snippet';
  63. $mimeType = 'application/x-php';
  64. break;
  65. case 'OnTempFormPrerender':
  66. $field = 'modx-template-content';
  67. $modxTags = true;
  68. $mimeType = $html_elements_mime;
  69. break;
  70. case 'OnChunkFormPrerender':
  71. $field = 'modx-chunk-snippet';
  72. if ($modx->controller->chunk && $modx->controller->chunk->isStatic()) {
  73. $extension = pathinfo($modx->controller->chunk->name, PATHINFO_EXTENSION);
  74. if(!$extension||!isset($extensionMap[$extension])){
  75. $extension = pathinfo($modx->controller->chunk->getSourceFile(), PATHINFO_EXTENSION);
  76. }
  77. $mimeType = isset($extensionMap[$extension]) ? $extensionMap[$extension] : 'text/plain';
  78. } else {
  79. $mimeType = $html_elements_mime;
  80. }
  81. $modxTags = true;
  82. break;
  83. case 'OnPluginFormPrerender':
  84. $field = 'modx-plugin-plugincode';
  85. $mimeType = 'application/x-php';
  86. break;
  87. case 'OnFileCreateFormPrerender':
  88. $field = 'modx-file-content';
  89. $mimeType = 'text/plain';
  90. break;
  91. case 'OnFileEditFormPrerender':
  92. $field = 'modx-file-content';
  93. $extension = pathinfo($scriptProperties['file'], PATHINFO_EXTENSION);
  94. $mimeType = isset($extensionMap[$extension])
  95. ? $extensionMap[$extension]
  96. : 'text/plain';
  97. $modxTags = $extension == 'tpl';
  98. break;
  99. case 'OnDocFormPrerender':
  100. if (!$modx->controller->resourceArray) {
  101. return;
  102. }
  103. $field = 'ta';
  104. $mimeType = $modx->getObject('modContentType', $modx->controller->resourceArray['content_type'])->get('mime_type');
  105. if($mimeType == 'text/html')$mimeType = $html_elements_mime;
  106. if ($modx->getOption('use_editor')){
  107. $richText = $modx->controller->resourceArray['richtext'];
  108. $classKey = $modx->controller->resourceArray['class_key'];
  109. if ($richText || in_array($classKey, array('modStaticResource','modSymLink','modWebLink','modXMLRPCResource'))) {
  110. $field = false;
  111. }
  112. }
  113. $modxTags = true;
  114. break;
  115. default:
  116. return;
  117. }
  118. $modxTags = (int) $modxTags;
  119. $script = '';
  120. if ($field) {
  121. $script .= "MODx.ux.Ace.replaceComponent('$field', '$mimeType', $modxTags);";
  122. }
  123. if ($modx->event->name == 'OnDocFormPrerender' && !$modx->getOption('use_editor')) {
  124. $script .= "MODx.ux.Ace.replaceTextAreas(Ext.query('.modx-richtext'));";
  125. }
  126. if ($script) {
  127. $modx->controller->addHtml('<script>Ext.onReady(function() {' . $script . '});</script>');
  128. }