В коде текста добавляются кавычки

#16 17 мая 2016 в 16:41

А насчет вопроса темы у Вас случайно нет предположений?

boanro
Действительно забивает кавычки. Пора смотреть в сторону бесплатных и обновляемых редакторов. smile
#17 17 мая 2016 в 18:52
Не могу воспроизвести cryЧЯДНТ?
#18 17 мая 2016 в 18:56
Val, вот шифровка

— Набрал 2 раза слово тест
— 4 раза нажал на ентер
— 1 раз нажал на backspace
— 2 раза набрал слово тест
— нажал ентер
— еще 2 раза набрал слово тест

Boanro
забиваем согласно инструкции и нажимаем кнопку просмотра кода.
#19 17 мая 2016 в 19:00
Loadырь, я это видел конечно и забивал! Результата 0. Не появляются у меня кавычки… Пробовал на локалке и на демо-сайте.
#20 17 мая 2016 в 19:04


Loadырь, я это видел конечно и забивал! Результата 0. Не появляются у меня кавычки… Пробовал на локалке и на демо-сайте.

Val
Достаточно вернуть назад слово через backspace, и будет тег
#21 17 мая 2016 в 19:22
Похоже, что эта проблема касается только Фаерфокса! На Хроме все хорошо!
#22 17 мая 2016 в 19:24

Достаточно вернуть назад слово через backspace, и будет тег

MaKo
не получается((

И по инструкции Boanro пробовал и "возврат слова через backspace" и как только не пытался набивать enter'ы и backspace, в хроме и лисе на локальном сайте и на демо сайте (у последнего кстати верстка поплыла куда-то)) я тут не причём laugh)
ничего кроме обычных тегов <p> в коде я не вижу, кавычек нет. Какие еще будут варианты поймать эту багу?
#23 17 мая 2016 в 19:25


Похоже, что эта проблема касается только Фаерфокса! На Хроме все хорошо!

boanro

В лисе и ссылку вставить проблематично, дергается окно, не попадешь, laugh
#24 17 мая 2016 в 19:28
Есть!!! В лисе на демосайте поймал)) dance
#25 17 мая 2016 в 19:46

Есть!!! В лисе на демосайте поймал))

Val
Молодец, каков будет вердикт?
#26 17 мая 2016 в 20:58

Скрипт редактора кодирован разработчиком. Собственно не проблема получить код, и иметь вероятность найти и исправить код редактора. Но это не выход. Кодированный редактор это зло.

А если просто разработчики Инстанта на которых оформлена лицензия попросят разработчиков Redactor исправить ошибку?
#27 17 мая 2016 в 21:03
редактор же периодически обновляеться

В этом релизе обновлены до последних версий:
wysiwyg редактор Redactor (также в этом редакторе добавлено управление таблицами и вставка видео по ссылке с Facebook).

Fuze

думаю можно ждать обновления
#28 17 мая 2016 в 21:44
Просто разработчики redactor могут не знать об этом баге. Ведь даже для самой крутой в мире CMS laughэта проблема получила обсуждение только больше чем через месяц после ее появления.


редактор же периодически обновляеться

Jestik
#29 17 мая 2016 в 22:09

Молодец, каков будет вердикт?

Loadырь
Спокойствие, только спокойствие ©.
За 2 минуты найти ошибку не просто laughИтак, вердикт:

1. Код обфусцирован разработчиком для его минификации, а не боязни дебага.

