В некоторых задачах требуется сохранить вывод выполняемый командами
для его дальнейшей обработки. Эта статья показывает как использовать устройство
STORE для такой задачи.
Устройство STORE сохраняет (или читает) данные передаваемые командами ввода-вывода в локальную или глобальную переменную. В случае если указывается режим устройства текстовый, то одной строке вывода соответствует один узел этой переменной и устройство сохраняет вывод построчно.
Для получения вывода в переменную для дальнейшей обработки вывода нужно создать устройство STORE указав в его имени имя локальной или глобальной переменной. Если это устройство становится текущим, то вывод сохраняется в указанную переменную.
После окончания перехвата с данными из локальной или глобальной переменной можно оперировать как с обычными переменными.
Приведем пример такого перехвата для вывода результата компиляции рутины в HTML страницу. Основной задачей является перехват вывода компиляции с последующей заменой HTML сущностей для корректного формирования html страницы. Например, если в рутине присутствует синтаксическая ошибка, то требуется заменить угловые скобки в диагностическом сообщении на HTML сущности представляющие угловые скобки (< >).
Для удобства вынесем код компиляции, перехвата вывода компилятора и трансформации вывода в отдельную рутину STOREEXAM:
Показ компиляции выполняется в странице MWA compile.mwa с таким содержанием:
Далее страница выводит имеющиеся в текущей базе данных рутины и формирует для каждой гиперссылку, при нажатии на которую странице передается параметр routine с именем рутины.
При клике по ссылке имя рутины передается через параметр страницы, далее MWA страница передает имя рутины подпрограмме компиляции с перехватом, подпрограмма отправляет весь диагностический вывод компиляции в локальную переменную result и после компиляции выводит в текущее устройство страницы MWA результат замены HTML сущностей. В результате работы страница показывает корректный HTML код диагностики компиляции.
Устройство типа STORE может работать как в текстовом, так и в бинарном режиме. В приведенном примере использовался текстовый режим.
Устройство STORE сохраняет (или читает) данные передаваемые командами ввода-вывода в локальную или глобальную переменную. В случае если указывается режим устройства текстовый, то одной строке вывода соответствует один узел этой переменной и устройство сохраняет вывод построчно.
Для получения вывода в переменную для дальнейшей обработки вывода нужно создать устройство STORE указав в его имени имя локальной или глобальной переменной. Если это устройство становится текущим, то вывод сохраняется в указанную переменную.
После окончания перехвата с данными из локальной или глобальной переменной можно оперировать как с обычными переменными.
Приведем пример такого перехвата для вывода результата компиляции рутины в HTML страницу. Основной задачей является перехват вывода компиляции с последующей заменой HTML сущностей для корректного формирования html страницы. Например, если в рутине присутствует синтаксическая ошибка, то требуется заменить угловые скобки в диагностическом сообщении на HTML сущности представляющие угловые скобки (< >).
Для удобства вынесем код компиляции, перехвата вывода компилятора и трансформации вывода в отдельную рутину STOREEXAM:
; example how to use STORE device compile(rouname) n saveio=$io,result n dev="|STORE|"_$na(result("")),ok,i o dev:("rwt") u dev ; next output is made into STORE device s ok=$v("rou","c",rouname) u saveio ; next output is made into prior device c dev s i="" f s i=$o(result(i)) q:i="" d . w $zcvt(result(i),"o","XML"),! qЭта подпрограмма сохраняет текущее имя устройства, формирует устройство типа STORE для получения вывода в локальную переменную result, выполняет компиляцию, восстанавливает текущее устройство и выводит в него результат компиляции с заменой HTML сущностей.
Показ компиляции выполняется в странице MWA compile.mwa с таким содержанием:
<html> <head> <title>Intercept routine compilation using STORE device</title> </head> <body> <table align=center width=570><tr><td> <?if $d(%KEY("routine"))?> <b>Compiling routine <?eval $g(%KEY("routine",1,1))?>:</b> <pre> <?x d compile^STOREEXAM($g(%KEY("routine",1,1)))?> </pre> <?endif?> <B>Available routines:</B> <P><?x s name=$o(^$R(""))?> <?while name'=""?> <a href="compile.mwa?routine=<?eval name?>"><?eval name?></a><br> <?endwhile s name=$o(^$R(name))?> <p>Click routine name to compile. </td></tr></table> </body> </html>В этой странице тегом if проверяется есть ли в параметрах страницы параметр routine и если есть то выводится строка о компиляции с именем рутины и вызывается подпрограмма компиляции с перехватом вывода.
Далее страница выводит имеющиеся в текущей базе данных рутины и формирует для каждой гиперссылку, при нажатии на которую странице передается параметр routine с именем рутины.
При клике по ссылке имя рутины передается через параметр страницы, далее MWA страница передает имя рутины подпрограмме компиляции с перехватом, подпрограмма отправляет весь диагностический вывод компиляции в локальную переменную result и после компиляции выводит в текущее устройство страницы MWA результат замены HTML сущностей. В результате работы страница показывает корректный HTML код диагностики компиляции.
Устройство типа STORE может работать как в текстовом, так и в бинарном режиме. В приведенном примере использовался текстовый режим.
Комментариев нет:
Отправить комментарий