Coder plugin (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
DV
Offline
Posts: 1291
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Например, такой вариант работает корректно: (\()(c(a|d)+)
А как только добавляем "r" после "+", то перестаёт срабатывать на комбинации (caar, (cadr, (cdar и т.д.: (\()(c(a|d)+r)

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Например, такой вариант работает корректно: (\()(c(a|d)+)
А как только добавляем "r" после "+", то перестаёт срабатывать на комбинации (caar, (cadr, (cdar и т.д.: (\()(c(a|d)+r)
Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Очень даже может быть, это более точное описание возможного бага.

PS Кстати, на счет lookbehind-ов...
В теме много раз уже попадалось их обсуждение и обсуждение сопутствующего ограничения для них (фиксированное число символов).
Может быть, в данной ситуации помогла бы реализация метасимвола \K ?
Этот метасимвол отрезает всё, что было до него, естественно с проверкой шаблона, и в итоговой подстроке оказывается только то, что идет после него.
Например ищем в таком тексте:
xyzg fhjabc def
шаблон:
.*[^abc]\K(abc)(?= def)
В итоговой строке получим:
abc
- причем в этом случае, всё остальное окажется не захваченным. Это в регулярках coder-a было бы очень хорошим подспорьем, имхо.

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Infocatcher wrote:Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)
Так чрезмерная жадность, это уже "++" должно быть, но в любом случае (a|d)+r при любой жадности, не должно спотыкаться на символах идущих после "+", ведь они не попадают в шаблон жадной группы.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

YuS
Ну так то особенности реализации.
++ не реализовано, а жадность работает как-то неклассически. :)

Более того, я сейчас полез проверять, так на вот таком тексте

Code: Select all

test
test test test
работает только «t[a-z]+?t», а «t[a-z]+t» не находит вообще ничего (я так понимаю, оно «поедает» всю последовательность, а назад, если не найдено, не возвращается). И явно больше похоже не «t[a-z]++t».

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

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

Post by Skif_off »

Infocatcher wrote:
DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Например, такой вариант работает корректно: (\()(c(a|d)+)
А как только добавляем "r" после "+", то перестаёт срабатывать на комбинации (caar, (cadr, (cdar и т.д.: (\()(c(a|d)+r)
Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)
Пробовал, не работает.

Offline
Posts: 382
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

YuS wrote: Конечно, будет. Надо здесь:

Code: Select all

"(-)?(\d{1,8})\s*(px|em|s|rem|deg)?"	"\1=(0,${DEL2},0) \2=(0,${NUM},0) \3=(0,${DEL1},0)"
${NUM} - заменить либо на 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} - не мало для захвата цифр? Число символов брал практически "с потолка"
Пусть пока остается, если что, потом добавим.
Такой еще момент. Можно ли как-то ловить по признаку "Находится внутри ближайших {...}". Просто заметил вот такую

Image

Т.е. подсвечивается как класс, но тут этого не надо.

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Cuprum wrote: Такой еще момент. Можно ли как-то ловить по признаку "Находится внутри ближайших {...}". Просто заметил вот такую

Image

Т.е. подсвечивается как класс, но тут этого не надо.
В текущей реализации движка регулярок (чуть выше обозначили проблему с жадностью квантификаторов) и ограничений построчного их прохода в плагине кодера, однозначно сделать это невозможно.
Но с некоторыми условностями, можно попробовать обойти ограничения, как-то так:

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

Post by Cuprum »

YuS wrote: Но с некоторыми условностями, можно попробовать обойти ограничения, как-то так:

Code: Select all

0	"(\.)(?!\d)(?!--)(?!-\d)(\w|-)+(?![^;}]*?[;}])"	"\1=(0,${DEL2},0) \2=(0,${VAR},0)"
Тогда не подсвечивается класс в таком виде

Code: Select all

.ededed {color: black;}
В текущей реализации движка регулярок (чуть выше обозначили проблему с жадностью квантификаторов) и ограничений построчного их прохода в плагине кодера, однозначно сделать это невозможно.
Т. е. если бы было, то решило все проблемы с подсветкой?

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

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

Post by Cuprum »

YuS
а можно ли как сделать, чтобы цифра не выделялась в таком правиле

Code: Select all

-webkit-transform: translate3d(10px, 10px, 10px);
в слове "translate3d"?

Доп.
Разобрался. Правило должно быть таким

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"
Если надо чтобы отдельные цифры не светились.

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Имхо, выделенные цифры более наглядны...
Но если надо, чтобы цифры внутри текста не подсвечивались:

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

Post by Cuprum »

YuS
Тогда получается такой вариант:

css.coder 1.11
Я там подкорректировал, чтобы убрать подсветку, если между числом и ед. измерения есть пробел, т.к. это не по стандарту ;)

YuS
Offline
Posts: 513
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Cuprum wrote: Я там подкорректировал, чтобы убрать подсветку, если между числом и ед. измерения есть пробел, т.к. это не по стандарту ;)
Так значит это где-то тут прописано?
Ага, вот вроде что-то похожее:
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.
Ну, значит будем считать версию 1.11 релизом файла подсветки css...

ЗЫ Только \b из моего варианта лучше добавить, иначе будет подсвечиваться набор символов типа: 345emabc
Locked