[Formed-commits] r322 - in trunk: . formed/formed formed/formed/model formed/formed/plugins/export

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Tue Mar 31 14:44:02 CEST 2009


Author: teichmann
Date: 2009-03-31 14:44:02 +0200 (Tue, 31 Mar 2009)
New Revision: 322

Added:
   trunk/formed/formed/plugins/export/rules.py
Modified:
   trunk/ChangeLog
   trunk/formed/formed/config.py
   trunk/formed/formed/model/exprtree.py
   trunk/formed/formed/plugins/export/html.py
Log:
New plug-in to export rules in human readable form (as HTML).



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-03-31 10:08:00 UTC (rev 321)
+++ trunk/ChangeLog	2009-03-31 12:44:02 UTC (rev 322)
@@ -1,5 +1,17 @@
 2009-03-31	Sascha L. Teichmann <teichmann at intevation.de>
 
+	* formed/formed/model/exprtree.py: Add some code to pretty print
+	  the trees infix.
+
+	* formed/formed/plugins/export/rules.py: New. Exporter for human
+	  readable rules.
+
+	* formed/formed/plugins/export/html.py: Fixed HTML generation.
+
+	* formed/formed/config.py: Added new new Rule export plug-in.
+
+2009-03-31	Sascha L. Teichmann <teichmann at intevation.de>
+
 	* formed/formed/model/exprtree.py: Fixes from server. Raise
 	  exceptions if there is less or more than one element on stack
 	  after compilation of expression.

Modified: trunk/formed/formed/config.py
===================================================================
--- trunk/formed/formed/config.py	2009-03-31 10:08:00 UTC (rev 321)
+++ trunk/formed/formed/config.py	2009-03-31 12:44:02 UTC (rev 322)
@@ -25,6 +25,8 @@
 from formed.plugins.export.xsd     import ExportAsXMLSchema
 from formed.plugins.export.xls     import ExportKeyValueTableAsXLS
 
+from formed.plugins.export.rules   import ExportRulesAsHTML
+
 from formed.plugins.modify.rules   import GenerateRequiredRules
 
 #from formed.plugins.export.old_sql  import \
@@ -60,6 +62,7 @@
             ExportAsXMLSchema(),
             ExportKeyValueTableAsXLS(),
             GenerateRequiredRules(),
+            ExportRulesAsHTML(),
             DataImportFilter(),
             DataExportFilter()
         ]

Modified: trunk/formed/formed/model/exprtree.py
===================================================================
--- trunk/formed/formed/model/exprtree.py	2009-03-31 10:08:00 UTC (rev 321)
+++ trunk/formed/formed/model/exprtree.py	2009-03-31 12:44:02 UTC (rev 322)
@@ -45,6 +45,34 @@
 
 from shlex import split as lexsplit
 
+PRETTY_SYMBOLS = {
+    'EQ':    'gleich',
+    'NE':    'ungleich',
+    'NOT':   'nicht',
+    'ISSET': 'gesetzt',
+    'KNOWN': 'bekannt',
+    'And':   'und',
+    'Or':    'oder',
+    'MUL':   '*',
+    'DIV':   '/',
+    'MOD':   '%',
+    'MINUS': '-',
+    'PLUS':  '+',
+    'date':  'Datum',
+    'year':  'Jahr',
+    'month': 'Monat',
+    'day':   'Tag',
+    'GT':    '>',
+    'LT':    '<',
+    'GE':    '>=',
+    'LE':    '<=',
+    'today': 'Heute',
+    'out':   'Ausgabe'
+}
+
+def prettify(sym):
+    return PRETTY_SYMBOLS.get(sym, sym)
+
 class Node(object):
 
     def __init__(self):
@@ -53,6 +81,18 @@
     def eval(self, ctx):
         return None
 
+    def pretty(self, out):
+        pass
+
+    def isAtom(self):
+        return False
+
+    def bracket(self, out):
+        atom = self.isAtom()
+        if not atom: out.append('(')
+        self.pretty(out)
+        if not atom: out.append(')')
+
 class Unary(Node):
 
     def __init__(self, a = None):
@@ -64,6 +104,11 @@
             self.__class__.__name__,
             repr(self.a))
 
+    def pretty(self, out):
+        out.append("%s(" % pretty(self.__class__.__name__))
+        self.a.pretty(out)
+        out.append(")")
+
 class Binary(Unary):
 
     def __init__(self, a = None, b = None):
@@ -76,6 +121,11 @@
             repr(self.a),
             repr(self.b))
 
+    def pretty(self, out):
+        self.a.bracket(out)
+        out.append(" %s " % prettify(self.__class__.__name__))
+        self.b.bracket(out)
+
 class OperatorUnary(Unary):
 
     def __init__(self, a, operator):
@@ -91,6 +141,14 @@
             self.operator.__name__,
             repr(self.a))
 
+    def pretty(self, out):
+        out.append("%s(" % prettify(self.operator.__name__))
+        self.a.pretty(out)
+        out.append(")")
+
+    def isAtom(self):
+        return True
+
 class OperatorBinary(Binary):
 
     def __init__(self, a, b, operator):
@@ -107,6 +165,11 @@
             repr(self.a),
             repr(self.b))
 
+    def pretty(self, out):
+        self.a.bracket(out)
+        out.append(" %s " % prettify(self.operator.__name__))
+        self.b.bracket(out)
+
 class Not(Unary):
 
     def eval(self, ctx):
@@ -135,6 +198,12 @@
     def __repr__(self):
         return "var(%s)" % (self.var_name)
 
+    def pretty(self, out):
+        out.append("$%s" % self.var_name)
+
+    def isAtom(self):
+        return True
+
 class Const(Node):
 
     def __init__(self, const):
