[Erp5-report] r23008 - in /erp5/trunk/utils/oood: mimemapper.py worker.py

nobody at svn.erp5.org nobody at svn.erp5.org
Sat Aug 16 22:16:28 CEST 2008


Author: kazuhiko
Date: Sat Aug 16 22:16:28 2008
New Revision: 23008

URL: http://svn.erp5.org?rev=23008&view=rev
Log:
* MIMEType property is sometimes missing in recent OOo. so we use
  FilterName information instead to get the type of the document.

* gather import and export filter list from OOo's directory instead of
  hardcoding explicitly for better maintainability and supporting
  different version/flavor of OOo.

  Note that we still have explicit 'Export Filter':'unique Extension'
  mapping in mimemapper.py. If we use export filter name, that should be
  unique of course, instead of current unique extension to specify the
  target format, this mapping dict can be also removed. For now, I keep
  this interface as it is because it can cause incompatibility (for
  ERP5, it is OK because ERP5 uses one of the candidate list as the
  target format that oood creates, so if oood creates a filter name list
  instead of extension list, ERP5 just uses one of the filter name as
  the target format).

Modified:
    erp5/trunk/utils/oood/mimemapper.py
    erp5/trunk/utils/oood/worker.py

Modified: erp5/trunk/utils/oood/mimemapper.py
URL: http://svn.erp5.org/erp5/trunk/utils/oood/mimemapper.py?rev=23008&r1=23007&r2=23008&view=diff
==============================================================================
--- erp5/trunk/utils/oood/mimemapper.py (original)
+++ erp5/trunk/utils/oood/mimemapper.py Sat Aug 16 22:16:28 2008
@@ -29,817 +29,298 @@
 
 import operator
 import sys
+from glob import glob
+from xml.dom.minidom import parse
+
 import config
 sys.path.insert(0, config.uno_path)
 import uno
 from com.sun.star.beans import PropertyValue
 
 class MimeMapper:
