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.