1.1 --- a/README.txt Sun Oct 12 19:28:30 2008 +0200
1.2 +++ b/README.txt Sun Oct 12 19:47:09 2008 +0200
1.3 @@ -51,7 +51,6 @@
1.4 libxslt 1.1.17 should be avoided
1.5
1.6 The example Web applications require WebStack (release 1.3 or later).
1.7 -The example PyQt applications have been tested with PyQt 3.15.
1.8
1.9 New in XSLTools 0.6 (Changes since XSLTools 0.5)
1.10 ------------------------------------------------
1.11 @@ -64,13 +63,15 @@
1.12 template design document, linking to the housekeeping annotations section
1.13 of the template attribute reference guide.
1.14 * Observed changes in WebStack 1.3 and introduced default_charset usage in
1.15 - the WebResources and PyQtWebResources modules.
1.16 + the WebResources module.
1.17 * Added experimental OpenID support; improved the authentication resources
1.18 and mechanisms.
1.19 * Fixed the LoginResource to work correctly when detecting the protected
1.20 application's location.
1.21 * NOTE: Need to add persistence for OpenID associations.
1.22 * Added XInclude support in templates (requires libxml2dom 0.4.6 or later).
1.23 + * Removed PyQt support since the advantages of designing user interfaces for
1.24 + the Web using Qt Designer are questionable.
1.25
1.26 New in XSLTools 0.5 (Changes since XSLTools 0.4.6)
1.27 --------------------------------------------------
2.1 --- a/XSLForms/Resources/PyQtCommon.py Sun Oct 12 19:28:30 2008 +0200
2.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2.3 @@ -1,82 +0,0 @@
2.4 -#!/usr/bin/env python
2.5 -
2.6 -"""
2.7 -Common resource class functionality for PyQt-related applications.
2.8 -
2.9 -Copyright (C) 2005 Paul Boddie <paul@boddie.org.uk>
2.10 -
2.11 -This program is free software; you can redistribute it and/or modify it under
2.12 -the terms of the GNU Lesser General Public License as published by the Free
2.13 -Software Foundation; either version 3 of the License, or (at your option) any
2.14 -later version.
2.15 -
2.16 -This program is distributed in the hope that it will be useful, but WITHOUT
2.17 -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
2.18 -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
2.19 -details.
2.20 -
2.21 -You should have received a copy of the GNU Lesser General Public License along
2.22 -with this program. If not, see <http://www.gnu.org/licenses/>.
2.23 -"""
2.24 -
2.25 -import os
2.26 -from XSLForms.Resources.Common import CommonResource
2.27 -
2.28 -class PyQtCommonResource(CommonResource):
2.29 -
2.30 - "Common PyQt-compatible resource methods."
2.31 -
2.32 - design_resources = {}
2.33 -
2.34 - def get_document(self, document_identifier):
2.35 -
2.36 - """
2.37 - Return a DOM-style document retrieved using the given
2.38 - 'document_identifier'.
2.39 -
2.40 - Each implementation is free to choose its own DOM library.
2.41 - """
2.42 -
2.43 - raise NotImplementedError, "get_document"
2.44 -
2.45 - def get_elements(self, document_identifier):
2.46 - doc = self.get_document(document_identifier)
2.47 -
2.48 - # NOTE: Using special suffix.
2.49 -
2.50 - return doc.getElementsByTagName(document_identifier + "-enum")
2.51 -
2.52 - def prepare_design(self, design_identifier):
2.53 - filename = self.design_resources[design_identifier]
2.54 - return os.path.abspath(os.path.join(self.resource_dir, filename))
2.55 -
2.56 - def populate_list(self, field, elements):
2.57 -
2.58 - "Populate the given 'field' using a list of DOM 'elements'."
2.59 -
2.60 - current_text = field.currentText()
2.61 - while field.count() > 0:
2.62 - field.removeItem(0)
2.63 - item = 0
2.64 - set = 0
2.65 - for element in elements:
2.66 - text = element.getAttribute("value")
2.67 - field.insertItem(text)
2.68 - if text == current_text:
2.69 - field.setCurrentItem(item)
2.70 - set = 1
2.71 - item += 1
2.72 - if not set:
2.73 - field.setCurrentItem(0)
2.74 -
2.75 - def reset_collection(self, field):
2.76 -
2.77 - "Empty the given collection 'field'."
2.78 -
2.79 - layout = field.layout()
2.80 - for child in field.children():
2.81 - if child is not layout:
2.82 - layout.remove(child)
2.83 - child.deleteLater()
2.84 -
2.85 -# vim: tabstop=4 expandtab shiftwidth=4
3.1 --- a/XSLForms/Resources/PyQtResources.py Sun Oct 12 19:28:30 2008 +0200
3.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
3.3 @@ -1,88 +0,0 @@
3.4 -#!/usr/bin/env python
3.5 -
3.6 -"""
3.7 -Resources for use with PyQt.
3.8 -
3.9 -Copyright (C) 2005 Paul Boddie <paul@boddie.org.uk>
3.10 -
3.11 -This program is free software; you can redistribute it and/or modify it under
3.12 -the terms of the GNU Lesser General Public License as published by the Free
3.13 -Software Foundation; either version 3 of the License, or (at your option) any
3.14 -later version.
3.15 -
3.16 -This program is distributed in the hope that it will be useful, but WITHOUT
3.17 -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
3.18 -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
3.19 -details.
3.20 -
3.21 -You should have received a copy of the GNU Lesser General Public License along
3.22 -with this program. If not, see <http://www.gnu.org/licenses/>.
3.23 -"""
3.24 -
3.25 -import XSLForms.Prepare
3.26 -import XSLForms.Resources.PyQtCommon
3.27 -import qt, qtui, qtxmldom
3.28 -import os
3.29 -
3.30 -class XSLFormsResource(XSLForms.Resources.PyQtCommon.PyQtCommonResource):
3.31 -
3.32 - "An XSLForms resource for use with PyQt."
3.33 -
3.34 - widget_resources = {}
3.35 -
3.36 - def __init__(self, design_identifier):
3.37 - self.factory = Factory(self.prepare_design(design_identifier))
3.38 -
3.39 - def get_document(self, document_identifier):
3.40 - return qtxmldom.parse(self.prepare_document(document_identifier))
3.41 -
3.42 - def prepare_widget(self, design_identifier, widget_identifier, parent=None):
3.43 - design_path = self.prepare_design(design_identifier)
3.44 - fragment_name, widget_name = self.widget_resources[widget_identifier]
3.45 - fragment_path = os.path.abspath(os.path.join(self.resource_dir, fragment_name))
3.46 - XSLForms.Prepare.ensure_qt_fragment(design_path, fragment_path, widget_name)
3.47 - return qtui.QWidgetFactory.create(fragment_path, None, parent)
3.48 -
3.49 - def request_refresh(self, *kw, **args):
3.50 - self.form_refresh(*kw, **args)
3.51 -
3.52 -class Factory:
3.53 -
3.54 - "A widget factory helper class."
3.55 -
3.56 - def __init__(self, ui_filename):
3.57 - self.ui_filename = ui_filename
3.58 - self.ui_doc = qtxmldom.parse(ui_filename)
3.59 -
3.60 - def connect(self, widget, obj):
3.61 -
3.62 - for connection in self.ui_doc.getElementsByTagName("connection"):
3.63 - sender_name = self.get_text(connection.getElementsByTagName("sender")[0]).encode("utf-8")
3.64 - signal_name = self.get_text(connection.getElementsByTagName("signal")[0]).encode("utf-8")
3.65 - slot_name = self.get_text(connection.getElementsByTagName("slot")[0]).encode("utf-8")
3.66 -
3.67 - if widget.name() == sender_name:
3.68 - senders = [widget]
3.69 - else:
3.70 - senders = self.find_widgets(widget, sender_name)
3.71 -
3.72 - slot = slot_name.split("(")[0]
3.73 - if hasattr(obj, slot):
3.74 - signal = qt.SIGNAL(signal_name)
3.75 - for sender in senders:
3.76 - qt.QObject.connect(sender, signal, getattr(obj, slot))
3.77 -
3.78 - def get_text(self, node):
3.79 - node.normalize()
3.80 - return node.childNodes[0].nodeValue
3.81 -
3.82 - def find_widgets(self, widget, name):
3.83 - widgets = []
3.84 - found = widget.child(name)
3.85 - if found:
3.86 - widgets.append(found)
3.87 - for child in widget.children() or []:
3.88 - widgets += self.find_widgets(child, name)
3.89 - return widgets
3.90 -
3.91 -# vim: tabstop=4 expandtab shiftwidth=4
4.1 --- a/XSLForms/Resources/PyQtWebResources.py Sun Oct 12 19:28:30 2008 +0200
4.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
4.3 @@ -1,313 +0,0 @@
4.4 -#!/usr/bin/env python
4.5 -
4.6 -"""
4.7 -PyQt-compatible resources for use with WebStack.
4.8 -
4.9 -Copyright (C) 2005, 2007 Paul Boddie <paul@boddie.org.uk>
4.10 -
4.11 -This program is free software; you can redistribute it and/or modify it under
4.12 -the terms of the GNU Lesser General Public License as published by the Free
4.13 -Software Foundation; either version 3 of the License, or (at your option) any
4.14 -later version.
4.15 -
4.16 -This program is distributed in the hope that it will be useful, but WITHOUT
4.17 -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
4.18 -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
4.19 -details.
4.20 -
4.21 -You should have received a copy of the GNU Lesser General Public License along
4.22 -with this program. If not, see <http://www.gnu.org/licenses/>.
4.23 -"""
4.24 -
4.25 -import XSLForms.Prepare
4.26 -import XSLForms.Resources.PyQtCommon
4.27 -import XSLForms.Resources.WebResources
4.28 -import WebStack.Generic
4.29 -import os
4.30 -import libxml2dom
4.31 -
4.32 -class XSLFormsResource(XSLForms.Resources.WebResources.XSLFormsResource,
4.33 - XSLForms.Resources.PyQtCommon.PyQtCommonResource):
4.34 -
4.35 - """
4.36 - An XSLForms resource supporting PyQt-compatible Web applications for use
4.37 - with WebStack.
4.38 - """
4.39 -
4.40 - encoding = "utf-8"
4.41 - widget_resources = {}
4.42 -
4.43 - def __init__(self, design_identifier):
4.44 - self.factory = Factory()
4.45 - self.default_design = design_identifier
4.46 -
4.47 - # NOTE: Filenames extended by string concatenation.
4.48 -
4.49 - self.template_resources = {}
4.50 - self.init_resources = {}
4.51 - for design_identifier, design_name in self.design_resources.items():
4.52 - self.template_resources[design_identifier] = (design_name + "_template.xhtml", design_name + "_output.xsl")
4.53 - self.init_resources[design_identifier] = (design_name + "_template.xhtml", design_name + "_input.xsl")
4.54 -
4.55 - # Initialisation of connections - just a mapping from field names to
4.56 - # methods in the Web version.
4.57 -
4.58 - self.method_resources = {}
4.59 - for design_identifier, design_name in self.design_resources.items():
4.60 - design_path = self.prepare_design(design_identifier)
4.61 - design_doc = libxml2dom.parse(design_path)
4.62 - connections = {}
4.63 - for connection in design_doc.xpath("UI/connections/connection"):
4.64 - receiver = "".join([n.nodeValue for n in connection.xpath("receiver/text()")])
4.65 - if receiver == design_identifier:
4.66 - sender = "".join([n.nodeValue for n in connection.xpath("sender/text()")])
4.67 - slot = "".join([n.nodeValue for n in connection.xpath("slot/text()")])
4.68 - slot = slot.split("(")[0]
4.69 - connections[sender] = slot
4.70 - self.method_resources[design_identifier] = connections
4.71 -
4.72 - # Initialisation of template fragments.
4.73 -
4.74 - self.in_page_resources = {}
4.75 - for widget_identifier, (design_name, fragment_id) in self.widget_resources.items():
4.76 - self.in_page_resources[widget_identifier] = (design_name + "_output.xsl", fragment_id)
4.77 -
4.78 - # Refresh status - avoiding multiple refresh calls.
4.79 -
4.80 - self._refreshed = 0
4.81 -
4.82 - # Resource methods.
4.83 -
4.84 - def prepare_output(self, design_identifier):
4.85 -
4.86 - """
4.87 - Prepare the output stylesheets using the given 'design_identifier' to
4.88 - indicate which templates and stylesheets are to be employed in the
4.89 - production of output from the resource.
4.90 -
4.91 - The 'design_identifier' is used as a key to the 'design_resources' and
4.92 - 'template_resources' dictionary attributes.
4.93 -
4.94 - Return the full path to the output stylesheet for use with 'send_output'
4.95 - or 'get_result'.
4.96 - """
4.97 -
4.98 - design_path = self.prepare_design(design_identifier)
4.99 - template_filename, output_filename = self.template_resources[design_identifier]
4.100 - output_path = os.path.abspath(os.path.join(self.resource_dir, output_filename))
4.101 - template_path = os.path.abspath(os.path.join(self.resource_dir, template_filename))
4.102 - XSLForms.Prepare.ensure_qt_template(design_path, template_path)
4.103 - XSLForms.Prepare.ensure_stylesheet(template_path, output_path)
4.104 - return output_path
4.105 -
4.106 - # PyQt compatibility methods.
4.107 -
4.108 - def get_document(self, document_identifier):
4.109 - return libxml2dom.parse(self.prepare_document(document_identifier))
4.110 -
4.111 - def prepare_widget(self, design_identifier, widget_identifier, parent=None):
4.112 - fragment_name, widget_name = self.widget_resources[widget_identifier]
4.113 - element = UINode(self.doc._node.ownerDocument.createElement(widget_name))
4.114 -
4.115 - # NOTE: Creating an element which may not be appropriate.
4.116 -
4.117 - element._node.appendChild(self.doc._node.ownerDocument.createElement(widget_name + "_value"))
4.118 - return element
4.119 -
4.120 - def child(self, name):
4.121 - return self.doc.child(name)
4.122 -
4.123 - def sender(self):
4.124 - return self._sender
4.125 -
4.126 - # PyQt structural methods.
4.127 -
4.128 - def form_init(self):
4.129 -
4.130 - "Initialise a newly-created form."
4.131 -
4.132 - raise NotImplementedError, "form_init"
4.133 -
4.134 - def form_populate(self):
4.135 -
4.136 - "Populate the values in a form."
4.137 -
4.138 - raise NotImplementedError, "form_populate"
4.139 -
4.140 - def form_refresh(self):
4.141 -
4.142 - "Refresh the form."
4.143 -
4.144 - raise NotImplementedError, "form_refresh"
4.145 -
4.146 - def request_refresh(self, *args, **kw):
4.147 -
4.148 - "Request a refresh of the form."
4.149 -
4.150 - if not self._refreshed:
4.151 - self._refreshed = 1
4.152 - self.form_refresh(*args, **kw)
4.153 -
4.154 - # Standard XSLFormsResource method, overridden to handle presentation.
4.155 -
4.156 - def respond_to_form(self, trans, form):
4.157 -
4.158 - """
4.159 - Respond to the request described by the given transaction 'trans', using
4.160 - the given 'form' object to conveniently retrieve field (request
4.161 - parameter) information and structured form information (as DOM-style XML
4.162 - documents).
4.163 - """
4.164 -
4.165 - self._refreshed = 0
4.166 -
4.167 - # Ensure the presence of the template.
4.168 -
4.169 - self.prepare_output(self.default_design)
4.170 -
4.171 - # Remember the document since it is accessed independently elsewhere.
4.172 -
4.173 - doc = form.get_document(self.default_design)
4.174 - if doc is None:
4.175 - doc = form.new_document(self.default_design)
4.176 - doc = self._get_initialised_form(doc)
4.177 - self.doc = UINode(doc.xpath("*")[0])
4.178 - self.form_init()
4.179 - else:
4.180 - doc = self._get_initialised_form(doc)
4.181 - self.doc = UINode(doc.xpath("*")[0])
4.182 -
4.183 - self.form_populate()
4.184 -
4.185 - # Updates happen here.
4.186 -
4.187 - form.set_document(self.default_design, doc)
4.188 - selectors = form.get_selectors()
4.189 - connections = self.method_resources[self.default_design]
4.190 - for selector_name, selector_values in selectors.items():
4.191 - if connections.has_key(selector_name):
4.192 - slot = connections[selector_name]
4.193 - if hasattr(self, slot):
4.194 -
4.195 - # Initialise the sender.
4.196 -
4.197 - for selector_value in selector_values:
4.198 - # NOTE: Fake a special element to simulate the Qt widget hierarchy.
4.199 - # NOTE: We could instead have set the underlying annotations for
4.200 - # NOTE: selector-field differently, but that would be more work.
4.201 - # NOTE: An alternative which works in certain cases is a new
4.202 - # NOTE: attribute whose node is retained.
4.203 - _sender = self.doc._node.ownerDocument.createElement("_sender")
4.204 - self._sender = UINode(selector_value.appendChild(_sender))
4.205 - getattr(self, slot)()
4.206 -
4.207 - # Consistency is ensured and filtering enforced.
4.208 -
4.209 - self.request_refresh()
4.210 - #print self.doc._node.toString("iso-8859-1")
4.211 -
4.212 - # Output is produced.
4.213 -
4.214 - attributes = trans.get_attributes()
4.215 - encoding = attributes.get("encoding") or self.encoding or trans.default_charset
4.216 -
4.217 - trans.set_content_type(WebStack.Generic.ContentType("application/xhtml+xml", encoding))
4.218 - design_xsl = self.prepare_output(self.default_design)
4.219 - self.send_output(trans, [design_xsl], doc._node)
4.220 -
4.221 - def _get_initialised_form(self, doc):
4.222 - input_xsl = self.prepare_initialiser(self.default_design, init_enumerations=0)
4.223 - return self.get_result([input_xsl], doc)
4.224 -
4.225 -class UINode:
4.226 -
4.227 - "A PyQt widget tree emulation node."
4.228 -
4.229 - def __init__(self, node):
4.230 - self._node = node
4.231 -
4.232 - def add(self, node):
4.233 - self._node.appendChild(node._node)
4.234 -
4.235 - def child(self, name):
4.236 - nodes = self._node.xpath(name)
4.237 - if len(nodes) > 0:
4.238 - return UINode(nodes[0])
4.239 - else:
4.240 - return None
4.241 -
4.242 - def children(self):
4.243 - return [UINode(node) for node in self._node.childNodes]
4.244 -
4.245 - def count(self):
4.246 - return len(self._node.childNodes)
4.247 -
4.248 - def currentText(self):
4.249 - return self._node.getAttribute("value")
4.250 -
4.251 - def currentItem(self):
4.252 - found = self._node.xpath("*[@value=current()/@value]")
4.253 - if found:
4.254 - return int(found.xpath("count(preceding-sibling::*)"))
4.255 - else:
4.256 - return 0
4.257 -
4.258 - def deleteLater(self):
4.259 - pass
4.260 -
4.261 - def insertItem(self, item, position=-1):
4.262 - # NOTE: Names invented rather than being extracted from the schema.
4.263 - new_element = self._node.ownerDocument.createElement(self._node.localName + "_enum")
4.264 - new_element.setAttribute("value", item)
4.265 - if position == -1:
4.266 - self._node.appendChild(new_element)
4.267 - else:
4.268 - elements = self._node.xpath("*")
4.269 - if position < len(elements) - 1:
4.270 - self._node.insertBefore(new_element, elements[position])
4.271 - else:
4.272 - self._node.appendChild(new_element)
4.273 -
4.274 - def layout(self):
4.275 - return self
4.276 -
4.277 - def parent(self):
4.278 - return UINode(self._node.parentNode)
4.279 -
4.280 - def removeItem(self, item):
4.281 - elements = self._node.xpath("*")
4.282 - if item < len(elements):
4.283 - self._node.removeChild(elements[item])
4.284 -
4.285 - def remove(self, item):
4.286 - self._node.removeChild(item._node)
4.287 -
4.288 - def setCurrentItem(self, index):
4.289 - pass # NOTE: Not implemented yet!
4.290 -
4.291 - def show(self):
4.292 - pass
4.293 -
4.294 -class Factory:
4.295 -
4.296 - "A widget factory helper class."
4.297 -
4.298 - def connect(self, widget, obj):
4.299 -
4.300 - """
4.301 - Connection is done all at once by mapping field names to method names in
4.302 - the resource object.
4.303 - """
4.304 -
4.305 - pass
4.306 -
4.307 - def find_widgets(self, widget, name):
4.308 -
4.309 - """
4.310 - Find within the given 'widget' (a DOM node) the widget with the given
4.311 - 'name'.
4.312 - """
4.313 -
4.314 - return [UINode(node) for node in widget.doc._node.getElementsByTagName(name)]
4.315 -
4.316 -# vim: tabstop=4 expandtab shiftwidth=4
5.1 --- a/docs/overview.html Sun Oct 12 19:28:30 2008 +0200
5.2 +++ b/docs/overview.html Sun Oct 12 19:47:09 2008 +0200
5.3 @@ -1,15 +1,23 @@
5.4 <?xml version="1.0" encoding="iso-8859-1"?>
5.5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5.6 -<html xmlns="http://www.w3.org/1999/xhtml"><head>
5.7 +<html xmlns="http://www.w3.org/1999/xhtml">
5.8 +<head>
5.9 <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type" />
5.10 <title>Creating Applications: An Overview</title>
5.11 - <link href="styles.css" rel="stylesheet" type="text/css" /></head>
5.12 + <link href="styles.css" rel="stylesheet" type="text/css" />
5.13 +</head>
5.14 <body>
5.15 <h1>Creating Applications: An Overview</h1>
5.16 +
5.17 <p>This document contains an overview of the process of developing an
5.18 XSLForms application. Since the only currently supported way of
5.19 -deploying such an application is through the use of <a href="http://www.boddie.org.uk/python/WebStack.html">WebStack</a>, it is necessary to install that package first before following the tutorial below.</p><p>The following steps briefly describe how to make a new application:<br />
5.20 -</p>
5.21 +deploying such an application is through the use of
5.22 +<a href="http://www.boddie.org.uk/python/WebStack.html">WebStack</a>,
5.23 +it is necessary to install that package first before following the
5.24 +tutorial below.</p>
5.25 +
5.26 +<p>The following steps briefly describe how to make a new application:</p>
5.27 +
5.28 <ol>
5.29 <li><a href="directory.html">Create a directory to hold your files</a></li>
5.30 <li><a href="data.html">Design the structure of the form data</a></li>
5.31 @@ -22,5 +30,24 @@
5.32 <li><a href="multivalue.html">Adding multivalued fields</a></li><li><a href="labels.html">Labelling multiple-choice values</a></li>
5.33 <li><a href="advice.html">Recommendations and advice</a></li>
5.34 <li><a href="in-page-updates.html">Adding in-page updates</a></li>
5.35 -</ol><p>A topic-by-topic guide to XSLTools:</p><ul><li><a href="template-design.html">A guide to template design</a></li><li><a href="internationalisation.html">Internationalisation</a></li><li><a href="advanced.html">Advanced template design</a></li><li><a href="XSLForms-resource.html">Using the XSLFormsResource API</a></li><li>Using Qt Designer to make templates <span style="font-style: italic;">(to be written)</span></li><li>Developing applications for PyQt and the Web <span style="font-style: italic;">(to be written)</span></li></ul><p>Some other resources:</p><ul><li><a href="reference.html">A template attribute reference</a></li><li><a href="../apidocs/public/XSLForms.Output-module.html">A template extension function reference</a></li><li><a href="JavaScript-reference.html">An in-page update JavaScript function reference</a></li></ul>
5.36 -</body></html>
5.37 +</ol>
5.38 +
5.39 +<p>A topic-by-topic guide to XSLTools:</p>
5.40 +
5.41 +<ul>
5.42 +<li><a href="template-design.html">A guide to template design</a></li>
5.43 +<li><a href="internationalisation.html">Internationalisation</a></li>
5.44 +<li><a href="advanced.html">Advanced template design</a></li>
5.45 +<li><a href="XSLForms-resource.html">Using the XSLFormsResource API</a></li>
5.46 +</ul>
5.47 +
5.48 +<p>Some other resources:</p>
5.49 +
5.50 +<ul>
5.51 +<li><a href="reference.html">A template attribute reference</a></li>
5.52 +<li><a href="../apidocs/public/XSLForms.Output-module.html">A template extension function reference</a></li>
5.53 +<li><a href="JavaScript-reference.html">An in-page update JavaScript function reference</a></li>
5.54 +</ul>
5.55 +
5.56 +</body>
5.57 +</html>
6.1 --- a/packages/ubuntu-feisty/python-xsltools/debian/control Sun Oct 12 19:28:30 2008 +0200
6.2 +++ b/packages/ubuntu-feisty/python-xsltools/debian/control Sun Oct 12 19:47:09 2008 +0200
6.3 @@ -11,7 +11,6 @@
6.4 Depends: ${python:Depends}, python-libxml2dom (>= 0.4.3), python-libxslt1 (>= 1.1.20-0ubuntu2), python-webstack (>= 1.2.5)
6.5 Conflicts: python2.4-xsltools (<< 0.5-0ubuntu1)
6.6 Replaces: python2.4-xsltools (<< 0.5-0ubuntu1)
6.7 -Suggests: python-qtxmldom, python-qt3 (>= 3.17-0ubuntu3), qt3-designer
6.8 XB-Python-Version: ${python:Versions}
6.9 Description: Modules and packages for the development of XML/XSL-based applications
6.10 XSLTools is a distribution providing modules and packages for the development
7.1 --- a/packages/ubuntu-hoary/python2.4-xsltools/debian/control Sun Oct 12 19:28:30 2008 +0200
7.2 +++ b/packages/ubuntu-hoary/python2.4-xsltools/debian/control Sun Oct 12 19:47:09 2008 +0200
7.3 @@ -10,7 +10,6 @@
7.4 Architecture: all
7.5 Depends: python2.4-libxml2dom (>= 0.4.3), python2.4-libxslt1 (>= 1.1.12), python2.4-webstack (>= 1.2.3), python2.4
7.6 Conflicts: python2.4-libxslt1 (1.1.17)
7.7 -Suggests: python2.4-qtxmldom, python2.4-qt3 (>= 3.15), qt3-designer
7.8 Description: Modules and packages for the development of XML/XSL-based applications
7.9 XSLTools is a distribution providing modules and packages for the development
7.10 of XML/XSL-based applications in Python, including Web-based applications,