diff --git a/ace_editor.module b/ace_editor.module index 2e42215f6e8ef79eee9219f8e68fa16d2d1fb27c..9680ace893ef141f2ba8d86743ac07e100eb234b 100644 --- a/ace_editor.module +++ b/ace_editor.module @@ -100,6 +100,7 @@ function ace_editor_library_info_alter(&$libraries, $extension) { $libraries['primary']['js'][$library_path . 'ext-language_tools.js'] = ['weight' => -2]; } $libraries['formatter']['js'][$library_path . 'ace.js'] = ['weight' => -2]; + $libraries['formatter']['js'][$library_path . 'ext-modelist.js'] = ['weight' => -2]; $libraries['filter']['js'][$library_path . 'ace.js'] = ['weight' => -2]; } } diff --git a/config/install/ace_editor.settings.yml b/config/install/ace_editor.settings.yml index b0978819d0487d09bdf6a1facae8dce60e500a20..3925ae7f44fa9155842c8c91c1f00a9621fd5436 100644 --- a/config/install/ace_editor.settings.yml +++ b/config/install/ace_editor.settings.yml @@ -178,6 +178,9 @@ syntax_list: yaml: "YAML" theme: 'cobalt' syntax: 'html' +syntax_field: '_none' +modelist: false +inline: false height: '300px' width: '100%' font_size: '12pt' diff --git a/js/formatter.js b/js/formatter.js index 6a1a60f67e3106c4ff6e7a8e7c014d25b55c7b0a..ae8ec4ad68723f63eb9085bd4e0d80fb0bf35b4b 100644 --- a/js/formatter.js +++ b/js/formatter.js @@ -31,12 +31,21 @@ // Setting theme and mode variable. var theme = ace_settings.theme; var mode = ace_settings.syntax; + var inline = Boolean(ace_settings.inline); + if (ace_settings.syntax_field_value) { + mode = ace_settings.syntax_field_value; + if (ace_settings.modelist) { + let modelist = ace.require("ace/ext/modelist"); + mode = modelist.getModeForPath("." + mode).name; + } + } // Setting editor style and properties. var editor = ace.edit(display_id); editor.setReadOnly(true); editor.setTheme("ace/theme/"+theme); - editor.getSession().setMode("ace/mode/"+mode); + editor.getSession().setMode({path:"ace/mode/" + mode, inline:inline}); + editor.getSession().setValue(content.val()); $("#"+display_id).height(ace_settings.height).width(ace_settings.width); diff --git a/src/Plugin/Field/FieldFormatter/AceFormatter.php b/src/Plugin/Field/FieldFormatter/AceFormatter.php index b6ef2a58a72509f9feb6375435af849736c936a9..0f4b0f032dfa023e7f00d34434168922ec3ff234 100644 --- a/src/Plugin/Field/FieldFormatter/AceFormatter.php +++ b/src/Plugin/Field/FieldFormatter/AceFormatter.php @@ -2,6 +2,7 @@ namespace Drupal\ace_editor\Plugin\Field\FieldFormatter; +use Drupal\Core\Entity\EntityFieldManagerInterface; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FormatterBase; @@ -39,6 +40,13 @@ class AceFormatter extends FormatterBase implements ContainerFactoryPluginInterf */ protected $renderer; + /** + * The entity field manager. + * + * @var \Drupal\Core\Entity\EntityFieldManagerInterface + */ + protected $entityFieldManager; + /** * Constructs an AceFormatter instance. * @@ -60,13 +68,16 @@ class AceFormatter extends FormatterBase implements ContainerFactoryPluginInterf * The rendered service. * @param \Drupal\Core\Config\ConfigFactory $config_factory * The config factory. + * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager + * The entity field manager. */ - public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, RendererInterface $renderer, ConfigFactory $config_factory) { + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, RendererInterface $renderer, ConfigFactory $config_factory, EntityFieldManagerInterface $entity_field_manager) { parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings); $this->renderer = $renderer; $this->configFactory = $config_factory; + $this->entityFieldManager = $entity_field_manager; } /** @@ -82,7 +93,8 @@ class AceFormatter extends FormatterBase implements ContainerFactoryPluginInterf $configuration['view_mode'], $configuration['third_party_settings'], $container->get('renderer'), - $container->get('config.factory') + $container->get('config.factory'), + $container->get('entity_field.manager') ); } @@ -104,6 +116,9 @@ class AceFormatter extends FormatterBase implements ContainerFactoryPluginInterf $summary = []; $summary[] = $this->t('Theme:') . ' ' . $settings['theme']; $summary[] = $this->t('Syntax:') . ' ' . $settings['syntax']; + $summary[] = $this->t('Syntax field:') . ' ' . $this->getSyntaxOptions()[$settings['syntax_field']]; + $summary[] = $this->t('Syntax use modelist:') . ' ' . ($settings['modelist'] ? $this->t('Yes') : $this->t('No')); + $summary[] = $this->t('Inline:') . ' ' . ($settings['inline'] ? $this->t('Yes') : $this->t('No')); $summary[] = $this->t('Height:') . ' ' . $settings['height']; $summary[] = $this->t('Width:') . ' ' . $settings['width']; $summary[] = $this->t('Font size:') . ' ' . $settings['font_size']; @@ -146,6 +161,24 @@ class AceFormatter extends FormatterBase implements ContainerFactoryPluginInterf ], '#default_value' => $settings['syntax'], ], + 'syntax_field' => [ + '#type' => 'select', + '#title' => $this->t('Syntax field'), + '#default_value' => $settings['syntax_field'], + '#options' => $this->getSyntaxOptions(), + ], + 'modelist' => [ + '#type' => 'checkbox', + '#title' => $this->t('Modelist'), + '#description' => $this->t('Use the ACE modelist to convert a file-extension to a syntax mode.'), + '#default_value' => $settings['modelist'], + ], + 'inline' => [ + '#type' => 'checkbox', + '#title' => $this->t('Inline'), + '#description' => $this->t('Specify if the code shall be displayed as inline code.'), + '#default_value' => $settings['inline'], + ], 'height' => [ '#type' => 'textfield', '#title' => $this->t('Height'), @@ -205,6 +238,18 @@ class AceFormatter extends FormatterBase implements ContainerFactoryPluginInterf $settings = $this->getSettings(); foreach ($items as $delta => $item) { + if (isset($settings['syntax_field']) + && $settings['syntax_field'] != '_none' + && $item->getEntity()->hasField($settings['syntax_field']) + && !$item->getEntity()->get($settings['syntax_field'])->isEmpty() + ) { + $field_storage_definition = $item->getEntity()->get($settings['syntax_field'])->getFieldDefinition()->getFieldStorageDefinition(); + $key = $field_storage_definition->getMainPropertyName(); + $settings['syntax_field_value'] = $item->getEntity()->get($settings['syntax_field'])->{$key}; + } + else { + $settings['syntax_field_value'] = NULL; + } $elements[$delta] = [ '#type' => 'textarea', @@ -230,4 +275,21 @@ class AceFormatter extends FormatterBase implements ContainerFactoryPluginInterf return $elements; } + /** + * Helper method to get all possible options for the syntax_field setting. + * + * @return array + * Select options for syntax_field. + */ + protected function getSyntaxOptions(): array { + $syntax_options = ['_none' => $this->t('None')]; + $entity_type_id = $this->fieldDefinition->getTargetEntityTypeId(); + $bundle = $this->fieldDefinition->getTargetBundle(); + foreach ($this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle) as $field) { + $syntax_options[$field->getName()] = $field->getLabel(); + } + + return $syntax_options; + } + }