【问题标题】:Drupal WYSIWYG removing &nbsp automaticallyDrupal WYSIWYG 自动删除 &nbsp
【发布时间】:2010-02-01 13:25:47
【问题描述】:

从 WORD 粘贴内容时,使用 TinyMCE 和 WYSIWYG 模块的“强制清理标准粘贴”会清除大量标记。然而,它似乎留在以下代码中:

<p>&nbsp;</p>

有什么办法可以过滤掉吗?

【问题讨论】:

  • 我在使用 CKEditor(没有 WYSIWYG 模块)时遇到了一个非常相似的问题。我在这里尝试了解决方案,但没有运气。有没有人在 CKEditor 中遇到过同样的行为?

标签: drupal drupal-6 tinymce wysiwyg


【解决方案1】:

以前放置空的 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'));
}

【讨论】:

    【解决方案2】:

    你确定是 TinyMCE 和 WYSIWYG 造成的吗?它也可以是所见即所得的设置(当“删除换行符”关闭时)和您的输入过滤器设置(“换行符”打开)的组合。

    【讨论】:

      【解决方案3】:

      据我所知,tinymce 是否具有干净的代码功能。 当这个被调用时,它应该删除空段落。

      但是你应该试试这个......

      【讨论】:

        【解决方案4】:

        这发生在几乎所有的 js 所见即所得。更改“从单词粘贴”行为将涉及修补或扩展 timymce/wysiwyg javascript,但如果您不关心空的 &lt;p&gt; 标记来自哪里并且想要摆脱每个提交的标记,那么您有一些选项。

        [在我最近自己不得不再次这样做之后编辑了我的答案]

        如果您需要大量的 html 更正/重写,您可能应该查看 HTML Purifier 模块。它有一个高级选项来删除空的和 nbsp 填充的 HTML 元素,以及更正和 xss 过滤。但是速度很慢。

        Empty Paragraph Killer 模块,但它现在不适用于 D7,所以你可以跳过它。

        最直接的解决方案是在自定义模块中编写自己的输入过滤器。这里有一个例子filter module,你可以复制学习。或者你可以复制我的:

        /* 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 module 来删除所有提交时为空&lt;p&gt;s。关于在内容进入数据库之前弄乱内容的常见警告适用。

        【讨论】:

          【解决方案5】:

          您并不总是需要上述技巧。正如 marcvangend 提到的,但用更简单的英语,您可以在设置中更改它。

          1. 去drupal管理
          2. 网站配置
          3. 输入格式
          4. 配置您选择的输入格式
          5. 取消选择“换行转换器”

          【讨论】:

            【解决方案6】:

            一个快速简单的方法就是在你的主题的template.php中加入这样的东西:

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

            这只是快速查找和替换以将空段落替换为空。这有点像 hack,但它确实有效。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-11-29
              • 1970-01-01
              • 2012-02-12
              • 1970-01-01
              • 2011-11-27
              • 2014-06-30
              • 1970-01-01
              相关资源
              最近更新 更多