ยปCore Development>Code coverage>Lib/plat-mac/aetypes.py

Python code coverage for Lib/plat-mac/aetypes.py

#countcontent
1n/a"""aetypes - Python objects representing various AE types."""
2n/a
3n/afrom warnings import warnpy3k
4n/awarnpy3k("In 3.x, the aetypes module is removed.", stacklevel=2)
5n/a
6n/afrom Carbon.AppleEvents import *
7n/aimport struct
8n/afrom types import *
9n/aimport string
10n/a
11n/a#
12n/a# convoluted, since there are cyclic dependencies between this file and
13n/a# aetools_convert.
14n/a#
15n/adef pack(*args, **kwargs):
16n/a from aepack import pack
17n/a return pack( *args, **kwargs)
18n/a
19n/adef nice(s):
20n/a """'nice' representation of an object"""
21n/a if type(s) is StringType: return repr(s)
22n/a else: return str(s)
23n/a
24n/aclass Unknown:
25n/a """An uninterpreted AE object"""
26n/a
27n/a def __init__(self, type, data):
28n/a self.type = type
29n/a self.data = data
30n/a
31n/a def __repr__(self):
32n/a return "Unknown(%r, %r)" % (self.type, self.data)
33n/a
34n/a def __aepack__(self):
35n/a return pack(self.data, self.type)
36n/a
37n/aclass Enum:
38n/a """An AE enumeration value"""
39n/a
40n/a def __init__(self, enum):
41n/a self.enum = "%-4.4s" % str(enum)
42n/a
43n/a def __repr__(self):
44n/a return "Enum(%r)" % (self.enum,)
45n/a
46n/a def __str__(self):
47n/a return string.strip(self.enum)
48n/a
49n/a def __aepack__(self):
50n/a return pack(self.enum, typeEnumeration)
51n/a
52n/adef IsEnum(x):
53n/a return isinstance(x, Enum)
54n/a
55n/adef mkenum(enum):
56n/a if IsEnum(enum): return enum
57n/a return Enum(enum)
58n/a
59n/a# Jack changed the way this is done
60n/aclass InsertionLoc:
61n/a def __init__(self, of, pos):
62n/a self.of = of
63n/a self.pos = pos
64n/a
65n/a def __repr__(self):
66n/a return "InsertionLoc(%r, %r)" % (self.of, self.pos)
67n/a
68n/a def __aepack__(self):
69n/a rec = {'kobj': self.of, 'kpos': self.pos}
70n/a return pack(rec, forcetype='insl')
71n/a
72n/a# Convenience functions for dsp:
73n/adef beginning(of):
74n/a return InsertionLoc(of, Enum('bgng'))
75n/a
76n/adef end(of):
77n/a return InsertionLoc(of, Enum('end '))
78n/a
79n/aclass Boolean:
80n/a """An AE boolean value"""
81n/a
82n/a def __init__(self, bool):
83n/a self.bool = (not not bool)
84n/a
85n/a def __repr__(self):
86n/a return "Boolean(%r)" % (self.bool,)
87n/a
88n/a def __str__(self):
89n/a if self.bool:
90n/a return "True"
91n/a else:
92n/a return "False"
93n/a
94n/a def __aepack__(self):
95n/a return pack(struct.pack('b', self.bool), 'bool')
96n/a
97n/adef IsBoolean(x):
98n/a return isinstance(x, Boolean)
99n/a
100n/adef mkboolean(bool):
101n/a if IsBoolean(bool): return bool
102n/a return Boolean(bool)
103n/a
104n/aclass Type:
105n/a """An AE 4-char typename object"""
106n/a
107n/a def __init__(self, type):
108n/a self.type = "%-4.4s" % str(type)
109n/a
110n/a def __repr__(self):
111n/a return "Type(%r)" % (self.type,)
112n/a
113n/a def __str__(self):
114n/a return string.strip(self.type)
115n/a
116n/a def __aepack__(self):
117n/a return pack(self.type, typeType)
118n/a
119n/adef IsType(x):
120n/a return isinstance(x, Type)
121n/a
122n/adef mktype(type):
123n/a if IsType(type): return type
124n/a return Type(type)
125n/a
126n/a
127n/aclass Keyword:
128n/a """An AE 4-char keyword object"""
129n/a
130n/a def __init__(self, keyword):
131n/a self.keyword = "%-4.4s" % str(keyword)
132n/a
133n/a def __repr__(self):
134n/a return "Keyword(%r)" % repr(self.keyword)
135n/a
136n/a def __str__(self):
137n/a return string.strip(self.keyword)
138n/a
139n/a def __aepack__(self):
140n/a return pack(self.keyword, typeKeyword)
141n/a
142n/adef IsKeyword(x):
143n/a return isinstance(x, Keyword)
144n/a
145n/aclass Range:
146n/a """An AE range object"""
147n/a
148n/a def __init__(self, start, stop):
149n/a self.start = start
150n/a self.stop = stop
151n/a
152n/a def __repr__(self):
153n/a return "Range(%r, %r)" % (self.start, self.stop)
154n/a
155n/a def __str__(self):
156n/a return "%s thru %s" % (nice(self.start), nice(self.stop))
157n/a
158n/a def __aepack__(self):
159n/a return pack({'star': self.start, 'stop': self.stop}, 'rang')
160n/a
161n/adef IsRange(x):
162n/a return isinstance(x, Range)
163n/a
164n/aclass Comparison:
165n/a """An AE Comparison"""
166n/a
167n/a def __init__(self, obj1, relo, obj2):
168n/a self.obj1 = obj1
169n/a self.relo = "%-4.4s" % str(relo)
170n/a self.obj2 = obj2
171n/a
172n/a def __repr__(self):
173n/a return "Comparison(%r, %r, %r)" % (self.obj1, self.relo, self.obj2)
174n/a
175n/a def __str__(self):
176n/a return "%s %s %s" % (nice(self.obj1), string.strip(self.relo), nice(self.obj2))
177n/a
178n/a def __aepack__(self):
179n/a return pack({'obj1': self.obj1,
180n/a 'relo': mkenum(self.relo),
181n/a 'obj2': self.obj2},
182n/a 'cmpd')
183n/a
184n/adef IsComparison(x):
185n/a return isinstance(x, Comparison)
186n/a
187n/aclass NComparison(Comparison):
188n/a # The class attribute 'relo' must be set in a subclass
189n/a
190n/a def __init__(self, obj1, obj2):
191n/a Comparison.__init__(obj1, self.relo, obj2)
192n/a
193n/aclass Ordinal:
194n/a """An AE Ordinal"""
195n/a
196n/a def __init__(self, abso):
197n/a# self.obj1 = obj1
198n/a self.abso = "%-4.4s" % str(abso)
199n/a
200n/a def __repr__(self):
201n/a return "Ordinal(%r)" % (self.abso,)
202n/a
203n/a def __str__(self):
204n/a return "%s" % (string.strip(self.abso))
205n/a
206n/a def __aepack__(self):
207n/a return pack(self.abso, 'abso')
208n/a
209n/adef IsOrdinal(x):
210n/a return isinstance(x, Ordinal)
211n/a
212n/aclass NOrdinal(Ordinal):
213n/a # The class attribute 'abso' must be set in a subclass
214n/a
215n/a def __init__(self):
216n/a Ordinal.__init__(self, self.abso)
217n/a
218n/aclass Logical:
219n/a """An AE logical expression object"""
220n/a
221n/a def __init__(self, logc, term):
222n/a self.logc = "%-4.4s" % str(logc)
223n/a self.term = term
224n/a
225n/a def __repr__(self):
226n/a return "Logical(%r, %r)" % (self.logc, self.term)
227n/a
228n/a def __str__(self):
229n/a if type(self.term) == ListType and len(self.term) == 2:
230n/a return "%s %s %s" % (nice(self.term[0]),
231n/a string.strip(self.logc),
232n/a nice(self.term[1]))
233n/a else:
234n/a return "%s(%s)" % (string.strip(self.logc), nice(self.term))
235n/a
236n/a def __aepack__(self):
237n/a return pack({'logc': mkenum(self.logc), 'term': self.term}, 'logi')
238n/a
239n/adef IsLogical(x):
240n/a return isinstance(x, Logical)
241n/a
242n/aclass StyledText:
243n/a """An AE object respresenting text in a certain style"""
244n/a
245n/a def __init__(self, style, text):
246n/a self.style = style
247n/a self.text = text
248n/a
249n/a def __repr__(self):
250n/a return "StyledText(%r, %r)" % (self.style, self.text)
251n/a
252n/a def __str__(self):
253n/a return self.text
254n/a
255n/a def __aepack__(self):
256n/a return pack({'ksty': self.style, 'ktxt': self.text}, 'STXT')
257n/a
258n/adef IsStyledText(x):
259n/a return isinstance(x, StyledText)
260n/a
261n/aclass AEText:
262n/a """An AE text object with style, script and language specified"""
263n/a
264n/a def __init__(self, script, style, text):
265n/a self.script = script
266n/a self.style = style
267n/a self.text = text
268n/a
269n/a def __repr__(self):
270n/a return "AEText(%r, %r, %r)" % (self.script, self.style, self.text)
271n/a
272n/a def __str__(self):
273n/a return self.text
274n/a
275n/a def __aepack__(self):
276n/a return pack({keyAEScriptTag: self.script, keyAEStyles: self.style,
277n/a keyAEText: self.text}, typeAEText)
278n/a
279n/adef IsAEText(x):
280n/a return isinstance(x, AEText)
281n/a
282n/aclass IntlText:
283n/a """A text object with script and language specified"""
284n/a
285n/a def __init__(self, script, language, text):
286n/a self.script = script
287n/a self.language = language
288n/a self.text = text
289n/a
290n/a def __repr__(self):
291n/a return "IntlText(%r, %r, %r)" % (self.script, self.language, self.text)
292n/a
293n/a def __str__(self):
294n/a return self.text
295n/a
296n/a def __aepack__(self):
297n/a return pack(struct.pack('hh', self.script, self.language)+self.text,
298n/a typeIntlText)
299n/a
300n/adef IsIntlText(x):
301n/a return isinstance(x, IntlText)
302n/a
303n/aclass IntlWritingCode:
304n/a """An object representing script and language"""
305n/a
306n/a def __init__(self, script, language):
307n/a self.script = script
308n/a self.language = language
309n/a
310n/a def __repr__(self):
311n/a return "IntlWritingCode(%r, %r)" % (self.script, self.language)
312n/a
313n/a def __str__(self):
314n/a return "script system %d, language %d"%(self.script, self.language)
315n/a
316n/a def __aepack__(self):
317n/a return pack(struct.pack('hh', self.script, self.language),
318n/a typeIntlWritingCode)
319n/a
320n/adef IsIntlWritingCode(x):
321n/a return isinstance(x, IntlWritingCode)
322n/a
323n/aclass QDPoint:
324n/a """A point"""
325n/a
326n/a def __init__(self, v, h):
327n/a self.v = v
328n/a self.h = h
329n/a
330n/a def __repr__(self):
331n/a return "QDPoint(%r, %r)" % (self.v, self.h)
332n/a
333n/a def __str__(self):
334n/a return "(%d, %d)"%(self.v, self.h)
335n/a
336n/a def __aepack__(self):
337n/a return pack(struct.pack('hh', self.v, self.h),
338n/a typeQDPoint)
339n/a
340n/adef IsQDPoint(x):
341n/a return isinstance(x, QDPoint)
342n/a
343n/aclass QDRectangle:
344n/a """A rectangle"""
345n/a
346n/a def __init__(self, v0, h0, v1, h1):
347n/a self.v0 = v0
348n/a self.h0 = h0
349n/a self.v1 = v1
350n/a self.h1 = h1
351n/a
352n/a def __repr__(self):
353n/a return "QDRectangle(%r, %r, %r, %r)" % (self.v0, self.h0, self.v1, self.h1)
354n/a
355n/a def __str__(self):
356n/a return "(%d, %d)-(%d, %d)"%(self.v0, self.h0, self.v1, self.h1)
357n/a
358n/a def __aepack__(self):
359n/a return pack(struct.pack('hhhh', self.v0, self.h0, self.v1, self.h1),
360n/a typeQDRectangle)
361n/a
362n/adef IsQDRectangle(x):
363n/a return isinstance(x, QDRectangle)
364n/a
365n/aclass RGBColor:
366n/a """An RGB color"""
367n/a
368n/a def __init__(self, r, g, b):
369n/a self.r = r
370n/a self.g = g
371n/a self.b = b
372n/a
373n/a def __repr__(self):
374n/a return "RGBColor(%r, %r, %r)" % (self.r, self.g, self.b)
375n/a
376n/a def __str__(self):
377n/a return "0x%x red, 0x%x green, 0x%x blue"% (self.r, self.g, self.b)
378n/a
379n/a def __aepack__(self):
380n/a return pack(struct.pack('hhh', self.r, self.g, self.b),
381n/a typeRGBColor)
382n/a
383n/adef IsRGBColor(x):
384n/a return isinstance(x, RGBColor)
385n/a
386n/aclass ObjectSpecifier:
387n/a
388n/a """A class for constructing and manipulation AE object specifiers in python.
389n/a
390n/a An object specifier is actually a record with four fields:
391n/a
392n/a key type description
393n/a --- ---- -----------
394n/a
395n/a 'want' type 4-char class code of thing we want,
396n/a e.g. word, paragraph or property
397n/a
398n/a 'form' enum how we specify which 'want' thing(s) we want,
399n/a e.g. by index, by range, by name, or by property specifier
400n/a
401n/a 'seld' any which thing(s) we want,
402n/a e.g. its index, its name, or its property specifier
403n/a
404n/a 'from' object the object in which it is contained,
405n/a or null, meaning look for it in the application
406n/a
407n/a Note that we don't call this class plain "Object", since that name
408n/a is likely to be used by the application.
409n/a """
410n/a
411n/a def __init__(self, want, form, seld, fr = None):
412n/a self.want = want
413n/a self.form = form
414n/a self.seld = seld
415n/a self.fr = fr
416n/a
417n/a def __repr__(self):
418n/a s = "ObjectSpecifier(%r, %r, %r" % (self.want, self.form, self.seld)
419n/a if self.fr:
420n/a s = s + ", %r)" % (self.fr,)
421n/a else:
422n/a s = s + ")"
423n/a return s
424n/a
425n/a def __aepack__(self):
426n/a return pack({'want': mktype(self.want),
427n/a 'form': mkenum(self.form),
428n/a 'seld': self.seld,
429n/a 'from': self.fr},
430n/a 'obj ')
431n/a
432n/adef IsObjectSpecifier(x):
433n/a return isinstance(x, ObjectSpecifier)
434n/a
435n/a
436n/a# Backwards compatibility, sigh...
437n/aclass Property(ObjectSpecifier):
438n/a
439n/a def __init__(self, which, fr = None, want='prop'):
440n/a ObjectSpecifier.__init__(self, want, 'prop', mktype(which), fr)
441n/a
442n/a def __repr__(self):
443n/a if self.fr:
444n/a return "Property(%r, %r)" % (self.seld.type, self.fr)
445n/a else:
446n/a return "Property(%r)" % (self.seld.type,)
447n/a
448n/a def __str__(self):
449n/a if self.fr:
450n/a return "Property %s of %s" % (str(self.seld), str(self.fr))
451n/a else:
452n/a return "Property %s" % str(self.seld)
453n/a
454n/a
455n/aclass NProperty(ObjectSpecifier):
456n/a # Subclasses *must* self baseclass attributes:
457n/a # want is the type of this property
458n/a # which is the property name of this property
459n/a
460n/a def __init__(self, fr = None):
461n/a #try:
462n/a # dummy = self.want
463n/a #except:
464n/a # self.want = 'prop'
465n/a self.want = 'prop'
466n/a ObjectSpecifier.__init__(self, self.want, 'prop',
467n/a mktype(self.which), fr)
468n/a
469n/a def __repr__(self):
470n/a rv = "Property(%r" % (self.seld.type,)
471n/a if self.fr:
472n/a rv = rv + ", fr=%r" % (self.fr,)
473n/a if self.want != 'prop':
474n/a rv = rv + ", want=%r" % (self.want,)
475n/a return rv + ")"
476n/a
477n/a def __str__(self):
478n/a if self.fr:
479n/a return "Property %s of %s" % (str(self.seld), str(self.fr))
480n/a else:
481n/a return "Property %s" % str(self.seld)
482n/a
483n/a
484n/aclass SelectableItem(ObjectSpecifier):
485n/a
486n/a def __init__(self, want, seld, fr = None):
487n/a t = type(seld)
488n/a if t == StringType:
489n/a form = 'name'
490n/a elif IsRange(seld):
491n/a form = 'rang'
492n/a elif IsComparison(seld) or IsLogical(seld):
493n/a form = 'test'
494n/a elif t == TupleType:
495n/a # Breakout: specify both form and seld in a tuple
496n/a # (if you want ID or rele or somesuch)
497n/a form, seld = seld
498n/a else:
499n/a form = 'indx'
500n/a ObjectSpecifier.__init__(self, want, form, seld, fr)
501n/a
502n/a
503n/aclass ComponentItem(SelectableItem):
504n/a # Derived classes *must* set the *class attribute* 'want' to some constant
505n/a # Also, dictionaries _propdict and _elemdict must be set to map property
506n/a # and element names to the correct classes
507n/a
508n/a _propdict = {}
509n/a _elemdict = {}
510n/a def __init__(self, which, fr = None):
511n/a SelectableItem.__init__(self, self.want, which, fr)
512n/a
513n/a def __repr__(self):
514n/a if not self.fr:
515n/a return "%s(%r)" % (self.__class__.__name__, self.seld)
516n/a return "%s(%r, %r)" % (self.__class__.__name__, self.seld, self.fr)
517n/a
518n/a def __str__(self):
519n/a seld = self.seld
520n/a if type(seld) == StringType:
521n/a ss = repr(seld)
522n/a elif IsRange(seld):
523n/a start, stop = seld.start, seld.stop
524n/a if type(start) == InstanceType == type(stop) and \
525n/a start.__class__ == self.__class__ == stop.__class__:
526n/a ss = str(start.seld) + " thru " + str(stop.seld)
527n/a else:
528n/a ss = str(seld)
529n/a else:
530n/a ss = str(seld)
531n/a s = "%s %s" % (self.__class__.__name__, ss)
532n/a if self.fr: s = s + " of %s" % str(self.fr)
533n/a return s
534n/a
535n/a def __getattr__(self, name):
536n/a if name in self._elemdict:
537n/a cls = self._elemdict[name]
538n/a return DelayedComponentItem(cls, self)
539n/a if name in self._propdict:
540n/a cls = self._propdict[name]
541n/a return cls(self)
542n/a raise AttributeError, name
543n/a
544n/a
545n/aclass DelayedComponentItem:
546n/a def __init__(self, compclass, fr):
547n/a self.compclass = compclass
548n/a self.fr = fr
549n/a
550n/a def __call__(self, which):
551n/a return self.compclass(which, self.fr)
552n/a
553n/a def __repr__(self):
554n/a return "%s(???, %r)" % (self.__class__.__name__, self.fr)
555n/a
556n/a def __str__(self):
557n/a return "selector for element %s of %s"%(self.__class__.__name__, str(self.fr))
558n/a
559n/atemplate = """
560n/aclass %s(ComponentItem): want = '%s'
561n/a"""
562n/a
563n/aexec template % ("Text", 'text')
564n/aexec template % ("Character", 'cha ')
565n/aexec template % ("Word", 'cwor')
566n/aexec template % ("Line", 'clin')
567n/aexec template % ("paragraph", 'cpar')
568n/aexec template % ("Window", 'cwin')
569n/aexec template % ("Document", 'docu')
570n/aexec template % ("File", 'file')
571n/aexec template % ("InsertionPoint", 'cins')