@@ -146,11 +215,23 @@
     def __repr__(self):
         return "const(%s)" % repr(self.const)
 
+    def pretty(self, out):
+        out.append("%s" % repr(self.const))
+
+    def isAtom(self):
+        return True
+
 class Today(Node):
 
     def eval(self, ctx):
         return date.today()
 
+    def pretty(self, out):
+        out.append(prettify("today"))
+
+    def isAtom(self):
+        return True
+
 class DateNode(Node):
 
     def __init__(self, year, month, day):
@@ -164,6 +245,19 @@
         year  = self.year.eval(ctx)
         return date(year, month, day)
 
+    def pretty(self, out):
+        out.append(prettify("date") + "(")
+        out.append(prettify("year") + " = ")
+        self.year.bracket(out)
+        out.append(", " + prettify("month") + " = ")
+        self.month.bracket(out)
+        out.append(", " + prettify("day") + " = ")
+        self.day.bracket(out)
+        out.append(")")
+
+    def isAtom(self):
+        return True
+
 class Out(Node):
 
     def __init__(self, parent):
@@ -174,6 +268,11 @@
         print >> sys.stderr, "OUT: %s" % repr(e)
         return e
 
+    def pretty(self, out):
+        out.append(prettify("out") + "(")
+        self.parent.pretty(out)
+        out.append(")")
+
 class IThenElse(Node):
 
     def __init__(self, q, a, b):
@@ -185,6 +284,15 @@
         if self.q.eval(ctx): return self.a.eval(ctx)
         return self.b.eval(ctx)
 
+    def pretty(self, out):
+        out.append("if (")
+        self.q.pretty(out)
+        out.append(") then (")
+        self.a.pretty(out)
+        out.append(") else (")
+        self.b.pretty(out)
+        out.append(")")
+
 def ADD(a, b):   return a + b
 def MINUS(a, b): return a - b
 def MUL(a, b):   return a * b
@@ -306,6 +414,13 @@
         self.prog    = stack[0]
         self.depends = depends
 
+    def pretty(self):
+        if self.prog is None:
+            self.compile()
+        out = []
+        self.prog.pretty(out)
+        return "".join(out)
+
     def getDependencies(self):
         if self.depends is None:
             self.compile()

Modified: trunk/formed/formed/plugins/export/html.py
===================================================================
--- trunk/formed/formed/plugins/export/html.py	2009-03-31 10:08:00 UTC (rev 321)
+++ trunk/formed/formed/plugins/export/html.py	2009-03-31 12:44:02 UTC (rev 322)
@@ -32,7 +32,7 @@
 <html>
     <head>
         <title>Formularfelder Auflistung</title> 
-        <meta http-equiv="content-type" content="text/html; charset="UTF8">
+        <meta http-equiv="content-type" content='text/html; charset="UTF8"'>
     </head>
     <body>
         <table border="1">

Added: trunk/formed/formed/plugins/export/rules.py
===================================================================
--- trunk/formed/formed/plugins/export/rules.py	2009-03-31 10:08:00 UTC (rev 321)
+++ trunk/formed/formed/plugins/export/rules.py	2009-03-31 12:44:02 UTC (rev 322)
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+#
+# FormEd is free software under the terms of the
+# GNU General Public License Version 3. See file
+# LICENSE coming with the source of FormEd for details.
+#
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from formed.plugins.ui.controls import FileDialogFilter
+
+import formed.model.data as data
+
+#from formed.model.misc import ModeChecker, checkMode
+
+import codecs
+from   cgi import escape
+
+HTML_HEADER = u'''
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+    <head>
+        <title>Formularfelder Auflistung</title> 
+        <meta http-equiv="content-type" content='text/html; charset="UTF8"'>
+    </head>
+    <body>
+    <table border cellspacing="0">
+    <tr><th>Nr.</th><th>Beschreibung</th><th>Ausdruck</th></tr>
+'''
+
+HTML_FOOTER = u'''
+    </table>
+    </body>
+</html>
+'''
+
+class ExportRulesAsHTML(FileDialogFilter):
+
+    def __init__(self):
+        FileDialogFilter.__init__(self)
+
+    def getMenuName(self):
+        return _("Export R&ules As HTML Table...")
+
+    def getDescription(self):
+        return _("Exports rules as a table in HTML")
+
+    def wildcards(self):
+        return _("HTML files (*.html)|*.html;*.htm")
+
+    def dialogMessage(self):
+        return _("Export rules as HTML table document")
+
+    def errorTitle(self):
+        return _("Error occured while exporting rules to HTML")
+
+    def doExport(self, path, main, dummy):
+        document = main.getDocument()
+        root     = document.root
+        mode     = main.getSelectedMode()
+        allModes = main.getAllModes()
+        out      = None
+        try:
+            out = codecs.open(path, "wb", "UTF-8")
+            print >> out, HTML_HEADER
+
+            all_rules = list(document.findAllByClass(data.RuleLeaf, mode, allModes))
+
+            for idx, rule in enumerate(all_rules):
+                desc = rule.getDescription()
+                if not desc: desc = rule.getValue()
+                if not desc: desc = u"Name: %s" % rule.getName()
+                print >> out, u'<tr><td align="right">%d</td><td>%s</td><td>%s</td></tr>' % (
+                    idx+1,
+                    escape(desc),
+                    escape(rule.getExpr().pretty()) 
+                )
+
+            print >> out, HTML_FOOTER
+        finally:
+            if out:
+                try: out.close()
+                except: pass
+
+# vim:set ts=4 sw=4 si et sta sts=4 enc=utf-8 fenc=utf-8 :



More information about the Formed-commits mailing list