buildframework/helium/sf/python/pythoncore/lib/rtfutils.py
author wbernard
Tue, 27 Apr 2010 08:33:08 +0300
changeset 587 85df38eb4012
child 588 c7c26511138f
permissions -rw-r--r--
helium_9.0-a7879c935424
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
#============================================================================ 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
#Name        : rtfutils.py 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
#Part of     : Helium 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
#All rights reserved.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
#This component and the accompanying materials are made available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
#under the terms of the License "Eclipse Public License v1.0"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
#which accompanies this distribution, and is available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
#at the URL "http://www.eclipse.org/legal/epl-v10.html".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
#Initial Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
#Nokia Corporation - initial contribution.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
#Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
#Description:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
#===============================================================================
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    19
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    20
import csv
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    21
import os
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    22
import PyRTF
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    23
import StringIO
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    24
import re
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    25
import logging
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    26
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    27
class RTFUtils(object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
    """ RTF utility module """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
    def __init__(self, template):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
        """ template would be a RTF file to modify """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
        self.template = template
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    33
        self.logger = logging.getLogger('test.relnotes')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    34
        logging.basicConfig(level=logging.DEBUG)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
    def rtftable(self, errorsfilename, outputfilename, tagtoreplace):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
        """ Create a .rtf file from the errors.csv file. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    39
        errors = file(errorsfilename, 'rb')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
        template = file(self.template, 'rb' )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    41
        output = file(outputfilename, 'w' )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    42
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
        self._rtftable(errors, output, tagtoreplace, template)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    44
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    45
        errors.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
        output.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
        template.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
    def _rtftable(self, errors, output, tagtoreplace, template):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
        PyRTF.Elements.StandardColours.append(PyRTF.PropertySets.Colour('NokiaBlue', 153, 204, 255))    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
       
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
        DR = PyRTF.Renderer()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
        doc     = PyRTF.Document()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
        ss      = doc.StyleSheet
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
        section = PyRTF.Section()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
        doc.Sections.append( section )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
        table = PyRTF.Table( PyRTF.TabPS.DEFAULT_WIDTH * 7,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
                             PyRTF.TabPS.DEFAULT_WIDTH * 3,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
                             PyRTF.TabPS.DEFAULT_WIDTH * 3 )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
                       
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
        reader = csv.reader(errors)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    64
        style = None    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
        for row in reader:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
            assert len(row) == 3
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
            if style == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
                style = ss.ParagraphStyles.Heading2
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
                style = ss.ParagraphStyles.Normal
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
            # Handle each value from the row
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
            rowcell = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
            for value in row:           
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
                cell = PyRTF.Text( value )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    78
                rowcell.append(PyRTF.Cell( PyRTF.Paragraph(style, cell) ))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
            table.AddRow( *rowcell )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
        section.append( table )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
        string = StringIO.StringIO()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
        DR.Write( doc, string )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
        keep = ''
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    86
        for line in string.getvalue().splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    87
            if keep != '' or line.startswith('{\\trowd'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    88
                keep += line
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
                    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
        #remove last '}'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
        keep = keep[0:-1]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
        for line in template:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
            line = line.replace(tagtoreplace, keep)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
            output.write(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    96
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    97
    def rtfimage(self, image, outputfilename, tagtoreplace):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    98
        """ Replaces tagtoreplace in a RTF file with a image """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    99
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   100
        template = file(self.template, 'rb' )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   101
        output = file(outputfilename, 'w' )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   102
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   103
        self._rtfimage(image, output, tagtoreplace, template)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
        output.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
        template.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
    def _rtfimage(self, image, output, tagtoreplace, template):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
        TEMP_FILE = 'image_temp.rtf'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
        DR = PyRTF.Renderer()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
        doc = PyRTF.Document()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
        ss = doc.StyleSheet
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   114
        section = PyRTF.Section()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   115
        doc.Sections.append( section )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   116
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   117
        section.append( PyRTF.Image( image ) )    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
        tempOutput = file( TEMP_FILE, 'w' )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   120
        DR.Write( doc, tempOutput )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   122
        tempOutput = file( TEMP_FILE, 'rb' )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
        keep = ''
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
        for line in tempOutput:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
            if keep != '':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
                keep += line
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
            elif line.startswith('{\pict'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
                keep = line
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   130
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
        #remove last '}'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   132
        keep = keep[0:-1]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   133
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   134
        tempOutput.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   135
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   136
        for line in template:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   137
            line = line.replace(tagtoreplace, keep)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   138
            output.write(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   139
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   140
        os.remove(TEMP_FILE)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   141
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   142
    def rtfconvert(self, inputfilename, outputfilename):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   143
        """ Converts a property file to be RTF link syntax """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   144
        inputfile = file( inputfilename, 'r' )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   145
        outputfile = file( outputfilename, 'w' )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   146
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   147
        self._rtfconvert(inputfile, outputfile)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   148
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   149
        inputfile.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   150
        outputfile.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   151
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   152
    def _rtfconvert(self, inputfile, outputfile):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   153
        p = re.compile(r'(.+=)((\\\\|http|\.\\|ftp)(.+))')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   154
        for line in inputfile:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   155
            newline = line
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   156
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   157
            #fix bad links generated in ant
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   158
            if newline.count('\\\\')>0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   159
                newline = newline.replace('//','\\')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   160
                newline = newline.replace('/','\\')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   161
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   162
            if "\\n" in newline:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   163
                newline = newline.replace("\\n", " \\\\line ")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   164
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   165
                newline = newline.replace('\\','\\\\\\\\\\\\\\\\')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   166
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   167
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   168
            newline = p.sub('\g<1>{_backslash_field{_backslash_*_backslash_fldinst HYPERLINK \g<2>}}', newline)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   169
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   170
            newline = newline.replace('_backslash_', r'\\')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   171
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   172
            outputfile.write(newline)