View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001742 | Wishes | Macro | public | 2011-04-04 23:35 | 2013-02-03 00:33 |
Reporter | DAtaMan | Assigned To | vskirdin | ||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0001742: Макрофункция CmpName - соответствие текста маске | ||||
Description | Довольно часто в макросах бывает нужно узнать, соответствует ли текст маске. В предлагаемом патче реализована макрофункция CmpName. | ||||
Steps To Reproduce | Синтаксис такой: N=CmpName(Mask,S[,SkipPath]) Функция регистронезависима. Примеры: cmpname("*far*", "far manager") == 1 cmpname("a.txt", @"c:\a.txt", 0) == 1 cmpname("a.txt", @"c:\a.txt", 0) == 0 cmpname("a.txt", @"c:\a.txt", 1) == 1 | ||||
Tags | No tags attached. | ||||
Build | 1946 | ||||
|
|
|
build 1942 |
|
а может имеет смысл переделать (и переименовать) функцию вот так (применив ProcessName()): N=ProcessName(Mask,Name[,Flags]) Здесь значение Flags как у PROCESSNAME_FLAGS (см. plugin.hpp) ? |
|
А может тогда уж сделать универсальную функцию, с поддержной регэкспов? И обязательно ли привязываться к именам файлов? Может пусть будет произвольный текст? |
|
никто не мешает ЭТО (регэкспы) сделать потом внутри, а в писании (потом) написать, мол можно юзать их. опять же, работа с путями - это частный случай. если не нравится cmpname или processname - выкатывай свою версию. |
|
>если не нравится cmpname или processname - выкатывай свою версию. Мне нравится cmpname, а processname ещё больше (но с оговорками). Вопрос: может стоит сделать функцию ещё более общей? Не факт что стоит чересчур обобщать. Хотелось бы знать какие на этот счёт есть мнения. 1. Флаг маски/регэкспы определённо никому не помешает. 2. Стоит ли привязываться к файлам, или можно обобщить до любых строк. |
|
здесь и так любые строк, но в маске юзается '*' и '?' (потом будут regexp) приведенные примеры рассмотри. |
|
>static const PROCESSNAME_FLAGS > PN_CMPNAME = 0x0000000000000000ULL, > PN_CMPNAMELIST = 0x0000000000010000ULL, > PN_GENERATENAME = 0x0000000000020000ULL, > PN_SKIPPATH = 0x0000000001000000ULL; Из всего перечисленного очевидно только SKIPPATH Вероятно CMPNAME/CMPNAMELIST это альтернативы. GENERATENAME похоже к делу не относится. Так? |
|
PN_CMPNAME - это то, что сейчас CmpName PN_SKIPPATH - это то, что сейчас CmpName(Mask,S,1) PN_CMPNAMELIST - список масок, разделенных запятой PN_GENERATENAME - генерация нового имени по маске Про PN_GENERATENAME (processname.cpp, ConvertWildcards()): // На основе имени файла (Src) и маски (Dest) генерируем новое имя // SelectedFolderNameLength - длина каталога. Например, есть // каталог dir1, а в нем файл file1. Нужно сгенерировать имя по маске для dir1. // Параметры могут быть следующими: Src="dir1", SelectedFolderNameLength=0 // или Src="dir1\\file1", а SelectedFolderNameLength=4 (длина "dir1") |
|
>PN_GENERATENAME - генерация нового имени по маске Что-то не могу сообразить как это применимо в рамках текущего тикета? |
|
не запоминай. в движке юзаются уже готовые функции, так что могут быть "побочные эффекты" |
|
Index: macro.cpp =================================================================== --- macro.cpp (revision 5918) +++ macro.cpp (working copy) @@ -3746,11 +3746,15 @@ // N=CmpName(Mask,S[,SkipPath]) static bool cmpnameFunc(const TMacroFunction*) { + int Flags = PN_CMPNAMELIST; bool SkipPath = (bool) VMStack.Pop().getInteger(); - TVar S2; VMStack.Pop(S2); + TVar S; VMStack.Pop(S); TVar Mask; VMStack.Pop(Mask); - int i = CmpName(Mask.toString(), S2.toString(), SkipPath); + if (SkipPath) + Flags |= PN_SKIPPATH; + + size_t i = ProcessName(Mask.toString(), (wchar_t *)S.toString(), 0, Flags); VMStack.Push(TVar((__int64)(i))); return true; |
|
>применив ProcessName() Спасибо, применил. >И обязательно ли привязываться к именам файлов? В текущем виде функция больше применима к именам файлов - из-за регистронезависимости. Для регэкспов хочется иметь набор функций, с namespace "RE." |
|
>Для регэкспов хочется иметь набор функций, с namespace "RE." Это да, но почему бы не иметь регэкспы и тут, ведь сам фар понимает регэкспы, в тех же местах где маски. А RE.xxx это уже отдельная история. (тема на форуме тут http://forum.farmanager.com/viewtopic.php?f=15&t=6013) P.S. А вот тема прямо как по тикету http://forum.farmanager.com/viewtopic.php?f=15&t=5389 |
|
> Спасибо, применил. Ну, в таком виде это лишнее. Я имел ввиду, чтобы третий параметр был не SkipPath, а Flags. > А RE.xxx это уже отдельная история. Угу. И она произойдет после внедрения ProcessMacro (т.е. регулярка в виде "Re.XXX" будет лежать на плечах очередного плагина :-)) |
|
>И она произойдет после внедрения ProcessMacro Дождёмся ли? |
|
|
|
Переименовал в FMatch(S,Mask), с поддержкой регэкспов Годится ? |
|
ну наверное да :-) и описание для Писания... можно сюда |
|
build 1946 N=FMatch(S, Mask) |
|
macro.diff (1,724 bytes)
Index: macro.cpp =================================================================== --- macro.cpp (revision 5937) +++ macro.cpp (working copy) @@ -77,6 +77,7 @@ #include "dirmix.hpp" #include "console.hpp" #include "imports.hpp" +#include "FileMasksProcessor.hpp" #include "CFileMask.hpp" // �� ������� �������� ������ @@ -296,7 +297,6 @@ static bool beepFunc(const TMacroFunction*); static bool callpluginFunc(const TMacroFunction*); static bool chrFunc(const TMacroFunction*); -static bool fmatchFunc(const TMacroFunction*); static bool clipFunc(const TMacroFunction*); static bool dateFunc(const TMacroFunction*); static bool dlggetvalueFunc(const TMacroFunction*); @@ -310,6 +310,7 @@ static bool fexistFunc(const TMacroFunction*); static bool floatFunc(const TMacroFunction*); static bool flockFunc(const TMacroFunction*); +static bool fmatchFunc(const TMacroFunction*); static bool fsplitFunc(const TMacroFunction*); static bool iifFunc(const TMacroFunction*); static bool indexFunc(const TMacroFunction*); @@ -3750,20 +3751,18 @@ return true; } -// N=FMatch(S, Mask) +// N=FMatch(S,Mask) static bool fmatchFunc(const TMacroFunction*) { - TVar Mask; VMStack.Pop(Mask); + TVar Mask; VMStack.Pop(Mask); TVar S; VMStack.Pop(S); CFileMask FileMask; - bool Ret = FileMask.Set(Mask.toString(), 0); - if (Ret && FileMask.Set(Mask.toString(), FMF_SILENT)) - Ret = FileMask.Compare(S.toString()); - - VMStack.Push(Ret?1:0); - - return Ret?true:false; + if (FileMask.Set(Mask.toString(), FMF_SILENT)) + VMStack.Push(FileMask.Compare(S.toString())); + else + VMStack.Push(-1); + return true; } // V=Editor.Sel(Action[,Opt]) |
|
Извиняюсь за паузу. Ещё уточнение. Теперь функция возвращает: 1 - при соответствии с маской 0 - при несоответствии с маской -1 - при некорректной маске (ошибке в регэкспе) Про Писание. Куда функцию "прописать", в строковые или в файловые ? Она и туда и туда подходит :) |
|
general.html.diff (1,956 bytes)
Index: general.html =================================================================== --- general.html (revision 5939) +++ general.html (working copy) @@ -768,6 +768,39 @@ <p>� ������ �� <a href="panels.html#panel.fattr">panel.fattr()</a>, ����� �� �������� � �������.</p> </td> </tr> + <tr> + <td>N=<dfn><a name="FMatch">FMatch</a></dfn>(S,Mask)</td> + <td><p>��������� ������ <var>S</var> �� ������������ ����� <var>Mask</var>.</p> + <p><var>Mask</var> ����� ��:</p> + <p> - ������</p> + <p> - ������� ����� (�������� ������ ��� ����� � ������)</p> + <p> - ������ ������� - ����� ��� ���������� ������� ������, ������� �� ������ �������������� ������ <var>S</var>. + ����� ������� �������� �� �������� ����� �������� |</p> + <p> - �������� ���������. ����� ���������� ������� ������ �� ������ ��������� /</p> + <p>���������:</p> + <table class="cont2 params lite tiny"> + <col class="value"> + <col> + <tr><th>�������</th><th>��������</th></tr> + <tr><td> 1</td><td>������ ������������� �����</td></tr> + <tr><td> 0</td><td>������ �� ������������� �����</td></tr> + <tr><td>-1</td><td>����� � ��������� ��������</td></tr> + </table> + <p>������</p> + <table class="cont2 params lite tiny"> + <col> + <col> + <tr> + <th>����</th> + <th>��������</th> + </tr> + <tr><td>FMatch("Readme.txt", "*.txt")</td><td>��������� 1</td></tr> + <tr><td>FMatch("Readme.txt", "Readme.*|*.txt")</td><td>��������� 0</td></tr> + <tr><td>FMatch(@"c:\Readme.txt", @"/txt$/i")</td><td>��������� 1</td></tr> + <tr><td>FMatch(@"c:\Readme.txt", @"/txt$")</td><td>��������� -1</td></tr> + </table> + </td> + </tr> </table> <h3>�������������� � ������������</h3> |
|
Добавил diff для Писания. Я в предыдущем комментарии накосячил, и в changelog попало неправильное описание результатов. Исправьте, пожалуйста. |
|
применил патч, скорректировал changelog |
Date Modified | Username | Field | Change |
---|---|---|---|
2011-04-04 23:35 | DAtaMan | New Issue | |
2011-04-04 23:35 | DAtaMan | File Added: macro.diff.7z | |
2011-04-05 06:49 | vskirdin | Note Added: 0006661 | |
2011-04-05 06:49 | vskirdin | Assigned To | => vskirdin |
2011-04-05 06:49 | vskirdin | Status | new => feedback |
2011-04-05 09:18 | vskirdin | Note Added: 0006667 | |
2011-04-05 09:47 | JohnDoe | Note Added: 0006668 | |
2011-04-05 09:48 | JohnDoe | Note Edited: 0006668 | |
2011-04-05 10:46 | vskirdin | Note Added: 0006672 | |
2011-04-05 12:33 | JohnDoe | Note Added: 0006678 | |
2011-04-05 12:35 | JohnDoe | Note Edited: 0006678 | |
2011-04-05 12:37 | JohnDoe | Note Edited: 0006678 | |
2011-04-05 12:50 | vskirdin | Note Added: 0006682 | |
2011-04-05 13:16 | JohnDoe | Note Added: 0006683 | |
2011-04-05 13:21 | JohnDoe | Note Edited: 0006683 | |
2011-04-05 13:29 | vskirdin | Note Added: 0006686 | |
2011-04-05 13:37 | JohnDoe | Note Added: 0006687 | |
2011-04-05 14:14 | vskirdin | Note Added: 0006690 | |
2011-04-05 16:00 | DAtaMan | Note Added: 0006697 | |
2011-04-05 16:00 | DAtaMan | Status | feedback => assigned |
2011-04-05 16:02 | DAtaMan | Note Added: 0006698 | |
2011-04-05 16:20 | JohnDoe | Note Added: 0006699 | |
2011-04-05 16:26 | JohnDoe | Note Edited: 0006699 | |
2011-04-05 16:27 | vskirdin | Note Added: 0006700 | |
2011-04-05 16:28 | JohnDoe | Note Edited: 0006699 | |
2011-04-05 16:29 | JohnDoe | Note Added: 0006701 | |
2011-04-05 18:26 | DAtaMan | File Added: FMatch.diff.7z | |
2011-04-05 18:27 | DAtaMan | Note Added: 0006707 | |
2011-04-05 18:31 | DAtaMan | Note Edited: 0006707 | |
2011-04-06 05:11 | vskirdin | Note Added: 0006710 | |
2011-04-06 11:00 | vskirdin | Note Added: 0006715 | |
2011-04-06 11:00 | vskirdin | Status | assigned => feedback |
2011-04-09 11:48 | DAtaMan | File Added: macro.diff | |
2011-04-09 11:52 | DAtaMan | Note Added: 0006727 | |
2011-04-09 11:52 | DAtaMan | Status | feedback => assigned |
2011-04-09 12:08 | DAtaMan | Note Edited: 0006727 | |
2011-04-09 20:30 | DAtaMan | Note Edited: 0006727 | |
2011-04-11 00:43 | DAtaMan | File Added: general.html.diff | |
2011-04-11 00:47 | DAtaMan | Note Added: 0006730 | |
2011-04-11 08:59 | vskirdin | Note Added: 0006733 | |
2011-04-11 08:59 | vskirdin | Status | assigned => feedback |
2012-06-08 14:47 | DAtaMan | Status | feedback => resolved |
2012-06-09 05:57 | vskirdin | Build | => 1946 |
2012-06-09 05:57 | vskirdin | Status | resolved => closed |
2012-06-09 05:58 | vskirdin | Resolution | open => fixed |
2012-06-09 05:58 | vskirdin | Fixed in Version | => 3.0 |
2013-02-03 00:33 | alexy | Severity | minor => feature |