###
# Modern Albufeira Prolog Interpreter
#
# Warranty & Liability
# To the extent permitted by applicable law and unless explicitly
# otherwise agreed upon, XLOG Technologies AG makes no warranties
# regarding the provided information. XLOG Technologies AG assumes
# no liability that any problems might be solved with the information
# provided by XLOG Technologies AG.
#
# Rights & License
# All industrial property rights regarding the information - copyright
# and patent rights in particular - are the sole property of XLOG
# Technologies AG. If the company was not the originator of some
# excerpts, XLOG Technologies AG has at least obtained the right to
# reproduce, change and translate the information.
#
# Reproduction is restricted to the whole unaltered document. Reproduction
# of the information is only allowed for non-commercial uses. Selling,
# giving away or letting of the execution of the library is prohibited.
# The library can be distributed as part of your applications and libraries
# for execution provided this comment remains unchanged.
#
# Restrictions
# Only to be distributed with programs that add significant and primary
# functionality to the library. Not to be distributed with additional
# software intended to replace any components of the library.
#
# Trademarks
# Jekejeke is a registered trademark of XLOG Technologies AG.
##

from nova.core import (exec_build, check_sink, Sink, add,
     make_check, stream_close,
     exec_unify, put_atom, stream_flush)
from doglet.text.auxlib import (xml_escape)


#######################################################################
# Sink API                                                            #
#######################################################################

###
# ir_is_sink(O):
# The predicate succeeds if O is a sink.
##
def test_ir_is_sink(args):
    obj = exec_build(args[0])
    return isinstance(obj, Sink)


#######################################################################
# DOM Machine                                                         #
#######################################################################

###
# ir_is_element(O):
# The predicate succeeds if O is a DOM element.
##
def test_ir_is_element(args):
    return False


#######################################################################
# Markup Streams                                                      #
#######################################################################

###
# dom_output_new(S, W):
# The predicate succeeds in W with a new markup writer to the stream S.
##
def test_dom_output_new(args):
    obj = exec_build(args[0])
    check_sink(obj)
    dst = Sink()
    dst.data = obj
    dst.send = xml_send
    dst.notify = stream_flush
    dst.release = stream_close
    dst.buf = None
    return exec_unify(args[1], dst)


def xml_send(data, buf):
    text = xml_escape(buf)
    put_atom(data, text)
    return data


#######################################################################
# Dom Lib Init                                                        #
#######################################################################

def main():
    add("ir_is_sink", 1, make_check(test_ir_is_sink))
    add("ir_is_element", 1, make_check(test_ir_is_element))
    add("dom_output_new", 2, make_check(test_dom_output_new))
