abstract class GlossifyBase in Glossify 8
Base implementation of tooltip filter type plugin.
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\glossify\GlossifyBase
- class \Drupal\filter\Plugin\FilterBase implements FilterInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of GlossifyBase
3 files declare their use of GlossifyBase
- GlossifyBaseTest.php in tests/
src/ Unit/ GlossifyBaseTest.php - NodeTooltip.php in modules/
glossify_node/ src/ Plugin/ Filter/ NodeTooltip.php - TaxonomyTooltip.php in modules/
glossify_taxonomy/ src/ Plugin/ Filter/ TaxonomyTooltip.php
File
- src/
GlossifyBase.php, line 15
Namespace
Drupal\glossifyView source
abstract class GlossifyBase extends FilterBase {
/**
* Convert terms in text to links.
*
* @param string $text
* The HTML text upon which the filter is acting.
* @param array $terms
* The terms (array) to be replaced with links.
* structure: [$termname_lower => [
* ['id' => $id],
* ['name' => $term],
* ['name_norm' => $termname_lower],
* ['tip' => $tooltip],
* ]].
* @param bool $case_sensitivity
* Case sensitive replace.
* @param bool $first_only
* Replace only first match.
* @param string $displaytype
* Type of tooltip/link.
* @param string $urlpattern
* URL pattern to create links.
*
* @return string
* The original HTML with the term string replaced by links.
*/
protected function parseTooltipMatch($text, array $terms, $case_sensitivity, $first_only, $displaytype, $urlpattern) {
// Create dom document.
$html_dom = Html::load($text);
$xpath = new DOMXPath($html_dom);
$pattern_parts = $replaced = [];
// Transform terms into normalized search pattern.
foreach ($terms as $term) {
$term_norm = preg_replace('/\\s+/', ' ', preg_quote(trim($term->name_norm)));
$term_norm = preg_replace('#/#', '\\/', $term_norm);
$pattern_parts[] = preg_replace('/ /', '\\s+', $term_norm);
}
// Process HTML.
$text_nodes = $xpath
->query('//text()[not(ancestor::a) and not(ancestor::span[@class="glossify-exclude"])]');
foreach ($text_nodes as $original_node) {
$text = $original_node->nodeValue;
$matches = [];
foreach ($pattern_parts as $pattern_part) {
$pattern = '/\\b(' . $pattern_part . ')\\b/';
if (!$case_sensitivity) {
$pattern .= 'i';
}
preg_match_all($pattern, $text, $matches_part, PREG_OFFSET_CAPTURE);
if (count($matches_part[0])) {
foreach ($matches_part[0] as $match_part) {
$matches[$match_part[1]] = $match_part[0];
}
}
}
// Sort by position in text.
ksort($matches);
if (count($matches) > 0) {
$offset = $loop_count = 0;
$parent = $original_node->parentNode;
$refnode = $original_node->nextSibling;
$current_path = $this
->currentPath();
$parent
->removeChild($original_node);
foreach ($matches as $term_pos => $term_txt) {
$loop_count += 1;
$term_txt = preg_replace('/\\s+/', ' ', $term_txt);
$terms_key = $case_sensitivity ? $term_txt : strtolower($term_txt);
// Insert any text before the term instance.
$prefix = substr($text, $offset, $term_pos - $offset);
$parent
->insertBefore($html_dom
->createTextNode($prefix), $refnode);
$dom_fragment = $html_dom
->createDocumentFragment();
if ($current_path == str_replace('[id]', $terms[$terms_key]->id, $urlpattern)) {
// Reinsert the found match if whe are on the page
// this match points to.
$dom_fragment
->appendXML($term_txt);
}
elseif ($first_only && in_array($term_txt, $replaced)) {
// Reinsert the found match if only first match must be parsed.
$dom_fragment
->appendXML($term_txt);
}
else {
$tip = '';
if ($displaytype == 'links' || $displaytype == 'tooltips_links') {
// Insert the matched term instance as link.
if ($displaytype == 'tooltips_links') {
$tip = $this
->sanitizeTip($terms[$terms_key]->tip);
}
if (\Drupal::hasContainer()) {
$tipurl = Url::fromUri('internal:' . str_replace('[id]', $terms[$terms_key]->id, $urlpattern));
}
else {
$tipurl = str_replace('[id]', $terms[$terms_key]->id, $urlpattern);
}
$word_link = [
'#theme' => 'glossify_link',
'#word' => $term_txt,
'#tip' => $tip,
'#tipurl' => $tipurl,
];
$word = $this
->renderLink($word_link);
}
else {
// Has to be 'tooltips'.
// Insert the matched term instance as tooltip.
$tip = $this
->sanitizeTip($terms[$terms_key]->tip);
$word_tip = [
'#theme' => 'glossify_tooltip',
'#word' => $term_txt,
'#tip' => $tip,
];
$word = $this
->renderTip($word_tip);
}
$dom_fragment
->appendXML($word);
$replaced[] = $term_txt;
}
$parent
->insertBefore($dom_fragment, $refnode);
$offset = $term_pos + strlen($term_txt);
// Last match, append remaining text.
if ($loop_count == count($matches)) {
$suffix = substr($text, $offset);
$parent
->insertBefore($html_dom
->createTextNode($suffix), $refnode);
}
}
}
}
return Html::serialize($html_dom);
}
/**
* Render tip for found match.
*/
protected function renderTip($word_tip) {
return trim(render($word_tip));
}
/**
* Render link for found match.
*/
protected function renderLink($word_link) {
return trim(render($word_link));
}
/**
* Get current path.
*/
protected function currentPath() {
return \Drupal::service('path.current')
->getPath();
}
/**
* Cleanup and truncate tip text.
*/
private function sanitizeTip($tip) {
// Get rid of HTML.
$tip = strip_tags($tip);
// Maximise tooltip text length.
$tip = Unicode::truncate($tip, 300, TRUE, TRUE);
return $tip;
}
}
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 settings form. Overrides FilterInterface:: |
3 |
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:: |
public | function | Performs the filter processing. | 21 |
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. | ||
GlossifyBase:: |
protected | function | Get current path. | 1 |
GlossifyBase:: |
protected | function | Convert terms in text to links. | |
GlossifyBase:: |
protected | function | Render link for found match. | 1 |
GlossifyBase:: |
protected | function | Render tip for found match. | 1 |
GlossifyBase:: |
private | function | Cleanup and truncate tip text. | |
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. |