Source code for ll.xist.ns.jsp

# -*- coding: utf-8 -*-
# cython: language_level=3, always_allow_keywords=True

## Copyright 1999-2024 by LivingLogic AG, Bayreuth/Germany
## Copyright 1999-2024 by Walter Dörwald
##
## All Rights Reserved
##
## See ll/xist/__init__.py for the license


"""
A module that allows you to embed JSP content as processing instructions.
"""


from ll import misc
from ll.xist import xsc, sims


__docformat__ = "reStructuredText"


xmlns = "http://java.sun.com/JSP/Page"


class directive(xsc.Element):
	model = sims.Empty()
	register = False # only serves as a base class

	def publish(self, publisher):
		yield publisher.encode("<%@ ")
		yield publisher.encode(self._publishname(publisher))
		yield from self.attrs.publish(publisher)
		yield publisher.encode("%>")


[docs] class scriptlet(xsc.ProcInst): """ Will be published as ``<% content %>``. """ def publish(self, publisher): yield publisher.encode("<% ") yield publisher.encode(self.content) yield publisher.encode(" %>")
[docs] class expression(xsc.ProcInst): """ Will be published as ``<%= content %>``. """ def publish(self, publisher): yield publisher.encode("<%= ") yield publisher.encode(self.content) yield publisher.encode(" %>")
[docs] class declaration(xsc.ProcInst): """ Will be published as ``<%! content %>``. """ def publish(self, publisher): yield publisher.encode("<%! ") yield publisher.encode(self.content) yield publisher.encode(" %>")
class If(scriptlet): xmlname = "if" prettyindentbefore = 0 prettyindentafter = 1 def convert(self, converter): return scriptlet("if(", self.content, "){") class Else(scriptlet): xmlname = "else" prettyindentbefore = -1 prettyindentafter = 1 def convert(self, converter): return scriptlet("}else{") class ElIf(scriptlet): xmlname = "elif" prettyindentbefore = -1 prettyindentafter = 1 def convert(self, converter): return scriptlet("}else if (", self.content, "){") class End(scriptlet): xmlname = "end" prettyindentbefore = -1 prettyindentafter = 0 def convert(self, converter): return scriptlet("}")
[docs] class block(xsc.Element): """ This element embeds its content in ``{}`` brackets. Note that the content itself will not be turned into a scriptlet automatically but will be used as-is. """ model = sims.Any() def convert(self, converter): e = xsc.Frag( scriptlet("{"), self.content, scriptlet("}") ) return e.convert(converter)
class directive_include(directive): xmlname = "include" class Attrs(directive.Attrs): class file(xsc.TextAttr): pass class directive_taglib(directive): xmlname = "taglib" class Attrs(directive.Attrs): class uri(xsc.TextAttr): pass class prefix(xsc.TextAttr): pass class directive_page(directive): xmlname = "page" class Attrs(directive.Attrs): class language(xsc.TextAttr): values = ("java",) class extends(xsc.TextAttr): pass class import_(xsc.TextAttr): xmlname = "import" class session(xsc.TextAttr): values = ("true", "false") class buffer(xsc.TextAttr): pass class autoFlush(xsc.TextAttr): values = ("true", "false") class isThreadSafe(xsc.TextAttr): values = ("true", "false") class info(xsc.TextAttr): pass class errorPage(xsc.URLAttr): pass class contentType(xsc.TextAttr): pass class isErrorPage(xsc.TextAttr): values = ("true", "false") class pageEncoding(xsc.TextAttr): pass def publish(self, publisher): # Only a contentType attribute triggers the special code if "contentType" in self.attrs and not self.attrs.contentType.isfancy() and not self.attrs.pageEncoding.isfancy(): (contenttype, options) = misc.parse_header(str(self.attrs.contentType)) pageencoding = str(self.attrs.pageEncoding) encoding = publisher.encoding if encoding is None: encoding = "utf-8" if "charset" not in options or not (options["charset"] == pageencoding == encoding): options["charset"] = encoding node = self.__class__( self.attrs, contentType=(contenttype, "; ", "; ".join(f"{name}={value}" for (name, value) in options.items())), pageEncoding=encoding ) return node.publish(publisher) # return a generator-iterator return super().publish(publisher) # return a generator-iterator
[docs] def fromul4(template, variables="variables", indent=0): """ Return the UL4 template ``template`` as JSP source code. ``variables`` is the variable name of the map object containing the top level variables. ``indent`` is the initial indentation of the source code. The code produced requires the `UL4 Java package`__. __ https://github.com/LivingLogic/LivingLogic.Java.ul4 """ return scriptlet(template.javasource(variables=variables, indent=indent))