1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 """
22 (Data structures for stage 2 of the formatter)
23 """
24
25
26 from Pyblio.Format.S3 import Tag
27 from Pyblio.Format.Base import Missing
28
29
31 return Tag('t', args, {})
32
33
35
36 - def __init__(self, t):
39
40 - def __call__(self, record):
41 return unicode(self.t)
42
44 return "S2.Text(%r)" % self.t
45
47
49 self.a = a
50 self.b = b
51 return
52
54
55 return T(self.a(record), self.b(record))
56
58 return "S2.Sum(%r, %r)" % (self.a, self.b)
59
60
61
63
65 self.a = a
66 self.b = b
67 return
68
70
71 try:
72 return self.a(record)
73 except Missing:
74 return self.b(record)
75
77 return "S2.Or(%r, %r)" % (self.a, self.b)
78
79
81
82 - def __init__(self, middle, last, children):
83 self.middle = middle
84 self.last = last
85 self.children = children
86 return
87
89
90 middle = self.middle(record)
91 last = self.last(record)
92
93 ls = []
94
95 for arg in self.children:
96 if isinstance (arg, (str, unicode)):
97 ls.append (arg)
98 continue
99
100 try: v = arg(record)
101 except Missing: continue
102
103 if isinstance (v, (list, tuple)):
104 ls.extend(v)
105 else:
106 ls.append (v)
107
108 if len(ls) == 0:
109 raise Missing('empty join')
110
111 f = [ls.pop (0)]
112
113 while ls:
114 l = ls.pop (0)
115 if ls: f.append(middle)
116 else: f.append(last)
117
118 f.append(l)
119
120 return T(*f)
121
123 return "S2.Join(%r, %r, %r)" % (
124 self.middle, self.last, self.children)
125
126
128
129 - def __init__(self, fetch, switch, default):
134
136 try:
137 txo = self.fetch(record)
138 except (KeyError, IndexError), msg:
139 if self.default:
140 c = self.default
141 else:
142 raise Missing('no such attribute in record: %s' % str(msg))
143 else:
144 c = self.switch.get(txo, self.default)
145
146 if not c:
147 raise Missing('unsupported switch case')
148
149 return c(record)
150