2. Получаем начальную версию кода, заменяем ей сжатый вариант и смотрим как там крутятся шестерёнки...
Видим "константу" BACKSPACE. Поиск показывает 7 её вхождений по коду. Нас интересует функция keydown: function() {...}, а конкретнее вот этот ее кусок:
  1. if (key === this.keyCode.BACKSPACE) {
  2. var block = this.selection.getBlock();
  3. var indented = ($(block).css('margin-left') !== '0px');
  4. if (block && indented && this.range.collapsed && this.utils.isStartOfElement()) {
  5. this.indent.decrease();
  6. e.preventDefault();
  7. return
  8. }
  9. if (this.utils.browser('mozilla')) {
  10. var prev = this.selection.getPrev();
  11. var prev2 = $(prev).prev()[0];
  12. if (prev && prev.tagName === 'HR')
  13. $(prev).remove();
  14. if (prev2 && prev2.tagName === 'HR')
  15. $(prev2).remove()
  16. }
  17. this.keydown.removeInvisibleSpace();
  18. this.keydown.removeEmptyListInTable(e)
  19. }
  20. this.code.sync()
Глобально здесь ничего интересного кроме конечной функции this.code.sync(). Ставим бряк и смотрим что там передается и куда))
  1. sync: function() {
  2. setTimeout($.proxy(this.code.startSync, this), 10)
  3. },
  4. startSync: function() {
  5. var html = this.$editor.html();
  6. if (this.code.syncCode && this.code.syncCode == html || (this.start && html == '')) {
  7. return
  8. }
  9. this.code.syncCode = html;
  10. html = this.core.setCallback('syncBefore', html);
  11. html = this.clean.onSync(html);
  12. this.$textarea.val(html);
  13. this.core.setCallback('sync', html);
  14. if (this.start === false) {
  15. this.core.setCallback('change', html)
  16. }
  17. this.start = false;
  18. if (this.autosave.html == false) {
  19. this.autosave.html = this.code.get()
  20. }
  21. if (this.opts.codemirror) {
  22. this.$textarea.next('.CodeMirror').each(function(i, el) {
  23. el.CodeMirror.setValue(html)
  24. })
  25. }
  26. this.autosave.onChange();
  27. this.autosave.enable()
  28. },
Здесь в том же окружении вызывается соседняя функция startSync(). В которой собственно обрабатывается исходный код страницы.

3. Я использовал следующую схему: 2 раза Enter, затем любое слово или несколько символов, далее устанавливаю курсор перед словом (Home) и жму клавишу Backspace.
Шагаем по функции startSync и наблюдаем как меняется переменная html. Первоначально после выполнения моей схемы html = '<p><br></p><p><br></p><p style="">текст<br></p>'. Замечаем что к нашей строке ранее добавилось объявление стиля с пустым значением. Это в Firefox, в Хроме исходный код выглядит так:
  1. <p></p><p><span style="line-height: 1.6em; background-color: initial;">текст</span><br></p><p></p>
т.е. стили прописаны и текст обернут в тег span.
Переменная html трансформируется в искомые нами "кавычки" после строки
  1. html = this.clean.onSync(html);
