bem / html-differ

Сompares two HTML
http://bem.info/tools/testing/html-differ/
MIT License
211 stars 44 forks source link

вложенные html-элементы не попадают под маску #134

Closed kompolom closed 8 years ago

kompolom commented 8 years ago

вот пример того что хочется получить но никак не могу написать паттерн который бы подошел, хотя проверяю https://regex101.com/#javascript регулярка срабаывает

eGavr commented 8 years ago

Ни одна из ссылок не дает требуемой информации :)

На первую меня не пускает, а на второй не показывается регулярка. Дай права, чтобы я мог перейти на первую ссылку и сюда можешь написать регулярку (я верю, что она корректна)

kompolom commented 8 years ago

https://gist.github.com/kompolom/19e70ff1c336463a1a71 еще раз ссылка на гист маска

{{.*}}
{{(.|\n)*}}

ни одна не матчится на произвольный html. Для примера:

<textarea class="textarea textarea_theme_vr textarea_size_l textarea_width_available textarea__control i-bem" id="uniq14455148478992" name="body" placeholder="Ваш комментарий" data-bem="{&quot;textarea&quot;:{}}"></textarea>
<textarea {{(.|\n)*}}></textarea>
kompolom commented 8 years ago

Может просто совпадение, но заметил что регулярка стабильно не срабатывает на тексте где есть = в дифе она тогда отображается не как регулярка, а как ожидаемый текст (зеленая)

eGavr commented 8 years ago

А конкретно с каким HTML ты сравниваешь?

kompolom commented 8 years ago

выше пример с textarea

eGavr commented 8 years ago

Не, я понял какая регулярка у тебя не работает.

Я хочу увидеть два реальных HTML, которые html-differ должен посчитать одинаковыми :)

kompolom commented 8 years ago

@eGavr как их показать?

kompolom commented 8 years ago

screen28 Вот скрином сделал

kompolom commented 8 years ago

Посмотрел в отладчике, насколько я понял, маска применяется только к одному токену. https://github.com/bem/html-differ/blob/master/lib/utils/mask.js#L42 который в свою очередь заканчивается кавычками. Я правильно понял?

eGavr commented 8 years ago

Да, ты все верно понял, только не только кавычками, собственно я и хотел предложить тебе примерно следующее:

<textarea class="{{.*}}" id="{{.*}}" name="{{.*}}" placeholder="{{.*}}" data-bem="{{.*}}"></textarea>
eGavr commented 8 years ago

@eGavr как их показать?

У enb-bem-tmpl-specs, я так понял ты эту утилиту используешь, есть переменная среды окружения/опция, которая позволяет сохранять созданный в тесте HTML –> https://github.com/enb-bem/enb-bem-tmpl-specs#Опции

kompolom commented 8 years ago

@eGavr спасибо за ответ. Тогда хочу попросить добавить фичу, которая будет работать на произвольном количестве токенов. Если это возможно

eGavr commented 8 years ago

Очень странно хотеть на столько "не жестко" сравнивать HTML.

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

kompolom commented 8 years ago

@eGavr Вообще ты прав. Спасибо что помог разобраться. Последний вопрос. Как добавить маску на необязательный атрибут. Например, в html может быть required="" может required а может и вообще не быть. Я как понимаю атрибут и его значение будут в разных токенах. Как сделать чтобы все три html посчитались одинаковыми? Или это тоже не стоит хотеть?

eGavr commented 8 years ago

Я бы сказал, что тоже не стоит хотеть делать, что у тебя там за тесты ? :)

Ты уверен, что такое хотеть нормально ? :) (с точки зрения сравнения одинаковой работоспособности двух HTML)

Есть у диффалки фича, которая игнорирует значение атрибута, но она обязательно требует наличие атрибута, то есть в случаях, когда есть required="" в одной HTML и required в другой, то они будут считаться одинаковыми, но диффалка ругнется таки, если не будет этого атрибута вообще.

kompolom commented 8 years ago

Спасибо за разъяснения!