[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