Drupal WYSIWYG удаляет & NBSP автоматически - PullRequest
2 голосов
/ 01 февраля 2010

При вставке содержимого из WORD большая часть разметки очищается с помощью «Принудительная очистка при стандартной вставке» с использованием модулей TinyMCE и WYSIWYG. Кажется, однако, оставить в следующем коде:

<p>&nbsp;</p>

Есть ли способ, чтобы я мог отфильтровать это?

Ответы [ 6 ]

1 голос
/ 09 марта 2015

Пустые теги p были ранее размещены для обозначения изменения строки, однако drupal wysiwyg автоматически добавляет неразрывный тег пробела, который, таким образом, не отображается должным образом и, таким образом, заменяется заменой символа "?"

Рабочий раствор:

$to_filter = array('bloc_1_delta', 'bloc_2_delta', 'bloc_3_delta', 'bloc_4_delta');
if (in_array($vars['block']->delta, $to_filter)) {
    $vars['block']->content = str_replace("<p></p>", "<br/>", mb_cοnvert_encoding($vars['block']->content, 'HTML-ENTITIES', 'UTF-8'));
}
0 голосов
/ 21 марта 2013

Вам не всегда нужны вышеуказанные хаки.как упоминалось в marcvangend, но на простом английском вы можете изменить его в настройках.

  1. Перейти к администрированию drupal
  2. Настройка сайта
  3. Форматы ввода
  4. configureформат ввода по вашему выбору
  5. отмените выбор «Преобразователь разрыва строки»
0 голосов
/ 21 апреля 2012

Это происходит почти в каждом JS WYSIWYG. В частности, изменение поведения «вставить из слова» может включать в себя исправление или расширение javascript timymce / wysiwyg, но если вам все равно, откуда берутся пустые теги <p>, и вы хотите избавиться от всех отправленных, у вас есть некоторые опции.

[отредактировал мой ответ после того, как мне пришлось сделать это снова самому]

Если вам нужно много исправлять / переписывать html, вам, вероятно, стоит взглянуть на модуль HTML Purifier . Он имеет расширенную опцию удаления пустых и заполненных элементов HTML, а также исправления и фильтрации xss. Но это медленно.

Есть модуль Empty Paragraph Killer , , но сейчас он не работает для D7, так что вы можете пропустить это.

Самое прямое решение - написать собственный фильтр ввода в пользовательском модуле. Вот пример модуля фильтра , который вы можете скопировать и извлечь уроки. Или вы можете просто скопировать мой:

/* Implements hook_filter_info(). */
function YOURMODULE_filter_info() {

  $filters['kill_empty'] = array(
    'title' => t('Kill Empty Paragraphs'),
    'description' => t('Remove paragraphs that contain only whitespace (including line breaks and &amp;nbsp;\'s) that are often inserted by editors using WYSIWYGs.'),
    'process callback'  => '_YOURMODULE_kill_empty',
    'tips callback' => '_YOURMODULE_kill_empty_tips',
  );
  return $filters;
}

/* Process callbacks, where the work is done. */
function _YOURMODULE_kill_empty($text, $filter) {
  // Remove all <p> tags containing only nbsp's, white space, or nothing.
  return preg_replace('/<p[^>]*>(&nbsp;|\s)*<\/p>/', '', $text);
}

/* Tips for the content editor, if you want them. I usually take these out. */
function _YOURMODULE_kill_empty_tips($filter, $format, $long = FALSE) {
  if (!$long) {
    // This string will be shown in the content add/edit form.
    return t('Use one [enter] to create a new paragraph. More than one will be ignored.');
  }
  else {
    // And this one on the "Filter Tips" page.
    return t('To maintain consistancy in content display, empty paragraphs inserted by WYSIWYG editors will be removed.');
  }
}

Поместите все это в пользовательский модуль, перейдите в конфигурацию и отредактируйте текстовые форматы и активируйте фильтр «Убить пустые абзацы». Так и должно быть.

Последнее замечание: если вы действительно хотите, чтобы они исчезли, например, «не в базе данных», «никогда не вернется», вы сможете использовать этот фильтр с модулем Sanitizable удалить все пустые <p> s при отправке. Применяются обычные предупреждения о том, что вы можете позабавиться с контентом до того, как он попадет в базу данных.

0 голосов
/ 01 февраля 2010

Вы уверены, что это вызвано TinyMCE и WYSIWYG?Это также может быть сочетание параметра в WYSIWYG (когда «Удалить разрывы строк» ​​выключен) и настроек входного фильтра («Преобразователь разрывов строк» ​​включен).

0 голосов
/ 01 февраля 2010

Быстрый и простой способ - просто поместить что-то подобное в template.php вашей темы:

<?php
function THEMENAME_preprocess_node(&$vars, $hook) {
    $vars['content'] = str_replace('<p>&nbsp;</p>','', $vars['content']);
}

Это просто делает быстрый поиск и замену, чтобы заменить пустой абзац ничем. Это что-то вроде взлома, но это работает.

0 голосов
/ 01 февраля 2010

Насколько я знаю, у tinymce есть функция чистого кода. Когда этот вызывается, он должен удалить пустые абзацы.

Но вы должны попробовать это ...

...