forked from ScoDoc/ScoDoc
165 lines
4.6 KiB
Python
165 lines
4.6 KiB
Python
try:
|
|
from Products.ZBabel import ZBabelTag
|
|
except:
|
|
|
|
from DocumentTemplate.DT_String import String
|
|
from DocumentTemplate.DT_Util import render_blocks, Eval, ParseError
|
|
import string, zLOG
|
|
|
|
|
|
# fake Babel/Fish Tags
|
|
|
|
class ZBabelTag:
|
|
'''ZBabel Tag class - The cool translation tag'''
|
|
|
|
# define the name of the tag; also tell the system it is a doublet
|
|
name = 'babel'
|
|
blockContinuations = ()
|
|
|
|
|
|
def __init__(self, blocks):
|
|
'''__init__(self, blocks) --> Initialize tag object; return None'''
|
|
(tname, args, section,) = blocks[0]
|
|
|
|
self.section = section
|
|
|
|
|
|
def render(self, md):
|
|
'''render(self, md) --> Do the Translation; return string'''
|
|
return render_blocks(self.section.blocks, md)
|
|
__call__=render
|
|
# register the DTML-BABEL tag
|
|
String.commands['babel'] = ZBabelTag
|
|
|
|
class FishTag:
|
|
'''Fish Tag class - Short-Cut version of the cool translation tag (babel)
|
|
|
|
This tag is used to quickly translate menu-like text snippets, similar to
|
|
the KDE translation.'''
|
|
|
|
# define the tag name
|
|
name = 'fish'
|
|
|
|
# define additional variables
|
|
literal = 1
|
|
|
|
src = 'label'
|
|
attrs = {'dst': None, 'label': '', 'data': None, 'towerId': None}
|
|
|
|
def __init__(self, args):
|
|
'''__init__(self, blocks) --> Initialize tag object; return None'''
|
|
self.section = None
|
|
args = parseTagParameters(args, tag=self.name)
|
|
self.args = self.validateArguments(args)
|
|
|
|
for attr in self.attrs.keys():
|
|
setattr(self, attr, self.attrs[attr])
|
|
|
|
def validateArguments(self, args):
|
|
'''validateArguments(self, args) --> try to evaluate the passed expression or try to get an object from the passed id; if all this fails, leave the string, it is probably cool!; return tuple of (name, value)'''
|
|
# I stole this from dtml-let...
|
|
# SR: Like he said: Always copy existing code to make you life easier (evben though
|
|
# I changed some variables around
|
|
for count in range(len(args)):
|
|
(name, expr,) = args[count]
|
|
if ((expr[:1] == '"') and ((expr[-1:] == '"') and (len(expr) > 1))):
|
|
expr = expr[1:-1]
|
|
try:
|
|
|
|
args[count] = (name, Eval(expr).eval)
|
|
|
|
except SyntaxError, v:
|
|
(m, (huh, l, c, src,),) = v
|
|
raise ParseError, (('<strong>Expression (Python) Syntax error</strong>:' +
|
|
'<pre>\012%s\012</pre>\012' % v[0]), 'babel')
|
|
|
|
elif ((expr[:1] == "'") and ((expr[-1:] == "'") and (len(expr) > 1))):
|
|
expr = expr[1:-1]
|
|
args[count] = (name, expr)
|
|
|
|
return args
|
|
|
|
def render(self, md):
|
|
'''render(self, md) --> Do the Translation; return string'''
|
|
data = None
|
|
for name, expr in self.args:
|
|
if type(expr) is type(''):
|
|
try:
|
|
data = md[expr]
|
|
except:
|
|
data = expr
|
|
else:
|
|
data = expr(md)
|
|
|
|
#zLOG.LOG("exUserFolder", zLOG.INFO, "rendering name=%s expr=%s data=%s"%(name,expr,data))
|
|
|
|
print data
|
|
return str(data)
|
|
|
|
__call__=render
|
|
|
|
|
|
# register the DTML-FISH tag
|
|
String.commands['fish'] = FishTag
|
|
|
|
|
|
|
|
try:
|
|
import re
|
|
parmre=re.compile('''([\000- ]*([^\000- ="']+)=([^\000- ="']+))''');#"))
|
|
dqparmre=re.compile('([\000- ]*([^\000- ="]+)="([^"]*)")')
|
|
sqparmre=re.compile('''([\000- ]*([^\000- =']+)='([^']*)')''')
|
|
except:
|
|
import regex
|
|
parmre=regex.compile('''([\000- ]*([^\000- ="']+)=([^\000- ="']+))''');#"))
|
|
dqparmre=regex.compile('([\000- ]*([^\000- ="]+)="([^"]*)")')
|
|
sqparmre=regex.compile('''([\000- ]*([^\000- =']+)='([^']*)')''')
|
|
|
|
|
|
|
|
def parseTagParameters(paramText, result = None, tag = 'babel',
|
|
parmre=parmre,
|
|
dqparmre=dqparmre,
|
|
sqparmre=sqparmre,
|
|
**parms):
|
|
result = (result or [])
|
|
|
|
parsedParam = parmre.match(paramText)
|
|
dqParsedParam = dqparmre.match(paramText)
|
|
sqParsedParam = sqparmre.match(paramText)
|
|
|
|
# Parse parameters of the form: name=value
|
|
if parsedParam is not None:
|
|
name = parsedParam.group(2)
|
|
value = parsedParam.group(3)
|
|
length = len(parsedParam.group(1))
|
|
|
|
# Parse parameters of the form: name="value"
|
|
elif dqParsedParam is not None:
|
|
name = dqParsedParam.group(2)
|
|
value = ('"%s"' % dqParsedParam.group(3))
|
|
length = len(dqParsedParam.group(1))
|
|
|
|
# Parse parameters of the form: name='value'
|
|
elif sqParsedParam is not None:
|
|
name = sqParsedParam.group(2)
|
|
value = ('''"'%s'"''' % sqParsedParam.group(3))
|
|
length = len(sqParsedParam.group(1))
|
|
|
|
else:
|
|
# There are no more parameters to parse
|
|
if ((not paramText) or (not string.strip(paramText))):
|
|
return result
|
|
raise ParseError, (('invalid parameter: "%s"' % paramText), tag)
|
|
|
|
# add the parameter/value pait to the results
|
|
result.append((name, value))
|
|
|
|
# remove the found parameter from the paramText
|
|
paramText = string.strip(paramText[length:])
|
|
|
|
if paramText:
|
|
return apply(parseTagParameters, (paramText, result, tag), parms)
|
|
else:
|
|
return result
|