annotate roundup/cgi/TAL/TALParser.py @ 2467:76ead526113d

client instances may be used as translation engines. any backend translator may be passed as constructor argument or via setTranslator() method. by default, templating.translationService is used. use this engine to translate client messages.
author Alexander Smishlajev <a1s@users.sourceforge.net>
date Tue, 15 Jun 2004 09:19:49 +0000
parents 8c2402a78bb0
children 12fe83f90f0d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # All Rights Reserved.
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
5 #
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # This software is subject to the provisions of the Zope Public License,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
11 # FOR A PARTICULAR PURPOSE.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
12 #
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 """
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
15 Parse XML and compile to TALInterpreter intermediate code.
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
16 """
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 from XMLParser import XMLParser
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
19 from TALDefs import XML_NS, ZOPE_I18N_NS, ZOPE_METAL_NS, ZOPE_TAL_NS
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 from TALGenerator import TALGenerator
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 class TALParser(XMLParser):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 ordered_attributes = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 def __init__(self, gen=None): # Override
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 XMLParser.__init__(self)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 if gen is None:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 gen = TALGenerator()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 self.gen = gen
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 self.nsStack = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 self.nsDict = {XML_NS: 'xml'}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 self.nsNew = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 def getCode(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 return self.gen.getCode()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 def getWarnings(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 return ()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 def StartNamespaceDeclHandler(self, prefix, uri):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 self.nsStack.append(self.nsDict.copy())
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 self.nsDict[uri] = prefix
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 self.nsNew.append((prefix, uri))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 def EndNamespaceDeclHandler(self, prefix):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 self.nsDict = self.nsStack.pop()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 def StartElementHandler(self, name, attrs):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 if self.ordered_attributes:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 # attrs is a list of alternating names and values
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 attrlist = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 for i in range(0, len(attrs), 2):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 key = attrs[i]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 value = attrs[i+1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 attrlist.append((key, value))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 # attrs is a dict of {name: value}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 attrlist = attrs.items()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 attrlist.sort() # For definiteness
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
61 name, attrlist, taldict, metaldict, i18ndict \
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
62 = self.process_ns(name, attrlist)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 attrlist = self.xmlnsattrs() + attrlist
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
64 self.gen.emitStartElement(name, attrlist, taldict, metaldict, i18ndict)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 def process_ns(self, name, attrlist):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 taldict = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 metaldict = {}
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
69 i18ndict = {}
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 fixedattrlist = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 name, namebase, namens = self.fixname(name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 for key, value in attrlist:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 key, keybase, keyns = self.fixname(key)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 ns = keyns or namens # default to tag namespace
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 item = key, value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 if ns == 'metal':
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 metaldict[keybase] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 item = item + ("metal",)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 elif ns == 'tal':
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 taldict[keybase] = value
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 item = item + ("tal",)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
82 elif ns == 'i18n':
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
83 assert 0, "dealing with i18n: " + `(keybase, value)`
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
84 i18ndict[keybase] = value
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
85 item = item + ('i18n',)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 fixedattrlist.append(item)
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
87 if namens in ('metal', 'tal', 'i18n'):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 taldict['tal tag'] = namens
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
89 return name, fixedattrlist, taldict, metaldict, i18ndict
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 def xmlnsattrs(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 newlist = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 for prefix, uri in self.nsNew:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 if prefix:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 key = "xmlns:" + prefix
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 key = "xmlns"
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
98 if uri in (ZOPE_METAL_NS, ZOPE_TAL_NS, ZOPE_I18N_NS):
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 item = (key, uri, "xmlns")
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 item = (key, uri)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 newlist.append(item)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 self.nsNew = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 return newlist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 def fixname(self, name):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 if ' ' in name:
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
108 uri, name = name.split(' ')
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 prefix = self.nsDict[uri]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 prefixed = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 if prefix:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 prefixed = "%s:%s" % (prefix, name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 ns = 'x'
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 if uri == ZOPE_TAL_NS:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 ns = 'tal'
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 elif uri == ZOPE_METAL_NS:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 ns = 'metal'
2348
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
118 elif uri == ZOPE_I18N_NS:
8c2402a78bb0 beginning getting ZPT up to date: TAL first
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
119 ns = 'i18n'
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 return (prefixed, name, ns)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 return (name, name, None)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 def EndElementHandler(self, name):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 name = self.fixname(name)[0]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 self.gen.emitEndElement(name)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 def DefaultHandler(self, text):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 self.gen.emitRawText(text)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 def test():
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 import sys
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 p = TALParser()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 file = "tests/input/test01.xml"
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 if sys.argv[1:]:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 file = sys.argv[1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 p.parseFile(file)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 program, macros = p.getCode()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 from TALInterpreter import TALInterpreter
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 from DummyEngine import DummyEngine
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 engine = DummyEngine(macros)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 TALInterpreter(program, macros, engine, sys.stdout, wrap=0)()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 if __name__ == "__main__":
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 test()

Roundup Issue Tracker: http://roundup-tracker.org/