Tinymce изображения автоматически оборачиваются в тег <p>.CSS способы обхода или взлом текстового редактора - PullRequest
11 голосов
/ 28 апреля 2011

Привет,
Я уже много раз сталкивался с этой проблемой, используя drupal или wordpress, где мои файлы настроек tinymce слишком умно абстрагированы.

Проблема в том, что tinymce автоматически оборачивает мои теги <img> в теги <p>.Если в Wordpress или Drupal есть способ обойти это, это было бы здорово.

Моя проблема существует, когда я хочу сделать что-то подобное

<style>
    img {
        float: left;
    }
    p {
        float: right;
        margin-right: 20px;
        width: 400px;
    }
 </style>

, и я хочу, чтобы мой код выглядел так

<img src="some_png.png" />
<p> Imagine a lot of lipsum text.</p>

, но tinymce делает это

<p><img src="crap_im_wrapped_in_a_paragraph.png" /></p>
<p> Imagine a lot of lipsum text.</p>

Я пытаюсь переместить изображение слева от абзаца с заданной шириной, не ограничивая ширину самого изображения.
в этом случае родитель изображения получает ширину иплавать прямо.Это не что я хочу.

Вполне возможно, что есть простое умное решение для этого, но я до сих пор не нашел его.Я бы предпочел не взламывать мои файлы конфигурации, если мне не нужно.

1 предостережение ...
Единственная причина, по которой существует эта проблема, заключается в том, что я хочу, чтобы клиенты могли легко выполнять свое собственное редактированиепоэтому я не просто заставлю их обернуть изображение в <div> вместо <p>.Это кажется мне не очень понятным для моих клиентов, которые являются фактическими пользователями wysiwyg

Предыдущее решение
Я использовал регулярное выражение для удаления тегов абзаца, но этовсегда как-то проблематично.Я заканчиваю тем, что добавляю больше изображений где-то еще, тогда я должен продолжать настраивать свое регулярное выражение, чтобы игнорировать их.502 ошибок предостаточно!

мой вопрос (ы):
Что я могу сделать в моем CSS, чтобы сделать изображение, заключенное в абзац, выполнением того, что я хочу?
и если я не могу
Что конкретно можно сказать о друпале или WordPress, чтобы этот абзац исчез?

- Редактировать -решение должно быть совместимо с IE7 + и современными браузерами.: P

Спасибо!
Аарон

Ответы [ 9 ]

7 голосов
/ 11 июля 2011

Вы вызываете tinyMCE с функцией tinyMCE.init, не так ли?

Поэтому добавьте в нее эту строку:

forced_root_block : false,

Также вы можете изменить tiny_mce_src.js.Найдите

forced_root_block : 'p',

и измените его на

forced_root_block : false,

PS Не подделывайте, чтобы очистить кеш.

6 голосов
/ 01 июня 2011

Если вы не хотите, чтобы он оборачивал теги изображений, найдите в источнике Tinymce функцию isBlock. Существует тест белого списка регулярного выражения, который определяет, является ли элемент блочным элементом. Если вам нужно, чтобы теги изображения рассматривались как элементы блока, добавьте «IMG» в список имен узлов, которые он ищет. Я просто должен был сделать это сам, я все еще ищу негативные побочные эффекты прямо сейчас, но это действительно решает насущную проблему.

EDIT: Это было более или менее временное решение: если вам просто нужно остановить обертывание тегов изображения на уровне корневого блока, есть функция «forceRoots», где вы действительно захотите выполнить проверку тега изображения. Я сделал это, изменив эту строку кода:

if (nx.nodeType == 3 || (!t.dom.isBlock(nx) && nx.nodeType != 8)) {

чтобы выглядеть так:

if (nx.nodeType == 3 || (!t.dom.isBlock(nx) && nx.nodeType != 8) && nx.nodeName.toLowerCase() != "img") {

Это решает проблему довольно хорошо для меня.

3 голосов
/ 09 августа 2011

Если мы говорим о сайте WordPress, есть раздражающий фильтр, который автоматически обернет некоторые элементы в контент тегом

с именем wpautop . Это на самом деле обрабатывается WordPress во время выполнения, а не TinyMCE.

Добавьте это в начало вашего шаблона или файла functions.php:

<?php remove_filter('the_content', 'wpautop'); ?>

источник:
http://wordpress.org/support/topic/stop-wordpress-from-adding-p-tags-and-removing-line-break

2 голосов
/ 13 мая 2019

Имеется опция "valid_children" https://www.tiny.cloud/docs/configure/content-filtering/#valid_children. Он определяет, какие элементы вы запрещаете (-) или разрешаете (+) тег img оборачиваться.

Этот пример для - не позволятьтег, являющийся дочерним для p и h1-4 - позволяя тегу img быть дочерним для div и span

tinymce.init({
valid_children : '-p[img],h1[img],h2[img],h3[img],h4[img],+div[img],span[img]'
});
2 голосов
/ 14 июля 2015

TinyMCE 4 оборачивает все в блочные элементы. Обёртка по умолчанию - P. Нажмите на изображение и выберите другой элемент обёртки, например, DIV. Чтобы добавить DIV в меню, добавьте это в functions.php :

function make_mce_awesome( $init ) {
  $init['block_formats'] = "Paragraph=p; Heading 1=h1; Heading 3=h3; Heading 2=h2; Preformatted=pre; Media=div";
return $init;
}

add_filter('tiny_mce_before_init', __NAMESPACE__ . "\\make_mce_awesome");

DIV wrapper around image

2 голосов
/ 16 марта 2012

Добавить эту строку:

theme_advanced_blockformats : "p,div,h1,h2,h3,h4,h5,h6,blockquote,dt,dd,code,samp"

Если вы хотите вставить изображение, выберите div:

<div>
    <img src="my_img.jpg>
</div>

Нет необходимости что-либо изменять с помощью css.

2 голосов
/ 29 апреля 2011

Если Javascript является опцией, то вы можете использовать jQuery, чтобы перефразировать img, чтобы быть братом p. Как то так (не проверено)

$("p > img").each(function () {
  var $this = $(this);
  var $p= $this.parent();
  $p.before($this);
});

Добавьте логику только к тем абзацам / изображениям, которые вам действительно нужны.

Безобразно, да, но в качестве крайней меры жизнеспособное решение.

2 голосов
/ 28 апреля 2011

В Drupal, один из способов «klugey» сделать это - использовать hook_nodeapi () или эквивалент (ы) d7 для отображения узлов и использовать регулярное выражение для замены p-обернутых изображений, появляющихся в началеполе.Вы должны сообщить своему клиенту, что они не будут выглядеть правильно при редактировании, но на дисплее они будут отображаться правильно.

Если вы ищете опцию css:

Incss2 у вас есть селектор: first-child, а в css3 также есть селектор: only-child.p: first-child img может использоваться с отрицательными полями, чтобы компенсировать поля, которые вы объявили для элементов p.Недостатком было бы то, что это также наложило бы те же отрицательные поля на любые изображения, которые клиент мог бы поместить в первый абзац.css3 может поддерживаться не во всех браузерах, которые вы хотите охватить, но если вы можете его использовать, вы можете использовать селектор: only-child для изображений, которые являются единственными дочерними элементами элементов p, смещая поля родительского p отрицательными полями.

1 голос
/ 28 апреля 2011

Боюсь, это невозможно из-за того, что img является встроенным элементом. Tinymce упаковывает все, что пользователь вводит в элементы блока (div s или p -tags), но img не является элементом блока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...