Coder plugin (2)
- Author
- Message
-
Offline
- Posts: 1291
- Joined: Thu Nov 16, 2006 11:53 am
- Location: Kyiv, Ukraine
-
Offline
- Posts: 1873
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Например, такой вариант работает корректно: (\()(c(a|d)+)
А как только добавляем "r" после "+", то перестаёт срабатывать на комбинации (caar, (cadr, (cdar и т.д.: (\()(c(a|d)+r)
-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Очень даже может быть, это более точное описание возможного бага.DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
PS Кстати, на счет lookbehind-ов...
В теме много раз уже попадалось их обсуждение и обсуждение сопутствующего ограничения для них (фиксированное число символов).
Может быть, в данной ситуации помогла бы реализация метасимвола \K ?
Этот метасимвол отрезает всё, что было до него, естественно с проверкой шаблона, и в итоговой подстроке оказывается только то, что идет после него.
Например ищем в таком тексте:
xyzg fhjabc def
шаблон:
.*[^abc]\K(abc)(?= def)
В итоговой строке получим:
abc
- причем в этом случае, всё остальное окажется не захваченным. Это в регулярках coder-a было бы очень хорошим подспорьем, имхо.
-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Так чрезмерная жадность, это уже "++" должно быть, но в любом случае (a|d)+r при любой жадности, не должно спотыкаться на символах идущих после "+", ведь они не попадают в шаблон жадной группы.Infocatcher wrote:Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)
-
Offline
- Posts: 1873
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
YuS
Ну так то особенности реализации.
++ не реализовано, а жадность работает как-то неклассически.
Более того, я сейчас полез проверять, так на вот таком тексте
работает только «t[a-z]+?t», а «t[a-z]+t» не находит вообще ничего (я так понимаю, оно «поедает» всю последовательность, а назад, если не найдено, не возвращается). И явно больше похоже не «t[a-z]++t».
Ну так то особенности реализации.
++ не реализовано, а жадность работает как-то неклассически.

Более того, я сейчас полез проверять, так на вот таком тексте
Code: Select all
test
test test test
-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Не, в данном случае всё нормально, самая обычная жадность...Infocatcher wrote: работает только «t[a-z]+?t», а «t[a-z]+t» не находит вообще ничего (я так понимаю, оно «поедает» всю последовательность, а назад, если не найдено, не возвращается). И явно больше похоже не «t[a-z]++t».
"t" попадает в диапазон "a-z" и будет им захвачено, даже при условии возврата, для поиска возможных вариантов совпадения. Но в итоге не будет найдено общего совпадения из-за отсутствия в тексте "t" (она уже захвачена жадным шаблоном "[a-z]+"), т.к. последняя "t" шаблона будет искать свое совпадение... ревнивая же квантификация, просто ускорит все проверки и не даст алгоритму возвращаться, т.е. захватывает однократно максимально возможный вариант и идет на перекур (ну, это классически).

Last edited by YuS on Fri Aug 01, 2014 5:16 am, edited 3 times in total.
-
Offline
- Posts: 1162
- Joined: Sun Oct 20, 2013 11:44 am
Пробовал, не работает.Infocatcher wrote:Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Например, такой вариант работает корректно: (\()(c(a|d)+)
А как только добавляем "r" после "+", то перестаёт срабатывать на комбинации (caar, (cadr, (cdar и т.д.: (\()(c(a|d)+r)
-
Offline
- Posts: 382
- Joined: Wed Sep 28, 2011 3:05 pm
Сделал пока так:YuS wrote: Конечно, будет. Надо здесь:${NUM} - заменить либо на 0, либо подсветить чем-то более нейтральным...Code: Select all
"(-)?(\d{1,8})\s*(px|em|s|rem|deg)?" "\1=(0,${DEL2},0) \2=(0,${NUM},0) \3=(0,${DEL1},0)"
Code: Select all
0 "(-)?(\d{1,8})\s*(%|ch|cm|deg|dpcm|dpi|dppx|em|ex|grad|in|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vw)?" "\1=(0,${DEL2},0) \2=(0,0,0) \3=(0,${IF},0)"
css.coder 1.10
Пусть пока остается, если что, потом добавим.Кстати, \d{1,8} - не мало для захвата цифр? Число символов брал практически "с потолка"
Такой еще момент. Можно ли как-то ловить по признаку "Находится внутри ближайших {...}". Просто заметил вот такую
Т.е. подсвечивается как класс, но тут этого не надо.
-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
В текущей реализации движка регулярок (чуть выше обозначили проблему с жадностью квантификаторов) и ограничений построчного их прохода в плагине кодера, однозначно сделать это невозможно.Cuprum wrote: Такой еще момент. Можно ли как-то ловить по признаку "Находится внутри ближайших {...}". Просто заметил вот такую
Т.е. подсвечивается как класс, но тут этого не надо.
Но с некоторыми условностями, можно попробовать обойти ограничения, как-то так:
Code: Select all
0 "(\.)(?!\d)(?!--)(?!-\d)(\w|-)+(?![^;}]*?[;}])" "\1=(0,${DEL2},0) \2=(0,${VAR},0)"
1. Если в строке не будет символа ";", то невалидные классы, находящиеся внутри {...}, будут подсвечены.
2. Если вне блока {...} в строке будет присутствовать ";", то валидные классы не будут подсвечены.
Кстати, по аналогии можно сделать проверку и для идентификаторов.
-
Offline
- Posts: 382
- Joined: Wed Sep 28, 2011 3:05 pm
Тогда не подсвечивается класс в таком видеYuS wrote: Но с некоторыми условностями, можно попробовать обойти ограничения, как-то так:Code: Select all
0 "(\.)(?!\d)(?!--)(?!-\d)(\w|-)+(?![^;}]*?[;}])" "\1=(0,${DEL2},0) \2=(0,${VAR},0)"
Code: Select all
.ededed {color: black;}
Т. е. если бы было, то решило все проблемы с подсветкой?В текущей реализации движка регулярок (чуть выше обозначили проблему с жадностью квантификаторов) и ограничений построчного их прохода в плагине кодера, однозначно сделать это невозможно.
-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Да, этот момент не учтен. Но исправить тоже можно, надо добавить "{" в исключающий символьный класс:Cuprum wrote: Тогда не подсвечивается класс в таком видеCode: Select all
.ededed {color: black;}
Code: Select all
0 "(\.)(?!\d)(?!--)(?!-\d)(\w|-)+(?![^;}{]*?[;}])" "\1=(0,${DEL2},0) \2=(0,${VAR},0)"
Многострочный проход? Не факт. Он может решить некоторые проблемы, но привнести другие... тут надо выбирать меньшее из зол.Cuprum wrote:Т. е. если бы было, то решило все проблемы с подсветкой?В текущей реализации движка регулярок (чуть выше обозначили проблему с жадностью квантификаторов) и ограничений построчного их прохода в плагине кодера, однозначно сделать это невозможно.
-
Offline
- Posts: 382
- Joined: Wed Sep 28, 2011 3:05 pm
YuS
а можно ли как сделать, чтобы цифра не выделялась в таком правиле
в слове "translate3d"?
Доп.
Разобрался. Правило должно быть таким
Но тогда придется закомментировать эту строку
Если надо чтобы отдельные цифры не светились.
а можно ли как сделать, чтобы цифра не выделялась в таком правиле
Code: Select all
-webkit-transform: translate3d(10px, 10px, 10px);
Доп.
Разобрался. Правило должно быть таким
Code: Select all
0 "(-)?(\d{1,8})(%|ch|cm|deg|dpcm|dpi|dppx|em|ex|grad|in|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vw)" "\1=(0,${DEL2},0) \2=(0,0,0) \3=(0,${IF},0)"
Code: Select all
;3 0 ${NUM} 0 "0123456789"
-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Имхо, выделенные цифры более наглядны...
Но если надо, чтобы цифры внутри текста не подсвечивались:
Но если надо, чтобы цифры внутри текста не подсвечивались:
Code: Select all
0 "(-)?(?:(?<=\s)|(?<=\W))(?<![a-z])(\d{1,8})\s*(%|ch|cm|deg|dpcm|dpi|dppx|em|ex|grad|in|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vw)?\b" "\1=(0,${DEL2},0) \2=(0,${NUM},0) \3=(0,${DEL1},0)"
-
Offline
- Posts: 382
- Joined: Wed Sep 28, 2011 3:05 pm
YuS
Тогда получается такой вариант:
css.coder 1.11
Я там подкорректировал, чтобы убрать подсветку, если между числом и ед. измерения есть пробел, т.к. это не по стандарту
Тогда получается такой вариант:
css.coder 1.11
Я там подкорректировал, чтобы убрать подсветку, если между числом и ед. измерения есть пробел, т.к. это не по стандарту

-
Offline
- Posts: 513
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Так значит это где-то тут прописано?Cuprum wrote: Я там подкорректировал, чтобы убрать подсветку, если между числом и ед. измерения есть пробел, т.к. это не по стандарту
Ага, вот вроде что-то похожее:
Ну, значит будем считать версию 1.11 релизом файла подсветки css...The format of a length value (denoted by <length> in this specification) is a <number> (with or without a decimal point) immediately followed by a unit identifier (e.g., px, em, etc.). After a zero length, the unit identifier is optional.
ЗЫ Только \b из моего варианта лучше добавить, иначе будет подсвечиваться набор символов типа: 345emabc