REBOL [
Title: "XML Generator"
File: %xmlgen.r
Date: 4-Jun-1999
Author: "Scrip Rebo"
Purpose: {
Simple functions to generate XML output. Creates
example XML as published in Scientific American, May
1999.
}
Category: [markup db 3]
]
;-- Scientific American example using REBOL blocks:
example: [
movie [
title "Star Trek: Insurrection"
star "Patrick Stewart" "Brent Spiner"
theater [
theater-name "MonoPlex 2000"
showtime 14:15 16:30 18:45 21:00
price [
adult $8.50
child $5.00
]
]
theater [
theater-name "Bigscreen 1"
showtime 19:30
price $6.00
]
]
]
;-- XML conversion functions:
emit-xml: function [data] [action tag-word][
foreach item data [
action: select [
word! [tag-word: form item]
block! [emit-tag tag-word [emit-xml item]]
] type?/word item
either action [do action] [emit-tag tag-word item]
]
]
emit-tag: func [tag value] [
either block? value [
emit [indent to-tag tag newline]
insert/dup indent " " 4
do value
remove/part indent 4
emit [indent to-tag join "/" tag newline]
][
emit [
indent to-tag tag
value
to-tag join "/" tag
newline
]
]
]
emit: func [data] [append output reduce data]
output: make string! 8000
indent: make string! 40
;-- Convert example to XML and print it:
emit-xml example
print output