src/cm/converters/oo_converters.py
author reno
Tue, 08 Dec 2009 16:51:48 +0100
changeset 24 c8a95e540b79
parent 0 40c8f766c9b8
child 51 321f4057eb78
permissions -rw-r--r--
ENH : adding comments on previous version now possible
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
# warning : oo server autolaunch is tricky
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
# make sure .qt .kde .openoffice.org2 should be writable in home directory
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
# for instance, if working user is www-data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
#   mkdir /var/www/.openoffice.org2 ; chown www-data:www-data /var/www/.openoffice.org2
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
#   mkdir /var/www/.qt ; chown www-data:www-data /var/www/.qt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
#   mkdir /var/www/.kde ; chown www-data:www-data /var/www/.kde
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 0
diff changeset
     8
UNO_IMPORT = False
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
if UNO_IMPORT:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
    import uno
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
# old ubuntu bug left for the record
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
#    print "#### Uno import failed ! #### "
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
#    print "#### https://bugs.launchpad.net/ubuntu/+source/openoffice.org2/+bug/139077 #### "
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
#    print "#### launch : sudo ldconfig -v /usr/lib/openoffice/program #### "
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
from cm.utils.thread import synchronized, daemonize
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
if UNO_IMPORT:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
    from com.sun.star.beans import PropertyValue
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
from datetime import datetime
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
from subprocess import Popen,call
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
from tempfile import mkstemp,mkdtemp
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
if UNO_IMPORT:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
    from unohelper import systemPathToFileUrl, absolutize
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
from xml.dom.minidom import parseString
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
import cStringIO
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
import chardet
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
import sys
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
import magic
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
import os,re
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
import random
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
import threading
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
import time
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
import logging
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
CONN_STRING = "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
KILL = 'killall -KILL xvfb-run ; killall -KILL soffice; killall -KILL soffice.bin; killall -KILL Xvfb'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
RM = 'rm -f /tmp/.X99-lock'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
LAUNCH = 'xvfb-run soffice -headless "-accept=socket,port=2002;urp;"'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
# xvfb-run soffice -headless "-accept=socket,port=2002;urp;";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
#  soffice "-accept=socket,port=2002;urp;";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
ms = magic.open(magic.MAGIC_NONE)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
ms.load()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
def is_text(buffer):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
    type = ms.buffer(buffer)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
    return ' text, ' in type
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
def fix_text_encoding(buffer, to_encoding = 'utf-8'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
    detected = chardet.detect(buffer)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
    encoding = detected['encoding']
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
    if encoding != to_encoding:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
        return buffer.decode(encoding).encode(to_encoding)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
    return buffer
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
# $$$ RBE TODO fix_content a call should be made before oo_convert call when importing text file with non utf-8 encoding todo test that to make it crash     
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
def fix_content(buffer):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
    Fix content fixes :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
    - encoding to utf8 to txt files
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
    try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
        if is_text(buffer):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
            return fix_text_encoding(buffer)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
        return buffer
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
    except:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
        return buffer
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
processing = 0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
# timeout : kill oo
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
PROCESSING_TIMEOUT = 20.0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
def oo_process_controller(code):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
    If 'code' process is still active : kill oo 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
    global processing
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
    logging.info('oo_process_controller')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
    if processing == code:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
        logging.error('--> oo_process_controller : killing !')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
        kill_oo()        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
def kill_oo():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
    logging.info('killing')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
    p = Popen(KILL, shell=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
    sts = os.waitpid(p.pid, 0)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
    p = Popen(RM, shell=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
    sts = os.waitpid(p.pid, 0)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
def launch_oo():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
    logging.info('launching')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
    p = Popen(LAUNCH, shell=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
def kill_and_relaunch_oo():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
    kill_oo()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
    launch_oo()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
get_connection_lock = threading.RLock() 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
def start_processing():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
    global processing
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
    logging.info('start_processing')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
    code = random.random()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
    processing = code
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
    t = threading.Timer(PROCESSING_TIMEOUT, oo_process_controller, args = [code,])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
    t.start()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
def end_processing():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
    logging.info('end_processing')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
    global processing
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
    processing = 0 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
@synchronized(get_connection_lock)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
def get_connection(retry = 2):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
    while retry > 0:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
        try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
            localContext = uno.getComponentContext()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
            resolver = localContext.ServiceManager.createInstanceWithContext(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
                            "com.sun.star.bridge.UnoUrlResolver", localContext )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
            ctx = resolver.resolve(CONN_STRING)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
            return ctx
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
        except:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
            retry -= 1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
            kill_and_relaunch_oo()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
            time.sleep(8)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
    raise Exception('could not launch oo, please read README.txt section Openoffice for troubleshooting')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
def get_desktop():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
    ctx = get_connection()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
    smgr = ctx.ServiceManager    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
    # get the central desktop object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
    desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
    return desktop
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
class FmtList:    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
    def __init__(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
        self._list = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
    def add(self, name, extension, summary, filter, export = False, mimetype = None):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
        dd = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
              'name' : name,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
              'extension' : extension,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
              'summary' : summary,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
              'filter' : filter,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
              'export' : export,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
              'mimetype' : mimetype,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
              }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
        self._list.append(dd)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
    def get_filter_by_summary(self, value):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
        return self.get_filter_by('summary', value)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
    def get_filter_by_name(self, value):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
        return self.get_filter_by('name', value)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
    def get_filter_by(self, name, value):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
        res = self.get_by(name, value)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
        if res:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
            return res['filter']
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
        return None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
    def get_by_name(self, value):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
        return self.get_by('name', value)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
    def get_by(self, name, value):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
        for fmt in self._list:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
            if fmt[name] == value:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
                return fmt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
        return None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
    def get_export_formats_tuple(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
        return [(f['summary'],f['name']) for f in self._list if f['export']]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
    def ids_by_summary(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
        return self.ids_by('summary')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
    def ids_by(self, name):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
        return dict([(r[name],r['name']) for r in self._list])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
fmts = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
if UNO_IMPORT:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
    fmts = FmtList()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
    fmts.add('bib', 'bib', 'BibTeX', 'BibTeX_Writer')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
    fmts.add('doc', 'doc', 'Microsoft Word 97/2000/XP', 'MS Word 97', True, 'application/msword')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
    fmts.add('doc6', 'doc', 'Microsoft Word 6.0', 'MS WinWord 6.0')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
    fmts.add('doc95', 'doc', 'Microsoft Word 95', 'MS Word 95')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
    fmts.add('docbook', 'xml', 'DocBook', 'DocBook File')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
    fmts.add('html', 'html', 'HTML Document (OpenOffice.org Writer)', 'HTML (StarWriter)')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
    fmts.add('odt', 'odt', 'Open Document Text', 'writer8', True, 'application/vnd.oasis.opendocument.text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
    fmts.add('ott', 'ott', 'Open Document Text', 'writer8_template')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
    fmts.add('ooxml', 'xml', 'Microsoft Office Open XML', 'MS Word 2003 XML')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
    fmts.add('pdb', 'pdb', 'AportisDoc (Palm)', 'AportisDoc Palm DB')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
    fmts.add('pdf', 'pdf', 'Portable Document Format', 'writer_pdf_Export', True, 'application/pdf')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
    fmts.add('psw', 'psw', 'Pocket Word', 'PocketWord File')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
    fmts.add('rtf', 'rtf', 'Rich Text Format', 'Rich Text Format', True, 'application/rtf')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
    fmts.add('latex', 'ltx', 'LaTeX 2e', 'LaTeX_Writer')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
    fmts.add('sdw', 'sdw', 'StarWriter 5.0', 'StarWriter 5.0')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
    fmts.add('sdw4', 'sdw', 'StarWriter 4.0', 'StarWriter 4.0')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
    fmts.add('sdw3', 'sdw', 'StarWriter 3.0', 'StarWriter 3.0')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
    fmts.add('stw', 'stw', 'Open Office.org 1.0 Text Document Template', 'writer_StarOffice_XML_Writer_Template')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
    fmts.add('sxw', 'sxw', 'Open Office.org 1.0 Text Document', 'StarOffice XML (Writer)')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
    fmts.add('text', 'txt', 'Text Encoded', 'Text (encoded)', True, 'application/txt')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
    fmts.add('txt', 'txt', 'Plain Text', 'Text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
    fmts.add('vor', 'vor', 'StarWriter 5.0 Template', 'StarWriter 5.0 Vorlage/Template')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
    fmts.add('vor4', 'vor', 'StarWriter 4.0 Template', 'StarWriter 4.0 Vorlage/Template')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
    fmts.add('vor3', 'vor', 'StarWriter 3.0 Template', 'StarWriter 3.0 Vorlage/Template')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
    fmts.add('xhtml', 'html', 'XHTML Document', 'XHTML Writer File')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
THE_OUTDIR = "outdir"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
THE_OUTFILE = "outfile"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
THE_INDIR = "indir"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
THE_INFILE = "infile"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
def fix_img_path(html,xhtml,imgs):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
    imgs : name --> path
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
    finder_re = 'src[\s]*=[\s]*\"((?:(?!https?))[^\"]*)\"'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
    len_res_html = len(re.findall(finder_re,html,re.IGNORECASE))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
    len_res_xhtml = len(re.findall(finder_re,xhtml,re.IGNORECASE))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
    res_html = re.finditer(finder_re,html,re.IGNORECASE)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
    res_xhtml = re.finditer(finder_re,xhtml,re.IGNORECASE)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
    result = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
    last_index = 0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
    for match_xhtml in res_xhtml:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
        img_path = '' 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
        try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
            match_html = res_html.next()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
            if match_html:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
                img_name = match_html.group(1)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
                img_path = imgs[img_name]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
        except StopIteration:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
            # TODO : report pb
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
            pass 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
        offset = len(match_xhtml.group(0)) - len(match_xhtml.group(1))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
        result.append(xhtml[last_index:match_xhtml.start() + offset - 1])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
        result.append(img_path)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
        last_index = match_xhtml.end() - 1 # -1 because trailing "
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
    result.append(xhtml[last_index:len(xhtml)])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
    return u''.join(result)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
def extract_css_body(xhtml):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
    dom = parseString(xhtml.encode('utf8'))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
    style = dom.getElementsByTagName("style")[0].toxml()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
    body = dom.getElementsByTagName("body")[0].toxml()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
    # cleanup initial/final tags
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
    style_clean = style[style.find('>')+1:style.rfind('</')]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
    body_clean = body[body.find('>')+1:body.rfind('</')]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
    return style_clean,body_clean
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
convert_lock = threading.RLock() 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
def combine_css_body(body, css):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
    return """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
<html xmlns="http://www.w3.org/1999/xhtml">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
    <head>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
        <style type="text/css">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
            %s
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
        </style>    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
    </head>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
    <body>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
        %s
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
    </body>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
</html>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
""" %(css,body)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
def to_string(input):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
    if type(input) == unicode:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
        input = input.encode('utf8')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
    return input
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
@synchronized(convert_lock)    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
def convert_html(input, format_name, images = None):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
    out_filter = fmts.get_filter_by_name(format_name)    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
    if not out_filter:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
        raise Exception("Unsupported format name %s" %(format_name)) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
    infile = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
    outfile = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
    out_f = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
    try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
        desktop = get_desktop()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
        start_processing()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
                        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
        # create in/out files
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
        temp_dir = mkdtemp(prefix="cm_")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
        # in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
        indir_name = os.path.join(temp_dir, THE_INDIR)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
        os.mkdir(indir_name)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
        infile_name = os.path.join(indir_name, THE_INFILE  + '.html')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
        # out
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
        outdir_name = os.path.join(temp_dir, THE_OUTDIR)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
        os.mkdir(outdir_name)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
        outfile_name = os.path.join(outdir_name, THE_OUTFILE)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
        # write infile 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
        infile = open(infile_name,'w')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
        input = to_string(input)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
        infile.write(input)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
        infile.close()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
        # fix perms
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
        # TODO: group permission should suffice
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
        os.chmod(temp_dir, 0755) # read    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
        os.chmod(indir_name, 0755) # read
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
        os.chmod(infile_name, 0755) # read
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
        os.chmod(outdir_name, 0777) # read / write
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
        inProps = PropertyValue( "Hidden" , 0 , True, 0 ),        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
        doc = desktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, inProps )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
        text   = doc.Text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
        cursor = text.createTextCursor()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
        fileUrl = systemPathToFileUrl(infile_name)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
        cursor.insertDocumentFromURL(fileUrl, ())
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
        properties= (PropertyValue("Hidden", 0, True, 0), PropertyValue("FilterName", 0, out_filter, 0))        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
        doc.storeToURL('file://%s' %outfile_name,tuple(properties))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
        out_f = open(outfile_name,'r')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
        output = out_f.read()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
        return output
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
    finally:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
        end_processing()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
        try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
            if out_f:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
                out_f.close()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
            if infile:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
                infile.close()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
            top = temp_dir
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
            for root, dirs, files in os.walk(top, topdown=False):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
                for name in files:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
                    os.remove(os.path.join(root, name))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
                for name in dirs:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
                    os.rmdir(os.path.join(root, name))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
            os.rmdir(top)            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
        except:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
            # TODO : warn
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
            pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
@synchronized(convert_lock)    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
def convert(input, format_name, unicode = False):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
    logging.info('convert')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
    out_filter = fmts.get_filter_by_name(format_name)    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
    if not out_filter:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
        raise Exception("Unsupported format name %s" %(format_name)) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
    infile = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
    outfile = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
    out_f = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
    try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
        desktop = get_desktop() 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
	    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
        start_processing()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
        # create in/out files
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
        temp_dir = mkdtemp(prefix="cm_")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
        # in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
        indir_name = os.path.join(temp_dir, THE_INDIR)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
        os.mkdir(indir_name)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
        infile_name = os.path.join(indir_name, THE_INFILE)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
        # out
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
        outdir_name = os.path.join(temp_dir, THE_OUTDIR)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
        os.mkdir(outdir_name)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
        outfile_name = os.path.join(outdir_name, THE_OUTFILE)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
        # write infile 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
        infile = open(infile_name,'w')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
        input = to_string(input)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
        infile.write(input)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
        infile.close()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
        # fix perms
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
        # TODO group permission should suffice
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
        os.chmod(temp_dir, 0755) # read        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
        os.chmod(indir_name, 0755) # read        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
        os.chmod(infile_name, 0755) # read
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
        os.chmod(outdir_name, 0777) # read / write
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
        properties = PropertyValue("Hidden", 0, True, 0),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
                       
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
        #import pdb;pdb.set_trace()   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
        doc=desktop.loadComponentFromURL("file://%s" % infile_name, "_blank", 0, properties)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
        properties= (PropertyValue("Hidden", 0, True, 0), PropertyValue("FilterName", 0, out_filter, 0))        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
        doc.storeToURL('file://%s' %outfile_name,tuple(properties))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
        out_f = open(outfile_name,'r')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
        output = out_f.read()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
        # load other files (useful only for html)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
        image_names = [name for name in os.listdir(outdir_name) if name != THE_OUTFILE]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
        img_res = [] 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
        for image_name in image_names:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
              img_res.append(os.path.join(outdir_name, image_name))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
        if unicode:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
            output = output.decode('utf8')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
        return output,img_res
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
    finally:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
        end_processing()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
        try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
            if out_f:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
                out_f.close()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
            if infile:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
                infile.close()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
# Do not remove dir: we only return images path to avoid 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
# mem overload             
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
#            top = temp_dir
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
#            for root, dirs, files in os.walk(top, topdown=False):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
#                for name in files:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
#                    os.remove(os.path.join(root, name))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
#                for name in dirs:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
#                    os.rmdir(os.path.join(root, name))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
#            os.rmdir(top)            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
        except:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
            # TODO : warn
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
            pass