|
|||||
Output | |||||
Related Syntax |
All output from an OmniMark program goes to OmniMark's built-in current output. You do not usually need to explicitly state where you want output to go, you just output it and it goes to current output. When you do state a destination for output, you are, in effect, resetting current output to the named destination and outputting to current output.
You can change the destination of current output within a rule:
element lamb local stream mary open mary as file "mary.txt" using output as mary do output "ba ba ba %c" done
This rule temporarily changes the current output to the file mary.txt. Any output that occurs in the do...done
block following using output as
goes to the new destination. Once the block is finished, current output reverts to its original destination. Note, however, that the output statement contains the parse continuation operator (%c
). Is the new output destination in effect for all the processing that occurs as part of the parsing of the lamb element? Yes it is. Output that is generated by any rules that fire as a result of parsing the lamb element will go to the file "mary.txt".
To understand how this works, consider an XML file, "mary.xml", that contains a valid DTD and the following markup:
<line> <person>Mary</person> had a little <person>lamb</person> </line>
And consider the following OmniMark program:
global stream words global stream people process open words as file "words.txt" open people as file "people.txt" using output as words do xml-parse document scan file "mary.xml" output"%c" done element line output "%c" element person using output as people do output "%c " done
Running this program will leave you with two files: words.txt will contain " had a little ", and people.txt will contain "Mary lamb ". Look closely at this code to make sure you understand which output destination is in effect in the "line" element rule. Make sure you understand why the output ended up in the files it did. If you are comfortable with this, you know most of what you need to know about how OmniMark handles output.
The last rule of the program above can be shortened slightly by using put
as a shorthand for the using output as
block:
element person put people "%c "
OmniMark's current output is a powerful mechanism for simplifying code by eliminating the need to always state where output is going. Once the destination of the current output is set, all output goes to that destination unless you explicitly send it elsewhere. Current output has the additional feature of being able to have more than one destination at a time:
global stream my-file global stream my-buffer process open my-file as file "myfile.txt" output-to my-file submit "Mary had a little lamb" find "had" open my-buffer as buffer output using my-buffer and #current-output do output "I've been had!" done
This code will place "I've been had!" in both the file myfile.txt and in the variable my-buffer. #current-output
stands for all the current destinations of current output, so you can use it to add a new destination to all those currently active (even if you don't know what they are).
Related Syntax open output output-to put using output as |
---- |