From 3e141cb2d54cfe2a2a62d32e558cb49767ea0359 Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Tue, 7 Mar 2017 18:29:31 +0100 Subject: [PATCH] support odf flat xml formats --- src/Makefile.am | 1 + src/filters/rclsoff-flat.py | 204 ++++++++++++++++++++++++++++++++++++ src/sampleconf/mimeconf | 3 + src/sampleconf/mimemap | 4 + 4 files changed, 212 insertions(+) create mode 100755 src/filters/rclsoff-flat.py diff --git a/src/Makefile.am b/src/Makefile.am index cfb6ea43..892ed4f2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -609,6 +609,7 @@ filters/rclscribus \ filters/rclshowinfo \ filters/rclsiduxman \ filters/rclsoff.py \ +filters/rclsoff-flat.py \ filters/rclsvg.py \ filters/rcltar \ filters/rcltex \ diff --git a/src/filters/rclsoff-flat.py b/src/filters/rclsoff-flat.py new file mode 100755 index 00000000..7649dd8b --- /dev/null +++ b/src/filters/rclsoff-flat.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python +# Copyright (C) 2014 J.F.Dockes +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +###################################### + +from __future__ import print_function + +import sys +import rclexecm +import rclxslt +from zipfile import ZipFile + +stylesheet_meta = ''' + + + + + + + + + + + + + + + + + + + <xsl:value-of select="."/> + + + + + + abstract + + + + + + + + + + keywords + + + + + + + + + + author + + + + + + + + + + keywords + + + + + + + + +''' + +stylesheet_content = ''' + + + + + + + + + + + + +

+ +
+ + +

+ +
+ + + + + + +
+
+ + + + + +
+''' + +class OOExtractor: + def __init__(self, em): + self.em = em + self.currentindex = 0 + + def extractone(self, params): + if "filename:" not in params: + self.em.rclog("extractone: no mime or file name") + return (False, "", "", rclexecm.RclExecM.eofnow) + fn = params["filename:"] + + try: + f = open(fn) + data = f.read() + f.close() + except Exception as err: + self.em.rclog("open failed: %s" % err) + return (False, "", "", rclexecm.RclExecM.eofnow) + + docdata = b'\n\n\n' + + try: + res = rclxslt.apply_sheet_data(stylesheet_meta, data) + docdata += res + except: + # To be checked. I'm under the impression that I get this when + # nothing matches? + #self.em.rclog("no/bad metadata in %s" % fn) + pass + + docdata += b'' + + try: + res = rclxslt.apply_sheet_data(stylesheet_content, data) + docdata += res + docdata += b'' + except Exception as err: + self.em.rclog("bad data in %s: %s" % (fn, err)) + return (False, "", "", rclexecm.RclExecM.eofnow) + + return (True, docdata, "", rclexecm.RclExecM.eofnext) + + ###### File type handler api, used by rclexecm ----------> + def openfile(self, params): + self.currentindex = 0 + return True + + def getipath(self, params): + return self.extractone(params) + + def getnext(self, params): + if self.currentindex >= 1: + return (False, "", "", rclexecm.RclExecM.eofnow) + else: + ret= self.extractone(params) + self.currentindex += 1 + return ret + +if __name__ == '__main__': + proto = rclexecm.RclExecM() + extract = OOExtractor(proto) + rclexecm.main(proto, extract) diff --git a/src/sampleconf/mimeconf b/src/sampleconf/mimeconf index f0265827..bc403727 100644 --- a/src/sampleconf/mimeconf +++ b/src/sampleconf/mimeconf @@ -72,6 +72,9 @@ application/vnd.oasis.opendocument.text-template = execm rclsoff.py application/vnd.oasis.opendocument.presentation = execm rclsoff.py application/vnd.oasis.opendocument.spreadsheet = execm rclsoff.py application/vnd.oasis.opendocument.graphics = execm rclsoff.py +application/vnd.oasis.opendocument.spreadsheet-flat-xml = execm rclsoff-flat.py +application/vnd.oasis.opendocument.presentation-flat-xml = execm rclsoff-flat.py +application/vnd.oasis.opendocument.spreadsheet-flat-xml = execm rclsoff-flat.py application/vnd.openxmlformats-officedocument.wordprocessingml.document = \ execm rclopxml.py application/vnd.openxmlformats-officedocument.wordprocessingml.template = \ diff --git a/src/sampleconf/mimemap b/src/sampleconf/mimemap index 783a6b05..bf24062b 100644 --- a/src/sampleconf/mimemap +++ b/src/sampleconf/mimemap @@ -112,6 +112,10 @@ .sxg = application/vnd.sun.xml.writer.global .stw = application/vnd.sun.xml.writer.template +.fods = application/vnd.oasis.opendocument.spreadsheet-flat-xml +.fodp = application/vnd.oasis.opendocument.presentation-flat-xml +.fods = application/vnd.oasis.opendocument.spreadsheet-flat-xml + # ms openxml .docm = application/vnd.ms-word.document.macroEnabled.12 .docx = application/vnd.openxmlformats-officedocument.wordprocessingml.document