[Libreoffice-commits] online.git: loolwsd/discovery.xml loolwsd/lint-discovery.py
Miklos Vajna
vmiklos at collabora.co.uk
Tue Oct 4 16:51:10 UTC 2016
loolwsd/discovery.xml | 64 ++++++-------
loolwsd/lint-discovery.py | 213 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 245 insertions(+), 32 deletions(-)
New commits:
commit d8daaff1e91ac926a3f51473a7b5d4656e0802cb
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Tue Oct 4 18:42:40 2016 +0200
WOPI discovery: change action name to 'view' when we can import the format
Also add a script that can detect if discovery.xml is no longer in sync
with the core.git filter configuration.
richdocuments.git d6b65b79835bc499f720d15bb6c00441079b2fd6 (Respect WOPI
action names, 2016-10-04) can launch a read-only loleaflet based on this
info.
Change-Id: I09232bb53844d0737dfdc66cd0e87342b9dd0fb6
diff --git a/loolwsd/discovery.xml b/loolwsd/discovery.xml
index 59cd769..759f0ab 100644
--- a/loolwsd/discovery.xml
+++ b/loolwsd/discovery.xml
@@ -2,10 +2,10 @@
<wopi-discovery>
<net-zone name="external-http">
<app name="application/vnd.lotus-wordpro">
- <action name="edit" ext="lwp"/>
+ <action name="view" ext="lwp"/>
</app>
<app name="image/svg+xml">
- <action name="edit" ext="svg"/>
+ <action name="view" ext="svg"/>
</app>
<app name="application/vnd.ms-powerpoint">
<action name="edit" ext="pot"/>
@@ -16,7 +16,7 @@
<!-- Writer documents -->
<app name="application/vnd.sun.xml.writer">
- <action name="edit" ext="sxw"/>
+ <action name="view" ext="sxw"/>
</app>
<app name="application/vnd.oasis.opendocument.text">
<action name="edit" ext="odt"/>
@@ -27,7 +27,7 @@
<!-- Calc documents -->
<app name="application/vnd.sun.xml.calc">
- <action name="edit" ext="sxc"/>
+ <action name="view" ext="sxc"/>
</app>
<app name="application/vnd.oasis.opendocument.spreadsheet">
<action name="edit" ext="ods"/>
@@ -38,7 +38,7 @@
<!-- Impress documents -->
<app name="application/vnd.sun.xml.impress">
- <action name="edit" ext="sxi"/>
+ <action name="view" ext="sxi"/>
</app>
<app name="application/vnd.oasis.opendocument.presentation">
<action name="edit" ext="odp"/>
@@ -49,9 +49,9 @@
<!-- Draw documents -->
<app name="application/vnd.sun.xml.draw">
- <action name="edit" ext="sxd"/>
+ <action name="view" ext="sxd"/>
</app>
- <app name="iapplication/vnd.oasis.opendocument.graphics">
+ <app name="application/vnd.oasis.opendocument.graphics">
<action name="edit" ext="odg"/>
</app>
<app name="application/vnd.oasis.opendocument.graphics-flat-xml">
@@ -65,7 +65,7 @@
<!-- Text master documents -->
<app name="application/vnd.sun.xml.writer.global">
- <action name="edit" ext="sxg"/>
+ <action name="view" ext="sxg"/>
</app>
<app name="application/vnd.oasis.opendocument.text-master">
<action name="edit" ext="odm"/>
@@ -73,7 +73,7 @@
<!-- Math documents -->
<app name="application/vnd.sun.xml.math">
- <action name="edit" ext="sxm"/>
+ <action name="view" ext="sxm"/>
</app>
<app name="application/vnd.oasis.opendocument.formula">
<action name="edit" ext="odf"/>
@@ -81,7 +81,7 @@
<!-- Text template documents -->
<app name="application/vnd.sun.xml.writer.template">
- <action name="edit" ext="stw"/>
+ <action name="view" ext="stw"/>
</app>
<app name="application/vnd.oasis.opendocument.text-template">
<action name="edit" ext="ott"/>
@@ -94,7 +94,7 @@
<!-- Spreadsheet template documents -->
<app name="application/vnd.sun.xml.calc.template">
- <action name="edit" ext="stc"/>
+ <action name="view" ext="stc"/>
</app>
<app name="application/vnd.oasis.opendocument.spreadsheet-template">
<action name="edit" ext="ots"/>
@@ -102,7 +102,7 @@
<!-- Presentation template documents -->
<app name="application/vnd.sun.xml.impress.template">
- <action name="edit" ext="sti"/>
+ <action name="view" ext="sti"/>
</app>
<app name="application/vnd.oasis.opendocument.presentation-template">
<action name="edit" ext="otp"/>
@@ -110,7 +110,7 @@
<!-- Drawing template documents -->
<app name="application/vnd.sun.xml.draw.template">
- <action name="edit" ext="std"/>
+ <action name="view" ext="std"/>
</app>
<app name="application/vnd.oasis.opendocument.graphics-template">
<action name="edit" ext="otg"/>
@@ -123,7 +123,7 @@
<!-- Extensions -->
<app name="application/vnd.openofficeorg.extension">
- <action name="edit" ext="otx"/>
+ <action name="edit" ext="oxt"/>
</app>
<!-- Microsoft Word Template -->
@@ -139,18 +139,18 @@
<action name="edit" ext="docm"/>
</app>
<app name="application/vnd.openxmlformats-officedocument.wordprocessingml.template">
- <action name="edit" ext="dotx"/>
+ <action name="view" ext="dotx"/>
</app>
<app name="application/vnd.ms-word.template.macroEnabled.12">
- <action name="edit" ext="dotm"/>
+ <action name="view" ext="dotm"/>
</app>
<!-- OOXML spreadsheet -->
<app name="application/vnd.openxmlformats-officedocument.spreadsheetml.template">
- <action name="edit" ext="xltx"/>
+ <action name="view" ext="xltx"/>
</app>
<app name="application/vnd.ms-excel.template.macroEnabled.12">
- <action name="edit" ext="xltm"/>
+ <action name="view" ext="xltm"/>
</app>
<app name="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
<action name="edit" ext="xlsx"/>
@@ -178,19 +178,19 @@
<!-- Others -->
<app name="application/vnd.wordperfect">
- <action name="edit" ext="wpd"/>
+ <action name="view" ext="wpd"/>
</app>
<app name="application/x-aportisdoc">
- <action name="edit" ext="pdb"/>
+ <action name="view" ext="pdb"/>
</app>
<app name="application/x-hwp">
- <action name="edit" ext="hwp"/>
+ <action name="view" ext="hwp"/>
</app>
<app name="application/vnd.ms-works">
- <action name="edit" ext="wps"/>
+ <action name="view" ext="wps"/>
</app>
<app name="application/x-mswrite">
- <action name="edit" ext="wri"/>
+ <action name="view" ext="wri"/>
</app>
<app name="application/x-dif-document">
<action name="edit" ext="dif"/>
@@ -205,31 +205,31 @@
<action name="edit" ext="dbf"/>
</app>
<app name="application/vnd.lotus-1-2-3">
- <action name="edit" ext="wk1"/>
+ <action name="view" ext="wk1"/>
</app>
<app name="image/cgm">
- <action name="edit" ext="cgm"/>
+ <action name="view" ext="cgm"/>
</app>
<app name="image/vnd.dxf">
- <action name="edit" ext="dxf"/>
+ <action name="view" ext="dxf"/>
</app>
<app name="image/x-emf">
- <action name="edit" ext="emf"/>
+ <action name="view" ext="emf"/>
</app>
<app name="image/x-wmf">
- <action name="edit" ext="wmf"/>
+ <action name="view" ext="wmf"/>
</app>
<app name="application/coreldraw">
- <action name="edit" ext="cdr"/>
+ <action name="view" ext="cdr"/>
</app>
<app name="application/vnd.visio2013">
- <action name="edit" ext="vsd"/>
+ <action name="view" ext="vsd"/>
</app>
<app name="application/vnd.visio">
- <action name="edit" ext="vss"/>
+ <action name="view" ext="vss"/>
</app>
<app name="application/x-mspublisher">
- <action name="edit" ext="pub"/>
+ <action name="view" ext="pub"/>
</app>
</net-zone>
</wopi-discovery>
diff --git a/loolwsd/lint-discovery.py b/loolwsd/lint-discovery.py
new file mode 100755
index 0000000..d2c21e2
--- /dev/null
+++ b/loolwsd/lint-discovery.py
@@ -0,0 +1,213 @@
+#!/usr/bin/env python
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, you can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# Makes sure that discovery.xml in online.git is in sync with
+# filter/source/config/fragments/ in core.git.
+
+from __future__ import print_function
+import os
+import sys
+import xml.sax
+
+
+# Parses an online.git discovery.xml.
+class DiscoveryHandler(xml.sax.handler.ContentHandler):
+ def __init__(self):
+ # List of app <-> action types.
+ self.appActions = []
+ self.inApp = False
+ self.app = None
+ self.inAction = False
+ self.action = None
+
+ def startElement(self, name, attrs):
+ if name == "app":
+ self.inApp = True
+ for k, v in list(attrs.items()):
+ if k == "name":
+ self.app = v
+ elif name == "action":
+ self.inAction = True
+ for k, v in list(attrs.items()):
+ if k == "name":
+ self.action = v
+
+ def endElement(self, name):
+ if name == "app":
+ self.inApp = False
+ if self.app and self.action:
+ self.appActions.append([self.app, self.action])
+ self.app = None
+ self.action = None
+ elif name == "action":
+ self.inAction = False
+
+
+# Parses core.git filter/source/config/fragments/types/*.xcu.
+class FilterTypeHandler(xml.sax.handler.ContentHandler):
+ def __init__(self):
+ self.name = None
+ self.inMediaType = False
+ self.content = []
+ self.mediaType = None
+
+ def startElement(self, name, attrs):
+ if name == "node":
+ for k, v in list(attrs.items()):
+ if k == "oor:name":
+ self.name = v
+ elif name == "prop":
+ for k, v in list(attrs.items()):
+ if k == "oor:name" and v == "MediaType":
+ self.inMediaType = True
+
+ def endElement(self, name):
+ if name == "prop" and self.inMediaType:
+ self.inMediaType = False
+ self.mediaType = "".join(self.content).strip()
+ self.content = []
+
+ def characters(self, content):
+ if self.inMediaType:
+ self.content.append(content)
+
+
+# Parses core.git filter/source/config/fragments/filters/*.xcu.
+class FilterFragmentHandler(xml.sax.handler.ContentHandler):
+ def __init__(self):
+ self.inType = False
+ self.typeName = None
+ self.inFlags = False
+ self.flags = None
+ self.content = []
+
+ def startElement(self, name, attrs):
+ if name == "prop":
+ for k, v in list(attrs.items()):
+ if k == "oor:name" and v == "Type":
+ self.inType = True
+ elif k == "oor:name" and v == "Flags":
+ self.inFlags = True
+
+ def endElement(self, name):
+ if name == "prop" and self.inType:
+ self.inType = False
+ self.typeName = "".join(self.content).strip()
+ self.content = []
+ elif name == "prop" and self.inFlags:
+ self.inFlags = False
+ encodedFlags = "".join(self.content).strip().encode("utf-8")
+ self.flags = encodedFlags.split(" ")
+ self.content = []
+
+ def characters(self, content):
+ if self.inType or self.inFlags:
+ self.content.append(content)
+
+
+# Builds a MIME type -> filter flag dictionary.
+def getFilterFlags(filterDir):
+ # Build a MIME type -> type name dictionary.
+ filterNames = {}
+ typeFragments = os.path.join(filterDir, "types")
+ for typeFragment in os.listdir(typeFragments):
+ if not typeFragment.endswith(".xcu"):
+ continue
+
+ parser = xml.sax.make_parser()
+ filterTypeHandler = FilterTypeHandler()
+ parser.setContentHandler(filterTypeHandler)
+ parser.parse(os.path.join(typeFragments, typeFragment))
+ # Did we find a MIME type?
+ if filterTypeHandler.mediaType:
+ filterNames[filterTypeHandler.mediaType] = filterTypeHandler.name
+
+ # core.git doesn't declares this, but probably this is the intention.
+ filterNames["application/x-dif-document"] = "calc_DIF"
+ filterNames["application/x-dbase"] = "calc_dBase"
+
+ # Build a 'type name' -> 'filter flag list' dictionary.
+ typeNameFlags = {}
+ filterFragments = os.path.join(filterDir, "filters")
+ for filterFragment in os.listdir(filterFragments):
+ if not filterFragment.endswith(".xcu"):
+ continue
+
+ parser = xml.sax.make_parser()
+ handler = FilterFragmentHandler()
+ parser.setContentHandler(handler)
+ parser.parse(os.path.join(filterFragments, filterFragment))
+ typeNameFlags[handler.typeName] = handler.flags
+
+ # Now build the combined MIME type -> filter flags one.
+ filterFlags = {}
+ for i in filterNames.keys():
+ typeName = filterNames[i]
+ if typeName in typeNameFlags.keys():
+ filterFlags[i] = typeNameFlags[typeName]
+
+ return filterFlags
+
+# How it's described in discovery.xml -> how core.git knows it.
+mimeTypeAliases = {
+ 'application/coreldraw': 'application/vnd.corel-draw',
+ 'application/vnd.visio2013': 'application/vnd.visio',
+}
+
+# We know that these can be edited.
+mimeTypeWhiteList = {
+ 'application/vnd.ms-excel',
+ 'application/vnd.oasis.opendocument.text',
+ 'application/msword',
+}
+
+
+def main():
+ discoveryXml = "discovery.xml"
+ repoGuess = os.path.join(os.environ["HOME"], "git/libreoffice/master")
+ filterDir = os.path.join(repoGuess, "filter/source/config/fragments")
+ if len(sys.argv) >= 3:
+ discoveryXml = sys.argv[1]
+ filterDir = sys.arv[2]
+
+ # Parse discovery.xml, which describes what online.git exposes at the
+ # moment.
+ parser = xml.sax.make_parser()
+ discoveryHandler = DiscoveryHandler()
+ parser.setContentHandler(discoveryHandler)
+ parser.parse(discoveryXml)
+
+ # Parse core.git filter definitions to build a MIME type <-> filter flag
+ # dictionary.
+ filterFlags = getFilterFlags(filterDir)
+
+ # Now look up the filter flags in core.git for the MIME type.
+ for i in discoveryHandler.appActions:
+ mimeType = i[0]
+ discoveryAction = i[1]
+ if mimeType in mimeTypeWhiteList:
+ continue
+ if mimeType in mimeTypeAliases.keys():
+ mimeType = mimeTypeAliases[mimeType]
+ if mimeType in filterFlags.keys():
+ flags = filterFlags[mimeType]
+ if "IMPORT" in flags and "EXPORT" in flags:
+ coreAction = "edit"
+ else:
+ coreAction = "view"
+
+ if discoveryAction != coreAction:
+ # Inconsistency found.
+ print("warning: action for '" + mimeType + "' " +
+ "is '" + discoveryAction + "', " +
+ "but it should be '" + coreAction + "'")
+
+if __name__ == "__main__":
+ main()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
More information about the Libreoffice-commits
mailing list