class FilterResponsiveTablesFilter in Responsive Tables Filter 8
Responsive Tables Filter class. Implements process() method only.
Plugin annotation
@Filter(
id = "filter_responsive_tables_filter",
title = @Translation("Apply responsive behavior to HTML tables."),
type = Drupal\filter\Plugin\FilterInterface::TYPE_MARKUP_LANGUAGE,
settings = {
"tablesaw_type" = "stack",
"tablesaw_persist" = 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\responsive_tables_filter\Plugin\Filter\FilterResponsiveTablesFilter
- class \Drupal\filter\Plugin\FilterBase implements FilterInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of FilterResponsiveTablesFilter
1 file declares its use of FilterResponsiveTablesFilter
- TablesawSettings.php in src/
Form/ TablesawSettings.php
File
- src/
Plugin/ Filter/ FilterResponsiveTablesFilter.php, line 22
Namespace
Drupal\responsive_tables_filter\Plugin\FilterView source
class FilterResponsiveTablesFilter extends FilterBase {
/**
* Available Tablesaw modes.
*
* @var modes
*/
public static $modes = [
'stack' => "Stack Mode",
'columntoggle' => "Column Toggle Mode",
'swipe' => "Swipe Mode",
];
/**
* {@inheritdoc}
*/
public function process($text, $langcode) {
if ($filtered = $this
->runFilter($text)) {
$result = new FilterProcessResult($filtered);
// Attach Tablesaw library assets to this page.
$result
->setAttachments([
'library' => [
'responsive_tables_filter/tablesaw-filter',
],
]);
}
else {
$result = new FilterProcessResult($text);
}
return $result;
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$form['tablesaw_type'] = [
'#type' => 'select',
'#title' => $this
->t('Default mode'),
'#default_value' => $this->settings['tablesaw_type'] ?? 'stack',
'#description' => $this
->t('This will apply by default to tables in WYSIWYGs, but can be overridden on an individual basis by adding the <code>class</code> "tablesaw-stack", "tablesaw-columntoggle", or "tablesaw-swipe" to the <code>table</code> tag. See documentation: https://github.com/filamentgroup/tablesaw'),
'#options' => self::$modes,
];
$form['tablesaw_persist'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Persistent first column?'),
'#default_value' => $this->settings['tablesaw_persist'] ?? TRUE,
'#description' => $this
->t('This will apply to all tables in WYSIWYGs.'),
];
return $form;
}
/**
* Business logic for adding classes & attributes to <table> tags.
*/
public function runFilter($text) {
// Older versions of libxml always add DOCTYPE, <html>, and <body> tags.
// See http://www.php.net/manual/en/libxml.constants.php.
// Sometimes, PHP is >= 5.4, but libxml is old enough that the constants are
// not defined.
static $new_libxml;
if (!isset($new_libxml)) {
$new_libxml = version_compare(PHP_VERSION, '5.4', '>=') && defined('LIBXML_HTML_NOIMPLIED') && defined('LIBXML_HTML_NODEFDTD');
}
if ($text != '') {
$tables = [];
libxml_use_internal_errors(TRUE);
// LibXML requires that the html is wrapped in a root node.
$text = '<root>' . $text . '</root>';
$dom = new \DOMDocument();
if ($new_libxml) {
$dom
->loadHTML(mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
}
else {
$dom
->loadHTML(mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8'));
}
$tables = $dom
->getElementsByTagName('table');
// Find all tables in text.
if ($tables->length !== 0) {
foreach ($tables as $table) {
// Find existing class attributes, if any, and append tablesaw class.
$existing_classes = $table
->getAttribute('class');
if (strpos($existing_classes, 'no-tablesaw') === FALSE) {
$mode = $this->settings['tablesaw_type'] ?? 'stack';
// Allow for class-based override of default.
foreach (array_keys(self::$modes) as $mode_option) {
if (strpos($existing_classes, "tablesaw-" . $mode_option) !== FALSE) {
$mode = $mode_option;
break;
}
}
$new_classes = !empty($existing_classes) ? $existing_classes . ' tablesaw tablesaw-' . $mode : 'tablesaw tablesaw-' . $mode;
$table
->setAttribute('class', $new_classes);
// Set data-tablesaw-mode & minimap.
$table
->setAttribute('data-tablesaw-mode', $mode);
$table
->setAttribute('data-tablesaw-minimap', NULL);
$persist = $this->settings['tablesaw_persist'] ?? TRUE;
$ths = $table
->getElementsByTagName('th');
$inc = 1;
foreach ($ths as $delta => $th) {
// Add required columntoggle- & swipe- specific attributes.
if (in_array($mode, [
'columntoggle',
'swipe',
])) {
$th
->setAttribute('data-tablesaw-sortable-col', '');
if (!$th
->getAttribute('data-tablesaw-priority')) {
$th
->setAttribute('data-tablesaw-priority', $inc);
$inc++;
}
}
// Add persistent first column if no priority has been specified.
if ($persist && $delta === 0 && !$th
->getAttribute('data-tablesaw-priority')) {
$th
->setAttribute('data-tablesaw-priority', 'persist');
}
}
}
}
// Get innerHTML of root node.
$html = "";
foreach ($dom
->getElementsByTagName('root')
->item(0)->childNodes as $child) {
// Re-serialize the HTML.
$html .= $dom
->saveHTML($child);
}
// For lower older libxml, use preg_replace to clean up DOCTYPE.
if (!$new_libxml) {
$html_start = strpos($html, '<html><body>') + 12;
$html_length = strpos($html, '</body></html>') - $html_start;
$html = substr($html, $html_start, $html_length);
}
return $html;
}
}
return FALSE;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
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. | ||
FilterResponsiveTablesFilter:: |
public static | property | Available Tablesaw modes. | |
FilterResponsiveTablesFilter:: |
public | function |
Performs the filter processing. Overrides FilterInterface:: |
|
FilterResponsiveTablesFilter:: |
public | function | Business logic for adding classes & attributes to <table> tags. | |
FilterResponsiveTablesFilter:: |
public | function |
Generates a filter's settings form. Overrides FilterBase:: |
|
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. |