Смотрим что там делается...
  1. onSync: function(html) {
  2. html = html.replace(/\u200B/g, '');
  3. html = html.replace(/&#x200b;/gi, '');
  4. if (this.opts.cleanSpaces) {
  5. html = html.replace(/&nbsp;/gi, ' ')
  6. }
  7. if (html.search(/^<p>(||\s||<br\s?\/?>||&nbsp;)<\/p>$/i) != -1) {
  8. return ''
  9. }
  10. html = html.replace(/<pre class="redactor-script-tag" style="display: none;"(.*?[^>]?)>([\w\W]*?)<\/pre>/gi, '<script$1>$2</script>');
  11. html = this.clean.restoreFormTags(html);
  12. var chars = {
  13. '\u2122': '&trade;',
  14. '\u00a9': '&copy;',
  15. '\u2026': '&hellip;',
  16. '\u2014': '&mdash;',
  17. '\u2010': '&dash;'
  18. };
  19. $.each(chars, function(i, s) {
  20. html = html.replace(new RegExp(i,'g'), s)
  21. });
  22. if (this.utils.browser('mozilla')) {
  23. html = html.replace(/<br\s?\/?>$/gi, '')
  24. }
  25. html = html.replace(new RegExp('<br\\s?/?></li>','gi'), '</li>');
  26. html = html.replace(new RegExp('</li><br\\s?/?>','gi'), '</li>');
  27. html = html.replace(/<(.*?)rel="\s*?"(.*?[^>]?)>/gi, '<$1$2">');
  28. html = html.replace(/<(.*?)style="\s*?"(.*?[^>]?)>/gi, '<$1$2">');
  29. html = html.replace(/="">/gi, '>');
  30. html = html.replace(/""">/gi, '">');
  31. html = html.replace(/"">/gi, '">');
  32. html = html.replace(/<div(.*?)data-tagblock="redactor"(.*?[^>])>/gi, '<div$1$2>');
  33. html = html.replace(/<(.*?) data-verified="redactor"(.*?[^>])>/gi, '<$1$2>');
  34. var $div = $("<div/>").html($.parseHTML(html, document, true));
  35. $div.find("span").removeAttr("rel");
  36. $div.find('pre .redactor-invisible-space').each(function() {
  37. $(this).contents().unwrap()
  38. });
  39. html = $div.html();
  40. html = html.replace(/<img(.*?[^>])rel="(.*?[^>])"(.*?[^>])>/gi, '<img$1$3>');
  41. html = html.replace(/<span class="redactor-invisible-space">(.*?)<\/span>/gi, '$1');
  42. html = html.replace(/ data-save-url="(.*?[^>])"/gi, '');
  43. html = html.replace(/<span(.*?)id="redactor-image-box"(.*?[^>])>([\w\W]*?)<img(.*?)><\/span>/gi, '$3<img$4>');
  44. html = html.replace(/<span(.*?)id="redactor-image-resizer"(.*?[^>])>(.*?)<\/span>/gi, '');
  45. html = html.replace(/<span(.*?)id="redactor-image-editter"(.*?[^>])>(.*?)<\/span>/gi, '');
  46. html = html.replace(/<font(.*?)>/gi, '');
  47. html = html.replace(/<\/font>/gi, '');
  48. html = this.tidy.load(html);
  49. if (this.opts.linkNofollow) {
  50. html = html.replace(/<a(.*?)rel="nofollow"(.*?[^>])>/gi, '<a$1$2>');
  51. html = html.replace(/<a(.*?[^>])>/gi, '<a$1 rel="nofollow">')
  52. }
  53. html = html.replace(/\sdata-redactor-(tag|class|style)="(.*?[^>])"/gi, '');
  54. html = html.replace(new RegExp('<(.*?) data-verified="redactor"(.*?[^>])>','gi'), '<$1$2>');
  55. html = html.replace(new RegExp('<(.*?) data-verified="redactor">','gi'), '<$1>');
  56. html = html.replace(/&amp;/g, '&');
  57. return html
  58. },
После обработки регуляркой
  1. html = html.replace(/<(.*?)style="\s*?"(.*?[^>]?)>/gi, '<$1$2">'); // <- проблема здесь!
наша строка преобразуется из '<p></p><p><br></p><p style="">текст<br></p>' в '<p></p><p><br></p><p ">текст<br></p>', а затем через функцию
  1. var $div = $("<div/>").html($.parseHTML(html, document, true));
  2. ...
  3. html = $div.html();
Получаем уже знакомые символы: <p></p><p><br></p><p "="">тек<br></p>

Итог — косяк где-то в регулярке😊В целом не силён в них, но если никто не подскажет как исправить, буду думать по возможности))
Необходимо обработать <p style="">текст</p>, чтобы на выходе получалось <p >текст</p>, т.е. без кавычки <p ">
#30 17 мая 2016 в 23:23

Необходимо обработать <p style="">текст</p>, чтобы на выходе получалось <p >текст</p>, т.е. без кавычки <p ">

boanro

html = html.replace(/<(.*?)style="\s*?"(.*?[^>]?)>/gi, '<$1$2">'); // <- проблема здесь!

Val


<$1$2"> — а если просто убрать кавычку в заменяемой части?
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.