Script Content Plugin

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Вот, решил проблему с критерием "юникодности" имени файла:

Код: Выделить всё

var	// проверяем на юникодность имена файлов, переданных короткими (8.3) именами
 a=new ActiveXObject('Shell.Application'),
 c=new ActiveXObject('MSScriptControl.ScriptControl'),
 f=new ActiveXObject('Scripting.FileSystemObject'),
 n=a.NameSpace(f.getParentFolderName(filename));

c.language='VBScript';
c.allowUI=false;
c.addCode(
'Function FC(E)\n'+
'  FC = ""\n'+
'  For i = 1 to Len(E)\n'+
'    FC = FC & Chr(Asc(mid(E,i,1)))\n'+
'  Next\n'+
'End Function\n'
);

Content=fb(fa(filename));

function fa(e){return(n.ParseName(f.getFileName(e)).path);}
function fb(e){var u=c.run('fc',e);return(f.fileExists(u)||f.folderExists(u));}
Asc, похоже, использует "общевиндовский" механизм замены символов Unicode, а видно файл после преобразования имени, или нет - пусть сама винда и разбирается. Попутно обнаружилось ещё одно воплощение проблемы с именами в плагине: папка с именем "Õ" не обрабатывается вообще, даже скриптом

Код: Выделить всё

Content=1;
Добавлено спустя 10 минут:

На VBS, пожалуй, покороче будет, но сейчас не до этого. Кстати, нет ли в VBS команды, преобразующей строку Unicode в строку ANSI целиком, не по одному символу в цикле?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin писал(а):короткого (8.3), которое плагин радостно передаёт скрипту
Забыл спросить, это тоже только на 8-ке? На семёрке имя полностью передаётся.

И я правильно понимаю, что ты вернулся к варианту проверки по знакам вопроса? Если да, то по логике должно было бы хватить этого:

Код: Выделить всё

Content = "Нет"
For i = 1 to Len(FileName)
  If Chr(Asc(Mid(FileName, i, 1))) = "?" Then
    Content = "Да" : Exit For
  End If
Next
Хотя вместо Да плагин возвращает почему-то пустое значение. :?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Flasher
Имя, например, "ЯÕ" у меня на всём коротким (точнее, более длинным, но валидным) передаётся, а "нормальные" - да, на семёрке нормально, на восьмёрке - коротким. Спасибо, что обратил внимание.

А проверка - нет, не по "?". Полное имя преобразуется с помощью Asc, результат скармливается fso.fileExists()|folderExists(). Если винда (точнее, её fileSystemObject) объект нашла - считаем имячко "ансишным", поскольку старые программы его тоже найдут. Если не нашла - что-то здесь не так...

Добавлено спустя 4 минуты:

Сейчас я конвертирую полное имя в цикле посимвольно, потому и спрашиваю:
Кстати, нет ли в VBS команды, преобразующей строку Unicode в строку ANSI целиком, не по одному символу в цикле?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin
Wait a second. Но ведь по логике винда найдёт все имена, где нет знаков вопроса? Или нет?

Вопрос видел. Стандартных методов преобразования нет.

Боюсь, что у плагина проблемы с возвратом юникодных имён. К примеру àéÿüĄŀĦĤŕž.ext +

Код: Выделить всё

Content = CreateObject("Shell.Application").NameSpace(CreateObject("WScript.Shell").CurrentDirectory).ParseName(filename).Name
даёт пустое значение.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Flasher писал(а):винда найдёт все имена, где нет знаков вопроса
Не скажи... Пока я со всякими смайликами-солнышками игрался, на какие только варианты не насмотрелся. Да и цель - определить валидность имён для старых программ - так достигается более точно, чем построение собственных предпроложений.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin
См. дописку. У тебя есть с этим проблемы?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Да, и это не единственный вариант имени, которое не обрабатывается плагином совсем. Даже, если скрипт не трогает имена, а делает что-нибудь другое. Придётся подождать юникодной версии плагина.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Ай нид хелп: в инишнике к старой версии был ключик, позволяющий обрабатывать и папки тоже, инишник в ходе экспериментов сильно пострадал, а в инишнике к последней версии этого ключа нет. Может кто-нибудь напомнить?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Serge Yolkin
Все ключи, содержащиеся в старом инишнике, есть и в новом, хотя и с некоторыми вариациями, включая упоминание ParseDirs=0 в комментарии.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Avada
Точно. Спасибо.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Маленькое резюме моих "открытий":
- ключ LongName=0/1 переключает не длинные/короткие имена, как я думал, а длинные/полные имена, т.е. при 0 в filename только имя объекта, при 1 - имя с путём;
- ParseDirs=0 отключает не только обработку папок, но и некоторых файлов, таких как hiberfil.sys, pagefile.sys;
- плагином очень удобно пользоваться для подсветки определённых файлов/папок, если она нужна не часто, или, по крайней мере, не всегда: имя плагина и поля всегда одни и те же, настраиваем шаблон поиска и цвет для него, а в зависимости от подключенного скрипта подсвечиваться будет то что нужно;
- для отключения плагина можно создать пустой скрипт (нулевого размера) и переключаться на его секцию в инишнике;
- чтобы не захламлять папку плагина скрипты можно сложить в подпапку, или разложить по нескольким подпапкам, относительные пути вида Script=".\Scripts\test.js" в инишнике поддерживаются;
- если плагин заинтересовал не только меня, могу поделиться HTA утилиткой, которая навешивается на хоткей и позволяет менять активную секцию в инишнике;

