wasm tools
This commit is contained in:
parent
c19893df11
commit
ed46142b44
104
wasm/wasm.go
Normal file
104
wasm/wasm.go
Normal file
|
@ -0,0 +1,104 @@
|
|||
package wasm
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"syscall/js"
|
||||
)
|
||||
|
||||
type Node struct {
|
||||
tag string
|
||||
id string
|
||||
attrs []*Attribute
|
||||
children []*Node
|
||||
jsElement js.Value
|
||||
innerText string
|
||||
}
|
||||
|
||||
type Attribute struct {
|
||||
Name string
|
||||
Value string
|
||||
}
|
||||
|
||||
func document(document js.Value) *Node {
|
||||
return &Node{jsElement: document}
|
||||
}
|
||||
|
||||
func (n *Node) createElement(document js.Value) {
|
||||
var el = document.Call("createElement", n.tag)
|
||||
el.Call("setAttribute", "id", n.id)
|
||||
for _, attr := range n.attrs {
|
||||
el.Call("setAttribute", attr.Name, attr.Value)
|
||||
}
|
||||
n.jsElement = el
|
||||
}
|
||||
|
||||
func (n *Node) AppendChild(child *Node) {
|
||||
if child.tag != "" {
|
||||
n.children = append(n.children, child)
|
||||
n.jsElement.Call("appendChild", child.jsElement)
|
||||
} else {
|
||||
n.jsElement.Set("innerText", child.innerText)
|
||||
}
|
||||
}
|
||||
|
||||
func (n *Node) GetChildren() []*Node {
|
||||
return n.children
|
||||
}
|
||||
|
||||
func (n *Node) ReplaceChildren(newChildren []*Node) {
|
||||
n.children = newChildren
|
||||
for {
|
||||
child := n.jsElement.Get("firstChild")
|
||||
if child.IsNull() {
|
||||
break
|
||||
}
|
||||
n.jsElement.Call("removeChild", child)
|
||||
}
|
||||
for _, child := range n.children {
|
||||
n.AppendChild(child)
|
||||
}
|
||||
}
|
||||
|
||||
type NodeFactory struct {
|
||||
document *Node
|
||||
idCounter int64
|
||||
root *Node
|
||||
}
|
||||
|
||||
func NewNodeFactory(jsDocument js.Value) *NodeFactory {
|
||||
var f = &NodeFactory{document: document(jsDocument), idCounter: 0}
|
||||
f.setRoot()
|
||||
return f
|
||||
}
|
||||
|
||||
func (f *NodeFactory) setRoot() {
|
||||
var rootElement = f.document.jsElement.Get("firstElementChild")
|
||||
if rootElement.IsNull() {
|
||||
f.root = f.NewNode("html")
|
||||
} else {
|
||||
f.root = &Node{tag: "html", jsElement: rootElement}
|
||||
f.document.AppendChild(f.root)
|
||||
}
|
||||
}
|
||||
|
||||
func (f *NodeFactory) Root() *Node {
|
||||
return f.root
|
||||
}
|
||||
|
||||
func (f *NodeFactory) NewBody() *Node {
|
||||
var body = f.NewNode("body")
|
||||
f.root.AppendChild(body)
|
||||
return body
|
||||
}
|
||||
|
||||
func (f *NodeFactory) NewNode(tag string, attributes ...*Attribute) *Node {
|
||||
var id = f.idCounter
|
||||
f.idCounter++
|
||||
var n = &Node{tag: tag, id: strconv.FormatInt(id, 10), attrs: attributes}
|
||||
n.createElement(f.document.jsElement)
|
||||
return n
|
||||
}
|
||||
|
||||
func (f *NodeFactory) NewTextNode(text string) *Node {
|
||||
return &Node{innerText: text}
|
||||
}
|
Loading…
Reference in New Issue
Block a user