[REBOL] BUILD-MARKUP
From: al::bri::xtra::co::nz at: 4-Aug-2002 13:42
Brett wrote:
> I also feel that BUILD-MARKUP should be able to accept a block as input.
It feels limiting that code inside <%...%> will only be bound to the global
context.
I may have mentioned this before but there's my ML dialect which creates
HTML markup from Rebol words, paths and other values. It makes the
HTML/XHTML look like Rebol script. For example, the Envelope function my
Rebol/Wiki:
Envelope: func [Title [string!] Body [block!]] [
content-type 'text/html
print newline
print ML compose/deep [
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
html [
head [
title (Title)
link/rel/type/href "stylesheet" "text/css" (Stylesheet)
script/type/language/src "text/javascript" "JavaScript"
%Wiki.js ""
]
body/onload/id "SetColumnHeight (HtmlElement)" "HtmlElement"
[(Body)]
]
]
quit
]
The view page function uses the above and looks something like:
Envelope Title compose/deep either file? Page [
[
(Folder_Buttons Page)
div/id "Center_Column" [
(
eText/Wiki/Base read Wiki_Folder/:Page rejoin [
CGI/Script-File #"?"
]
)
]
div/id "Commands" [
(Random_Page/GUI)
(Search/GUI Title)
(Edit_Page/GUI Page)
]
]
And it's done through a nice and simple parser as shown below.
Andrew Martin
ICQ: 26227169 http://valley.150m.com/
-><-
ML: function [Dialect [block!]] [String Values_Rule Values Value Tag] [
String: make string! 40000
Values_Rule: [
; Caution! The 'none word below is replaced in the 'parse rule
below!
none [
set Value any-type! (
Tag: next next Tag
insert Tag Value
Value: none
)
]
; Caution! The 'opt word below is replaced in the 'parse rule below!
opt [
set Value [
decimal! | file! | block! | string! | char!
| money! | time! | issue! | tuple! | date!
| email! | pair! | logic! | integer! | url!
]
]
]
Values: make block! 10
parse Dialect [
any [
[
set Tag tag! (
Values_Rule/1: 0 ; Replace 'none word in 'Values_Rule
above.
Values_Rule/3: either any [ ; Replace 'opt word...
#"/" = last Tag ; empty tag.
#"?" = first Tag ; XML tag.
#"!" = first Tag ; DOCTYPE tag.
] [0] [1]
)
| set Tag [path! | word!] (
Tag: to-block get 'Tag
Values_Rule/1: -1 + length? Tag ; Replace 'none word
in 'Values_Rule above.
Values_Rule/3: 'opt ; Replace 'opt word...
)
] (Value: none) Values_Rule (
Tag: head Tag
either none? Value [
if not tag? Tag [
Tag: build-tag Tag
]
if all [
#"/" <> last Tag
#"?" <> first Tag
#"!" <> first Tag
] [
append Tag " /"
]
append String Tag
append String newline
] [
repend String [
either block? Value [newline] [""]
either tag? Tag [Tag] [Build-Tag Tag]
either block? Value [ML Value] [Value]
to-tag join #"/" first either tag? Tag [to-block
Tag] [Tag]
]
]
Values_Rule/1: none
)
| none! ; Ignore 'none values.
| set Value any-type! (append String Value)
]
end
]
String
]