An HTML page (or any XML file) can now contain any XML element.
This commit is contained in:
parent
9fbe86c249
commit
622ba4da36
|
@ -108,9 +108,11 @@ class code(InlineLevelElement):
|
|||
|
||||
class h(BlockLevelElement):
|
||||
def generateXmlContextElement(self, context, layout):
|
||||
newElementClass = modules.getElementClass(
|
||||
self.getNamespaceUri(), "h%d" % context.sectionLevel)
|
||||
newElement = newElementClass(owner = None)
|
||||
namespacePrefix = self.getNamespacePrefix()
|
||||
namespaceUri = self.getNamespaceUri()
|
||||
name = "h%d" % context.sectionLevel
|
||||
newElementClass = modules.getElementClass(namespaceUri, name)
|
||||
newElement = newElementClass(node = (namespacePrefix, namespaceUri, name), owner = None)
|
||||
layout.append(newElement)
|
||||
return newElement
|
||||
|
||||
|
@ -147,8 +149,11 @@ class p(BlockLevelElement):
|
|||
|
||||
class section(BlockLevelElement):
|
||||
def generateXmlContextElement(self, context, layout):
|
||||
newElementClass = modules.getElementClass(self.getNamespaceUri(), "div")
|
||||
newElement = newElementClass(owner = None)
|
||||
namespacePrefix = self.getNamespacePrefix()
|
||||
namespaceUri = self.getNamespaceUri()
|
||||
name = "div"
|
||||
newElementClass = modules.getElementClass(namespaceUri, name)
|
||||
newElement = newElementClass(node = (namespacePrefix, namespaceUri, name), owner = None)
|
||||
newElement.node.newProp("class", "section-h%s" % context.sectionLevel)
|
||||
layout.append(newElement)
|
||||
return newElement
|
||||
|
|
|
@ -48,7 +48,6 @@ import xpaths
|
|||
|
||||
class Element(stations.AbstractStation, nodes.NodeWrapper):
|
||||
_description = None
|
||||
_namespaceUri = None
|
||||
_schema = None # Cache for XML schema
|
||||
dummyNodes = None
|
||||
# The nodes containing the namespace definitions managed by this
|
||||
|
@ -78,9 +77,15 @@ class Element(stations.AbstractStation, nodes.NodeWrapper):
|
|||
if node is None:
|
||||
namespaceUri, name = modules.getElementClassNamespaceUriAndName(self.__class__)
|
||||
assert name, "Node %s in namespace URI %s has no name." % (self, namespaceUri)
|
||||
self._namespaceUri = namespaceUri
|
||||
node = libxml2.newNode(name)
|
||||
node.setNs(self.newNamespace(namespaceUri))
|
||||
elif isinstance(node, (list, tuple)):
|
||||
assert len(node) == 3, "Wrong node triplet = %s" % (node)
|
||||
namespacePrefix = node[0]
|
||||
namespaceUri = node[1]
|
||||
name = node[2]
|
||||
node = libxml2.newNode(name)
|
||||
node.setNs(self.newNamespace(namespaceUri, namespacePrefix))
|
||||
else:
|
||||
assert node.type == "element", "Node %s of type %s is not an element." % (
|
||||
node, node.type)
|
||||
|
@ -218,8 +223,11 @@ class Element(stations.AbstractStation, nodes.NodeWrapper):
|
|||
return filled
|
||||
|
||||
def generateXmlContextElement(self, context, layout):
|
||||
newElementClass = modules.getElementClass(self.getNamespaceUri(), self.node.name)
|
||||
newElement = newElementClass(owner = None)
|
||||
namespacePrefix = self.getNamespacePrefix()
|
||||
namespaceUri = self.getNamespaceUri()
|
||||
name = self.node.name
|
||||
newElementClass = modules.getElementClass(namespaceUri, name)
|
||||
newElement = newElementClass(node = (namespacePrefix, namespaceUri, name), owner = None)
|
||||
layout.append(newElement)
|
||||
return newElement
|
||||
|
||||
|
@ -251,7 +259,7 @@ class Element(stations.AbstractStation, nodes.NodeWrapper):
|
|||
# Otherwise, look for a description declaration made by a Python module.
|
||||
if descriptionAbsolutePath is None:
|
||||
try:
|
||||
feature = modules.getElementFeature(self.namespaceUri, self.node.name)
|
||||
feature = modules.getElementFeature(self.getNamespaceUri(), self.node.name)
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
|
@ -282,16 +290,19 @@ class Element(stations.AbstractStation, nodes.NodeWrapper):
|
|||
else:
|
||||
return None
|
||||
|
||||
def getNamespacePrefix(self):
|
||||
try:
|
||||
return self.node.ns().name
|
||||
except libxml2.treeError:
|
||||
# The libxml2 Python binding raises this exception when xmlNs returns None.
|
||||
return None
|
||||
|
||||
def getNamespaceUri(self):
|
||||
if self._namespaceUri is None:
|
||||
try:
|
||||
namespaceUri = self.node.ns().content
|
||||
except libxml2.treeError:
|
||||
# The libxml2 Python binding raises this exception when xmlNs returns None.
|
||||
namespaceUri = None
|
||||
else:
|
||||
namespaceUri = self._namespaceUri
|
||||
return namespaceUri
|
||||
try:
|
||||
return self.node.ns().content
|
||||
except libxml2.treeError:
|
||||
# The libxml2 Python binding raises this exception when xmlNs returns None.
|
||||
return None
|
||||
|
||||
def getSchema(self):
|
||||
if self._schema is None:
|
||||
|
@ -308,7 +319,7 @@ class Element(stations.AbstractStation, nodes.NodeWrapper):
|
|||
# Otherwise, look for a schema declaration made by a Python module.
|
||||
if schemaAbsolutePath is None:
|
||||
try:
|
||||
feature = modules.getElementFeature(self.namespaceUri, self.node.name)
|
||||
feature = modules.getElementFeature(self.getNamespaceUri(), self.node.name)
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
|
@ -360,7 +371,7 @@ class Element(stations.AbstractStation, nodes.NodeWrapper):
|
|||
return rootElement
|
||||
newInTemporaryDocument = classmethod(newInTemporaryDocument)
|
||||
|
||||
def newNamespace(self, namespaceUri):
|
||||
def newNamespace(self, namespaceUri, namespacePrefix = None):
|
||||
# Create a dummy node whose only role is to contain the namespace used by the real node.
|
||||
# This dummy node is required, because it seems that it is not possible to remove a
|
||||
# namespace definition from a node. So we store the namespace definition in a dummy node.
|
||||
|
@ -373,7 +384,13 @@ class Element(stations.AbstractStation, nodes.NodeWrapper):
|
|||
if self.dummyNodes is None:
|
||||
self.dummyNodes = []
|
||||
self.dummyNodes.append(dummyNode)
|
||||
namespacePrefix = namespaces.getName(namespaceUri)
|
||||
# Try to replace namespacePrefix with the standard one.
|
||||
try:
|
||||
namespacePrefix = namespaces.getName(namespaceUri)
|
||||
except KeyError:
|
||||
# Keep previous namespacePrefix if it exists.
|
||||
if namespacePrefix is None:
|
||||
raise
|
||||
return dummyNode.newNs(namespaceUri, namespacePrefix)
|
||||
|
||||
def outputHttpSource(self):
|
||||
|
@ -507,7 +524,6 @@ class Element(stations.AbstractStation, nodes.NodeWrapper):
|
|||
return description.checkAccessAndWalk(uriPathFragments, command, instruction)
|
||||
|
||||
id = property(getId)
|
||||
namespaceUri = property(getNamespaceUri)
|
||||
schema = property(getSchema)
|
||||
source = property(getSource)
|
||||
type = property(getType)
|
||||
|
|
|
@ -42,7 +42,7 @@ class Element(elements.Element):
|
|||
|
||||
class WidgetElement(widgets.WidgetMixin, Element):
|
||||
def generateXmlContext(self, context, layout):
|
||||
pass
|
||||
return False
|
||||
|
||||
def generateHtmlContextControlAlert(self, context, layout):
|
||||
modelContext = self.getModelContext(context)
|
||||
|
@ -250,13 +250,11 @@ class Control(WidgetElement):
|
|||
context.formCreationNeeded = oldFormCreationNeeded
|
||||
context.inForm = False
|
||||
if filled:
|
||||
if not environs.getVar("canUseCookie") \
|
||||
or environs.getVar("testCookieSupport"):
|
||||
if not environs.getVar("canUseCookie") or environs.getVar("testCookieSupport"):
|
||||
session = environs.getVar("session")
|
||||
if session is not None and session.publishToken:
|
||||
form.append(html.input(
|
||||
name = "sessionToken", type = "hidden",
|
||||
value = session.token))
|
||||
name = "sessionToken", type = "hidden", value = session.token))
|
||||
layout.append(form)
|
||||
return filled
|
||||
else:
|
||||
|
@ -1093,6 +1091,7 @@ class Model(WidgetElement):
|
|||
|
||||
def generateXmlContext(self, context, layout):
|
||||
self.buildXformsContext(context)
|
||||
return False
|
||||
|
||||
def getInstanceNode(self, schemaNameWithNamespace):
|
||||
instanceNodes = self.evaluateXpath(
|
||||
|
|
Reference in New Issue