[REBOL] Re: New dialect for building HTML and XML tags [Announce] ML update
From: AJMartin::orcon::net::nz at: 24-Dec-2003 22:51
I've enhanced my ML dialect to eliminate the need for the 'check function:
>> French: true
== true
>> ML compose [input/type/checked checkbox (French)]
== {<input type="checkbox" checked="checked" />}
>> French: false
== false
>> ML compose [input/type/checked checkbox (French)]
== {<input type="checkbox" />}
>> French: none
== none
>> ML compose [input/type/checked checkbox (French)]
== {<input type="checkbox" />}
Note that a logic! false or none! attribute causes the corresponding Name to
vanish away, which makes it just right for optional attributes in HTML and
XML tags.
And I've enhanced my ML dialect to allow building complex tags, with out
needing to use path! values (but it still allows path! values)! Just use a
surrounding <" and ">" for the "expanded" tag:
>> ML [< a href http://www.rebol.com title "Rebol HQ" > [ "Rebol HQ Link"] ]
== {<a href="http://www.rebol.com" title="Rebol HQ">Rebol HQ Link</a>}
I've also chopped out NameSpace, which was implemented wrongly (it doesn't
do the right thing for XSL stylesheets that generate HTML). :( I've also
chopped out some redundant words and values. :)
Enjoy!
Andrew J Martin
Speaking in tongues and performing miracles.
ICQ: 26227169
http://www.rebol.it/Valley/
http://valley.orcon.net.nz/
http://Valley.150m.com/
-><-
; From my %Patterns.r script:
Fail^: [to end skip] ; A rule that always fails.
Succeed^: [] ; A rule that always succeeds.
LT^: compose [(to-lit-word "<")]
GT^: compose [(to-lit-word ">")]
Slash^: Compose [(to-lit-word "/")]
[
Rebol [
Name: 'ML
Title: "ML"
File: %"ML.r"
Author: "A J Martin"
Owner: "Aztecnology"
Rights: "Copyright © 2003 A J Martin, Aztecnology."
eMail: [Rebol--orcon--net--nz]
Web: http://www.rebol.it/Valley/
Tabs: 4
Purpose: {ML generates XML markup from Rebol words, paths, refinements,
tags and blocks.}
Requires: [Build-Tag Fail^ LT^ GT^ Slash^]
Provides: [ML]
Language: 'English
Date: 11/December/2003
Version: 2.0.0
]
ML: function [
{ML generates XML markup from Rebol words, paths, tags, refinements and
blocks.}
Dialect [block!] "ML Dialect"
] [Gate String Values_Rule Value Tag Values Name Attribute] [
Gate: []
String: copy ""
Values_Rule: [
; Caution! The 'none word below is replaced in the 'parse rule
below!
none [
set Value any-type! (
Tag: next next Tag
either Value [
if logic? Value [
Value: form first back Tag
]
insert/only Tag :Value
] [
remove back Tag
]
Value: none
)
(Tag: head Tag)
]
; 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!
]
]
]
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]
)
| [
LT^ set Tag [word! | url!]
(
Values: make block! 10
insert tail Values Tag
)
any [
[opt Slash^ GT^ (insert Gate Fail^) Fail^]
| Gate set Name [word! | url!] set Attribute [
decimal! | file! | string! | char! | none!
| money! | time! | issue! | tuple! | date!
| email! | logic! | integer! | url! | lit-word!
]
(
if Attribute [
if logic? Attribute [
Attribute: form Name
]
insert tail Values reduce [Name Attribute]
]
)
]
(
clear Gate
Tag: Values
Values_Rule/1: 0 ; Replace 'none word in
'Values_Rule above.
Values_Rule/3: 1 ; Replace 'opt word...
)
opt [Slash^ (Values_Rule/3: 0)]
GT^
]
| set Tag [path! | word!] (
Tag: to-block get 'Tag
; Replace 'none word in 'Values_Rule above.
Values_Rule/1: -1 + length? Tag
Values_Rule/3: 'opt ; Replace 'opt word...
)
] (Value: none) Values_Rule (
if not tag? Tag [
Tag: build-tag Tag
]
insert tail String reduce either none? :Value [
if all [
#"/" <> last Tag
#"?" <> first Tag
#"!" <> first Tag
] [
insert tail Tag " /"
]
Tag
] [
[
Tag
either block? :Value [ML Value] [:Value]
to-tag join #"/" first to-block Tag
]
]
Values_Rule/1: none
)
| set Tag refinement! (
; Converts: /br to: <br /> for a saving of three characters!
insert tail String head insert tail to-tag Tag " /"
)
| none! | logic! ; Ignore 'none and logic! values.
| unset! ; And ignore unset values (caused by 'print...)
| set Value any-type! (insert/only tail String :Value)
]
end
]
String
]
]