source: OpenRLabs-Git/deploy/rlabs-docker/web2py-rlabs/gluon/contrib/pyrtf/PropertySets.py

main
Last change on this file was 42bd667, checked in by David Fuertes <dfuertes@…>, 4 years ago

Historial Limpio

  • Property mode set to 100755
File size: 13.7 KB
Line 
1"""
2PropertySets group common attributes together, each property set is used to control a specific part of the rendering.
3
4PropertySets can be used in different elements of the document.
5
6For example the FramePropertySet is used in paragraphs, tables, cells, etc.
7
8The TextPropertySet can be used for text or in a Paragraph Style.
9
10"""
11
12from copy import  deepcopy
13
14from .Constants import PY2
15
16if PY2:
17    StringType = basestring
18else:
19    StringType = str
20
21#
22#   We need some basic Type like fonts, colours and paper definitions
23#
24def MakeAttributeName( value ) :
25    assert value and isinstance(value, StringType)
26    value = value.replace( ' ', '' )
27    return value
28
29class AttributedList( list ) :
30    def __init__( self, accepted_type=None ) :
31        super( AttributedList, self ).__init__()
32        self.AcceptedType = accepted_type
33        self._append = super( AttributedList, self ).append
34
35    def append( self, *values ) :
36        for value in values :
37            if self.AcceptedType : assert isinstance( value, self.AcceptedType )
38
39            self._append( value )
40
41            name = getattr( value, 'Name', None )
42            if name :
43                name = MakeAttributeName( value.Name )
44                setattr( self, name, value )
45
46    def __deepcopy__( self, memo ) :
47        result = self.__class__()
48        result.append( *self[:] )
49        return result
50
51class Colour :
52    def __init__( self, name, red, green, blue ) :
53        self.SetName ( name  )
54        self.SetRed  ( red   )
55        self.SetGreen( green )
56        self.SetBlue ( blue  )
57
58    def SetName( self, value ) :
59        self.Name = value
60        return self
61
62    def SetRed( self, value ) :
63        self.Red = value
64        return self
65
66    def SetGreen( self, value ) :
67        self.Green = value
68        return self
69
70    def SetBlue( self, value ) :
71        self.Blue = value
72        return self
73
74class Colours( AttributedList ) :
75    def __init__( self ) :
76        super( Colours, self ).__init__( Colour )
77
78class Font :
79    def __init__( self, name, family, character_set = 0, pitch = None, panose = None, alternate = None ) :
80        self.SetName        ( name          )
81        self.SetFamily      ( family        )
82        self.SetCharacterSet( character_set )
83        self.SetPitch       ( pitch         )
84        self.SetPanose      ( panose        )
85        self.SetAlternate   ( alternate     )
86
87    def SetName( self, value ) :
88        self.Name = value
89        return self
90
91    def SetFamily( self, value ) :
92        self.Family = value
93        return self
94
95    def SetCharacterSet( self, value ) :
96        self.CharacterSet = value
97        return self
98
99    def SetPitch( self, value ) :
100        self.Pitch = value
101        return self
102
103    def SetPanose( self, value ) :
104        self.Panose = value
105        return self
106
107    def SetAlternate( self, value ) :
108        self.Alternate = value
109        return self
110
111class Fonts( AttributedList ) :
112    def __init__( self ) :
113        super( Fonts, self ).__init__( Font )
114
115class Paper :
116    def __init__( self, name, code, description, width, height ) :
117        self.SetName       ( name        )
118        self.SetCode       ( code        )
119        self.SetDescription( description )
120        self.SetWidth      ( width       )
121        self.SetHeight     ( height      )
122
123    def SetName( self, value ) :
124        self.Name = value
125        return self
126
127    def SetCode( self, value ) :
128        self.Code = value
129        return self
130
131    def SetDescription( self, value ) :
132        self.Description = value
133        return self
134
135    def SetWidth( self, value ) :
136        self.Width = value
137        return self
138
139    def SetHeight( self, value ) :
140        self.Height = value
141        return self
142
143class Papers( AttributedList ) :
144    def __init__( self ) :
145        super( Papers, self ).__init__( Paper )
146
147#
148#   Then we have property sets which represent different aspects of Styles
149#
150class MarginsPropertySet :
151    def __init__( self, top=None, left=None, bottom=None, right=None ) :
152        self.SetTop   ( top    )
153        self.SetLeft  ( left   )
154        self.SetBottom( bottom )
155        self.SetRight ( right  )
156
157    def SetTop( self, value ) :
158        self.Top = value
159        return self
160
161    def SetLeft( self, value ) :
162        self.Left = value
163        return self
164
165    def SetBottom( self, value ) :
166        self.Bottom = value
167        return self
168
169    def SetRight( self, value ) :
170        self.Right = value
171        return self
172
173class ShadingPropertySet :
174    HORIZONTAL             =  1
175    VERTICAL               =  2
176    FORWARD_DIAGONAL       =  3
177    BACKWARD_DIAGONAL      =  4
178    VERTICAL_CROSS         =  5
179    DIAGONAL_CROSS         =  6
180    DARK_HORIZONTAL        =  7
181    DARK_VERTICAL          =  8
182    DARK_FORWARD_DIAGONAL  =  9
183    DARK_BACKWARD_DIAGONAL = 10
184    DARK_VERTICAL_CROSS    = 11
185    DARK_DIAGONAL_CROSS    = 12
186    PATTERNS = [ HORIZONTAL,
187                 VERTICAL,
188                 FORWARD_DIAGONAL,
189                 BACKWARD_DIAGONAL,
190                 VERTICAL_CROSS,
191                 DIAGONAL_CROSS,
192                 DARK_HORIZONTAL,
193                 DARK_VERTICAL,
194                 DARK_FORWARD_DIAGONAL,
195                 DARK_BACKWARD_DIAGONAL,
196                 DARK_VERTICAL_CROSS,
197                 DARK_DIAGONAL_CROSS ]
198
199    def __init__( self, shading=None, pattern=None, foreground=None, background=None ) :
200        self.SetShading   ( shading    )
201        self.SetForeground( foreground )
202        self.SetBackground( background )
203        self.SetPattern   ( pattern    )
204
205    def __deepcopy__( self, memo ) :
206        return ShadingPropertySet( self.Shading,
207                                   self.Foreground,
208                                   self.Background,
209                                   self.Pattern )
210
211    def SetShading( self, value ) :
212        self.Shading = value
213        return self
214
215    def SetPattern( self, value ) :
216        assert value is None or value in self.PATTERNS
217        self.Pattern = value
218        return self
219
220    def SetForeground( self, value ) :
221        assert not value or isinstance( value, Colour )
222        self.Foreground = value
223        return self
224
225    def SetBackground( self, value ) :
226        assert not value or isinstance( value, Colour )
227        self.Background = value
228        return self
229
230
231class BorderPropertySet :
232    SINGLE    = 1
233    DOUBLE    = 2
234    SHADOWED  = 3
235    DOUBLED   = 4
236    DOTTED    = 5
237    DASHED    = 6
238    HAIRLINE  = 7
239    STYLES    = [ SINGLE, DOUBLE, SHADOWED, DOUBLED, DOTTED, DASHED, HAIRLINE ]
240
241    def __init__( self, width=None, style=None, colour=None, spacing=None ) :
242        self.SetWidth  ( width   )
243        self.SetStyle  ( style or self.SINGLE )
244        self.SetColour ( colour  )
245        self.SetSpacing( spacing )
246
247    def SetWidth( self, value ) :
248        self.Width = value
249        return self
250
251    def SetStyle( self, value ) :
252        assert value is None or value in self.STYLES
253        self.Style = value
254        return self
255
256    def SetColour( self, value ) :
257        assert value is None or isinstance( value, Colour )
258        self.Colour = value
259        return self
260
261    def SetSpacing( self, value ) :
262        self.Spacing = value
263        return self
264
265class FramePropertySet :
266    def __init__( self, top=None, left=None, bottom=None, right=None ) :
267        self.SetTop   ( top    )
268        self.SetLeft  ( left   )
269        self.SetBottom( bottom )
270        self.SetRight ( right  )
271
272    def SetTop( self, value ) :
273        assert value is None or isinstance( value, BorderPropertySet )
274        self.Top = value
275        return self
276
277    def SetLeft( self, value ) :
278        assert value is None or isinstance( value, BorderPropertySet )
279        self.Left = value
280        return self
281
282    def SetBottom( self, value ) :
283        assert value is None or isinstance( value, BorderPropertySet )
284        self.Bottom = value
285        return self
286
287    def SetRight( self, value ) :
288        assert value is None or isinstance( value, BorderPropertySet )
289        self.Right = value
290        return self
291
292class TabPropertySet :
293    DEFAULT_WIDTH = 720
294
295    LEFT      = 1
296    RIGHT     = 2
297    CENTER    = 3
298    DECIMAL   = 4
299    ALIGNMENT = [ LEFT, RIGHT, CENTER, DECIMAL ]
300
301    DOTS        = 1
302    HYPHENS     = 2
303    UNDERLINE   = 3
304    THICK_LINE  = 4
305    EQUAL_SIGN  = 5
306    LEADERS = [ DOTS, HYPHENS, UNDERLINE, THICK_LINE, EQUAL_SIGN ]
307
308    def __init__( self, width=None, alignment=None, leader=None ) :
309        self.SetWidth    ( width     )
310        self.SetAlignment( alignment or self.LEFT )
311        self.SetLeader   ( leader    )
312
313    def SetWidth( self, value ) :
314        self.Width = value
315        return self
316
317    def SetAlignment( self, value ) :
318        assert value in self.ALIGNMENT
319        self.Alignment = value
320        return self
321
322    def SetLeader( self, value ) :
323        assert not value or value in self.LEADERS
324        self.Leader = value
325        return self
326
327class TextPropertySet :
328
329    def __init__( self, font=None, size=None, bold=None, italic=None, underline=None, colour=None, frame=None, expansion=None ) :
330        self.SetFont         ( font )
331        self.SetSize         ( size )
332
333        self.SetBold         ( bold      or False )
334        self.SetItalic       ( italic    or False )
335        self.SetUnderline    ( underline or False )
336
337        self.SetColour( colour )
338        self.SetFrame ( frame  )
339
340        self.SetStrikeThrough  ( False )
341        self.SetDottedUnderline( False )
342        self.SetDoubleUnderline( False )
343        self.SetWordUnderline  ( False )
344        self.SetExpansion      ( expansion )
345
346    def Copy( self ) :
347        return deepcopy( self )
348
349    def __deepcopy__( self, memo ) :
350        #   the font must remain a reference to the same font that we are looking at
351        #   so we want to stop the recursiveness at this point and return an object
352        #   with the right references.
353        result = TextPropertySet( self.Font,
354                                  self.Size,
355                                  self.Bold,
356                                  self.Italic,
357                                  self.Underline,
358                                  self.Colour,
359                                  deepcopy( self.Frame, memo ) )
360        result.SetStrikeThrough( self.StrikeThrough )
361        return result
362
363    def SetFont( self, value ) :
364        assert not value or isinstance( value, Font )
365        self.Font = value
366        return self
367
368    def SetSize( self, value ) :
369        self.Size = value
370        return self
371
372    def SetBold( self, value ) :
373        self.Bold = False
374        if value : self.Bold = True
375        return self
376
377    def SetItalic( self, value ) :
378        self.Italic = False
379        if value : self.Italic = True
380        return self
381
382    def SetUnderline( self, value ) :
383        self.Underline = False
384        if value : self.Underline = True
385        return self
386
387    def SetColour( self, value ) :
388        assert value is None or isinstance( value, Colour )
389        self.Colour = value
390        return self
391
392    def SetFrame( self, value ) :
393        assert value is None or isinstance( value, BorderPropertySet )
394        self.Frame = value
395        return self
396
397    def SetStrikeThrough( self, value ) :
398        self.StrikeThrough = False
399        if value : self.StrikeThrough = True
400        return self
401
402    def SetDottedUnderline( self, value ) :
403        self.DottedUnderline = False
404        if value : self.DottedUnderline = True
405        return self
406
407    def SetDoubleUnderline( self, value ) :
408        self.DoubleUnderline = False
409        if value : self.DoubleUnderline = True
410        return self
411
412    def SetWordUnderline( self, value ) :
413        self.WordUnderline = False
414        if value : self.WordUnderline = True
415        return self
416
417    def SetExpansion( self, value ) :
418        self.Expansion = value
419        return self
420
421class ParagraphPropertySet :
422    LEFT       = 1
423    RIGHT      = 2
424    CENTER     = 3
425    JUSTIFY    = 4
426    DISTRIBUTE = 5
427    ALIGNMENT  = [ LEFT, RIGHT, CENTER, JUSTIFY, DISTRIBUTE ]
428
429    def __init__( self, alignment=None, space_before=None, space_after=None, tabs=None, first_line_indent=None, left_indent=None, right_indent=None, page_break_before=None ) :
430        self.SetAlignment  ( alignment or self.LEFT )
431        self.SetSpaceBefore( space_before )
432        self.SetSpaceAfter ( space_after  )
433
434        self.Tabs = []
435        if tabs : self.SetTabs(*tabs)
436
437        self.SetFirstLineIndent( first_line_indent or None )
438        self.SetLeftIndent     ( left_indent or None )
439        self.SetRightIndent    ( right_indent or None )
440
441        self.SetPageBreakBefore( page_break_before )
442
443        self.SetSpaceBetweenLines( None )
444
445    def Copy( self ) :
446        return deepcopy( self )
447
448    def SetAlignment( self, value ) :
449        assert not value or value in self.ALIGNMENT
450        self.Alignment = value or self.LEFT
451        return self
452
453    def SetSpaceBefore( self, value ) :
454        self.SpaceBefore = value
455        return self
456
457    def SetSpaceAfter( self, value ) :
458        self.SpaceAfter = value
459        return self
460
461    def SetTabs( self, *params ) :
462        self.Tabs = params
463        return self
464
465    def SetFirstLineIndent( self, value ) :
466        self.FirstLineIndent = value
467        return self
468
469    def SetLeftIndent( self, value ) :
470        self.LeftIndent = value
471        return self
472
473    def SetRightIndent( self, value ) :
474        self.RightIndent = value
475        return self
476
477    def SetSpaceBetweenLines( self, value ) :
478        self.SpaceBetweenLines = value
479        return self
480
481    def SetPageBreakBefore( self, value ) :
482        self.PageBreakBefore = False
483        if value : self.PageBreakBefore = True
484        return self
485
486#   Some short cuts to make the code a bit easier to read
487MarginsPS   = MarginsPropertySet
488ShadingPS   = ShadingPropertySet
489BorderPS    = BorderPropertySet
490FramePS     = FramePropertySet
491TabPS       = TabPropertySet
492TextPS      = TextPropertySet
493ParagraphPS = ParagraphPropertySet
494
Note: See TracBrowser for help on using the repository browser.