-  """
-  list of supported extensions (keys in property_map)
-  testing information:
-  the first character tells if generation to the given format has been tested:
-    (-) not tested
-    (P) Passed
-    (F) Failed
-  the second tells if the output was verified and what was the result
-  More information at http://wiki.services.openoffice.org/wiki/Framework/Article/Filter/FilterList_OOo_2_1
-  """
-
-  document_type_dict = {}
-
-  document_type_dict['text'] = [
-     'odt', # P P
-     'ott', # P P
-     'sxw', # P P
-     'stw', # P P
-     'doc', # P P
-     '95.doc', # P P
-     '6_0.doc', # P P
-     'rtf', # P P
-     'sdw', # P P
-     'sdw.vor', # P P
-     '4_0.sdw', # P P
-     '4_0.sdw.vor', # P P
-     '3_0.sdw', # P P
-     '3_0.sdw.vor', # P P
-     'txt', # P P
-     'enc.txt', # P P
-     'writer.html', # P P
-     'html', # - -
-     'pdb', # P -
-     'docbook.xml', # P P
-     '2003.doc.xml', # P P
-     'psw', # P -
-     'pdf', # P P
-     'bib', # P -
-     'tex', # P -
-     'writer.xhtml', # P -
-     'fodt', # P -
-     'wiki.txt', # P -
-     ]
-
-  document_type_dict['spreadsheet'] = [
-     'ods',# P P
-     'ots',# P P
-     'sxc',# P P
-     'stc',# P P
-     'dif',# P -
-     'dbf',# F -
-     'xls',# P P
-     'xlt',# P P
-     '95.xls',# P P
-     '95.xlt',# P P
-     '5_0.xls',# P P
-     '5_0.xlt',# P P
-     'sdc',# P P
-     'sdc.vor',# P P
-     '4_0.sdc',# P P
-     '4_0.sdc.vor',# P P
-     '3_0.sdc',# P P
-     '3_0.sdc.vor',# P P
-     'slk',# P -
-     'csv',# P P
-     'calc.html',# P P
-     '2003.xls.xml',# P P
-     'pxl',# P -
-     'calc.pdf',# P P
-     'calc.xhtml',# P -
-     'fods',# P -
-     ]
-
-  document_type_dict['presentation'] = [
-     'odp', # P P
-     'otp', # P P
-     'sxi', # P P
-     'sti', # P P
-     'ppt', # P P
-     'pot', # P P
-     'odp.sxd', # P P
-     'odp.sda', # P P
-     'odp.3_0.sda', # P P
-     'sdd', # P P
-     'sdd.vor', # P P
-     '4_0.sdd', # P P
-     '4_0.sdd.vor', # P P
-     'odp.odg', # P P
-     'impr.html', # P P
-     'impr.pdf', # P P
-     'impr.swf', # P -
-     'impr.xhtml', # P F
-     'impr.bmp', # P P
-     'impr.emf', # P -
-     'impr.eps', # P P
-     'impr.gif', # P P
-     'impr.jpg', # P P
-     'impr.met', # P -
-     'impr.pbm', # P P
-     'impr.pct', # P -
-     'impr.pgm', # P P
-     'impr.png', # P P
-     'impr.ppm', # P P
-     'impr.ras', # P -
-     'impr.svg', # P -
-     'impr.svm', # P -
-     'impr.tiff', # P P
-     'impr.wmf', # P -
-     'impr.xpm', # P P
-     'pwp', # P -
-     'fodp', # P -
-     ]
-
-  document_type_dict['drawing'] = [ 
-     'odg', # P P
-     'otg', # P P
-     'sxd', # P P
-     'std', # P P
-     'sda', # P P
-     'sda.vor', # P P
-     '3_0.sda', # P P
-     '3_0.sda.vor', # P P
-     'draw.html', # P P
-     'draw.pdf', # P P
-     'draw.swf', # P P
-     'draw.xhtml', # P F
-     'bmp', # P P
-     'emf', # P -
-     'draw.eps', # P P
-     'gif', # P P
-     'jpg', # P P
-     'pbm', # P P
-     'met', # P -
-     'pct', # P -
-     'pgm', # P P
-     'png', # P P
-     'ppm', # P P
-     'ras', # P -
-     'svg', # P -
-     'svm', # P -
-     'tiff', # P P
-     'wmf', # P -
-     'xpm', # P P
-     'fodg', # P -
-     ]
-
+
+  # currently we use a unique extension for each export filter.
+  extension_by_export_filter_dict = {
+    'AportisDoc Palm DB': 'pdb',
+    'BibTeX_Writer': 'bib',
+    'DIF': 'dif',
+    'DocBook File': 'docbook.xml',
+    'HTML (StarCalc)': 'calc.html',
+    'HTML (StarWriter)': 'writer.html',
+    'LaTeX_Writer': 'tex',
+    'MS Excel 2003 XML': '2003.xls.xml',
+    'MS Excel 5.0/95': '5_0.xls',
+    'MS Excel 5.0/95 Vorlage/Template': '5_0.xlt',
+    'MS Excel 95': '95.xls',
+    'MS Excel 95 Vorlage/Template': '95.xlt',
+    'MS Excel 97': 'xls',
+    'MS Excel 97 Vorlage/Template': 'xlt',
+    'MS PowerPoint 97': 'ppt',
+    'MS PowerPoint 97 Vorlage': 'pot',
+    'MS WinWord 6.0': '6_0.doc',
+    'MS Word 2003 XML': '2003.doc.xml',
+    'MS Word 95': '95.doc',
+    'MS Word 97': 'doc',
+    'MediaWiki': 'wiki.txt',
+    'OpenDocument Drawing Flat XML': 'fodg',
+    'OpenDocument Presentation Flat XML': 'fodp',
+    'OpenDocument Spreadsheet Flat XML': 'fods',
+    'OpenDocument Text Flat XML': 'fodt',
+    'Pocket Excel': 'pxl',
+    'PocketWord File': 'psw',
+    'Rich Text Format': 'rtf',
+    'SYLK': 'slk',
+    'StarCalc 3.0': '3_0.sdc',
+    'StarCalc 3.0 Vorlage/Template': '3_0.sdc.vor',
+    'StarCalc 4.0': '4_0.sdc',
+    'StarCalc 4.0 Vorlage/Template': '4_0.sdc.vor',
+    'StarCalc 5.0': '5_0.sdc',
+    'StarCalc 5.0 Vorlage/Template': 'sdc.vor',
+    'StarDraw 3.0': '3_0.sda',
+    'StarDraw 3.0 (StarImpress)': 'odp.3_0.sda',
+    'StarDraw 3.0 Vorlage (StarImpress)': 'odp.3_0.sda.vor',
+    'StarDraw 3.0 Vorlage': '3_0.sda.vor',
+    'StarDraw 5.0': 'sda',
+    'StarDraw 5.0 (StarImpress)': 'odp.sda',
+    'StarDraw 5.0 Vorlage': 'sda.vor',
+    'StarDraw 5.0 Vorlage (StarImpress)': 'odp.sda.vor',
+    'StarImpress 4.0': '4_0.sdd',
+    'StarImpress 4.0 Vorlage': '4_0.sdd.vor',
+    'StarImpress 5.0': 'sdd',
+    'StarImpress 5.0 Vorlage': 'sdd.vor',
+    'StarOffice XML (Calc)': 'sxc',
+    'StarOffice XML (Draw)': 'sxd',
+    'StarOffice XML (Impress)': 'sxi',
+    'StarOffice XML (Writer)': 'sxw',
+    'StarWriter 3.0': '3_0.sdw',
+    'StarWriter 3.0 Vorlage/Template': '3_0.sdw.vor',
+    'StarWriter 4.0': '4_0.sdw',
+    'StarWriter 4.0 Vorlage/Template': '4_0.sdw.vor',
+    'StarWriter 5.0': 'sdw',
+    'StarWriter 5.0 Vorlage/Template': 'sdw.vor',
+    'Text': 'txt',
+    'Text (encoded)': 'enc.txt',
+    'Text - txt - csv (StarCalc)': 'csv',
+    'XHTML Calc File': 'calc.xhtml',
+    'XHTML Draw File': 'draw.xhtml',
+    'XHTML Impress File': 'impr.xhtml',
+    'XHTML Writer File': 'writer.xhtml',
+    'calc8': 'ods',
+    'calc8_template': 'ots',
+    'calc_StarOffice_XML_Calc_Template': 'stc',
+    'calc_pdf_Export': 'calc.pdf',
+    'dBase': 'dbf',
+    'draw8': 'odg',
+    'draw8_template': 'otg',
+    'draw_StarOffice_XML_Draw_Template': 'std',
+    'draw_bmp_Export': 'bmp',
+    'draw_emf_Export': 'emf',
+    'draw_eps_Export': 'draw.eps',
+    'draw_flash_Export': 'draw.swf',
+    'draw_gif_Export': 'gif',
+    'draw_html_Export': 'draw.html',
+    'draw_jpg_Export': 'jpg',
+    'draw_met_Export': 'met',
+    'draw_pbm_Export': 'pbm',
+    'draw_pct_Export': 'pct',
+    'draw_pdf_Export': 'draw.pdf',
+    'draw_pgm_Export': 'pgm',
+    'draw_png_Export': 'png',
+    'draw_ppm_Export': 'ppm',
+    'draw_ras_Export': 'ras',
+    'draw_svg_Export': 'svg',
+    'draw_svm_Export': 'svm',
+    'draw_tif_Export': 'tiff',
+    'draw_wmf_Export': 'wmf',
+    'draw_xpm_Export': 'xpm',
+    'impress8': 'odp',
+    'impress8_draw': 'odp.odg',
+    'impress8_template': 'otp',
+    'impress_StarOffice_XML_Draw': 'odp.sxd',
+    'impress_StarOffice_XML_Impress_Template': 'sti',
+    'impress_bmp_Export': 'impr.bmp',
+    'impress_emf_Export': 'impr.emf',
+    'impress_eps_Export': 'impr.eps',
+    'impress_flash_Export': 'impr.swf',
+    'impress_gif_Export': 'impr.gif',
+    'impress_html_Export': 'impr.html',
+    'impress_jpg_Export': 'impr.jpg',
+    'impress_met_Export': 'impr.met',
+    'impress_pbm_Export': 'impr.pbm',
+    'impress_pct_Export': 'impr.pct',
+    'impress_pdf_Export': 'impr.pdf',
+    'impress_pgm_Export': 'impr.pgm',
+    'impress_png_Export': 'impr.png',
+    'impress_ppm_Export': 'impr.ppm',
+    'impress_ras_Export': 'impr.ras',
+    'impress_svg_Export': 'impr.svg',
+    'impress_svm_Export': 'impr.svm',
+    'impress_tif_Export': 'impr.tiff',
+    'impress_wmf_Export': 'impr.wmf',
+    'impress_xpm_Export': 'impr.xpm',
+    'placeware_Export': 'pwp',
+    'writer8': 'odt',
+    'writer8_template': 'ott',
+    'writer_StarOffice_XML_Writer_Template': 'stw',
+    'writer_pdf_Export': 'pdf'
+    }
+
+  document_type_list = ['text', 'spreadsheet', 'presentation', 'drawing']
   odf_type_list = ['odt', 'ods', 'odp', 'odg']
