class AceFilter in Ace Code Editor 8
Filters implementation for Ace Editor.
Plugin annotation
@Filter(
id = "ace_filter",
title = @Translation("Ace Filter"),
description = @Translation("Use <ace> and </ace> tags to show it with syntax highlighting.
Add attributes to <ace> tag to control formatting."),
type = Drupal\filter\Plugin\FilterInterface::TYPE_MARKUP_LANGUAGE,
settings = {
"theme" = "cobalt",
"syntax" = "html",
"height" = "500px",
"width" = "700px",
"font_size" = "12pt",
"line_numbers" = TRUE,
"show_invisibles" = FALSE,
"print_margins" = TRUE,
"auto_complete" = TRUE,
"use_wrap_mode" = TRUE,
}
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\filter\Plugin\FilterBase implements FilterInterface
- class \Drupal\ace_editor\Plugin\Filter\AceFilter
- class \Drupal\filter\Plugin\FilterBase implements FilterInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of AceFilter
File
- src/
Plugin/ Filter/ AceFilter.php, line 32
Namespace
Drupal\ace_editor\Plugin\FilterView source
class AceFilter extends FilterBase {
/**
* Setting form for filters.
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$settings = $this->settings;
$config = \Drupal::config('ace_editor.settings');
return [
'theme' => [
'#type' => 'select',
'#title' => t('Theme'),
'#options' => $config
->get('theme_list'),
'#attributes' => [
'style' => 'width: 150px;',
],
'#default_value' => $settings['theme'],
],
'syntax' => [
'#type' => 'select',
'#title' => t('Syntax'),
'#description' => t('The syntax that will be highlighted.'),
'#options' => $config
->get('syntax_list'),
'#attributes' => [
'style' => 'width: 150px;',
],
'#default_value' => $settings['syntax'],
],
'height' => [
'#type' => 'textfield',
'#title' => t('Height'),
'#description' => t('The height of the editor in either pixels or percents.'),
'#attributes' => [
'style' => 'width: 100px;',
],
'#default_value' => $settings['height'],
],
'width' => [
'#type' => 'textfield',
'#title' => t('Width'),
'#description' => t('The width of the editor in either pixels or percents.'),
'#attributes' => [
'style' => 'width: 100px;',
],
'#default_value' => $settings['width'],
],
'font_size' => [
'#type' => 'textfield',
'#title' => t('Font size'),
'#description' => t('The the font size of the editor.'),
'#attributes' => [
'style' => 'width: 100px;',
],
'#default_value' => $settings['font_size'],
],
'line_numbers' => [
'#type' => 'checkbox',
'#title' => t('Show line numbers'),
'#default_value' => $settings['line_numbers'],
],
'print_margins' => [
'#type' => 'checkbox',
'#title' => t('Show print margin (80 chars)'),
'#default_value' => $settings['print_margins'],
],
'show_invisibles' => [
'#type' => 'checkbox',
'#title' => t('Show invisible characters (whitespaces, EOL...)'),
'#default_value' => $settings['show_invisibles'],
],
'use_wrap_mode' => [
'#type' => 'checkbox',
'#title' => t('Toggle word wrapping'),
'#default_value' => $settings['use_wrap_mode'],
],
];
}
/**
* Processing the filters and return the processed result.
*/
public function process($text, $langcode) {
$text = html_entity_decode($text);
if (preg_match_all("/<ace.*?>(.*?)\\s*<\\/ace>/s", $text, $match)) {
$js_settings = [
'instances' => [],
'theme_settings' => $this
->getConfiguration()['settings'],
];
foreach ($match[0] as $key => $value) {
$element_id = 'ace-editor-inline' . $key;
$content = trim($match[1][$key], "\n\r\0\v");
$replace = '<pre id="' . $element_id . '"></pre>';
// Override settings with attributes on the tag.
$settings = $this
->getConfiguration()['settings'];
$attach_lib = [];
foreach ($this
->tagAttributes('ace', $value) as $attribute_key => $attribute_value) {
$settings[$attribute_key] = $attribute_value;
if ($attribute_key == "theme" && \Drupal::service('library.discovery')
->getLibraryByName('ace_editor', 'theme.' . $attribute_value)) {
$attach_lib[] = "ace_editor/theme." . $attribute_value;
}
if ($attribute_key == "syntax" && \Drupal::service('library.discovery')
->getLibraryByName('ace_editor', 'mode.' . $attribute_value)) {
$attach_lib[] = "ace_editor/mode." . $attribute_value;
}
}
$js_settings['instances'][] = [
'id' => $element_id,
'content' => $content,
'settings' => $settings,
];
$text = $this
->strReplaceOnce($value, $replace, $text);
}
$result = new FilterProcessResult($text);
$attach_lib[] = 'ace_editor/filter';
$result
->setAttachments([
'library' => $attach_lib,
'drupalSettings' => [
// Pass settings variable ace_formatter to javascript.
'ace_filter' => $js_settings,
],
]);
return $result;
}
$result = new FilterProcessResult($text);
return $result;
}
/**
* Get all attributes of an <ace> tag in key/value pairs.
*/
public function tagAttributes($element_name, $xml) {
// Grab the string of attributes inside the editor tag.
$found = preg_match('#<' . $element_name . '\\s+([^>]+(?:"|\'))\\s?/?>#', $xml, $matches);
if ($found == 1) {
$attribute_array = [];
$attribute_string = $matches[1];
// Match attribute-name attribute-value pairs.
$found = preg_match_all('#([^\\s=]+)\\s*=\\s*(\'[^<\']*\'|"[^<"]*")#', $attribute_string, $matches, PREG_SET_ORDER);
if ($found != 0) {
// Create an associative array that matches attribute names
// with their values.
foreach ($matches as $attribute) {
$value = substr($attribute[2], 1, -1);
if ($value == "1" || $value == "0" || $value == "TRUE" || $value == "FALSE") {
$value = intval($value);
}
$attribute_array[str_replace('-', '_', $attribute[1])] = $value;
}
return $attribute_array;
}
}
// Attributes either weren't found, or couldn't be extracted
// by the regular expression.
return FALSE;
}
/**
* Custom function to replace the code only once.
*
* Probably not the most efficient way, but at least it works.
*/
public function strReplaceOnce($needle, $replace, $haystack) {
// Looks for the first occurence of $needle in $haystack
// and replaces it with $replace.
$pos = strpos($haystack, $needle);
if ($pos === FALSE) {
// Nothing found.
return $haystack;
}
return substr_replace($haystack, $replace, $pos, strlen($needle));
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
AceFilter:: |
public | function |
Processing the filters and return the processed result. Overrides FilterInterface:: |
|
AceFilter:: |
public | function |
Setting form for filters. Overrides FilterBase:: |
|
AceFilter:: |
public | function | Custom function to replace the code only once. | |
AceFilter:: |
public | function | Get all attributes of an <ace> tag in key/value pairs. | |
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
FilterBase:: |
public | property | The name of the provider that owns this filter. | |
FilterBase:: |
public | property | An associative array containing the configured settings of this filter. | |
FilterBase:: |
public | property | A Boolean indicating whether this filter is enabled. | |
FilterBase:: |
public | property | The weight of this filter compared to others in a filter collection. | |
FilterBase:: |
public | function |
Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: |
1 |
FilterBase:: |
public | function |
Gets default configuration for this plugin. Overrides ConfigurableInterface:: |
|
FilterBase:: |
public | function |
Gets this plugin's configuration. Overrides ConfigurableInterface:: |
|
FilterBase:: |
public | function |
Returns the administrative description for this filter plugin. Overrides FilterInterface:: |
|
FilterBase:: |
public | function |
Returns HTML allowed by this filter's configuration. Overrides FilterInterface:: |
4 |
FilterBase:: |
public | function |
Returns the administrative label for this filter plugin. Overrides FilterInterface:: |
|
FilterBase:: |
public | function |
Returns the processing type of this filter plugin. Overrides FilterInterface:: |
|
FilterBase:: |
public | function |
Prepares the text for processing. Overrides FilterInterface:: |
|
FilterBase:: |
public | function |
Sets the configuration for this plugin instance. Overrides ConfigurableInterface:: |
1 |
FilterBase:: |
public | function |
Generates a filter's tip. Overrides FilterInterface:: |
9 |
FilterBase:: |
public | function |
Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase:: |
4 |
FilterInterface:: |
constant | HTML tag and attribute restricting filters to prevent XSS attacks. | ||
FilterInterface:: |
constant | Non-HTML markup language filters that generate HTML. | ||
FilterInterface:: |
constant | Irreversible transformation filters. | ||
FilterInterface:: |
constant | Reversible transformation filters. | ||
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |