Update to Drupal 8.0.0-beta15. For more information, see: https://www.drupal.org/node/2563023
This commit is contained in:
parent
2720a9ec4b
commit
f3791f1da3
1898 changed files with 54300 additions and 11481 deletions
|
@ -127,7 +127,18 @@ class Internal extends CKEditorPluginBase implements ContainerFactoryPluginInter
|
|||
*/
|
||||
public function getButtons() {
|
||||
$button = function($name, $direction = 'ltr') {
|
||||
return '<a href="#" class="cke-icon-only cke_' . $direction . '" role="button" title="' . $name . '" aria-label="' . $name . '"><span class="cke_button_icon cke_button__' . str_replace(' ', '', $name) . '_icon">' . $name . '</span></a>';
|
||||
// In the markup below, we mostly use the name (which may include spaces),
|
||||
// but in one spot we use it as a CSS class, so strip spaces.
|
||||
$class_name = str_replace(' ', '', $name);
|
||||
return [
|
||||
'#type' => 'inline_template',
|
||||
'#template' => '<a href="#" class="cke-icon-only cke_{{ direction }}" role="button" title="{{ name }}" aria-label="{{ name }}"><span class="cke_button_icon cke_button__{{ classname }}_icon">{{ name }}</span></a>',
|
||||
'#context' => [
|
||||
'direction' => $direction,
|
||||
'name' => $name,
|
||||
'classname' => $class_name,
|
||||
],
|
||||
];
|
||||
};
|
||||
|
||||
return array(
|
||||
|
@ -256,7 +267,13 @@ class Internal extends CKEditorPluginBase implements ContainerFactoryPluginInter
|
|||
),
|
||||
'Format' => array(
|
||||
'label' => t('HTML block format'),
|
||||
'image_alternative' => '<a href="#" role="button" aria-label="' . t('Format') . '"><span class="ckeditor-button-dropdown">' . t('Format') . '<span class="ckeditor-button-arrow"></span></span></a>',
|
||||
'image_alternative' => [
|
||||
'#type' => 'inline_template',
|
||||
'#template' => '<a href="#" role="button" aria-label="{{ format_text }}"><span class="ckeditor-button-dropdown">{{ format_text }}<span class="ckeditor-button-arrow"></span></span></a>',
|
||||
'#context' => [
|
||||
'format_text' => t('Format'),
|
||||
],
|
||||
],
|
||||
),
|
||||
// "table" plugin.
|
||||
'Table' => array(
|
||||
|
@ -282,7 +299,13 @@ class Internal extends CKEditorPluginBase implements ContainerFactoryPluginInter
|
|||
// No plugin, separator "button" for toolbar builder UI use only.
|
||||
'-' => array(
|
||||
'label' => t('Separator'),
|
||||
'image_alternative' => '<a href="#" role="button" aria-label="' . t('Button separator') . '" class="ckeditor-separator"></a>',
|
||||
'image_alternative' => [
|
||||
'#type' => 'inline_template',
|
||||
'#template' => '<a href="#" role="button" aria-label="{{ button_separator_text }}" class="ckeditor-separator"></a>',
|
||||
'#context' => [
|
||||
'button_separator_text' => t('Button separator'),
|
||||
],
|
||||
],
|
||||
'attributes' => array(
|
||||
'class' => array('ckeditor-button-separator'),
|
||||
'data-drupal-ckeditor-type' => 'separator',
|
||||
|
@ -302,10 +325,6 @@ class Internal extends CKEditorPluginBase implements ContainerFactoryPluginInter
|
|||
*
|
||||
* @return array
|
||||
* An array containing the "format_tags" configuration.
|
||||
*
|
||||
* @see ckeditor_rebuild()
|
||||
* @see ckeditor_filter_format_insert()
|
||||
* @see ckeditor_filter_format_update()
|
||||
*/
|
||||
protected function generateFormatTagsSetting(Editor $editor) {
|
||||
// When no text format is associated yet, assume no tag is allowed.
|
||||
|
@ -315,9 +334,35 @@ class Internal extends CKEditorPluginBase implements ContainerFactoryPluginInter
|
|||
}
|
||||
|
||||
$format = $editor->getFilterFormat();
|
||||
// The <p> tag is always allowed — HTML without <p> tags is nonsensical.
|
||||
$default = 'p';
|
||||
return \Drupal::state()->get('ckeditor_internal_format_tags:' . $format->id(), $default);
|
||||
$cid = 'ckeditor_internal_format_tags:' . $format->id();
|
||||
|
||||
if ($cached = $this->cache->get($cid)) {
|
||||
$format_tags = $cached->data;
|
||||
}
|
||||
else {
|
||||
// The <p> tag is always allowed — HTML without <p> tags is nonsensical.
|
||||
$format_tags = ['p'];
|
||||
|
||||
// Given the list of possible format tags, automatically determine whether
|
||||
// the current text format allows this tag, and thus whether it should show
|
||||
// up in the "Format" dropdown.
|
||||
$possible_format_tags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'pre'];
|
||||
foreach ($possible_format_tags as $tag) {
|
||||
$input = '<' . $tag . '>TEST</' . $tag . '>';
|
||||
$output = trim(check_markup($input, $editor->id()));
|
||||
if ($input == $output) {
|
||||
$format_tags[] = $tag;
|
||||
}
|
||||
}
|
||||
$format_tags = implode(';', $format_tags);
|
||||
|
||||
// Cache the "format_tags" configuration. This cache item is infinitely
|
||||
// valid; it only changes whenever the text format is changed, hence it's
|
||||
// tagged with the text format's cache tag.
|
||||
$this->cache->set($cid, $format_tags, Cache::PERMANENT, $format->getCacheTags());
|
||||
}
|
||||
|
||||
return $format_tags;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -59,7 +59,13 @@ class StylesCombo extends CKEditorPluginBase implements CKEditorPluginConfigurab
|
|||
return array(
|
||||
'Styles' => array(
|
||||
'label' => t('Font style'),
|
||||
'image_alternative' => '<a href="#" role="button" aria-label="' . t('Styles') . '"><span class="ckeditor-button-dropdown">' . t('Styles') . '<span class="ckeditor-button-arrow"></span></span></a>',
|
||||
'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'),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -331,10 +331,12 @@ class CKEditor extends EditorBase implements ContainerFactoryPluginInterface {
|
|||
if (empty($langcodes)) {
|
||||
$langcodes = array();
|
||||
// Collect languages included with CKEditor based on file listing.
|
||||
$ckeditor_languages = new \GlobIterator(\Drupal::root() . '/core/assets/vendor/ckeditor/lang/*.js');
|
||||
foreach ($ckeditor_languages as $language_file) {
|
||||
$langcode = $language_file->getBasename('.js');
|
||||
$langcodes[$langcode] = $langcode;
|
||||
$files = scandir('core/assets/vendor/ckeditor/lang');
|
||||
foreach ($files as $file) {
|
||||
if ($file[0] !== '.' && fnmatch('*.js', $file)) {
|
||||
$langcode = basename($file, '.js');
|
||||
$langcodes[$langcode] = $langcode;
|
||||
}
|
||||
}
|
||||
\Drupal::cache()->set('ckeditor.langcodes', $langcodes);
|
||||
}
|
||||
|
@ -414,7 +416,7 @@ class CKEditor extends EditorBase implements ContainerFactoryPluginInterface {
|
|||
public function buildContentsCssJSSetting(EditorEntity $editor) {
|
||||
$css = array(
|
||||
drupal_get_path('module', 'ckeditor') . '/css/ckeditor-iframe.css',
|
||||
drupal_get_path('module', 'system') . '/css/system.module.css',
|
||||
drupal_get_path('module', 'system') . '/css/components/align.module.css',
|
||||
);
|
||||
$this->moduleHandler->alter('ckeditor_css', $css, $editor);
|
||||
$css = array_merge($css, _ckeditor_theme_css());
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
namespace Drupal\ckeditor\Tests;
|
||||
|
||||
use Drupal\Component\Serialization\Json;
|
||||
use Drupal\editor\Entity\Editor;
|
||||
use Drupal\filter\FilterFormatInterface;
|
||||
use Drupal\simpletest\WebTestBase;
|
||||
|
@ -176,6 +177,22 @@ class CKEditorAdminTest extends WebTestBase {
|
|||
$this->assertTrue($editor instanceof Editor, 'An Editor config entity exists.');
|
||||
$this->assertIdentical($expected_settings, $editor->getSettings(), 'The Editor config entity has the correct settings.');
|
||||
|
||||
// Check that the markup we're setting for the toolbar buttons (actually in
|
||||
// JavaScript's drupalSettings, and Unicode-escaped) is correctly rendered.
|
||||
$this->drupalGet('admin/config/content/formats/manage/filtered_html');
|
||||
// Create function to encode HTML as we expect it in drupalSettings.
|
||||
$json_encode = function($html) {
|
||||
return trim(Json::encode($html), '"');
|
||||
};
|
||||
// Check the Button separator.
|
||||
$this->assertRaw($json_encode('<li data-drupal-ckeditor-button-name="-" class="ckeditor-button-separator ckeditor-multiple-button" data-drupal-ckeditor-type="separator"><a href="#" role="button" aria-label="Button separator" class="ckeditor-separator"></a></li>'));
|
||||
// Check the Format dropdown.
|
||||
$this->assertRaw($json_encode('<li data-drupal-ckeditor-button-name="Format" class="ckeditor-button"><a href="#" role="button" aria-label="Format"><span class="ckeditor-button-dropdown">Format<span class="ckeditor-button-arrow"></span></span></a></li>'));
|
||||
// Check the Styles dropdown.
|
||||
$this->assertRaw($json_encode('<li data-drupal-ckeditor-button-name="Styles" class="ckeditor-button"><a href="#" role="button" aria-label="Styles"><span class="ckeditor-button-dropdown">Styles<span class="ckeditor-button-arrow"></span></span></a></li>'));
|
||||
// Check strikethrough.
|
||||
$this->assertRaw($json_encode('<li data-drupal-ckeditor-button-name="Strike" class="ckeditor-button"><a href="#" class="cke-icon-only cke_ltr" role="button" title="strike" aria-label="strike"><span class="cke_button_icon cke_button__strike_icon">strike</span></a></li>'));
|
||||
|
||||
// Now enable the ckeditor_test module, which provides one configurable
|
||||
// CKEditor plugin — this should not affect the Editor config entity.
|
||||
\Drupal::service('module_installer')->install(array('ckeditor_test'));
|
||||
|
|
|
@ -54,7 +54,7 @@ class CKEditorTest extends KernelTestBase {
|
|||
'filter_html' => array(
|
||||
'status' => 1,
|
||||
'settings' => array(
|
||||
'allowed_html' => '<h4> <h5> <h6> <p> <br> <strong> <a>',
|
||||
'allowed_html' => '<h2> <h3> <h4> <h5> <h6> <p> <br> <strong> <a>',
|
||||
)
|
||||
),
|
||||
),
|
||||
|
@ -103,9 +103,6 @@ class CKEditorTest extends KernelTestBase {
|
|||
$this->container->get('plugin.manager.editor')->clearCachedDefinitions();
|
||||
$this->ckeditor = $this->container->get('plugin.manager.editor')->createInstance('ckeditor');
|
||||
$this->container->get('plugin.manager.ckeditor.plugin')->clearCachedDefinitions();
|
||||
// KernelTestBase::enableModules() unfortunately doesn't invoke
|
||||
// hook_rebuild() just like a "real" Drupal site would. Do it manually.
|
||||
\Drupal::moduleHandler()->invoke('ckeditor', 'rebuild');
|
||||
$settings = $editor->getSettings();
|
||||
$settings['toolbar']['rows'][0][0]['items'][] = 'Strike';
|
||||
$settings['toolbar']['rows'][0][0]['items'][] = 'Format';
|
||||
|
@ -113,7 +110,7 @@ class CKEditorTest extends KernelTestBase {
|
|||
$editor->save();
|
||||
$expected_config['toolbar'][0]['items'][] = 'Strike';
|
||||
$expected_config['toolbar'][0]['items'][] = 'Format';
|
||||
$expected_config['format_tags'] = 'p;h4;h5;h6';
|
||||
$expected_config['format_tags'] = 'p;h2;h3;h4;h5;h6';
|
||||
$expected_config['extraPlugins'] .= ',llama_contextual,llama_contextual_and_button';
|
||||
$expected_config['drupalExternalPlugins']['llama_contextual'] = file_create_url('core/modules/ckeditor/tests/modules/js/llama_contextual.js');
|
||||
$expected_config['drupalExternalPlugins']['llama_contextual_and_button'] = file_create_url('core/modules/ckeditor/tests/modules/js/llama_contextual_and_button.js');
|
||||
|
@ -129,7 +126,7 @@ class CKEditorTest extends KernelTestBase {
|
|||
|
||||
$expected_config['allowedContent']['pre'] = array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE);
|
||||
$expected_config['allowedContent']['h3'] = array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE);
|
||||
$expected_config['format_tags'] = 'p;h3;h4;h5;h6;pre';
|
||||
$expected_config['format_tags'] = 'p;h2;h3;h4;h5;h6;pre';
|
||||
$this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Generated JS settings are correct for customized configuration.');
|
||||
|
||||
// Disable the filter_html filter: allow *all *tags.
|
||||
|
@ -209,11 +206,6 @@ class CKEditorTest extends KernelTestBase {
|
|||
$expected_config['format_tags'] = 'p';
|
||||
ksort($expected_config);
|
||||
$this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Generated JS settings are correct for customized configuration.');
|
||||
|
||||
// Assert that we're robust enough to withstand people messing with State
|
||||
// manually.
|
||||
\Drupal::state()->delete('ckeditor_internal_format_tags:' . $format->id());
|
||||
$this->assertIdentical($expected_config, $this->ckeditor->getJSSettings($editor), 'Even when somebody manually deleted the key-value pair in State with the pre-calculated format_tags setting, it returns "p" — because the <p> tag is always allowed.');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -267,7 +259,6 @@ class CKEditorTest extends KernelTestBase {
|
|||
$this->config('system.theme')->set('default', 'bartik')->save();
|
||||
$expected[] = file_create_url('core/themes/bartik/css/base/elements.css');
|
||||
$expected[] = file_create_url('core/themes/bartik/css/components/captions.css');
|
||||
$expected[] = file_create_url('core/themes/bartik/css/components/content.css');
|
||||
$expected[] = file_create_url('core/themes/bartik/css/components/table.css');
|
||||
$this->assertIdentical($expected, $this->ckeditor->buildContentsCssJSSetting($editor), '"contentsCss" configuration part of JS settings built correctly while a theme providing a CKEditor stylesheet exists.');
|
||||
}
|
||||
|
@ -289,7 +280,7 @@ class CKEditorTest extends KernelTestBase {
|
|||
$settings = $editor->getSettings();
|
||||
$settings['toolbar']['rows'][0][0]['items'][] = 'Format';
|
||||
$editor->setSettings($settings);
|
||||
$expected['format_tags'] = 'p;h4;h5;h6';
|
||||
$expected['format_tags'] = 'p;h2;h3;h4;h5;h6';
|
||||
$this->assertEqual($expected, $internal_plugin->getConfig($editor), '"Internal" plugin configuration built correctly for customized toolbar.');
|
||||
}
|
||||
|
||||
|
@ -430,6 +421,8 @@ class CKEditorTest extends KernelTestBase {
|
|||
|
||||
protected function getDefaultAllowedContentConfig() {
|
||||
return array(
|
||||
'h2' => array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE),
|
||||
'h3' => array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE),
|
||||
'h4' => array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE),
|
||||
'h5' => array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE),
|
||||
'h6' => array('attributes' => TRUE, 'styles' => FALSE, 'classes' => TRUE),
|
||||
|
@ -475,7 +468,7 @@ class CKEditorTest extends KernelTestBase {
|
|||
protected function getDefaultContentsCssConfig() {
|
||||
return array(
|
||||
file_create_url('core/modules/ckeditor/css/ckeditor-iframe.css'),
|
||||
file_create_url('core/modules/system/css/system.module.css'),
|
||||
file_create_url('core/modules/system/css/components/align.module.css'),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue