Уроки по составлению скриптов для HTP.
Урок 1 (Создание первого скрипта)
Урок 2 (Улучшение первого скрипта)
Урок 3 (Cборка нужных алгоритмов из частей)
Улучшение первого скрипта - Перевод текста в группе файлов в верхний регистр.
Созданный в предыдущем уроке скрипт позволяет поднять регистр символов в содержимом файлов расположенных в рабочем каталоге, однако, этот скрипт поднимает регистр символов в файлах всех типов. То есть если в рабочем каталоге, кроме текстовых, окажутся и исполняемые файлы, то они будут безнадёжно испорчены.
Попробуем дополнить скрипт из предыдущего урока кодом, который позволит указать, какие именно типы файлы мы хотим обработать, а за одно и задействуем поля интерфейса ввода системы HTP.
Шаг 1.
Загрузим алгоритм из предыдущего урока в систему HTP ("Алгоритмы -> Выбор установленных алгоритмов").
Откроем окно редактора алгоритмов, нажатием на кнопку "Редактировать алгоритм".
Шаг 2.
Что бы задействовать поле текстового ввода интерфейса HTP, впишем две строки перед кодом алгоритма:
; FACE="Поднимает регистр символов в группе файлов", "3"
; @u0=E, "Типы файлов для обработки:", "txt htm"
Отступим от этих строк одну пустую строку.
Если сейчас нажать на кнопку "ОК", в редакторе алгоритма и перейти тем самым в рабочий интерфейс системы, то мы увидим что открылось однострочное текстовое поле и в него вписан текст "txt htm", а его имя "Типы файлов для обработки:".
В этом поле нам предстоит указывать типы файлов, которые мы хотим обработать, через пробел.
Текст из этого поля при запуске нашего скрипта будет помещён в регистр @u0 и мы сможем его использовать.
Более подробно о том как активировать поля ввода можно прочитать в файле помощи по системе HTP, раздел "Поля ввода интерфейса пользователя и имя скрипта".
Шаг 3.
Представим в виде текстового описания алгоритм анализа типа файла:
1. Получить расширение файла (то что находится после последней точки в имени).
2. Проверить соответствует ли оно указанным?
3. Если нет, то пропустить файл, не обрабатывать его.
Шаг 4.
Создадим алгоритм, который работает согласно нашему текстовому описанию:
GetEl @5, @0, ".", -1 ; получить часть имени после последней точки в регистр @5
FindE $6, @u0, @5, 0, -1, " " ; просмотреть весь список типов на наличие того типа который в регистре @5
Jmp=N $6, -1, WORK_CANCEL ; если не обнаружено, то файл не обрабатывать и перейти к следующему имени файла
Теперь встроим этот участок кода в алгоритм из предыдущего урока:
; FACE="Поднимает регистр символов в группе файлов", "3"
; @u0=E, "Типы файлов:", "txt htm"
WORK GetEl @0, @FL, "\00", $1
JmpEq @0, "", END_WORK
GetEl @5, @0, ".", -1 ; получить часть имени после последней точки в регистр @5
FindE $6, @u0, @5, 0, -1, "," ; просмотреть весь список типов на наличие того типа который в регистре @5
Jmp=N $6, -1, WORK_CANCEL ; если не обнаружено, то файл не обрабатывать и перейти к следующему имени файла
LoadF @2, @0
UCase @2, 0, -1
SaveF @0, @2
WORK_CANCEL
Add $1, $1, 1
Jmp WORK
END_WORK
PrintT 0,0, "Работу закончил."
Наш новый алгоритм будет замечательно работать, но, как быть, если потребуется обработать все типы файлов в рабочем каталоге?
Простое изменение алгоритма решает проблему, теперь его код выглядит так:
; FACE="Поднимает регистр символов в группе файлов", "3"
; @u0=E, "Типы файлов:", "txt htm"
FindE $9, @u0, "*", 0, -1, " " ; есть ли среди типов файлов знак умножить?
PrintT 0,0, "Обрабатываю файл:"
WORK GetEl @0, @FL, "\00", $1
JmpEq @0, "", END_WORK
Jmp=N $9, -1, ALL_TYPE ; если в типах фалов есть знак умножить, то обходить проверку типа, обрабатывать все типы файлов
GetEl @5, @0, ".", -1
FindE $6, @u0, @5, 0, -1, " "
Jmp=N $6, -1, WORK_CANCEL
ALL_TYPE
PrintT 1,0, @0 ; показать какой файл мы сейчас обрабатываем
LoadF @2, @0
UCase @2, 0, -1
SaveF @0, @2
WORK_CANCEL
Add $1, $1, 1
Jmp WORK
END_WORK
PrintT 0,0, "Работу закончил успешно."
Можно увидеть, что кроме проверки типов файлов, мы ввели и индикацию того файла, который сейчас обрабатываем, то есть привели алгоритм к виду профессионального во всех смыслах.
Сохраните полученный алгоритм, он ещё не один раз пригодиться Вам, как основа для различных алгоритмов обработки группы файлов, ведь стоит вписать вместо команды:
UCase @2, 0, -1
любой другой участок кода обработки содержимого регистра @2, и мы получим совершенно другой обработчик, например перекодировка из KOI-8R в WIN-1251 решается заменой указанной выше команды на команду:
ReplaceS @2, "кгхлеозыэъияжщчбртпмдцьсюунйфшваEКГХЛЕОЗЫЭЪИЯЖЩЧБРТПМДЦЬСЮУНЙФШВАe", "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁйцукенгшщзхъфывапролджэячсмитьбюё"
Если нам потребуется убрать переносы строк в содержимом файлов в рабочем каталоге, например для уменьшения размера HTML страниц, то это решается командой:
ReplaceS @2, "\n", ""
Если мы хотим перевести код переноса строки из DOS/WIN стандарта в *NIX стандарт, например в рабочем каталоге у нас находятся cgi скрипты на perl, то используем команду:
Mov $N, 0 ; обратитесь к справке, что бы узнать для чего служит регистр $N
Мы можем пойти и дальше, переделать наш скрипт в систему замены участка текста на другой, то есть сделать из нашего алгоритма, стандартный скрипт "ReplaceR".
Для этого задействуем ещё два поля ввода текста, заменив первую строку скрипта на:
; FACE="Поднимает регистр символов в группе файлов", "3"
; @u0=E, "Типы файлов:", "txt htm"
; @u1=M, "Что заменять:", ""
; @u2=M, "На что заменять:", ""
И поменяв команду:
UCase @2, 0, -1
На команды:
Mov $R, 1 ; если учитывать регистр, то 1 если нет, то 0
ReplaceI @2, 0, -1, @u1, @u2
Обратите внимание, как просто решаются казалось бы сложные задачи.
Материал получен с сайта поддержки
|