-
-  # XXX some formats are in more then one section (e.g. html - can be made from text, from presentation etc); they
-  # have different keys (extensions) here, but mimetype is the same, which can confuse getAllowedTo method if
-  # it is given mimetype as argument.
-  # So, in such a case, all occurrences of such mimetype, or all but one, have omit=True set, so that they are not
-  # taken into account while doing _mimeToExt; so we know that text/html can be converted only to other "text"
-  # formats, while application/x-shockwave-flash can not be converted into anything.
-
-  property_map = {
-
-    ########## TEXT ########## 
-    'odt':{
-      'mime_type':('application/vnd.oasis.opendocument.text',),
-      'outprops':(PropertyValue("FilterName", 0, 'writer8', 0), PropertyValue("Overwrite",0,True,0)),
-      'label': 'OpenDocument Text',
-    },
-    'ott':{
-      'mime_type':('application/vnd.oasis.opendocument.text-template',),
-      'outprops':(PropertyValue("FilterName", 0, 'writer8_template', 0), PropertyValue("Overwrite",0,True,0)),
-      'label': 'OpenDocument Text Template',
-    },
-    'sxw':{
-      'mime_type':('application/vnd.sun.xml.writer',),
-      'outprops':(PropertyValue("FilterName", 0, 'StarOffice XML (Writer)', 0), PropertyValue("Overwrite",0,True,0)),
-      'label': 'OpenOffice.org 1.0 Text Document',
-    },
-    'stw':{
-      'mime_type':('application/vnd.sun.xml.writer.template',),
-      'outprops':(PropertyValue("FilterName", 0, 'writer_StarOffice_XML_Writer_Template', 0), PropertyValue("Overwrite",0,True,0)),
-      'label': 'OpenOffice.org 1.0 Text Document Template',
-    },
-    'doc':{
-      'mime_type':('application/msword',),
-      'outprops':(PropertyValue("FilterName",0,"MS Word 97",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Word 97/2000/XP',
-    },
-    '95.doc':{
-      'mime_type':('application/msword',),
-      'outprops':(PropertyValue("FilterName",0,'MS Word 95',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Word 95',
-    },
-    '6_0.doc':{
-      'mime_type':('application/msword',),
-      'outprops':(PropertyValue("FilterName",0,'MS WinWord 6.0',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Word 6.0',
-    },
-    'rtf':{
-      'mime_type':('application/rtf',),
-      'outprops':(PropertyValue("FilterName",0,"Rich Text Format",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Rich Text Format',
-    },
-    'sdw':{
-      'mime_type':('application/vnd.stardivision.writer',),
-      'outprops':(PropertyValue("FilterName",0,'StarWriter 5.0',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarWriter 5.0',
-    },
-    'sdw.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue("FilterName",0,'StarWriter 5.0 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarWriter 5.0 Template',
-    },
-    '4_0.sdw':{
-      'mime_type':('application/x-starwriter',),
-      'outprops':(PropertyValue("FilterName", 0, 'StarWriter 4.0', 0), PropertyValue("Overwrite",0,True,0)),
-      'label': 'StarWriter 4.0',
-    },
-    '4_0.sdw.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue("FilterName",0,'StarWriter 4.0 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarWriter 4.0 Template',
-    },
-    '3_0.sdw':{
-      'mime_type':('application/x-starwriter',),
-      'outprops':(PropertyValue("FilterName", 0, 'StarWriter 3.0', 0), PropertyValue("Overwrite",0,True,0)),
-      'label': 'StarWriter 3.0',
-    },
-    '3_0.sdw.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue("FilterName",0,'StarWriter 3.0 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarWriter 3.0 Template',
-    },
-    'txt':{
-      'mime_type':('text/plain',),
-      'outprops':(PropertyValue("FilterName",0,"Text",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Text',
-    },
-    'enc.txt':{
-      'mime_type':('text/plain',),
-      'outprops':(PropertyValue("FilterName",0,"Text (encoded)",0),PropertyValue("Overwrite",0,True,0),PropertyValue("FilterFlags",0,'UTF8,LF',0)),
-      'label':'Text (encoded)',
-    },
-    'writer.html':{
-      'mime_type':('text/html',),
-      'outprops':(PropertyValue("FilterName",0,"HTML (StarWriter)",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'HTML Document (OpenOffice.org Writer)',
-    },
-    'html':{
-      'mime_type':('text/html',),
-      'outprops':(PropertyValue("FilterName",0,"HTML (StarWriter)",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'HTML Document (OpenOffice.org Writer)',
-    },
-    'pdb':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue("FilterName",0,'AportisDoc Palm DB',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'AportisDoc (Palm)',
-    },
-    'docbook.xml':{
-      'mime_type':('text/xml',),
-      'outprops':(PropertyValue("FilterName",0,'DocBook File',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'DocBook',
-    },
-    '2003.doc.xml':{
-      'mime_type':('text/xml',),
-      'outprops':(PropertyValue("FilterName",0,'MS Word 2003 XML',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Word 2003 XML',
-    },
-    'psw':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue("FilterName",0,'PocketWord File',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'PocketWord',
-    },
-    'pdf':{
-      'mime_type':('application/pdf',),
-      'omit': True,
-      'outprops':(PropertyValue("FilterName",0,"writer_pdf_Export",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Pdf',
-    },
-    'tex':{
-      'mime_type':('application/x-latex',),
-      'outprops':(PropertyValue("FilterName",0,"LaTeX_Writer",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'LaTeX 2e',
-    },
-    'bib':{
-      'mime_type':('application/x-bibtex',),
-      'outprops':(PropertyValue("FilterName",0,"BibTeX_Writer",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'BibTeX',
-    },
-    'writer.xhtml':{
-      'mime_type':('text/xhtml+xml',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'XHTML Writer File',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'XHTML',
-    },
-    'fodt':{
-      'mime_type':('application/vnd.oasis.opendocument.text',),
-      'outprops':(PropertyValue('FilterName',0,'OpenDocument Text Flat XML',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Text (Flat XML)',
-    },
-    'wiki.txt':{
-      'mime_type':('text/plain',),
-      'outprops':(PropertyValue("FilterName",0,"MediaWiki",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'MediaWiki',
-    },
-
-    ########## SPREADSHEET ########## 
-    'ods':{
-      'mime_type':('application/vnd.oasis.opendocument.spreadsheet',),
-      'outprops':(PropertyValue('FilterName',0,'calc8',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Spreadsheet',
-    },
-    'ots':{
-      'mime_type':('application/vnd.oasis.opendocument.spreadsheet-template',),
-      'outprops':(PropertyValue('FilterName',0,'calc8_template',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Spreadsheet Template',
-    },
-    'sxc':{
-      'mime_type':('application/vnd.sun.xml.calc',),
-      'outprops':(PropertyValue('FilterName',0,'StarOffice XML (Calc)',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenOffice.org 1.0 Spreadsheet',
-    },
-    'stc':{
-      'mime_type':('application/vnd.sun.xml.calc.template',),
-      'outprops':(PropertyValue('FilterName',0,'calc_StarOffice_XML_Calc_Template',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenOffice.org 1.0 Spreadsheet Template',
-    },
-    'dif':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'DIF',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'Data Interchange Format',
-    },
-    'dbf':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'dBase',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'dBASE',
-    },
-    'xls':{
-      'mime_type':('application/vnd.ms-excel',),
-      'outprops':(PropertyValue("FilterName",0,"MS Excel 97",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Excel 97/2000/XP',
-    },
-    'xlt':{
-      'mime_type':('application/vnd.ms-excel',),
-      'outprops':(PropertyValue("FilterName",0,'MS Excel 97 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Excel 97/2000/XP Template',
-    },
-    '95.xls':{
-      'mime_type':('application/vnd.ms-excel',),
-      'outprops':(PropertyValue("FilterName",0,'MS Excel 95',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Excel 95',
-    },
-    '95.xlt':{
-      'mime_type':('application/vnd.ms-excel',),
-      'outprops':(PropertyValue("FilterName",0,'MS Excel 95 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Excel 95 Template',
-    },
-    '5_0.xls':{
-      'mime_type':('application/vnd.ms-excel',),
-      'outprops':(PropertyValue("FilterName",0,'MS Excel 5.0/95',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Excel 5.0',
-    },
-    '5_0.xlt':{
-      'mime_type':('application/vnd.ms-excel',),
-      'outprops':(PropertyValue("FilterName",0,'MS Excel 5.0/95 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Excel 5.0 Template',
-    },
-    'sdc':{
-      'mime_type':('application/vnd.stardivision.calc',),
-      'outprops':(PropertyValue("FilterName",0,'StarCalc 5.0',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarCalc 5.0',
-    },
-    'sdc.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue("FilterName",0,'StarCalc 5.0 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarCalc 5.0 Template',
-    },
-    '4_0.sdc':{
-      'mime_type':('application/x-starcalc',),
-      'outprops':(PropertyValue("FilterName",0,'StarCalc 5.0',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarCalc 5.0',
-    },
-    '4_0.sdc.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue("FilterName",0,'StarCalc 5.0 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarCalc 5.0 Template',
-    },
-    '3_0.sdc':{
-      'mime_type':('application/x-starcalc',),
-      'outprops':(PropertyValue("FilterName",0,'StarCalc 4.0',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarCalc 4.0',
-    },
-    '3_0.sdc.vor':{
-      'mime_type':('application/x-starcalc',),
-      'outprops':(PropertyValue("FilterName",0,'StarCalc 3.0 Vorlage/Template',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarCalc 3.0 Template',
-    },
-    'slk':{
-      'mime_type':('application/x-sylk',),
-      'outprops':(PropertyValue("FilterName",0,'SYLK',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'SYLK',
-    },
-    'csv':{
-      'mime_type':('text/csv',),
-      'outprops':(PropertyValue("FilterName",0,"Text - txt - csv (StarCalc)",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Text CSV',
-    },
-    'calc.html':{
-      'mime_type':('text/html',),
-      'omit': True,
-      'outprops':(PropertyValue("FilterName",0,"HTML (StarCalc)",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'HTML Document (OpenOffice.org Calc)',
-    },
-    '2003.xls.xml':{
-      'mime_type':('text/xml',),
-      'omit': True,
-      'outprops':(PropertyValue("FilterName",0,'MS Excel 2003 XML',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft Excel 2003 XML',
-    },
-    'pxl':{
-      'mime_type':'application/x-pocket-excel',
-      'outprops':(PropertyValue("FilterName",0,'Pocket Excel',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Pocket Excel',
-    },
-    'calc.pdf':{
-      'mime_type':('application/pdf',),
-      'omit': True,
-      'outprops':(PropertyValue("FilterName",0,"calc_pdf_Export",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'PDF - Portable Document Format',
-    },
-    'calc.xhtml':{
-      'mime_type':('text/xhtml+xml',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'XHTML Calc File',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'XHTML',
-    },
-    'fods':{
-      'mime_type':('application/vnd.oasis.opendocument.spreadsheet',),
-      'outprops':(PropertyValue('FilterName',0,'OpenDocument Spreadsheet Flat XML',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Spreadsheet (Flat XML)',
-    },
-
-    ########## PRESENTATION ########## 
-    'odp':{
-      'mime_type':('application/vnd.oasis.opendocument.presentation',),
-      'outprops':(PropertyValue('FilterName',0,'impress8',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Presentation',
-    },
-    'otp':{
-      'mime_type':('application/vnd.oasis.opendocument.presentation-template',),
-      'outprops':(PropertyValue('FilterName',0,'impress8_template',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Presentation Template',
-    },
-    'sxi':{
-      'mime_type':('application/vnd.sun.xml.impress',),
-      'outprops':(PropertyValue('FilterName',0,'StarOffice XML (Impress)',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenOffice.org 1.0 Presentation',
-    },
-    'sti':{
-      'mime_type':('application/vnd.sun.xml.impress.template',),
-      'outprops':(PropertyValue('FilterName',0,'impress_StarOffice_XML_Impress_Template',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenOffice.org 1.0 Presentation Template',
-    },
-    'ppt':{
-      'mime_type':('application/vnd.ms-powerpoint',),
-      'outprops':(PropertyValue("FilterName",0,'MS PowerPoint 97',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft PowerPoint 97/2000/XP',
-    },
-    'pot':{
-      'mime_type':('application/vnd.ms-powerpoint',),
-      'outprops':(PropertyValue('FilterName',0,'MS PowerPoint 97 Vorlage',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Microsoft PowerPoint 97/2000/XP Template',
-    },
-    'odp.sxd':{
-      'mime_type':('application/vnd.sun.xml.draw',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_StarOffice_XML_Draw',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'OpenOffice.org 1.0 Drawing (OpenOffice.org Impress)',
-    },
-    'odp.sda':{
-      'mime_type':('application/vnd.stardivision.draw',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'StarDraw 5.0 (StarImpress)',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarDraw 5.0 (OpenOffice.org Impress)',
-    },
-    'odp.3_0.sda':{
-      'mime_type':('application/vnd.stardivision.draw',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'StarDraw 3.0 (StarImpress)',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarDraw 3.0 (OpenOffice.org Impress)',
-    },
-    'sdd':{
-      'mime_type':('application/vnd.stardivision.impress',),
-      'outprops':(PropertyValue('FilterName',0,'StarImpress 5.0',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarImpress 5.0',
-    },
-    'sdd.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'StarImpress 5.0 Vorlage',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarImpress 5.0 Template',
-    },
-    '4_0.sdd':{
-      'mime_type':('application/x-starimpress',),
-      'outprops':(PropertyValue('FilterName',0,'StarImpress 4.0',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarImpress 4.0',
-    },
-    '4_0.sdd.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'StarImpress 4.0 Vorlage',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'StarImpress 4.0 Template',
-    },
-    'odp.odg':{
-      'mime_type':('application/vnd.oasis.opendocument.graphics',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress8_draw',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'OpenDocument Drawing (Impress)',
-    },
-    'impr.html':{
-      'mime_type':('text/html',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_html_Export',0),PropertyValue("Overwrite",0,True,0),
-                  PropertyValue("FilterData",0,uno.Any("[]com.sun.star.beans.PropertyValue",
-                                (PropertyValue("IsExportNotes",0,True,0),),),0),),
-      'label':'HTML Document (OpenOffice.org Impress)',
-    },
-    'impr.pdf':{
-      'mime_type':('application/pdf',),
-      'omit': True,
-      'outprops':(PropertyValue("FilterName",0,"impress_pdf_Export",0),PropertyValue("Overwrite",0,True,0),
-                  PropertyValue("FilterData",0,uno.Any("[]com.sun.star.beans.PropertyValue",
-                                (PropertyValue("ExportNotesPages",0,True,0),),),0),),
-      'label':'PDF - Portable Document Format',
-    },
-    'impr.swf':{
-      'mime_type':('application/x-shockwave-flash',),
-      'omit': True,
-      'outprops':(PropertyValue("FilterName",0,"impress_flash_Export",0),PropertyValue("Overwrite",0,True,0)),
-      'label':'Macromedia Flash (SWF)',
-    },
-    'impr.xhtml':{
-      'mime_type':('application/xhtml+xml',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'XHTML Impress File',0),PropertyValue("Overwrite",0,True,0)),
-      'label':'XHTML',
-    },
-    'impr.bmp':{
-      'mime_type':('image/bmp',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_bmp_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'BMP - Windows Bitmap',
-    },
-    'impr.emf':{
-      'mime_type':('unknown',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_emf_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'EMF - Enhanced Metafile',
-    },
-    'impr.eps':{
-      'mime_type':('unknown',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_eps_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'EPS - Encapsulated PostScript',
-    },
-    'impr.gif':{
-      'mime_type':('image/gif',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_gif_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'GIF - Graphics Interchange Format',
-    },
-    'impr.jpg':{
-      'mime_type':('image/jpg',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_jpg_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'JPEG - Joint Photographic Experts Group',
-    },
-    'impr.met':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_met_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'MET - OS/2 Metafile',
-    },
-    'impr.pbm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_pbm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PBM - Portable Bitmap',
-    },
-    'impr.pct':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_pct_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PCT - Mac Pict',
-    },
-    'impr.pgm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_pgm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PGM - Portable Graymap',
-    },
-    'impr.png':{
-      'mime_type':('image/png',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_png_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PNG - Portable Network Graphic',
-    },
-    'impr.ppm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_ppm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PPM - Portable Pixelmap',
-    },
-    'impr.ras':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_ras_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'RAS - Sun Raster Image',
-    },
-    'impr.svg':{
-      'mime_type':('image/svg+xml',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_svg_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'SVG - Scalable Vector Graphics',
-    },
-    'impr.svm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_svm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'SVM - StarView Metafile',
-    },
-    'impr.tiff':{
-      'mime_type':('image/tiff',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'impress_tif_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'TIFF - Tagged Image File Format',
-    },
-    'impr.wmf':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_wmf_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'WMF - Windows Metafile',
-    },
-    'impr.xpm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'impress_xpm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'XPM - X PixMap',
-    },
-    'pwp':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'placeware_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PWP - PlaceWare',
-    },
-    'fodp':{
-      'mime_type':('application/vnd.oasis.opendocument.presentation',),
-      'outprops':(PropertyValue('FilterName',0,'OpenDocument Presentation Flat XML',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Presentation (Flat XML)',
-    },
-
-    ########## DRAWING ########## 
-    'odg':{
-      'mime_type':('application/vnd.oasis.opendocument.graphics',),
-      'outprops':(PropertyValue('FilterName',0,'draw8',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Drawing',
-    },
-    'otg':{
-      'mime_type':('application/vnd.oasis.opendocument.graphics-template',),
-      'outprops':(PropertyValue('FilterName',0,'draw8_template',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Drawing Template',
-    },
-    'sxd':{
-      'mime_type':('application/vnd.sun.xml.draw',),
-      'outprops':(PropertyValue('FilterName',0,'StarOffice XML (Draw)',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenOffice.org 1.0 Drawing',
-    },
-    'std':{
-      'mime_type':('application/vnd.sun.xml.draw.template',),
-      'outprops':(PropertyValue('FilterName',0,'draw_StarOffice_XML_Draw_Template',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenOffice.org 1.0 Drawing Template',
-    },
-    'sda':{
-      'mime_type':('application.vnd.stardivision.draw',),
-      'outprops':(PropertyValue('FilterName',0,'StarDraw 5.0',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'StarDraw 5.0',
-    },
-    'sda.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'StarDraw 5.0 Vorlage',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'StarDraw 5.0 Template',
-    },
-    '3_0.sda':{
-      'mime_type':('application.vnd.stardivision.draw',),
-      'outprops':(PropertyValue('FilterName',0,'StarDraw 3.0',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'StarDraw 3.0',
-    },
-    '3_0.sda.vor':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'StarDraw 3.0 Vorlage',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'StarDraw 3.0 Template',
-    },
-    'draw.html':{
-      'mime_type':('text/html',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'draw_html_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'HTML Document (OpenOffice.org Draw)',
-    },
-    'draw.pdf':{
-      'mime_type':('application/pdf',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'draw_pdf_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PDF - Portable Document Format',
-    },
-    'draw.swf':{
-      'mime_type':('application/x-shockwave-flash',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'draw_flash_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'Macromedia Flash (SWF)',
-    },
-    'draw.xhtml':{
-      'mime_type':('text/xhtml+xml',),
-      'omit': True,
-      'outprops':(PropertyValue('FilterName',0,'XHTML Draw File',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'XHTML',
-    },
-    'bmp':{
-      'mime_type':('image/bmp',),
-      'outprops':(PropertyValue('FilterName',0,'draw_bmp_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'BMP - Windows Bitmap',
-    },
-    'emf':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_emf_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'EMF - Enhanced Metafile',
-    },
-    'draw.eps':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_eps_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'EPS - Encapsulated PostScript',
-    },
-    'gif':{
-      'mime_type':('image/gif',),
-      'outprops':(PropertyValue('FilterName',0,'draw_gif_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'GIF - Graphics Interchange Format',
-    },
-    'jpg':{
-      'mime_type':('image/jpeg',),
-      'outprops':(PropertyValue('FilterName',0,'draw_jpg_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'JPEG - Joint Photographic Experts Group',
-    },
-    'pbm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_pbm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PBM - Portable Bitmap',
-    },
-    'met':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_met_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'MET - OS/2 Metafile',
-    },
-    'pct':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_pct_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PCT - Mac Pict',
-    },
-    'pgm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_pgm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PGM - Portable Graymap',
-    },
-    'png':{
-      'mime_type':('image/png',),
-      'outprops':(PropertyValue('FilterName',0,'draw_png_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PNG - Portable Network Graphic',
-    },
-    'ppm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_ppm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'PPM - Portable Pixelmap',
-    },
-    'ras':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_ras_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'RAS - Sun Raster Image',
-    },
-    'svg':{
-      'mime_type':('image/svg+xml',),
-      'outprops':(PropertyValue('FilterName',0,'draw_svg_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'SVG - Scalable Vector Graphics',
-    },
-    'svm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_svm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'SVM - StarView Metafile',
-    },
-    'tiff':{
-      'mime_type':('image/tiff',),
-      'outprops':(PropertyValue('FilterName',0,'draw_tif_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'TIFF - Tagged Image File Format',
-    },
-    'wmf':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_wmf_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'WMF - Windows Metafile',
-    },
-    'xpm':{
-      'mime_type':('unknown',),
-      'outprops':(PropertyValue('FilterName',0,'draw_xpm_Export',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'XPM - X PixMap',
-    },
-    'fodg':{
-      'mime_type':('application/vnd.oasis.opendocument.graphics',),
-      'outprops':(PropertyValue('FilterName',0,'OpenDocument Drawing Flat XML',0),PropertyValue('Overwrite',0,True,0)),
-      'label':'OpenDocument Drawing (Flat XML)',
-    },
-
-
-  }
+  odf_filter_list = ['writer8', 'calc8', 'impress8', 'draw8']
 
   def __init__(self):
+    self.collectFilterInfo()
+    self.setFilterInfo()
     self.filterDocumentType()
+
+  def collectFilterInfo(self):
+    """
+    collect Filter information and Type information from OOo's directory.
+    """
+    def getFileList(dir):
+      return glob('%s/*' % dir)
+
+    filter_dir = '%s/../share/registry/modules/org/openoffice/TypeDetection/Filter' % config.uno_path
+    type_dir = '%s/../share/registry/modules/org/openoffice/TypeDetection/Types' % config.uno_path
+    filter_file_list = getFileList(filter_dir)
+    type_file_list = getFileList(type_dir)
+    if not filter_file_list or not type_file_list:
+      # for OOo 3.0
+      filter_dir = '%s/../../*/basis3.0/share/registry/modules/org/openoffice/TypeDetection/Filter' % config.uno_path
+      type_dir = '%s/../../*/basis3.0/share/registry/modules/org/openoffice/TypeDetection/Types' % config.uno_path
+      filter_file_list = getFileList(filter_dir)
+      type_file_list = getFileList(type_dir)
+    if not filter_file_list or not type_file_list:
+      raise Exception('no OOo filter found.')
+
+    def prop_by_name(node, name):
+      for x in node.getElementsByTagName('prop'):
+        if x.getAttribute('oor:name') == name:
+          try:
+            value = x.getElementsByTagName('value')[0]
+            return value.firstChild.data
+          except IndexError:
+            return None
+      return None
+
+    def node_by_name(node, name):
+      for x in node.getElementsByTagName('node'):
+        if x.getAttribute('oor:name') == name:
+          return x
+      return None
+
+    type_list = []
+    for x in type_file_list:
+      type_list.extend(
+        node_by_name(parse(x), 'Types').getElementsByTagName('node'))
+
+    filter_list = []
+    for x in filter_file_list:
+      filter_list.extend(
+        node_by_name(parse(x), 'Filters').getElementsByTagName('node'))
+
+    document_type_dict = {
+      'com.sun.star.text.TextDocument':'text',
+      'com.sun.star.sheet.SpreadsheetDocument':'spreadsheet',
+      'com.sun.star.drawing.DrawingDocument':'drawing',
+      'com.sun.star.presentation.PresentationDocument':'presentation',
+      }
+
+    self.document_type_by_extension_dict = {}
+    self.document_type_by_mimetype_dict = {}
+    self.document_type_by_input_filter_dict = {}
+    self.extension_by_mimetype_dict = {}
+
+    for type_node in type_list:
+      preferred_filter = prop_by_name(type_node, 'PreferredFilter')
+      if preferred_filter is None:
+        continue
+      filter_node = [f for f in filter_list if f.getAttribute('oor:name') == preferred_filter][0]
+      document_type = document_type_dict.get(prop_by_name(filter_node,
+                                                          'DocumentService'))
+      if document_type is None:
+        continue
+      flags = prop_by_name(filter_node, 'Flags')
+      if flags.find('IMPORT') == -1:
+        continue
+      # we found a entry split by ';' instead of ' '.
+      extensions = prop_by_name(type_node, 'Extensions').replace(';', ' ').split(' ')
+      if extensions is not None:
+        for extension in extensions:
+          self.document_type_by_extension_dict[extension] = document_type
+      mimetype = prop_by_name(type_node, 'MediaType')
+      if mimetype is not None:
+        self.document_type_by_mimetype_dict[mimetype] = document_type
+      input_filter = filter_node.getAttribute('oor:name')
+      self.document_type_by_input_filter_dict[input_filter] = document_type
+      self.extension_by_mimetype_dict[mimetype] = extensions[0]
+
+    # we don't know why but HTML filter is missing in *.xcu
+    self.document_type_by_extension_dict['html'] = 'text'
+    self.document_type_by_extension_dict['htm'] = 'text'
+    self.document_type_by_mimetype_dict['text/html'] = 'text'
+    self.document_type_by_input_filter_dict['HTML'] = 'text'
+    self.extension_by_mimetype_dict['text/html'] = 'html'
+
+    self.filter_property_dict = {}
+
+    for filter_node in filter_list:
+      document_type = document_type_dict.get(prop_by_name(filter_node,
+                                                          'DocumentService'))
+      if document_type is None:
+        continue
+      export_filter = filter_node.getAttribute('oor:name')
+      flags = prop_by_name(filter_node, 'Flags')
+      if flags.find('EXPORT') == -1:
+        continue
+      type_name = prop_by_name(filter_node, 'Type')
+      try:
+        type_node = [t for t in type_list if t.getAttribute('oor:name') == type_name][0]
+      except IndexError:
+        continue
+      ui_name = prop_by_name(type_node, 'UIName')
+      if ui_name is None:
+        continue
+      if ui_name.find('%') != -1:
+        ui_name = filter_node.getAttribute('oor:name')
+      media_type = prop_by_name(type_node, 'MediaType') or \
+                   'application/octet-stream'
+      # we found a entry split by ';' instead of ' '.
+      extension = prop_by_name(type_node, 'Extensions').replace(';', ' ').split(' ')[0]
+      self.filter_property_dict[export_filter] = {
+        'document_type':document_type,
+        'extension':extension,
+        'mime_type':media_type,
+        'label':ui_name
+        }
+
+    self.export_filter_by_extension_dict = {}
+    for k,v in self.extension_by_export_filter_dict.items():
+      self.export_filter_by_extension_dict[v] = k
+
+    self.document_type_dict = {}
+    for document_type in self.document_type_list:
+      self.document_type_dict[document_type] = \
+        [self.extension_by_export_filter_dict[k] for k, v in \
+         self.filter_property_dict.items() if v['document_type'] == document_type]
+
+  def setFilterInfo(self):
+    # specify more properties for several filters
+    self.filter_property_dict['Text (encoded)']['export_props'] = ( \
+      PropertyValue('FilterFlags', 0, 'UTF8,LF', 0),
+      )
+    self.filter_property_dict['impress_html_Export']['export_props'] = ( \
+      PropertyValue('FilterData',0,uno.Any(
+        '[]com.sun.star.beans.PropertyValue',
+        (PropertyValue('IsExportNotes', 0, True, 0),
+         PropertyValue('Format', 0, 2, 0),),), 0), # PNG format
+      )
+    self.filter_property_dict['impress_pdf_Export']['export_props'] = ( \
+      PropertyValue('FilterData',0,uno.Any(
+        '[]com.sun.star.beans.PropertyValue',
+        (PropertyValue('ExportNotesPages', 0, True, 0),),), 0),
+      )
 
   def filterDocumentType(self):
     """
@@ -875,118 +356,102 @@
       for all formats to which we can convert the given mimetype
       We return all formats of a given type, except for the type of original document if known
     """
-    if mimetype and not extension:
-      extension = self._mimeToExt(mimetype)
-    if not extension and not document_type:
+    if document_type is not None:
+      pass
+    elif mimetype is not None:
+      document_type = self._mimeToType(mimetype)
+    elif extension is not None:
+      document_type = self._extToType(extension)
+    if not document_type:
       return []
-    if not document_type:
-      document_type = self._extToType(extension)
-    return [(ext, self.property_map[ext].get('label', ext)) for ext in self.document_type_dict[document_type] if ext != extension]
-
-  def _mimeToExt(self, mimetype):
-    """
-      helper function to map mimetype to filename extension
-      uses sequences from document_type_dict, because some mimetypes map to more then one
-      extension, and we want to return the first one (the newest)
-    """
-    for extension_list in self.document_type_dict.values():
-      for extension in extension_list:
-        property_dict = self.property_map[extension]
-        if mimetype in property_dict['mime_type']:
-          if not property_dict.has_key('omit') or not property_dict['omit']:
-            return extension
+    return [(self.extension_by_export_filter_dict[k],
+             v['label']) for k, v in self.filter_property_dict.items() \
+            if v['document_type'] == document_type and \
+            self.extension_by_export_filter_dict[k] != extension]
+
+  def _mimeToType(self, mimetype):
+    """
+      Helper function to map mimetype to document type
+    """
+    return self.document_type_by_mimetype_dict.get(mimetype, None)
 
   def _extToType(self, extension):
     """
       Helper function to map filename extension to document type
     """
-    for type, extension_list in self.document_type_dict.items():
-      if extension in extension_list:
-        return type
-
-  def _mimeToType(self, mimetype):
-    """
-      Helper function to map mimetype to document type
-    """
-    extension = self._mimeToExt(mimetype)
-    if not extension:
-      return
-    return self._extToType(extension)
+    return self.document_type_by_extension_dict.get(extension, None)
+
+  def _filterNameToType(self, filter_name):
+    """
+      Helper function to map filter name to document type
+    """
+    return self.document_type_by_input_filter_dict.get(filter_name, None)
 
   def getMimeFor(self, format):
     """
       return mime type for a given format (format is file name extension)
     """
     try:
-      return self.property_map[format]['mime_type']
+      export_filter = self.export_filter_by_extension_dict[format]
+      return self.filter_property_dict[export_filter]['mime_type']
     except KeyError:
       raise Exception('no mime type for format ' + format)
 
-  def isOdf(self, mimetype=None, extension=None):
+  def isOdf(self, extension=None, filter_name=None):
     """
       Method for a quick check if a document is ODF
     """
-    if extension is None:
-      extension = self._mimeToExt(mimetype)
-    return extension in self.odf_type_list
-
-  def getOdfInfo(self, mimetype=None, extension=None):
+    if filter_name is not None:
+      return filter_name in self.odf_filter_list
+    if extension is not None:
+      return extension in self.odf_type_list
+
+  def getOdfInfo(self, filter_name=None):
     """
       Get info about ODF format appropriate for the given format
     """
-    if extension is None:
-      extension = self._mimeToExt(mimetype)
-      if not extension:
-        return
-    document_type = self._extToType(extension)
+    if filter_name is not None:
+      document_type = self._filterNameToType(filter_name)
     if not document_type:
       return
-    odf_ext_list = [ext for ext in self.document_type_dict[document_type] if ext in self.odf_type_list]
-    if odf_ext_list:
-      return odf_ext_list[0], self.property_map[odf_ext_list[0]]['mime_type'][0]
-
-  def getTypePropertyDict(self, mimetype=None, extension=None):
+    odf_filter = [x for x in self.odf_filter_list \
+                  if self.filter_property_dict[x]['document_type'] == document_type][0]
+    odf_filter_property = self.filter_property_dict[odf_filter]
+    # XXX it can be
+    # extension = odf_filter_property['extension']
+    extension = self.extension_by_export_filter_dict[odf_filter]
+    return extension, odf_filter_property['mime_type']
+
+  def getTypePropertyDict(self, extension=None, filter_name=None):
     """
       Get properties for generating file in a given format
       (format is given as mimetype or extension)
     """
-    if extension is None:
-      extension = self._mimeToExt(mimetype)
-      if not extension:
-        return
-    property_dict = self.property_map[extension]
-    return property_dict
-
+    if filter_name is not None:
+      filter_name = self.export_filter_by_extension_dict[extension]
+    return self.filter_property_dict.get(filter_name, None)
+
+  def getExtForMime(self, mimetype):
+    return self.extension_by_mimetype_dict.get(mimetype, None)
 
 mimemapper = MimeMapper()
 
 if __name__=='__main__':
-  print mimemapper.getAllowedTo(mimetype='text/html')
-  print mimemapper.getAllowedTo(mimetype='application/x-shockwave-flash')
-  print len(mimemapper.property_map.keys())
-  print reduce(operator.add, [len(l) for l in mimemapper.document_type_dict.values()])
-  sys.exit(0)
+  import pprint
+  pp = pprint.PrettyPrinter(indent=2)
+  pp.pprint(mimemapper.getAllowedTo(mimetype='text/html'))
+  pp.pprint(mimemapper.getAllowedTo(mimetype='application/x-shockwave-flash'))
+  pp.pprint('========================================')
   for k,v in mimemapper.document_type_dict.items():
-    print k
-    print v
-    print '========================================'
-  sys.exit(0)
-  print mimemapper.isOdf('application/vnd.oasis.opendocument.text')
-  print '========================================'
-  print mimemapper.getOdfInfo(extension='txt')
-  print mimemapper.getOdfInfo(mimetype='application/msword')
-  print '========================================'
-  print mimemapper.getAllowedTo(mimetype='application/vnd.oasis.opendocument.text')
-  print mimemapper.getAllowedTo(extension='rtf')
-  print mimemapper.getAllowedTo(document_type='text')
-  #print 'convertable', mimemapper.convertable
-  print '========================================'
-  #print mimemapper.convertable
-  #for k,v in mimemapper.generable.iteritems():
-    #print k
-    #print v
-
-
-
-
-# vim: shiftwidth=2
+    pp.pprint(k)
+    pp.pprint(v)
+    pp.pprint('========================================')
+  pp.pprint(mimemapper.isOdf(extension='sxw'))
+  pp.pprint(mimemapper.isOdf(extension='odp'))
+  pp.pprint(mimemapper.isOdf(filter_name='calc8'))
+  pp.pprint('========================================')
+  pp.pprint(mimemapper.getOdfInfo(filter_name='writer8'))
+  pp.pprint('========================================')
+  pp.pprint(mimemapper.getAllowedTo(mimetype='application/vnd.oasis.opendocument.text'))
+  pp.pprint(mimemapper.getAllowedTo(extension='rtf'))
+  pp.pprint(mimemapper.getAllowedTo(document_type='text'))

Modified: erp5/trunk/utils/oood/worker.py
URL: http://svn.erp5.org/erp5/trunk/utils/oood/worker.py?rev=23008&r1=23007&r2=23008&view=diff
==============================================================================
--- erp5/trunk/utils/oood/worker.py (original)
+++ erp5/trunk/utils/oood/worker.py Sat Aug 16 22:16:28 2008
@@ -244,17 +244,18 @@
       XXX TODO: the same for CSV
     """
     Log.info('[worker] trying to load %s' % fname)
-    self.fileUrl = absolutize(self.cwd,systemPathToFileUrl(fname))
     inProps = self.inProps
     if kw.has_key('encoding'):
       prop_name = PropertyValue("FilterName", 0, "Text (encoded)", 0)
       prop_encoding = PropertyValue("FilterOptions", 0, kw['encoding'], 0)
       inProps = (self.inProps[0], prop_name, prop_encoding)
     if 'orig_format' in kw:
-      #Add Native Format if available to perform Transformation
-      proporty_dict = mimemapper.getTypePropertyDict(kw['orig_format'])
-      if proporty_dict is not None:
-        inProps = (inProps) + proporty_dict['outprops']
+      # if orig_format is given, just add an appropriate extension to
+      # fname, that can be a hint for OOo to guess the format.
+      extension = mimemapper.getExtForMime(kw['orig_format'])
+      if extension is not None:
+        fname += '.%s' % extension
+    self.fileUrl = absolutize(self.cwd,systemPathToFileUrl(fname))
     try:
       self.doc = self.desktop.loadComponentFromURL(self.fileUrl, '_blank', 0, inProps)
       if getattr(self.doc, 'getTypes', None) is not None:
@@ -284,8 +285,13 @@
     if type_info is None:
       raise lib.IllegalFormat(format)
     self.destUrl = self.fileUrl + '.' + format # we want it very unique
-    try:
-      self.doc.storeToURL(self.destUrl, type_info['outprops'])
+    outprops = [PropertyValue('FilterName', 0, type_info['export_filter'], 0),
+                PropertyValue('Overwrite',0,True,0),]
+    export_props = type_info.get('export_props', None)
+    if export_props is not None:
+      outprops.extend(export_props)
+    try:
+      self.doc.storeToURL(self.destUrl, outprops)
     except ErrorCodeIOException:
       raise lib.GenerationFailed(self.fileUrl + ' to format ' + format)
 
@@ -307,6 +313,7 @@
       if caseDown(n) in self.userfields:
         if v:
           metadata[caseDown(n)] = v
+    metadata['FilterName'] = [x.Value for x in self.doc.getArgs() if x.Name == 'FilterName'][0]
     return metadata
 
   def _convert(self, kw):
@@ -318,19 +325,7 @@
       replacing, because filename may have unusual extension or
       none at all
     """
-    odf_format_info = None
-    mimetype = self.metadata.get('MIMEType', None)
-    if mimetype is not None:
-      odf_format_info = mimemapper.getOdfInfo(mimetype)
-    else:
-      extension = kw.get('extension', None)
-      if extension is not None:
-        odf_format_info = mimemapper.getOdfInfo(extension=extension)
-      else:
-        filename = kw.get('filename', None)
-        if filename is not None and filename.find('.') != -1:
-          extension = filename.split('.')[-1]
-          odf_format_info = mimemapper.getOdfInfo(extension=extension)
+    odf_format_info = mimemapper.getOdfInfo(filter_name=self.metadata['FilterName'])
     if odf_format_info is None:
       raise lib.IllegalMimeType(self.metadata['MIMEType'])
     ext = odf_format_info[0]
@@ -345,8 +340,7 @@
       add new property if does not exist
       OOo uses titlecased property names
     """
-    Log.debug(self.metadata['MIMEType'])
-    if not mimemapper.isOdf(mimetype=self.metadata['MIMEType']):
+    if not mimemapper.isOdf(filter_name=self.metadata['FilterName']):
       raise Exception('can not set metadata on non-ODF file')
     self.dinfo = self.doc.getDocumentInfo()
     userfieldcounter = 0




More information about the Erp5-report mailing list