An HTML page (or any XML file) can now contain any XML element.

This commit is contained in:
eraviart 2004-06-26 08:10:00 +00:00
parent 9fbe86c249
commit 622ba4da36
3 changed files with 48 additions and 28 deletions

View File

@ -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

View File

@ -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)

View File

@ -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(