Уроки по составлению скриптов для 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

Обратите внимание, как просто решаются казалось бы сложные задачи.



Материал получен с сайта поддержки   HOD Text Processor - язык обработки текстов