Действительно забивает кавычки. Пора смотреть в сторону бесплатных и обновляемых редакторов.А насчет вопроса темы у Вас случайно нет предположений?
забиваем согласно инструкции и нажимаем кнопку просмотра кода.— Набрал 2 раза слово тест
— 4 раза нажал на ентер
— 1 раз нажал на backspace
— 2 раза набрал слово тест
— нажал ентер
— еще 2 раза набрал слово тест
Достаточно вернуть назад слово через backspace, и будет тег
Loadырь, я это видел конечно и забивал! Результата 0. Не появляются у меня кавычки… Пробовал на локалке и на демо-сайте.
не получается((Достаточно вернуть назад слово через backspace, и будет тег
И по инструкции Boanro пробовал и "возврат слова через backspace" и как только не пытался набивать enter'ы и backspace, в хроме и лисе на локальном сайте и на демо сайте (у последнего кстати верстка поплыла куда-то)) я тут не причём )
ничего кроме обычных тегов <p> в коде я не вижу, кавычек нет. Какие еще будут варианты поймать эту багу?
Похоже, что эта проблема касается только Фаерфокса! На Хроме все хорошо!
В лисе и ссылку вставить проблематично, дергается окно, не попадешь,
Молодец, каков будет вердикт?Есть!!! В лисе на демосайте поймал))
А если просто разработчики Инстанта на которых оформлена лицензия попросят разработчиков Redactor исправить ошибку?Скрипт редактора кодирован разработчиком. Собственно не проблема получить код, и иметь вероятность найти и исправить код редактора. Но это не выход. Кодированный редактор это зло.
В этом релизе обновлены до последних версий:
wysiwyg редактор Redactor (также в этом редакторе добавлено управление таблицами и вставка видео по ссылке с Facebook).
думаю можно ждать обновления
редактор же периодически обновляеться
Спокойствие, только спокойствие ©.Молодец, каков будет вердикт?
За 2 минуты найти ошибку не просто Итак, вердикт:
1. Код обфусцирован разработчиком для его минификации, а не боязни дебага.
2. Получаем начальную версию кода, заменяем ей сжатый вариант и смотрим как там крутятся шестерёнки...
Видим "константу" BACKSPACE. Поиск показывает 7 её вхождений по коду. Нас интересует функция keydown: function() {...}, а конкретнее вот этот ее кусок:
if (key === this.keyCode.BACKSPACE) { var block = this.selection.getBlock(); var indented = ($(block).css('margin-left') !== '0px'); if (block && indented && this.range.collapsed && this.utils.isStartOfElement()) { this.indent.decrease(); e.preventDefault(); return } if (this.utils.browser('mozilla')) { var prev = this.selection.getPrev(); var prev2 = $(prev).prev()[0]; if (prev && prev.tagName === 'HR') $(prev).remove(); if (prev2 && prev2.tagName === 'HR') $(prev2).remove() } this.keydown.removeInvisibleSpace(); this.keydown.removeEmptyListInTable(e) } this.code.sync()
sync: function() { setTimeout($.proxy(this.code.startSync, this), 10) }, startSync: function() { var html = this.$editor.html(); if (this.code.syncCode && this.code.syncCode == html || (this.start && html == '')) { return } this.code.syncCode = html; html = this.core.setCallback('syncBefore', html); html = this.clean.onSync(html); this.$textarea.val(html); this.core.setCallback('sync', html); if (this.start === false) { this.core.setCallback('change', html) } this.start = false; if (this.autosave.html == false) { this.autosave.html = this.code.get() } if (this.opts.codemirror) { this.$textarea.next('.CodeMirror').each(function(i, el) { el.CodeMirror.setValue(html) }) } this.autosave.onChange(); this.autosave.enable() },
3. Я использовал следующую схему: 2 раза Enter, затем любое слово или несколько символов, далее устанавливаю курсор перед словом (Home) и жму клавишу Backspace.
Шагаем по функции startSync и наблюдаем как меняется переменная html. Первоначально после выполнения моей схемы html = '<p><br></p><p><br></p><p style="">текст<br></p>'. Замечаем что к нашей строке ранее добавилось объявление стиля с пустым значением. Это в Firefox, в Хроме исходный код выглядит так:
<p></p><p><span style="line-height: 1.6em; background-color: initial;">текст</span><br></p><p></p>
Переменная html трансформируется в искомые нами "кавычки" после строки
html = this.clean.onSync(html);
onSync: function(html) { html = html.replace(/\u200B/g, ''); html = html.replace(/​/gi, ''); if (this.opts.cleanSpaces) { html = html.replace(/ /gi, ' ') } if (html.search(/^<p>(||\s||<br\s?\/?>|| )<\/p>$/i) != -1) { return '' } html = html.replace(/<pre class="redactor-script-tag" style="display: none;"(.*?[^>]?)>([\w\W]*?)<\/pre>/gi, '<script$1>$2</script>'); html = this.clean.restoreFormTags(html); var chars = { '\u2122': '™', '\u00a9': '©', '\u2026': '…', '\u2014': '—', '\u2010': '‐' }; $.each(chars, function(i, s) { html = html.replace(new RegExp(i,'g'), s) }); if (this.utils.browser('mozilla')) { html = html.replace(/<br\s?\/?>$/gi, '') } html = html.replace(new RegExp('<br\\s?/?></li>','gi'), '</li>'); html = html.replace(new RegExp('</li><br\\s?/?>','gi'), '</li>'); html = html.replace(/<(.*?)rel="\s*?"(.*?[^>]?)>/gi, '<$1$2">'); html = html.replace(/<(.*?)style="\s*?"(.*?[^>]?)>/gi, '<$1$2">'); html = html.replace(/="">/gi, '>'); html = html.replace(/""">/gi, '">'); html = html.replace(/"">/gi, '">'); html = html.replace(/<div(.*?)data-tagblock="redactor"(.*?[^>])>/gi, '<div$1$2>'); html = html.replace(/<(.*?) data-verified="redactor"(.*?[^>])>/gi, '<$1$2>'); var $div = $("<div/>").html($.parseHTML(html, document, true)); $div.find("span").removeAttr("rel"); $div.find('pre .redactor-invisible-space').each(function() { $(this).contents().unwrap() }); html = $div.html(); html = html.replace(/<img(.*?[^>])rel="(.*?[^>])"(.*?[^>])>/gi, '<img$1$3>'); html = html.replace(/<span class="redactor-invisible-space">(.*?)<\/span>/gi, '$1'); html = html.replace(/ data-save-url="(.*?[^>])"/gi, ''); html = html.replace(/<span(.*?)id="redactor-image-box"(.*?[^>])>([\w\W]*?)<img(.*?)><\/span>/gi, '$3<img$4>'); html = html.replace(/<span(.*?)id="redactor-image-resizer"(.*?[^>])>(.*?)<\/span>/gi, ''); html = html.replace(/<span(.*?)id="redactor-image-editter"(.*?[^>])>(.*?)<\/span>/gi, ''); html = html.replace(/<font(.*?)>/gi, ''); html = html.replace(/<\/font>/gi, ''); html = this.tidy.load(html); if (this.opts.linkNofollow) { html = html.replace(/<a(.*?)rel="nofollow"(.*?[^>])>/gi, '<a$1$2>'); html = html.replace(/<a(.*?[^>])>/gi, '<a$1 rel="nofollow">') } html = html.replace(/\sdata-redactor-(tag|class|style)="(.*?[^>])"/gi, ''); html = html.replace(new RegExp('<(.*?) data-verified="redactor"(.*?[^>])>','gi'), '<$1$2>'); html = html.replace(new RegExp('<(.*?) data-verified="redactor">','gi'), '<$1>'); html = html.replace(/&/g, '&'); return html },
html = html.replace(/<(.*?)style="\s*?"(.*?[^>]?)>/gi, '<$1$2">'); // <- проблема здесь!
var $div = $("<div/>").html($.parseHTML(html, document, true)); ... html = $div.html();
Итог — косяк где-то в регулярке😊В целом не силён в них, но если никто не подскажет как исправить, буду думать по возможности))
Необходимо обработать <p style="">текст</p>, чтобы на выходе получалось <p >текст</p>, т.е. без кавычки <p ">
Необходимо обработать <p style="">текст</p>, чтобы на выходе получалось <p >текст</p>, т.е. без кавычки <p ">
html = html.replace(/<(.*?)style="\s*?"(.*?[^>]?)>/gi, '<$1$2">'); // <- проблема здесь!
<$1$2"> — а если просто убрать кавычку в заменяемой части?