понедельник, 18 марта 2019 г.

MiniM. Перехват вывода через устройство STORE

В некоторых задачах требуется сохранить вывод выполняемый командами для его дальнейшей обработки. Эта статья показывает как использовать устройство 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 может работать как в текстовом, так и в бинарном режиме. В приведенном примере использовался текстовый режим.

Комментариев нет:

Отправить комментарий