Source code for openxmllib

# -*- coding: utf-8 -*-
# $Id$
"""
The Open XML document library
Open XML document is defined by the ECMA-376 standard
http://www.ecma-international.org/publications/standards/Ecma-376.htm
"""

import os
import cStringIO
import urllib2
import mimetypes

import wordprocessing
import spreadsheet
import presentation

version = None
if version is None:
    version = open(os.path.join(os.path.dirname(__file__), 'version.txt')).read().strip()

_document_classes = (
    wordprocessing.WordprocessingDocument,
    spreadsheet.SpreadsheetDocument,
    presentation.PresentationDocument)

[docs]def openXmlDocument(path=None, file_=None, data=None, url=None, mime_type=None): """**Factory function** Will guess what document type is best suited and return the appropriate document type. User must provide either ``path``, ``file_``, ``data`` or ``url`` parameter. :param path: file path in the local filesystem to a document. :param file_: a file (like) object to a document (must be opened in 'rb' mode') :param data: the binary data of a document :param url: the URL of a document :param mime_type: mime type if known. One of the known MIME types from :mod:`openxmllib.contenttypes`. Note that ``mime_tyype`` parameter **must** be provided if you provide the Open XML document through the ``data`` parameter. Otherwise, if you don't provide one, we'll try to guess which is the most appropriate using the file extension. :return: A subclass of :class:`openxmllib.document.Document`. """ if path is not None: file_ = open(path, 'rb') elif file_ is not None: assert hasattr(file_, 'read') elif url is not None: file_ = urllib2.urlopen(url) if mime_type is None: mime_type = file_.headers.gettype() elif data is not None: file_ = cStringIO.StringIO(data) assert mime_type is not None else: raise ValueError("Either path, file_, data, or url should be provided") # Mime type based document if mime_type is not None: for class_ in _document_classes: if class_.canProcessMime(mime_type): return class_(file_, mime_type=mime_type) raise ValueError("%s MIME type is unknown." % mime_type) else: assert hasattr(file_, 'name') for class_ in _document_classes: if class_.canProcessFilename(file_.name): return class_(file_, mime_type=mime_type) raise ValueError("Can't guess mime_type. You should set the mime_type param") return ### ## Extending standard mimetypes ###
for class_ in _document_classes: for pattern, mime_type in class_._extpattern_to_mime.items(): mimetypes.add_type(mime_type, pattern[1:], True)