прошу прощения, если это мой очередной велосипед, и всем нормальным людям всё это давно известно.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Serge Yolkin
Про hiberfil.sys, pagefile.sys не знал, да и не требовалось.
Serge Yolkin писал(а):- плагином очень удобно пользоваться для подсветки определённых файлов/папок, если она нужна не часто, или, по крайней мере, не всегда: имя плагина и поля всегда одни и те же, настраиваем шаблон поиска и цвет для него, а в зависимости от подключенного скрипта подсвечиваться будет то что нужно;
Не понял, пример приведи, пож-та.
Serge Yolkin писал(а):для отключения плагина можно создать пустой скрипт (нулевого размера) и переключаться на его секцию в инишнике;
Прямо таки отключения? Да и зачем?
Serge Yolkin писал(а):могу поделиться HTA утилиткой
На код глянуть можно. Хотя менять секцию можно и обычным путём.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Flasher
Просто другая логика работы с плагином:
Плагин подключен, в тотале настроен шаблон поиска (у меня - highlight_plugin=script.Result = "!", но это на вкус), в [colors] настроена подсветка ColorFilter1=>highlight. В подпапке Scripts папки плагина - несколько скриптов, детектирующих определённые файлы/папки, в script.ini для каждого создана секция, в Section= та самая заглушка, которая "зачем". Ничего не подсвечивается. При необходимости, или остром желании, по хоткею вызываем утилитку, выбираем интересующий скрипт - в тотале подсвечены желаемые элементы. Через так же выбираем заглушку - всё как было. Чтобы в утилитке отображалось что-то более вменяемое, чем имена секций, в инишнике, в следующей после названия каждой секции строчке пишем комментарий (начинается с точки_с_запятой). Вот утиль:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
<html>
<head>
  <title>Переключатель Script.wdx</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=8" />
  <script type="text/jscript" language="JScript">
    self.resizeTo(400,200);
    self.moveTo(200,100);
  </script>
  <hta:application
   applicationName="WDXScriptSwitcher-II"
   border="thin"
   icon="%SystemRoot%/system32/scrobj.dll"
   id="HTApp"
   innerBorder="no"
   maximizeButton="no"
   minimizeButton="no"
   selection="no"
   singleInstance="yes"
   version="0.2"
   />
  <style type="text/css">
   *{color:navy;font:normal 14px/16px Arial;margin:0;padding:0;}
   p{cursor:hand;padding:5px 10px;}
   p:hover{background-color:yellow;}

  </style>
</head>
<script type="text/jscript" language="JScript">
  var
   a=[],
   f=new ActiveXObject('Scripting.FileSystemObject'),
   o=HTApp.commandLine.replace(/^"|[^\\]+$/g,'')+'script.ini',p,q,r,s,t;

  s=f.openTextFile(o);
  t=s.readAll();
  s.close();
  q=t.match(/Section\=[^\n\r]+/)[0].split('=')[1];
  a=t.match(/\[\w+\](\s*;\s*[^\n\r]*)?/g);
  for(var i=0;i<a.length;i++){
    r=a[i].split(/\s*;\s*/);
    if(r[0]!='[Script]'){
      p=document.createElement('P');
      p.comment=r[0].replace(/^\[|\]$/g,'');
      p.innerHTML='•&emsp;'+(r.length>1?r[1]:r[0]);
      p.attachEvent('onclick',fa);
      if(p.comment==q)p.style.fontWeight='bold';
      document.documentElement.appendChild(p);
    }
  }

  function fa(e){
    self.resizeTo(0,0);
    self.moveTo(-100,-100);
    var u,v;
    t=t.replace(/Section\=[^\n\r]+/,'Section='+f.getFileName(e.srcElement.comment));
    s=f.openTextFile('script.ini',2);
    s.write(t);
    s.close();
    try{
      with(new ActiveXObject('WScript.Shell'))
       run(
        expandEnvironmentStrings('%COMMANDER_PATH%\\PlugIns\\util\\tccp.exe')+' 540',
        0,
        true
       );
    }catch(e){}
    window.close();
  }
</script>
</html>
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Как вариант можно наделать ini файлов и копировать утилиткой нужный поверх script.ini, т.е. перезаписывать весь, вместо редактирования строк.
-----
Еще можно заводить отдельный script.lng для именования колонок.

Код: Выделить всё

[eng] 
Result=ColumnName

[rus] 
Result=ИмяКолонки
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

Lev
Можно и скрипты хранить в архиве, вместе с инишниками, а распаковывать скриптом парами, поверх имеющихся, но это хорошо для готовой сборки, в прцессе написания отлаживать лучше ничего не удаляя, а то я тут выше уже жаловался, что инишник потерял совсем. Перезаписал, блин... Зато, обжогшись, научил утилитку генерить инишник при его отсутствии (болванка, конечно, но для всех имеющихся скриптов, включая подпапки).
Ответить