#!/usr/bin/env python3 # -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- # # 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/. # this tool rips out configuration pieces that are not useful for # a mobile viewer / editing application without a full UI. # # ideally the postprocess/ makefile would cope with this but its # already over-complicated by rampant conditionals. import sys import xml.etree.ElementTree as ET main_xcd_discard = [ 'org.openoffice.Office/TableWizard', # huge 'org.openoffice.Office.DataAccess/Drivers', # no database 'org.openoffice.Office/Addons', # no addons # no conventional UI; reverse sorted by size 'org.openoffice.Office.UI/GenericCommands', 'org.openoffice.Office.UI/DrawImpressCommands', 'org.openoffice.Office.UI/Sidebar', 'org.openoffice.Office.UI/ChartCommands', 'org.openoffice.Office.UI/DbuCommands', 'org.openoffice.Office.UI/Controller', 'org.openoffice.Office.UI/StartModuleCommands', 'org.openoffice.Office.UI/BasicIDEWindowState', 'org.openoffice.Office.UI/GenericCategories', 'org.openoffice.Office.UI/ChartWindowState', 'org.openoffice.Office.UI/BaseWindowState', 'org.openoffice.Office.UI/BasicIDECommands', 'org.openoffice.Office.UI/BibliographyCommands', 'org.openoffice.Office.UI/DbQueryWindowState', 'org.openoffice.Office.UI/DbRelationWindowState', 'org.openoffice.Office.UI/DbTableWindowState', 'org.openoffice.Office.UI/DbTableDataWindowState', 'org.openoffice.Office.UI/DbBrowserWindowState', 'org.openoffice.Office.UI/WindowContentFactories', 'org.openoffice.Office.UI/StartModuleWindowState', 'org.openoffice.Office.UI/GlobalSettings', 'org.openoffice.Office.UI/BibliographyWindowState', 'org.openoffice.Office.UI/Category', ] if __name__ == '__main__': tree = ET.parse(sys.argv[1]) root = tree.getroot() total = 0 for child in root: total += len(ET.tostring(child)) saved = 0 to_remove = [] for child in root: section = child.attrib['{http://openoffice.org/2001/registry}name'] package = child.attrib['{http://openoffice.org/2001/registry}package'] size = len(ET.tostring(child)) key = '%s/%s' % (package, section) if key in main_xcd_discard: print('removed %s - saving %d' % (key, size)) saved = saved + size to_remove.append(child) for child in to_remove: root.remove(child) print("saved %d of %d bytes: %2.f%%" % (saved, total, saved*100.0/total)) # Don't do pointless Word -> Writer and similar conversions when we have no UI. nsDict = { "component-schema": "{http://openoffice.org/2001/registry}component-schema", "component-data": "{http://openoffice.org/2001/registry}component-data", "name": "{http://openoffice.org/2001/registry}name", } microsoftImport = '%(component-schema)s[@%(name)s="Common"]/component/group[@%(name)s="Filter"]/group[@%(name)s="Microsoft"]/group[@%(name)s="Import"]/prop' % nsDict props = root.findall(microsoftImport) for prop in props: prop.findall("value")[0].text = "false" # Disable View -> Text Boundaries for prop in root.findall('%(component-schema)s[@%(name)s="UI"]/templates/group[@%(name)s="ColorScheme"]/group[@%(name)s="DocBoundaries"]/prop' % nsDict): for value in prop.findall("value"): value.text = "false" # Disable Table -> Table Boundaries for prop in root.findall('%(component-schema)s[@%(name)s="UI"]/templates/group[@%(name)s="ColorScheme"]/group[@%(name)s="TableBoundaries"]/prop' % nsDict): for value in prop.findall("value"): value.text = "false" # Disable follow link with Ctrl+Click, use Click only for mobile app. for prop in root.findall('%(component-schema)s[@%(name)s="Common"]/component/group[@%(name)s="Security"]/group[@%(name)s="Scripting"]/prop[@%(name)s="HyperlinksWithCtrlClick"]' % nsDict): for value in prop.findall("value"): value.text = "false" # Disable Impress View -> Slide Pane for prop in root.findall('%(component-data)s[@%(name)s="Impress"]/node[@%(name)s="MultiPaneGUI"]/node[@%(name)s="SlideSorterBar"]/node[@%(name)s="Visible"]/prop[@%(name)s="ImpressView"]' % nsDict): for value in prop.findall("value"): value.text = "false" # The namespace prefixes xs and oor are present in attribute *values*, and namespace # declarations for them are needed, even if no actual elements or attributes with these # namespace prefixes are present. Fun. root.set('xmlns:xs', 'http://www.w3.org/2001/XMLSchema') root.set('xmlns:oor', 'http://openoffice.org/2001/registry') tree.write(sys.argv[2], 'UTF-8', True) # vim: set shiftwidth=4 softtabstop=4 expandtab: