Current section
Files
Jump to
Current section
Files
lib/libxml.ex
defmodule Libxml do
def read_memory(contents) do
{:ok, pointer} = Libxml.Nif.xml_read_memory(contents)
%Libxml.Node{pointer: pointer}
end
def free_doc(%Libxml.Node{pointer: pointer}) do
Libxml.Nif.xml_free_doc(pointer)
end
def safe_read_memory(contents, fun) do
{:ok, pointer} = Libxml.Nif.xml_read_memory(contents)
doc = %Libxml.Node{pointer: pointer}
try do
fun.(doc)
after
free_doc(doc)
end
end
def copy_doc(%Libxml.Node{pointer: pointer}, recursive) do
recursive_value = if recursive, do: 1, else: 0
{:ok, pointer} = Libxml.Nif.xml_copy_doc(pointer, recursive_value)
%Libxml.Node{pointer: pointer}
end
def safe_copy_doc(doc, recursive, fun) do
doc = copy_doc(doc, recursive)
try do
fun.(doc)
after
free_doc(doc)
end
end
def copy_node(%Libxml.Node{pointer: pointer}, extended) do
extended_value = case extended do
:shallow -> 0
# if 1 do a recursive copy (properties, namespaces and children when applicable)
:recursive -> 1
# if 2 copy properties and namespaces (when applicable)
:partial -> 2
end
{:ok, pointer} = Libxml.Nif.xml_copy_node(pointer, extended_value)
%Libxml.Node{pointer: pointer}
end
def safe_copy_node(node, extended, fun) do
node = copy_node(node, extended)
try do
fun.(node)
after
free_node(node)
end
end
def doc_copy_node(%Libxml.Node{pointer: node_pointer}, %Libxml.Node{pointer: doc_pointer}, extended) do
extended_value = case extended do
:shallow -> 0
# if 1 do a recursive copy (properties, namespaces and children when applicable)
:recursive -> 1
# if 2 copy properties and namespaces (when applicable)
:partial -> 2
end
{:ok, pointer} = Libxml.Nif.xml_doc_copy_node(node_pointer, doc_pointer, extended_value)
%Libxml.Node{pointer: pointer}
end
def safe_doc_copy_node(node, doc, extended, fun) do
node = doc_copy_node(node, doc, extended)
try do
fun.(node)
after
free_node(node)
end
end
def doc_get_root_element(%Libxml.Node{pointer: doc_pointer}) do
{:ok, pointer} = Libxml.Nif.xml_doc_get_root_element(doc_pointer)
Libxml.Util.ptr_to_type(Libxml.Node, pointer)
end
def doc_set_root_element(%Libxml.Node{pointer: doc_pointer}, %Libxml.Node{pointer: node_pointer}) do
{:ok, pointer} = Libxml.Nif.xml_doc_set_root_element(doc_pointer, node_pointer)
Libxml.Util.ptr_to_type(Libxml.Node, pointer)
end
def new_ns(%Libxml.Node{pointer: pointer}, href, prefix) do
{:ok, pointer} = Libxml.Nif.xml_new_ns(pointer, href, prefix)
%Libxml.Ns{pointer: pointer}
end
def unlink_node(%Libxml.Node{pointer: pointer}) do
Libxml.Nif.xml_unlink_node(pointer)
end
def free_node(%Libxml.Node{pointer: pointer}) do
Libxml.Nif.xml_free_node(pointer)
end
def free_node_list(%Libxml.Node{pointer: pointer}) do
Libxml.Nif.xml_free_node_list(pointer)
end
end