Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 80 |
StylesCombo | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
240 | |
0.00% |
0 / 80 |
isInternal | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getFile | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getConfig | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 9 |
|||
getButtons | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 13 |
|||
settingsForm | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 20 |
|||
validateStylesValue | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
generateStylesSetSetting | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 30 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\ckeditor\Plugin\CKEditorPlugin\StylesCombo. | |
*/ | |
namespace Drupal\ckeditor\Plugin\CKEditorPlugin; | |
use Drupal\ckeditor\CKEditorPluginBase; | |
use Drupal\ckeditor\CKEditorPluginConfigurableInterface; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\editor\Entity\Editor; | |
/** | |
* Defines the "stylescombo" plugin. | |
* | |
* @CKEditorPlugin( | |
* id = "stylescombo", | |
* label = @Translation("Styles dropdown") | |
* ) | |
*/ | |
class StylesCombo extends CKEditorPluginBase implements CKEditorPluginConfigurableInterface { | |
/** | |
* {@inheritdoc} | |
*/ | |
public function isInternal() { | |
return TRUE; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getFile() { | |
// This plugin is already part of Drupal core's CKEditor build. | |
return FALSE; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getConfig(Editor $editor) { | |
$config = array(); | |
$settings = $editor->getSettings(); | |
if (!isset($settings['plugins']['stylescombo']['styles'])) { | |
return $config; | |
} | |
$styles = $settings['plugins']['stylescombo']['styles']; | |
$config['stylesSet'] = $this->generateStylesSetSetting($styles); | |
return $config; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getButtons() { | |
return array( | |
'Styles' => array( | |
'label' => t('Font style'), | |
'image_alternative' => [ | |
'#type' => 'inline_template', | |
'#template' => '<a href="#" role="button" aria-label="{{ styles_text }}"><span class="ckeditor-button-dropdown">{{ styles_text }}<span class="ckeditor-button-arrow"></span></span></a>', | |
'#context' => [ | |
'styles_text' => t('Styles'), | |
], | |
], | |
), | |
); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function settingsForm(array $form, FormStateInterface $form_state, Editor $editor) { | |
// Defaults. | |
$config = array('styles' => ''); | |
$settings = $editor->getSettings(); | |
if (isset($settings['plugins']['stylescombo'])) { | |
$config = $settings['plugins']['stylescombo']; | |
} | |
$form['styles'] = array( | |
'#title' => t('Styles'), | |
'#title_display' => 'invisible', | |
'#type' => 'textarea', | |
'#default_value' => $config['styles'], | |
'#description' => t('A list of classes that will be provided in the "Styles" dropdown. Enter one or more classes on each line in the format: element.classA.classB|Label. Example: h1.title|Title. Advanced example: h1.fancy.title|Fancy title.<br />These styles should be available in your theme\'s CSS file.'), | |
'#attached' => array( | |
'library' => array('ckeditor/drupal.ckeditor.stylescombo.admin'), | |
), | |
'#element_validate' => array( | |
array($this, 'validateStylesValue'), | |
), | |
); | |
return $form; | |
} | |
/** | |
* #element_validate handler for the "styles" element in settingsForm(). | |
*/ | |
public function validateStylesValue(array $element, FormStateInterface $form_state) { | |
if ($this->generateStylesSetSetting($element['#value']) === FALSE) { | |
$form_state->setError($element, t('The provided list of styles is syntactically incorrect.')); | |
} | |
} | |
/** | |
* Builds the "stylesSet" configuration part of the CKEditor JS settings. | |
* | |
* @see getConfig() | |
* | |
* @param string $styles | |
* The "styles" setting. | |
* @return array|FALSE | |
* An array containing the "stylesSet" configuration, or FALSE when the | |
* syntax is invalid. | |
*/ | |
protected function generateStylesSetSetting($styles) { | |
$styles_set = array(); | |
// Early-return when empty. | |
$styles = trim($styles); | |
if (empty($styles)) { | |
return $styles_set; | |
} | |
$styles = str_replace(array("\r\n", "\r"), "\n", $styles); | |
foreach (explode("\n", $styles) as $style) { | |
$style = trim($style); | |
// Ignore empty lines in between non-empty lines. | |
if (empty($style)) { | |
continue; | |
} | |
// Validate syntax: element[.class...]|label pattern expected. | |
if (!preg_match('@^ *[a-zA-Z0-9]+ *(\\.[a-zA-Z0-9_-]+ *)*\\| *.+ *$@', $style)) { | |
return FALSE; | |
} | |
// Parse. | |
list($selector, $label) = explode('|', $style); | |
$classes = explode('.', $selector); | |
$element = array_shift($classes); | |
// Build the data structure CKEditor's stylescombo plugin expects. | |
// @see http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Styles | |
$configured_style = array( | |
'name' => trim($label), | |
'element' => trim($element), | |
); | |
if (!empty($classes)) { | |
$configured_style['attributes'] = array( | |
'class' => implode(' ', array_map('trim', $classes)) | |
); | |
} | |
$styles_set[] = $configured_style; | |
} | |
return $styles_set; | |
} | |
} |