View in color | View documentation | View discussion [248 posts] | License |
Download script | History | Other scripts by: inetw3dm |
17-Feb 10:55 UTC
[0.11] 73.711k
[0.11] 73.711k
rebol-dom-mdlparserREBOL [
File: %rebol-dom-mdlparser
Date: 02-11-2020
Title: "Dialect Object Model"
Emai: %inetw3--dm--gmail--com
author: daniel murrill
Purpose: {
%Rebol-DOM.r mdlparser.r is a copy
of the %Rebol-DOM.r mdlparser.
The first copy would not download
so i appended the *.r to it, wich
seemed to make it able to become
downloadable now. So...., down
load it and tell me all about its
glorious problems so i can make a
to-do list to go with the one in my
head. This is the somewhat weekly build version}
]
library: [
author: daniel murrill
level: 'intermediate
platform: 'all
type: 'progressive-build
domain: [DOM html vid css json js array]
tested-under: "windows Rebol2"
support: "discussions, email me"
license: shareware
see-also: %HTML-view.r
]
markup: [body: [{background-color="blue" text "white"} ]
p: [
{id="my-p1" "color":"#0000ff", "bgcolor":"yellow", "width" : "399", "height" : "100" "font-styles": "big" }
This is an example of an Dialect Oject Model
b: [
{color = "Chocolate" bgcolor = "yellow"}
that can be written to look like json' html' javascript arrays' css'
i: [
{id="i-color" color = "green"}
VID' or plain old rebol ]
]
if you like.
]
hr: [{color="red" bgcolor="yellow"}]
div: [
{width="399" height="50" bgcolor="orange"}
b: [
{color: "purple" bgcolor: "orange"}
Maybe it would be easier to write
i: [
{color: "green"}
MakeDoc.r code but the purpose of this rebol DOM is']
]
]
p: [
{width "399" height= 200
style="color:red;bgcolor:purple;border:2x2;"
}
b: [
{color="red"}
to read or load as many well known dialects of coding styles as possible
and write all of it as a single or seperate legible rebol series that's
quickly manipulated' transcoded as html' and viewed as a VID. ]
]
]
macros:[
"&" "&"
"<" "<"
">" ">"
""" {"}
"ä" "ä"
"Ä" "Ä"
"ö" "ö"
"Ö" "Ö"
"ü" "ü"
"Ü" "Ü"
"ß" "ß"
]
histobj: []
markup-hexcolors: func [Dialect-colors] [
foreach [word-color with-hexcolor] incolor-series [replace/all Dialect-colors word-color :with-hexcolor]
]
incolor-series: to-hash [
"Aliceblue" "#F0F8FF"
"Antiquewhite" "#FAEBD7"
"Aqua" "#00FFFF"
"Aquamarine" "#7FFFD4"
"Azure" "#F0FFFF"
"Base-color" "#8F7F6F"
"Beige" "#FFE4C4"
"Bisque" "#FFE4C4"
"Black" "#000000"
"Blueviolet" "#8A2BE2"
"Blanchedalmond" "#FFEBCD"
"Brown" "#A52A2A"
"Brick" "#B22222"
"Burlywood" "#DEB887"
"Cadetblue" "#5F9EA0"
"Chartreuse" "#7FFF00"
"Coal" "#404040"
"Coffee" "#4C1A00"
"Chocolate" "#D2691E"
"Coral" "#FF7F50"
"Cornflowerblue" "#6495ED"
"Cornsilk" "#FFF8DC"
"Crimson" "#DC143C"
"Cyan" "#00FFFF"
"Darkblue" "#00008B"
"Darkcyan" "#008B8B"
"Darkgoldenrod" "#B8860B"
"Darkgray" "#A9A9A9"
"Darkgreen" "#006400"
"Darkkhaki" "#BDB76B"
"Darkmagenta" "#8B008B"
"Darkolivegreen" "#556B2F"
"Darkorange" "#FF8C00"
"Darkorchid" "#9932CC"
"Darkred" "#8B0000"
"Darksalmon" "#E9967A"
"Darkseagreen" "#8FBC8F"
"Darkturquoise" "#00CED1"
"Darkslateblue" "#483D8B"
"Darkslategray" "#2F4F4F"
"Darkviolet" "#9400D3"
"Deepskyblue" "#00BFFF"
"Dimgray" "#696969"
"Firebrick" "#B22222"
"Floralwhite" "#FFFAF0"
"Forest" "#003000"
"Forestgreen" "#228B22"
"Fuchsia" "#FF00FF"
"Gainsboro" "#DCDCDC"
"Ghostwhite" "#F8F8FF"
"Gold" "#FFCD28"
"Goldenrod" "#DAA520"
"Gray" "#808080"
"Green" "#00FF00"
"Greenyellow" "#ADFF2F"
"Honeydew" "#F0FFF0"
"Hotpink" "#FF69B4"
"Indianred" "#CD5C5C"
"Indigo" "#4B0082"
"Ivory" "#FFFFF0"
"Khaki" "#F0E68C"
"Lavender" "#E6E6FA"
"Lavenderblush" "#FFF0F5"
"Lawngreen" "#7CFC00"
"Lemonchiffon" "#FFFACD"
"Lightblue" "#ADD8E6"
"Lightcoral" "#F08080"
"Lightcyan" "#E0FFFF"
"Lightgoldenrodyellow" "#FAFAD2"
"Lightgreen" "#90EE90"
"Lightgrey" "#D3D3D3"
"Lightpink" "#FFB6C1"
"Lightsalmon" "#FFA07A"
"Lightseagreen" "#20B2AA"
"Lightskyblue" "#87CEFA"
"Lightslategray" "#778899"
"Lightyellow" "#FFFFE0"
"Lime" "#00CD00"
"Limegreen" "#32CD32"
"Linen" "#FAF0E6"
"Leaf" "#008000"
"Magenta" "#FF00FF"
"Maroon" "#800000"
"Mint" "#648874"
"Mediumauqamarine" "#66CDAA"
"Mediumblue" "#0000CD"
"Mediumorchid" "#BA55D3"
"Mediumpurple" "#9370D8"
"Mediumseagreen" "#3CB371"
"Mediumslateblue" "#7B68EE"
"Mediumspringgreen" "#00FA9A"
"Mediumturquoise" "#48D1CC"
"Mediumvioletred" "#C71585"
"Midnightblue" "#191970"
"Mintcream" "#F5FFFA"
"Mistyrose" "#FFE4E1"
"Moccasin" "#FFE4B5"
"Navajowhite" "#FFDEAD"
"Navy" "#000080"
"Oldrab" "#484810"
"Olive" "#808000"
"Olivedrab" "#688E23"
"Orange" "#FFA500"
"Orangepumpkin" "#FFA500"
"Orangered" "#FF4500"
"Orchid" "#DA70D6"
"Papaya" "#FF5025"
"Palegoldenrod" "#EEE8AA"
"Palegreen" "#98FB98"
"Paleturquoise" "#AFEEEE"
"Palevioletred" "#D87093"
"Papayawhip" "#FFEFD5"
"Peachpuff" "#FFDAB9"
"Peru" "#CD853F"
"Pewter" "#AAAAAA"
"Pink" "#FFC0CB"
"Palepink" "#FFC0CB"
"Plum" "#DDA0DD"
"Powderblue" "#B0E0E6"
"Purple" "#800080"
"Rebolor" "#8E806E"
"red" "#FF0000"
"Rosybrown" "#BC8F8F"
"Royalblue" "#4169E1"
"Saddlebrown" "#8B4513"
"Salmon" "#FA8072"
"Sandybrown" "#F4A460"
"Seagreen" "#2E8B57"
"Seashell" "#FFF5EE"
"Sienna" "#A0522D"
"Silver" "#C0C0C0"
"Sky" "#A4C8FF"
"Skyblue" "#87CEEB"
"Slateblue" "#6A5ACD"
"Slategray" "#708090"
"Snow" "#FFFAFA"
"Springgreen" "#00FF7F"
"Steelblue" "#4682B4"
"Tan" "#D2B48C"
"Teal" "#008080"
"Thistle" "#D8BFD8"
"Tomato" "#FF6347"
"Turquoise" "#40E0D0"
"Violet" "#EE82EE"
"Water" "#506C8E"
"Wheat" "#F5DEB3"
"White" "#FFFFFF"
"Whightsmoke" "#F5F5F5"
"Yellow" "#FFFF00"
"YellowGreen" "#9ACD32"
"Blue" "#0000ff"
"amp;" "&&"
"lt;" "&<"
"gt;" "&>"
"quot;" {&"}
"auml;" "&ä"
"Auml;" "&Ä"
"ouml;" "&ö"
"Ouml;" "&Ö"
"uuml;" "&ü"
"Uuml" "&Ü"
"szlig;" "&ß"
"nbsp;" {&""}
"&&" "&"
"!--" ""
"%100" "%99"
"100%" "99%"
<head> <body background-color="#FFFFFF" text="#000000">
"backdrop-color" "bgcolor"
"background-color" "bgcolor"
{a# } <a > { #a} </a>
]
markup-DTD: func [DTD] [
foreach [doc-tag with-definition] in-dtd [replace/all DTD doc-tag with-definition]
]
in-dtd: [
"!--" ""
"64-" "64 "
"" " "
"%100" "%99"
"100%" "99%"
<body> <body background-color="#FFFFFF" text="#000000">
"body bgcolor" "body background-color"
]
get-color: does [either error? try [
baseclr: to-tuple debase/base baseclr 16] [this-color?] [this-color: any [baseclr this-color]]
]
color=: func [this-color][
parse to-string this-color [(baseclr: "") to "#"
copy baseclr to end]
this-color?: txt-clr
either find baseclr "#" [remove baseclr get-color][this-color: any [attempt [to-tuple this-color]txt-clr]]
]
bgcolor=: func [this-color][
parse to-string this-color [(baseclr: "") to "#"
copy baseclr to end]
this-color?: bkclr
either find baseclr "#" [remove baseclr get-color][this-color: any [attempt [to-tuple this-color]bgclr]]
]
remove-tail-char?: func [in-node element][; =: :equal?
foreach char element [
if char = back tail to string! in-node[
remove back tail in-node]
]
]
remove-head-char?: func [in-node element][; =: :equal?
type: type? in-node
foreach char element [
all [char = any [first to-string in-node form first in-node]
to type trim to-string any [attempt [remove in-node] remove form in-node]]
]
]
quote-node-attributes: does [with-these-attributes: copy ""
remove-tail-char? in-node-element "/"
this-node: form find/match in-node-element node-name: first parse/all in-node-element { =">}
strip-obj-chars-from in-node-element [
#"^/" " " {:"} {"} ": {" "=true {"
{ ="" } {="" } { ="} " " {"=""} " "
{="" } {" } "://" "&&"
]
if find/any this-node "style=" [
parse/all this-node [
[to {style="} | to "style="] copy style-obj [thru {;" } | thru {;">}
| thru {;>} | thru {;"} | thru {" } | thru {>} | thru "}," | to end] (
*style.node: copy style-obj
foreach [style-chars found-with-in] tag-tokens/style-obj-chars [
replace/all *style.node style-chars found-with-in
] replace this-node style-obj *style.node
)
]
]
foreach part replace/all this-node: parse/all this-node {<{} __,=":;[]>} [""] [] [
part: any [if find/match part "'" [
replace/all part "'" ""] part ]
strip-obj-chars-from part [" " " " {,} " " "&&" "://" ". " "." {=null} {=""} "'" "" {""} "" "none" ""]
append with-these-attributes mold form part
]
]
create-tag-element: func [these-attr][
in-attribute-blk: to-block these-attr
foreach [attr-name attr-value] in-attribute-blk [
replace in-attribute-blk attr-name to-word attr-name
attempt [trim attr-value]
]
attempt [insert in-attribute-blk to-word trim/all strip-chars-from node-name none]
data-node: build-tag in-attribute-blk
]
this-width: 100
div: prg: tbl: tds: hd: lst: ul: spn: fnt: 0
img: hrl: fld: btn: txt-btn: hdn: chk: rdo: txt-sz: width=: 0
Dialect: ""
div-x: tbl-x: para-x: hr-x: hr-xy: face-x: tdx: x-size: gt-str-sz: 0x0
slf: child: use-methods: last-node: ""
styles: .style: ""
imgurl: go-here: copy []
parent-sz: font-size=: str-sz: 0
DOM: face-styles: "" fnt-styles: [] fnt-style: ""
data-node: face-node: node-name: node-type: tag-node: tag-head: text-node:
in-parent?: in-node?: end-tag-token?: slf*: none
div_clr: p_clr: tb_clr: tr_clr: td_clr: ul_clr: li_clr: f_clr: b_clr: i_clr: clr: txt-clr: border=: none
div_bgclr: p_bgclr: tb_bgclr: tr_bgclr: td_bgclr: ul_bgclr: li_bgclr: f_bgclr: b_bgclr: i_bgclr: bgclr: bkclr: none
fnt-nm: ""
.border?: border?: does [if not none = border= [
border: to-block foreach [a b]["(" "" ". " "." ")" ""] [replace/all border= a b]
append face-styles to-string reduce [
to-path reduce [slf 'edge 'size] ": " either attempt [pair: first find border pair!][pair][0x0] " "
to-path reduce [slf 'edge 'color] ": " clr: first any [find border tuple! 0.0.0] " show " slf " "] ]
]
.color?: color?: does [append face-styles to-string reduce ["foreach fclr " to-path reduce [slf 'pane] " [if clr != fclr/effect/draw/pen [fclr/effect/draw/pen: " clr " show fclr]] "]]
]
.bgcolor?: bgcolor?: does [append face-styles to-string reduce ["foreach clr " this: to-path reduce [slf 'pane] " [if bgclr != " to-path reduce [slf 'color] " [clr/color: " bgclr " ] show clr] " slf "/color: " bgclr " show " slf " "]
]
.font-size?: font-size?: does [if none != font-size= [append face-styles to-string reduce [
" foreach fnt " to-path reduce [slf 'pane] { [ if error? try [fnt-style: to-word fnt/effect/draw/font][][fnt-style: font_] }
join fnt-style font-size= {: make face/font any [attempt [font_]attempt[b.]] fnt/effect/draw/font: } join fnt-style font-size= " "
join fnt-style font-size= {/size: }
font-size= " show fnt ]" ] ]
]
.font-style?: font-style?: does [if font-style= [append face-styles to-string reduce [" foreach fnt " to-path reduce [slf 'pane] " [fnt-style: font_ *fnt: fnt/effect/draw replace *fnt select *fnt fnt-style/style " font-style= " show fnt ]"]]font_/style: none]
.width?: width?: does [attempt [append face-styles to-string reduce [" " width=: to-path reduce [slf 'size 'x] ": " face-x/x: any [face-x width=] " show " slf " "]]]
`
select-this: func [this-token][
do select tag-tokens reduce this-token
]
tag-tokens: to-hash [
body [bgclr: clr: none clear-colors in-parent?: false][{ backcolor } bkclr { backdrop } imgurl " effect [merge] " {below across } ]
/body [][{}]
div [parent-sz: div-x: face-x div_clr div_clr: clr div_bgclr: bgclr divs: divs + 1][{ below across space 10 }]
/div [face-x: div_clr: div_bgclr: none ][{ close. } div-x " " div_bgclr { edge [] below }]
area [ar-x: any [face-x 100x50]][{ below across area #text } ar-x " "]
/area [ar-x: face-x: none][{ close. } bgclr " "]
textarea [ar-x: any [face-x 100x50]][{ below across area #text } ar-x " "]
/textarea [ar-x: face-x: none][]
p [parent-sz: para-x: face-x p_bgclr: bgclr p_clr: clr append main { below across } prg: prg + 1][{ below across } ]
/p [p_bgclr: p_clr: face-x: none border?][{ close. } para-x " " p_bgclr { edge [] }]
li [face-x: any [size= none] li_clr: any [clr ul_clr] li_bgclr: any [bgclr ul_bgclr txt-clr] lst: lst + 1][{ space 0 across box 16x20 } li_bgclr
{ effect [draw [fill-pen } li_clr { pen } li_clr { circle 3x8 2]] }]
/li [face-x: li_clr: li_bgclr: bgclr: clr: none ][{ close. below across }]
ul [in-parent?: false ul_bgclr: bgclr ul_clr: clr bgclr: clr: none ul: ul + 1][" across "]
/ul [ul_bgclr: ul_clr: bgclr: clr: none clear-colors][{ close. }]
tbody [tbl: tbl + 1][]
/tbody [][{}]
/table [parent-sz: tbl-x: tb_clr: tb_bgclr: none][{ close. } " " tb_bgclr " edge [] "]
table [parent-sz: tbl-x: face-x face-x: none get-colors tb_clr: clr tb_bgclr: bgclr tbl: tbl + 1][{ guide }]
td [parent-sz: tdx: any [face-x tbl-x] td_bgclr: bgclr td_clr: clr get-colors tds: tds + 1][{ across }]
/td [td_bgclr: td_clr: parent-sz: tdx: none][{] } tdx " " td_bgclr { edge [color: silver size: 1x1 effect [ibezel]] }]
tr [tr_bgclr: bgclr tr_clr: clr get-colors][{ across space 0 }]
/tr [tdx: tb_clr: td_clr: tr_clr: clr: none][{ return }]
b [to-font 'b. get-colors b_bgclr: bgclr b_clr: clr][face-node: { space 0 box #bgclr #string-size effect [draw [pen #clr font #font text #text ]] }]
i [to-font 'i. get-colors i_bgclr: bgclr i_clr: clr][face-node: { space 0 box #bgclr #string-size effect [draw [pen #clr font #font text #text ]] }]
a [to-font 'u. get-colors attempt [go-here: to-url styles/href=]][]
/b [remove-font 'b. b_clr: b_bgclr: none][]
/i [remove-font 'i. i_clr: i_bgclr: none][]
/a [remove-font 'u. remove-style ][{ [attempt [markup: read } go-here { update clear Dialect html/text: } go-here { show html] ] }]
font [f_bgclr: bgclr f_clr: clr get-colors][{ space 0 box #bgclr #string-size effect [draw [pen #clr font #font text #text ]] }]
/font [f_clr: f_bgclr: none remove-style][{ }]
span [f_clr: any [clr txt-clr]bgclr: any [bgclr bkclr]][{ space 0x20 box #bgclr #string-size effect [draw [pen #clr font #font text #text ]] }]
/span [face-x: f_clr: f_bgclr: none remove-style][]
br [face-x: none clear styles clear-colors ][{ below across }]
button [btn-sz: size= btn: btn + 1][{ button } btn-sz " " value= " font-color " clr " " bgclr " [" onclick= "] "]
btn [ btn-sz: size= btn: btn + 1][{ btn } btn-sz " " value= " font-color " clr " " bgclr " [" onclick= "] "]
text [txt-sz: size= fld: fld + 1][{ field } value= { edge [size: 1] effect [draw [pen silver line-width 1 box ]] font-color } clr " "]
field [fld: fld + 1][{ field } value= { edge [size: 1] effect [draw [pen silver line-width 1 box ]] font-color } clr " "]
search [btn-sz: size= ][{ field } value= " " btn-sz " edge [size: 1] effect [draw [pen silver line-width 1 box ]] font-color " clr " "]
select [btn-sz: size= in-parent?: false][{ choice }]
submit [btn-sz: size= btn: btn + 1][{ button } btn-sz " " value= " " clr " [" onclick= "] "]
password [btn-sz: size= fld: fld + 1][{ field } value= " " btn-sz " edge [size: 1] effect [draw [pen silver line-width 1 box ]] font-color " clr " "]
option [][{ #text }]
/option [][]
hidden [hdn: hdn + 1][""]
input [size=: any [size= []] fld: fld + 1]['field " " value= { font-color } clr " " ]
check [chk: chk + 1][{ space 12 check }]
checkbox [chk: chk + 1][{ space 12 check }]
radio [rdo: rdo + 1][{ radio space 12 } ]
H1 [in-parent?: false hd: hd + 1][{ below text }]
H2 [in-parent?: false hd: hd + 1][{ below text }]
H3 [in-parent?: false hd: hd + 1][{ below H2 }]
H4 [in-parent?: false hd: hd + 1][{ below H3 }]
H5 [in-parent?: false hd: hd + 1][{ below H4 }]
H6 [in-parent?: false hd: hd + 1]{ below text }
/H1 [ remove-style]{ font-size 32 below across }
/H2 [ remove-style]{ font-size 24 below across }
/H3 [ remove-style]{ below across }
/H4 [ remove-style]{ below across }
/H5 [ remove-style]{ below across }
/H6 [ remove-style]{ font-size 10 below across }
hr [ hrl: hrl + 1][{ panel [ box } clr " " (as-pair hr-x - .5 1) { bevel 2 pad 0x-11 box } bgclr " " (as-pair hr-x - .5 2){] below across }]
/hr [in-parent?: false ][{ close. below across } ]
strong [to-font 'b. get-colors b_clr: clr b_bgclr: bgclr][{ space 0 box #bgclr #string-size effect [draw [pen #clr font #font text #text ]] }]
/strong [remove-font 'b. b_clr: b_bgclr: none][]
img [img: img + 1][{ image } img-url " " face-x " "]
newline [""][{ below across }]
style-obj-chars ["<" "" {style="} " " {style=} " " " : " { "} ": " { "} ":" {*"} " " {__} {=""} { " " } "=" {*"} ";" {"*} {""} {"} { "} {"} {*"} { "} {"*} {" } " >" "" ">" "" "rgb" "" {__"} {"} {" "} {"} "," "."]
elemt-chars ["{" "}" {"} "(" ")" "/" "." "[" "]" "," ":" ";" "," "="]
obj-chars [":" " " ";" " " "," " " "=" " "]
]
free-up: func [this-data][do this-data]
parent-width: 0
parse-html: func [Dialect][
markup-DTD Dialect
bkclr: none
return-parent-width: func [children][in-parent-node: none
these-children: children
replace/all replace/all children "^/" "" <newline> " "
replace/all Dialect "> " ">"
in-parent-node: load/markup children str-sz: 0
free-up [foreach txt-node in-parent-node [replace/all txt-node " " " "
if all [not empty? txt-node string! = type? txt-node find txt-node " "][str-sz: str-sz + string-size? txt-node
replace in-parent-node txt-node to-block rejoin [{"}strip-obj-chars-from txt-node [" " {" "}]{"}] ] text-face: none]
free-up quote-node-attributes
create-tag-element with-these-attributes]
parent-width: get-size select in-attribute-blk 'width
if parent-width = 0 [switch node-name [
"div" [parent-width: 650]
"p" [parent-width: 650]
"p" [parent-width: 650]
"td" [replace/all in-parent-node "<br" "<span " parent-width: str-sz]
"li" [parent-width: str-sz]
]if [parent-width > 650 or parent-width = 0][parent-width: 650]
]
replace Dialect in-node-element data-node
txt-sz: 0
foreach child-element in-parent-node [
with-these-children: [] each-node: type? child-element
either string! = each-node [string-size? child-element face-x: face-x + 9
txt-sz: txt-sz + face-x text-face: none
either txt-sz <= parent-width [append with-these-children child-element][
txt-sz: face-x append with-these-children reduce [<newline> child-element]]
][append with-these-children child-element if find child-element "br" [txt-sz: 0]]
]
size-x: txt-sz: 0
replace Dialect these-children form with-these-children
;replace/all replace/all Dialect "<<" "<" ">>" ">"
]
replace/all Dialect "> " ">"
validate-or-remove: func [with-end-tag][
either none = children [replace Dialect in-node-element " "][
if children [if not find children with-end-tag [replace Dialect children children: join children with-end-tag
] if </td> != end-tag [attempt [return-parent-width children ]]]
]
]
P?: UL?: inP?: none
in?: [any "<div" | </body>]
parse Dialect [some[
to "<div" copy bad-node-element thru ">"
copy children in?
(if none != children [replace Dialect bad-node-element ""])
]skip
]
parse Dialect [some[
to "<div" copy in-node-element thru ">"
copy children [thru </div> | to "<div" | to </body>]
(validate-or-remove </div> end-tag: </td>)
]skip
]
in-node?: []
in-node?: [ "<table" | "</table" | "</body"]
parse/all Dialect [any[
[to "<table" copy in-node-element thru ">"
copy children to "<table"
(validate-or-remove end-tag: </td>)
]|
[to "<table" copy in-node-element thru ">"
copy children thru </table>
(validate-or-remove end-tag: </table>)
]
]skip
]
parse/all Dialect [some[to
"<table" copy bad-node-element thru ">"
copy children any in-node?
(if none != children [replace Dialect bad-node-element ""])
]skip
]
insert replace in?: copy in-parent_elem-type! [| "<ul" | "<li"] [] 'to
parse/all Dialect [some[
to "<ul" copy in-node-element thru ">"
copy children [thru "</ul>" | to "<ul" | in? | to "<br" | to "</body>"]
(validate-or-remove </ul> end-tag: </td>)
]skip
]
parse/all Dialect [some[to
"<tr" thru ">"
copy children thru "</td>" copy ending to "<tr"
(append children ending validate-or-remove end-tag: </tr>)
]skip
]
in-node?: [] append append insert in-node? in-parent_elem-type! [| "<h" | "</" |] out-parent_elem-type!
in?: [] append append insert in? [to] in-node? [| "<fieldset"] replace/all in? [|] [| to]
replace/all Dialect "<p><p" "<p"
parse/all Dialect [some[to
"<p" copy bad-node-element thru ">"
copy invalid-node [any in-node?]
(if invalid-node [replace Dialect bad-node-element ""])
]skip
]
parse Dialect [some[to
"<p" copy in-node-element thru ">"
copy children to "<p"
(validate-or-remove end-tag: </td>)
]skip
]
parse Dialect [some[to
"<p" copy in-node-element thru ">"
copy children thru </p>
(validate-or-remove end-tag: </p>)
]skip
]
parse/all Dialect [any[to
"<li " copy in-node-element thru ">"
copy children thru "</li>"
(validate-or-remove end-tag: </li>)
]skip
]
parse/all Dialect [some[to
"<li" copy in-node-element thru ">"
copy children [thru "</li>" | "<li>" |"</UL>"]
(validate-or-remove end-tag: </li>)
]skip
]
parse/all Dialect [any[
[to "<td" copy bad-node-element thru ">"
copy children any ["</" | "<td" | "<table" | "<div"]
(if none != children [replace Dialect bad-node-element ""])
]|
[to "<td" copy in-node-element thru ">"
copy children to "<td"
(replace children "<br" "<span" validate-or-remove end-tag: </td>)
]|
["<td" copy in-node-element thru ">"
copy children [thru "</td>" | [any "</tr" | "<tr" | "<table"]]
(replace children "<br" "<span" validate-or-remove end-tag: </td>)
]
]skip
]
{parse/all Dialect [some[to
"<a " copy element thru ">"
(this: copy element
foreach [a b][
"?" {" } "-" "_" "=" {="} "&" { " } "+" "_" "%25" "_" ">" {">} {" ">} {">} {""} {"}][replace/all this a b
]
replace Dialect element this)
]skip
]}
]
make-face-obj: func [][
self: mold to set-word! to string! reduce [last-node: copy node-name select-this tag-token: to word! node-name]
face-obj: reduce first skip find tag-tokens tag-token 2
slf: to word! first slf: parse self ":"
foreach style-request [font-style? border?][attempt [do style-request]]
]
get-size: func [this.width][in-size: none this.width: form this.width
*y: 20 attempt [*y: face-x/y]
attempt [parent-x: face-x/x]
attempt [parent-y: face-x/y]
hr-x: any [attempt[hr-xy/x]hr-xy]
parse this.width [[(unit-type: "none") to #"%" (unit-type: "%") | to "px"
(unit-type: "px") | to "pt" (unit-type: "pt")]to end]
if error? try [to-integer replace this.width unit-type ""][this.width: 0 unit-type: "none"]
switch unit-type [
"%" [replace in-size: parse this.width "%" "" []
if empty? in-size [in-size: to-block mold form length? value=]
either 1 = length? in-size/1 [insert in-size/1 ".0" percent-size: to-decimal load in-size/1
][insert in-size/1 "." percent-size: to-decimal load in-size/1]
this.width: as-pair to-integer percent-size * either find/any ["button" "submit"] node-name [
any [parent-x string-size? value=]][any [600 - 10]] *y]
"px" [replace/all in-size: parse this.width "px" "" [] this.width: attempt [to-integer in-size/1]]
"pt" [replace/all in-size: parse this.width "pt" "" [] this.width: attempt [to-integer in-size/1]]
"none" [if in-size: attempt [to-integer this.width] [this.width: in-size]]
]
]
get-attributes: func [element-node][
in-node-element: node-element: element-node
quote-node-attributes
create-tag-element with-these-attributes
markup-hexcolors styles: next node: to-block child: data-node
if all [use-methods not find child "." ][use-attr-as-methods yes]
slf: to-word any [slf* node/1]
bkclr: any [bkclr bkclr: bgcolor= any [select styles 'background-color= "#ffffff"]]
attempt [get-image styles/background-image= imgurl: img-url]
bgclr: bgcolor= any [select styles 'bgcolor= select styles '.bgcolor=]
txt-clr: any [ color= select styles 'text= txt-clr 0.0.0]
clr: color= any [select styles '.color= select styles 'color= ]
value=: form mold any [select styles 'value= ""]
either parent-sz [parent-sz][parent-sz: as-pair 10 / string-size? value= 0]
size=: hr-xy: any [get-size select styles 'size= 99.2]
border=: attempt [styles/border=]
font-size=: any [get-size select styles 'font-size= ]
font-style=: any [select styles 'font-style= ]
either 0 != size= [size= ][size=: none]
valign=: any [select styles 'valign= ""]
width=: any [get-size select styles 'width= 0]
height=: any [get-size select styles 'height= 20]
either not find reduce [width= height=] 0 [face-x: as-pair width= height= ][
either 0 != width= [face-x: width=][face-x: width=: height=: none]]
alt=: any [select styles 'alt= ""]
onclick=: any [attempt [to-word select styles 'onclick= ]]
get-image select styles 'src= styles: head styles
]
set-attributes: does [
either empty? styles [
=: :equal? get-attributes node-element
foreach [attr attrv] next styles [(attempt [do load replace form attr "=" "?"])]
do face-styles show page clear face-styles
][
parse styles [some[ to word! attr: to string! (attempt [do load replace form copy attr "=" "?"])]skip]
]
replace/all face-styles "node-elementjoin" ""
do face-styles show page clear face-styles =: :equal?
]
get-colors: does [
clr: any [clr f_clr i_clr b_clr div_clr p_clr td_clr tr_clr tb_clr li_clr ul_clr txt-clr]
bgclr: any [bgclr f_bgclr i_bgclr b_bgclr div_bgclr p_bgclr td_bgclr tr_bgclr tb_bgclr li_bgclr ul_bgclr bkclr]
]
clear-colors: does [
div_clr: p_clr: tb_clr: tr_clr: td_clr: ul_clr: li_clr: f_clr: b_clr: i_clr: clr: none
div_bgclr: p_bgclr: tb_bgclr: tr_bgclr: td_bgclr: ul_bgclr: li_bgclr: f_bgclr: b_bgclr: i_bgclr: bgclr: none
remove-font remove-style
]
get-input-type: func [in-form-element][
if "button" = node-name [node-name: 'btn]
if "input" = node-name [node-name: first to block! node-type: find/match in-form-element {input type=}]
if "" = node-name [node-name: "input"]
node-name: form any [node-name "input"]
]
to-font: func [style?][
insert fnt-styles style?
]
get-fnt-styles: func [][either not empty? fnt-styles [fnt-style: trim/all form sort unique fnt-styles][fnt-style: "font_"]
replace main "#font" fnt-style
]
string-size?: func [txt-string][text-face: layout/tight [text txt-string] face-x: text-face/size/x ]
get-string-size: func [txt-string][txt-string: form txt-string
any [attempt [face-x: face-x/x] face-x face-x: none]
any [
if "b." = fnt-style [text-face: layout/tight [text txt-string bold font-size 16]
either face-x [replace main "#string-size" as-pair face-x 20][
replace main "#string-size" as-pair text-face/size/x - 18 20 text-face: ""]
]
if "i." = fnt-style [text-face: layout/tight [text txt-string italic font-size 16]
either face-x [replace main "#string-size" as-pair face-x 20][
replace main "#string-size" as-pair text-face/size/x - 18 20 text-face: ""]
]
if "u." = fnt-style [text-face: layout/tight [text txt-string underline font-size 16 ]
either face-x [replace main "#string-size" as-pair face-x 20][
replace main "#string-size" as-pair text-face/size/x - 18 20 text-face: ""]
]
if "i.u." = fnt-style [text-face: layout/tight [text txt-string italic underline font-size 16]
i./valign: 'top
either face-x [replace main "#string-size" as-pair face-x 20][
replace main "#string-size" as-pair text-face/size/x - 18 20 text-face: ""]
]
if "b.i." = fnt-style [text-face: layout/tight [text txt-string bold italic font-size 16 ]
b.i./valign: 'top
either face-x [replace main "#string-size" as-pair face-x 20][
replace main "#string-size" as-pair text-face/size/x - 18 20 text-face: ""]
]
if "b.u." = fnt-style [text-face: layout/tight [text txt-string bold underline font-size 16 ]
b.i./valign: 'top
either face-x [replace main "#string-size" as-pair face-x 20][
replace main "#string-size" as-pair text-face/size/x - 18 20 text-face: ""]
]
if "b.i.u." = fnt-style [text-face: layout/tight [text txt-string bold italic underline font-size 16]
b.i./valign: 'top
either face-x [replace main "#string-size" as-pair face-x 20][
replace main "#string-size" as-pair text-face/size/x - 18 20 text-face: ""]
]
]
any [attempt [face-x: face-x/x] face-x face-x: none]
if find main "#string-size" [text-face: layout/tight [text txt-string font-size 16]
replace main "#string-size" as-pair text-face/size/x - 12 20 text-face: ""]
face-x: text-face: none
]
remove-style: does [
border=: parent-sz: width=: height=: div-x: para-x: font-size=: face-x: none bgclr: any [i_bgclr b_bgclr li_bgclr ul_bgclr td_bgclr tr_bgclr tb_bgclr p_bgclr div_bgclr bkclr]
clr: any [b_clr i_clr li_clr ul_clr td_clr tr_clr tb_clr p_clr div_clr txt-clr]replace main "#text" ""
]
remove-font: func [style?][
replace/all fnt-styles style? []
]
url-address: "http://www.rebol.com"
get-image: func [img-src] [the.image: ""
img-src: any [img-src img-src: "image"]
switch img-src/1 [
#"h" [replace img-src "p/" "p:/" the.image: to string! reduce img-src]
#"/" [either img-src/2 = #"/" [the.image: to string! reduce ["http:" img-src]][the.image: to string! reduce [url-address img-src]]]
#"w" [the.image: to string! reduce ["http://" img-src]]
#"%" [the.image: to-file img-src ]
]
image-type: [".png" ".jpg" ".gif"]
either find the.image any image-type [img-url: load the.image] [img-url: the.image]
]
font_: make face/font [style: [] size: 16]
b.: make face/font [style: 'bold size: 16 align: 'center]
i.: make face/font [style: 'italic size: 16 align: 'center]
u.: make face/font [style: 'underline size: 16 valign: "top"]
b.i.u.: make face/font [style: [bold italic underline] size: 16 align: 'center valign: "top"]
b.i.: make face/font [style: [bold italic] size: 16 align: 'center]
b.u.: make face/font [style: [bold underline] size: 16 align: 'center valign: "top"]
i.u.: make face/font [style: [italic underline] size: 16 align: 'center valign: "top"]
back.: make face/font [ size: 25 align: 'top valign: 'top color: silver]
in-parent_elem-type!: make hash! ["<div" | "<p" | "<table" | "<ul" | "<li" | "<td" | "<area"]
out-parent_elem-type!: make hash! ["</div" | "</p" | "</table" | "</ul" | "</li" | "</td" | "</area"]
in-style_elem-type!: make hash! ["body" "tbody" "h1" "h2" "h3" "h4" "h5" "h6" "strong" "br" "span" "tr" "a" "font" "b" "i" "newline" "option"]
out-style_elem-type!: make hash! ["/h1" "/h2" "/h3" "/h4" "/h5" "/h6" "/strong" "/body" "/tbody" "/span" "/tr" "/a" "/font" "/b" "/i"]
input_elem-type!: make hash! ["button" | "input" | "img" | "hr" | "select"]
as-block_elem-type!: make hash! [ "address" "article" "aside" "blockquote" "canvas" "dd" "div" "dl" "dt"
"fieldset" "figcaption" "figure" "footer" "form" "h1" "h2" "h3" "h4" "h5" "h6"
"header" "hr" "li" "main" "nav" "noscript" "ol" "p" "pre" "section"
"table" "tfoot" "ul" "video"]
input-as: func [DSL Dialect][
;replace/all Dialect #"^/" ""
replace/all Dialect { <} "<"
replace/all Dialect {> } ">"
switch DSL [html [markup-DOM Dialect parse-html markup layout-html markup
Dialect: none replace html-markup? "}" "}]"
markup-DOM load join "[" html-markup?] clear html-markup?
]
]
update: does [
html/text: "http://www.rebol.com"
url-address: url: ""
main: ""
url-type: ["com" "net" "org"]
foreach url.type url-type [
if find html/text url.type [
parse/all html/text [to "h" copy url-address thru url.type ]]
]
divs: prg: tbl: td: hd: lst: ul: spn: fnt:
img: hrl: fld: btn: txt-btn: hdn: chk: rdo: 0
width=: txt-sz: x-size: 0x0
doc: dom: dialect: editor/text: window: img-url: node-name: page/pane: none
clear main
clear face-styles
clear-colors
view/new view-port
input-as 'html markup
replace/all main "none" ""
replace/all main "font #font" " "
window: load main
doc: ""
doc: layout/offset/size window 0x0 800x2000 attempt [clear do face-styles]
page/pane: doc page/pane/size/x: 1000
update-panel page s1 s2
page/color: bkclr show page
editor/text: markup show editor
{pagetitle: getnodename "title"
either find histobj pagetitle [][
append histobj reduce [pagetitle url]
]
}
]
layout-html: func [Dialect][
markup-DTD Dialect
replace/all in-html-markup: to-hash load/markup trim/lines Dialect [" "] []
foreach data-node in-html-markup [of-data-node: data-node
if string! = type? of-data-node [
foreach [old new]["," "_." ";" "._" ][replace/all data-node old new]
text-node: mold form trim data-node bgclr: clr: none
foreach part-of-node node: parse/all of-data-node " " [
either none = attempt [load part-of-node][append html-markup? to-word rejoin ["<" part-of-node ">"]
][append html-markup? rejoin [" " part-of-node " "]]
]
foreach [old new]["_." "," "._" ";" ][replace/all text-node old new]
get-colors
either true = in-parent? [
either find main "#text" [
replace main "#text" text-node replace replace main "#bgclr" bgclr "#clr" clr
get-fnt-styles gt-str-sz: get-string-size text-node
][
append main reduce [" space 0 box " bgclr " " "#string-size effect[draw[pen " clr " font #font text " text-node "]] "]
face-x: none get-fnt-styles get-string-size text-node text-node: none
]
][
if find main "#text" [replace main "#text" reduce [" " text-node " "]
get-fnt-styles get-string-size text-node text-node: none
]
if all [text-node fnt-styles] [append main reduce [" box " bgclr " " "#string-size effect[draw[pen " clr " font #font text " text-node "]] "]
get-fnt-styles get-string-size text-node text-node: none
]
if text-node [append main reduce [" " text-node " font-size 16 " clr " " bgclr " "]]
replace/all replace/all main "#bgclr" bgclr "#clr" clr
face-x: text-node: node: none
]
]
out-parent?: []
out-style?: []
html-markup?: {}
close-parent: func [][close-parent: reduce first skip find tag-tokens end-tag-token? 2
insert tail main close-parent ]
make-dom-element: does [append html-markup? reduce [" "
mold to-set-word node-name { [}]
if find data-node " " [
attributes: find data-node select data-node node-name
append html-markup? reduce [mold to-string attributes " "]
]
]
close-dom-element: does [append html-markup? reduce [mold end-tag-token? {] }]]
if tag! = type? of-data-node [
either (length? parse/all of-data-node " ") > 1 [
get-attributes of-data-node
get-colors][node-name: to string! data-node]
if find in-parent_elem-type! join "<" node-name [
make-dom-element
insert out-parent? to-refinement copy node-name
in-parent?: true make-face-obj
insert tail main reduce [" " self " panel [ pad 1 " face-obj " "]
]
]
if find input_elem-type! node-name [
make-dom-element
get-input-type of-data-node
{if found? this-parent: find/any [/p /li /ul] out-parent? [
close-parent
select-this end-tag-token?: this-parent
replace out-parent? first this-parent []
replace main "close." {] }
remove-style in-parent?: false
]}
in-parent?: false make-face-obj
insert tail main reduce [ 'space " " 12 " " self " " face-obj]
append html-markup? {] }
remove-style
token?: end-tag-token?: img-url: none
]
if find out-parent_elem-type! join "<" node-name [
in-parent?: false
clear fnt-styles
either find out-parent? end-tag-token?: load node-name [
close-dom-element
close-parent
select-this end-tag-token?
replace/all main "close." {] }
remove-style replace out-parent? end-tag-token? []
]["replace in-html-markup pick in-html-markup node []"]
if find as-block_elem-type! form end-tag-token? [insert tail main { below across }]
end-tag-token?: none
]
if find in-style_elem-type! node-name [
either any ["br" = node-name "newline" = node-name][][make-dom-element]
insert out-style? to-refinement node-name
select-this style-token?: to word! node-name
either find main "#font" [][
insert tail main reduce first skip find tag-tokens style-token? 2
]
replace replace out-style? /br [] /newline []
node-name: ""
]
if find out-style_elem-type! node-name [
in-style?: false
if find out-style? style-token?: load node-name [
select-this style-token?
insert tail main reduce first skip find tag-tokens style-token? 2
append html-markup? { ]}
replace out-style? style-token? []
style-token?: []
]
]
] ;replace html-markup? "}" "}]"
replace/all main "none" ""
clear in-html-markup of-data-node: none
]
document.getnodename: func [request][document. getnodename request]
document.: func [request-as][
DOM: head DOM use*=*to-set-values
any [
all [not empty? data-node equal? block! type? data-node] insert data-node: []
any [attempt [strip-obj-chars-from request-as none] request-as]]
any [equal? tag! type? node-element: data-node/1
attempt [node-element: build-tag to-block data-node/1]]
var .style: = node-element *![.style]
return node-element
]
.return-tag-node: func [node-name][DOM: head DOM
node: either equal? word! type? node-name [
either any [attempt [empty? node-element] equal? none node-element]
[select node-list form node-name][node-name]][node-name]
any [
all [equal? node none print rejoin [{node-name: (} node-name ") not in node-list."]]
equal? tag! type? node-element: node
attempt [node-element: data-node: build-tag
to-block strip-obj-chars-from form node none]
set 'node-element node]node-name: check node-element
return probe node-element
]
.style: []
equal?: :=
DOM: DSL: html: window: end-tag: ""
data-node: parent-node: node: none
.body: .hr: .p: .b: .i: .tr: .ul: .li: .area: .table: .td: .button: .input: .div: .font: .span: 0
node-obj: node-element: node-name: *name: use-methods: attr-name: attr-value: none
check: func [select-this][return pick parse trim strip-chars-from form select-this none " " 1]
elemt-chars: none
strip-chars-from: func [node-name elemt-chars][
foreach char elemt-chars: any [reduce elemt-chars
["<" ">" "{" "}" "(" ")" {"} "/" "." "[" "]" "," ":" ";" "," "=" "`"]
][
replace/all node-name char " "
]
]
obj-chars: none
strip-obj-chars-from: func [node-name obj-chars][
replace replace node-element "={" {="} ";}" {;"}
trim form node-name if equal? #"^"" node-name/1 [remove node-name]
foreach [-char +char] obj-chars: any [reduce obj-chars [#"^/" " "
" " " " {" , "} {" } {", "} {" } "," " " {" "} {" } {" : "} {: "}
{":"} {: "} {":} {:} { " } "" {"[["} {"[[" "} "{" "[" "}" "]" {""}
{"} { "} "" " : " ": " ":" " " { =} {=} {=} " " "'" "" "#" ""
"<" "" ">" "" "`" ""]
][
replace/all node-name -char +char
]
]
reappend: func [with this-data][append with to-block mold rejoin this-data]
getnodename: func [node-name][
DOM: head DOM =: :equal? slf*: data-node: [] node-element: none
either block! = type? node-name[.return-tag-node node-name][
node-name: to block! strip-chars-from form node-name none
count: any [attempt [count: pick find node-name integer! 1]1]
nodename: to-word join "." array-obj!: node-name/1
any [attempt [repeat ? count [data-node: first DOM: next node: find DOM nodename]]
all [print rejoin [{node-name: (} node-name/1 "." count ") not found."]count: 0]
]
slf*: join node-name/1 count
]
if " " = data-node [data-node: form first DOM: next DOM]
return either tag! = type? data-node/1 [node-element: data-node/1][node-element: data-node]
]
setnodename: func [old-name new-name][
any [equal? this-name: check old-name check node-element getnodename old-name]
any [equal? none not find node-element new-name try [
replace node-element to string! this-name new-name
replace data-node to-tag join "/" this-name to-tag join "/" new-name]
]
]
getattribute: func [attr-name][
attr-value: none
print any [all [attr-value: array-obj!(attr-name)
[attr-name " " attr-value]
]["attribute: " attr-name " not found"]
]
]
setattribute: func [attr-name new-attr][
*key: *value: none .style: array-obj!:
|: func [key] do compose/deep [body-of (to-get-word variable)]
any [
all [.style(attr-name) *value: *key `= (new-attr)]
| [reappend [" " new-attr{="undefined"}]]
print ["Must get a parent-node with this attribute: " attr-name]]
get-attributes node-element attempt [set-attributes]
]
setattributevalue: func [attr-name attr-value][
*key: *value: none .style: array-obj!:
|: func [key] do compose/deep [body-of (to-get-word variable)]
any [
all [.style(attr-name) if *value [`= (attr-value)]]
| [reappend [" " attr-name{="}attr-value{"}]]
print ["Must get a parent-node with this attribute: " attr-name]
] get-attributes node-element attempt [set-attributes]
]
getElementByTagName: func [Tag-Name selection [block!]][
dom: head dom
repeat this count: first selection [
node-element: first data-node: first dom: next find dom to-word join "." Tag-Name]
if all [equal? true use-methods not find node-element " ."][use-attr-as-methods yes]
use-methods: off slf*: join Tag-name count
]
look-deep-for: func [this from-this-parent][
foreach child-tag!-node from-this-parent [
if all [tag! = type? child: child-tag!-node find/any child this][
insert data-node: [] node
node-element: child slf*: rejoin [slf* ":" *name: first parse node-element " "]]
if block! = type? node: child-tag!-node [look-deep-for this child-tag!-node]
]
]
getElementById: func [my-id][in-child-node: none count: 1
id: copy join "id*" slf*: form my-id =: :equal?
foreach in-parent-node dom [
if block! = type? node: in-parent-node [look-deep-for id in-parent-node
]]
]
querySelecter: func [css-Selecter][in-child-node: none count: 1
id: rejoin [slf*: css-Selecter "*"] =: :equal?
foreach in-parent-node dom [
if block! = type? node: in-parent-node [look-deep-for id in-parent-node
]]
]
.innerHTML: func [element][
children: copy/part next data-node find/last data-node tag!
either equal? tag! type? node-element [
any [all [empty? element children] replace data-node children element]
][print "The node-element has no innerHTML"]
]
use*=*to-set-values: does [=: func [value][any [value]]]
use-attr-as-methods: func [maybe [logic!]][
if no != maybe [strip-obj-chars-from node-element [{" } {" .} ".." "."]]
replace node-element " " " ."
use-methods: off
]
node-list: []
*!: func [new-var][append node-list reduce [
form new-var to-path compose/deep [node-list (length? node-list)]]
set to-set-word node-name set to-set-word form new-var :array-obj!
compose/deep [replace select body-of (:new-var) [variable:] new-var]()
]
;*!: func [new-var][set to-set-word node-name set to-set-word variable: form new-var :array-obj!]
proto-type: func [node-obj new-name][
old-name: check node-element
var replace copy head node-obj
old-name new-name
]
var: func [var-data][node-element: variable: "" .style: none
any [
attempt [variable: first parse node-element: var-data "=:, "]
attempt [if equal? block! type? var-data [variable: first node-element: var-data]]
attempt [variable: var-data node-element: ""]
]
use*=*to-set-values node-name: variable: to-string variable
replace node-element node-name nodename: first parse node-name form count
either empty? node-element [any [find node-list variable append node-list reduce
[variable node-element: any [attempt [do :variable] " "]]]]
[any [find node-list node-name append node-list reduce [form variable node-element]]]
set to-word variable array-obj!: func [key] compose/deep copy get-array-obj!
any [find variable "." set to-word trim/all reform [variable "."] :array-obj!]
use-methods: off ()
]
return.: func [value][
any [
attempt [*value: to-block value
foreach a *value [if not equal? word! type? a [do *value: a ]]]
attempt [*value: do form reduce load value]
]
]
insert-this: func [put-this at-here][do head insert here: find copy key at-here put-this]
.: func [value /local *val][either equal? block! type? *value [*val: copy *value
any [
if equal? integer! type? *key: first to-block value [
any [equal? 1 *key *key: *key + *key - 1]
attempt [do [value: select *value *key: pick *value *key *value: to-block value]]]
attempt [*value: first next *value: find *value value]
attempt [*value: head *value *value: next find *value value]
*value: *val]
][ do compose/deep reduce [*value [(load value)]]]
]
some: func [as-key][
foreach next-key as-key [
| next-key k: *key v: *value
either all [find node-element *key: any [next-key form next-key]
function! != type? *key
][print ["*key: " *key " *value: " *value ]
][]
]()
]
get-array-obj!: [
node-element: select node-list variable: (form variable)
|: :array-obj! strip-obj-chars-from node-element ["={" {="} ";}" {;"}]
attempt [all [inline: find/any node-element { style=*"}
replace node-element inline
replace/all replace replace inline {"} "{" {"} "}" " " ": "]]
if not find form node-element "1:" [all [(length? parse form node-element ":= ,") < 2
node-element: join {#1: } node-element]]
any [
if empty? form key [strip-obj-chars-from node-element ["={" {="} ";}" {;"}]
array-obj!: replace body-of :array-obj! select body-of :array-obj! [variable:] variable
|: array-obj!: func[key] array-obj!
return any [
if equal? tag! type? node-element [node-element]
attempt [trim find/tail copy head node-element first parse node-element " ,"]
node-element]*key: key: *value: value: none
]
if all [*key: first to-block key not find node-element rejoin [" " *key " "]
equal? integer! type? *key][
values: any [attempt [parse head node-element "<=;,`#: []>"]
load strip-obj-chars-from mold node-element none]
keys: length? replace/all values [""][]
if odd? length? values [remove values]
any [equal? 1 *key *key: *key + *key - 1]
*value: any [*value: select values *key: pick values *key *value ]
if *value [print ["*key:" *key " *value: " *value: *value ]]
node-name: keys: none
]
if equal? path! type? key[]
if equal? refinement! type? key[attempt [do replace/all form key "." "/."]]
if find ["url!" "email!" "tag!" "refinement!"] mold type? key [
attempt [key: to-string parse replace/all to-string key "." "/." "/"]
foreach [-char +char][":" ":." "@" ":" ".." "."][replace/all key -char +char]
replace/all from-method: parse key ".:" ":" []
*value: from-method/1
foreach key from-method [any [*value: | to-block key . to-block key]]
]
any [
attempt [*value: load select/case parse strip-obj-chars-from copy node-element none none
*key: trim head trim tail form key]
attempt [*value: select/case load strip-obj-chars-from mold to-block node-element none key]]
any [
attempt [do head append insert next copy key [node-element join] ""]
attempt [if equal? string! type? key [do head replace copy key " " { node-element }]]]
attempt [do load key] attempt [*get-methods key] attempt [do *get-expressions key none]
if not find node-element key [*key: *value: none print [key " not found in node sequence"]]]
]
rel-xprsn: to-hash [" " " " "*va" "-va" " ." "_$" "." " #" { = "} {:== "} {: "} ":::" " *" " set '" "};" {%>"} "] [" "]|["
"}}" "},}" "}," {%>"} "," " " ": " " 1 `= " ":::" {: "} {- "} {- ."} " = " " `= " " {" " .{"
" ${" { build-markup "<%} "* " "[] " "()" {("")} "==" " =" "function " "function '" "_$" " ."
"var " "var '" "-va" "*va" "= ." "= " ": ." ": " " #log" ".log" "&" ""]
*get-expressions: func[this expressions][
attempt [
find this: mold this "return 0"
strip-obj-chars-from this [{."} {"-} "1." "1-" "2." "2-" "3." "3-" "4." "4-" "5." "5-"
"6." "6-" "7." "7-" "8." "8-" "9." "9-" "0." "0-" "\." "~escp"]
strip-obj-chars-from this expressions: any [expressions rel-xprsn]
strip-obj-chars-from this [{"-} {."} "1-" "1." "2-" "2." "3-" "3." "4-" "4." "5-" "5."
"6-" "6." "7-" "7." "8-" "8." "9-" "9." "0-" "0." "~escp" "."]
all [
;| is exspressive, using Do won't eval sequence methods but is simpler and faster.
any [attempt [| reduce . this] do this]
]]
]
*get-methods: func[this][
attempt [
this: mold this
if not find this: next find this "." "return 0" [
| this: do strip-obj-chars-from head this [
"[" "" "]" "" "." "@" {"} "" "ame@" "ame join form '"
"ent@" "ent. " "&" { join " " } "=" "`="]]
]
]
`=: func[attr-value][
any [
attempt [replace node-element *value *value: do load form attr-value]
replace node-element form *value form *value: attr-value
replace node-element mold form *value mold *value: attr-value
attempt [*value: select node-element *key: load key]
] node-element: head node-element
]
node-element: *node-name: *name: array-obj!: key: *key: *value: ""
markup-DOM: func [Dialect][
use-methods: no
DOM: copy/deep load replace/all mold Dialect "__" " "
get-data: func [data][
end-tag: none
any [
if end-tag: find data refinement! [
end-tag/1: to-tag join "/" end-tag/1
]
if end-tag: find data get-word! [
end-tag/1: to-tag join "/" end-tag/1
]
insert tail data to-tag join "/" any [*name *node-name]
]
if string! != type? data/1 [insert data to-tag node-name]
repeat in-data data [
if set-word! = type? in-data [
replace data in-data node-name: to-word join "." *node-name: form in-data
]
if string! = type? in-data [
in-node-element: rejoin [remove form node-name " " in-data]
quote-node-attributes create-tag-element with-these-attributes
;foreach [a b][" " " ."][replace/all child a b]
replace data in-data data-node
]
if block! = type? in-data [get-next in-data]
]
]
get-next: func [in-data][
end-tag: none
any [
if end-tag: find in-data refinement! [
end-tag/1: to-tag join "/" end-tag/1
]
if end-tag: find in-data get-word! [
end-tag/1: to-tag join "/" end-tag/1
]
insert tail in-data to-tag join "/" any [*node-name *name]
]
if string! != type? in-data/1 [insert in-data to-tag node-name]
repeat data in-data [
if set-word! = type? data [
replace in-data data node-name: to-word join "." *name: form data
]
if string! = type? data [
in-node-element: rejoin [remove form node-name " " data]
quote-node-attributes create-tag-element with-these-attributes
;foreach [a b][" " " ."][replace/all child a b]
replace in-data data data-node
]
if block! = type? data [get-data data]
]
]
repeat with-this-data Dialect [
if issue! = type? with-this-data [
node-name: to-word join "." *name: copy form with-this-data
]
if set-word! = type? with-this-data [
replace Dialect with-this-data node-name: to-word join "." *name: copy form with-this-data
]
if word! = type? with-this-data [
either '= = with-this-data [string-is-data: yes replace Dialect with-this-data ""
][
*name: copy form with-this-data
replace Dialect with-this-data node-name: to-word join "." with-this-data]
replace Dialect reduce [node-name node-name] node-name
]
if string! = type? with-this-data [
either string-is-data [
replace Dialect with-this-data rejoin [node-name " " with-this-data]
][
created-data: copy with-this-data
strip-obj-chars-from created-data
insert created-data reduce [node-name " "]
child: build-tag to-block remove created-data
;foreach [a b][" " " ."][replace/all child a b]
replace Dialect with-this-data child
]
string-is-data: no
]
if block! = type? with-this-data [
get-data with-this-data
]
if get-word! = type? with-this-data [
replace Dialect with-this-data to-tag mold to-refinement *name
]
]
markup: form Dialect
foreach [-char +char]["{" "<" "}" ">" "<." "<" "_. " ","][replace/all markup -char +char]
foreach n-name [
".body " ".hr " ".p " ".b " ".i " ".? "
".tr " ".table " ".td " ".button " ".input "
".div " ".ul " ".li " ".font " ".span " ".hr "
".area " ".img " ".a " ".strong " " ."
][replace/all markup n-name " "
]
append replace/all markup </body> "" </body>
markup: any [find markup "<body" markup]
]
]
old-mrkp: none
view-port: layout [ID: bck: backdrop 241.241.241
across at 0x0
box black 805x40
pad -805x10
text 240x50 black "Click to load demo page" left font-size 12 241.241.241 effect [draw [pen black line-width 4.5
fill-pen 241.241.241 box -3x-2 240x50 7]][editor/text: any [old-mrkp markup]
show html markup: editor/text
clear face-styles
update
old-mrkp: copy markup
recycle/on recycle/off
] pad -250x30 box 700x50 241.241.241
below across
pad -4x-56
box 241.241.241 30x31 effect [draw[fill-pen 245.245.245 pen white circle 14x16 pen gray line-width 3 line 6x16 22x16 pen gray font back. text "<" 4x0]]
space 10
box 241.241.241 30x31 effect [draw[fill-pen 245.245.245 pen white circle 14x16 pen gray font back. text ">" 10x0 pen gray line-width 3 line 5x16 20x16]]
pad 0x6
Go: button "Go" white 30x24 [
txt-clr: none attempt [
case [
if find/match html/text "www" [insert html/text "http://" markup: read to-url html/text update]
if find/match html/text "http://" [markup: read to-url html/text update]
if find html/text {/rebol } [attempt [do html/text]]
;markup: mold any [attempt [load html/text] {<h6>404</h6>}]
]]
]
edge [size: 0x0 effect: 'none ]
html: field 500 edge [size: 1x1 color: blue ]
below
pad -20x28 box 805x1 gray /20 edge: ['none]
across pad -20x-10 page: box 241.241.241 edge[size: 0x0 effect: 'none ] 783x508
pad -10 s1: scroller 241.241.241 16x494 [attempt[scroll-panel-vert page s1]]
below pad -20x-24 s2: scroller 241.241.241 788x16 [attempt [scroll-panel-horz page s2]]
pad -10 editor: area white 805x130 wrap
pad 7
below across
pad -10x-10
btn "Up" 55 [if error? try [page/pane/offset/y: page/pane/offset/y + 100 show page
page/pane/offset/y: page/pane/offset/y - 2 show page][]]
btn "Down" 55 [if error? try [page/pane/offset/y: page/pane/offset/y - 100 show page
page/pane/offset/y: page/pane/offset/y + 1 show page][]]
btn "View code" 85 [markup: copy editor/text update
]
]
page/pane: ""
scroll-panel-vert: func [pnl bar][
pnl/pane/offset/y: negate bar/data *
(max 0 pnl/pane/size/y - pnl/size/y)
show pnl pnl/pane/size/y - 1 show pnl
]
scroll-panel-horz: func [pnl bar][
pnl/pane/offset/x: negate bar/data *
(max 0 pnl/pane/size/x - pnl/size/x)
show pnl
]
update-panel: func [pnl vbar hbar] [
pnl/pane/offset: 0x0
s1/data: s2/data: 0
vbar/redrag pnl/size/y / pnl/pane/size/y
hbar/redrag pnl/size/x / pnl/pane/size/x
show [pnl vbar hbar]
]
goo: does [get-attributes {p1 font-size "15" color "pink" bgcolor "blue"} set-attributes]
gogo: does [document.(getnodename{p.1}).style[color]`= "yellow" setattributevalue 'bgcolor "Mediumvioletred"]
view-port/size: 805x800
view center-face view-port Notes
|