[REBOL] A tool for tags.

2000-06-29 Thread bhandley

I thought a function that would be the complement to build-tag was in order.
So here's my attempt.

Comments appreciated.
Suggestions on improvements welcomed.
Now where did that bed get to

Oh, anyone thought up a dom (or just structured) approach to HTML in rebol
yet?

Brett.

REBOL [
Author: "Brett Handley"
Title: "Parse-tag"
Date: 30-June-2000
Note: {Feeds off xml-language for some code.
   I didn't know if there was an easier way to do this - and without
   clutter of a object cloning. Probably better just copying and
pasting but I thought I'd highlight the commonalities.}
Note2: {I'd be more happy if this sort of (or better) functionality was
part of the package. :) }
]

unset [tag-language-defn tag-language]

tag-language-defn: [
unquoted-data: complement charset reduce [ " " tab ]

tag-rule: [(tag-name: none) copy tag-name name (append result to-word
tag-name) any [sp attribute] sp?]
attribute: [copy attr-name name (append result to-word attr-name) opt
[eq attr-value (append result attr-data)]]

parse-tag: func[ a-tag [tag!] ] [
   result: make block! 1
   parse/all/case a-tag tag-rule
   result
]
]

foreach field [
space name-first name-chars data-chars qt1 qt2
data-chars-qt1 data-chars-qt2 name sp sp? eq attr-value
][
append tag-language-defn reduce [to-set-word :field copy get in
xml-language :field ]
]

; Add rule for handling unquoted attribute data
append tag-language-defn [
append attr-value '| append/only attr-value [ copy attr-data some
unquoted-data ]
]

tag-language: make object! tag-language-defn

parse-tag: func[ t [tag!] ] [ tag-language/parse-tag t ]


; Examples
;
;Use it like so...
;parse-tag a href="http://"
;
;Grab an attribute value
;select parse-tag a href=http://localhost/ id="a1" 'id
;
;or maybe...
;html: load/markup http://www.rebol.com
;foreach e html [
;either tag? e [
;if select parse-tag e 'src [print select parse-tag e 'alt]
;][ false ]
;]
;
;This one might be handy for tidying up those nasty unquoted values...
;build-tag parse-tag input type=radio name='theAnimal' value="cat"
CHECKED
;
;parse-tag /a; returns empty block - don't know if this is the
best or not.





[REBOL] A tool for tags. Re:

2000-06-29 Thread carl

Brett, Good stuff.  Thanks for posting it.  Should be part of the package, shouldn't 
it?

Since the result is a block, the function would be that of "load".  A "load-tag".  
Perhaps to-block should allow a tag as an arg and return a block like this.  It would 
also be nice for it to be blazingly fast, as if it were done directly in C code.  
Quite useful.

-Carl



At 6/30/00 01:56 AM +1000, you wrote:
I thought a function that would be the complement to build-tag was in order.
So here's my attempt.

Comments appreciated.
Suggestions on improvements welcomed.
Now where did that bed get to

Oh, anyone thought up a dom (or just structured) approach to HTML in rebol
yet?

Brett.

REBOL [
Author: "Brett Handley"
Title: "Parse-tag"
Date: 30-June-2000
Note: {Feeds off xml-language for some code.
   I didn't know if there was an easier way to do this - and without
   clutter of a object cloning. Probably better just copying and
pasting but I thought I'd highlight the commonalities.}
Note2: {I'd be more happy if this sort of (or better) functionality was
part of the package. :) }
]

unset [tag-language-defn tag-language]

tag-language-defn: [
unquoted-data: complement charset reduce [ " " tab ]

tag-rule: [(tag-name: none) copy tag-name name (append result to-word
tag-name) any [sp attribute] sp?]
attribute: [copy attr-name name (append result to-word attr-name) opt
[eq attr-value (append result attr-data)]]

parse-tag: func[ a-tag [tag!] ] [
   result: make block! 1
   parse/all/case a-tag tag-rule
   result
]
]

foreach field [
space name-first name-chars data-chars qt1 qt2
data-chars-qt1 data-chars-qt2 name sp sp? eq attr-value
][
append tag-language-defn reduce [to-set-word :field copy get in
xml-language :field ]
]

; Add rule for handling unquoted attribute data
append tag-language-defn [
append attr-value '| append/only attr-value [ copy attr-data some
unquoted-data ]
]

tag-language: make object! tag-language-defn

parse-tag: func[ t [tag!] ] [ tag-language/parse-tag t ]


; Examples
;
;Use it like so...
;parse-tag a href="http://"
;
;Grab an attribute value
;select parse-tag a href=http://localhost/ id="a1" 'id
;
;or maybe...
;html: load/markup http://www.rebol.com
;foreach e html [
;either tag? e [
;if select parse-tag e 'src [print select parse-tag e 'alt]
;][ false ]
;]
;
;This one might be handy for tidying up those nasty unquoted values...
;build-tag parse-tag input type=radio name='theAnimal' value="cat"
CHECKED
;
;parse-tag /a; returns empty block - don't know if this is the
best or not.