1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
def escape(str):
for (level, char) in [(3, '\\'), (2, "'"), (2, '"'), (1, '@')]:
str = str.replace(char, (level * '\\') + char)
return str
def cmd_expand(uzbl, cmd, args):
'''Exports a function that provides the following
expansions in any uzbl command string:
%s = replace('%s', ' '.join(args))
%r = replace('%r', "'%s'" % escaped(' '.join(args)))
%1 = replace('%1', arg[0])
%2 = replace('%2', arg[1])
%n = replace('%n', arg[n-1])
'''
# Ensure (1) all string representable and (2) correct string encoding.
args = map(unicode, args)
# Direct string replace.
if '%s' in cmd:
cmd = cmd.replace('%s', ' '.join(args))
# Escaped and quoted string replace.
if '%r' in cmd:
cmd = cmd.replace('%r', "'%s'" % escape(' '.join(args)))
# Arg index string replace.
for (index, arg) in enumerate(args):
index += 1
if '%%%d' % index in cmd:
cmd = cmd.replace('%%%d' % index, unicode(arg))
return cmd
def init(uzbl):
# Function exports to the uzbl object, `function(uzbl, *args, ..)`
# becomes `uzbl.function(*args, ..)`.
uzbl.export('cmd_expand', cmd_expand)
|