1*23436e16SPedro Giffuni#!/usr/bin/env python 2cdf0e10cSrcweir#_____________________________________________ 3cdf0e10cSrcweir# Caolan McNamara caolanm@redhat.com 4cdf0e10cSrcweir# converted from original java written by Andreas Schluens so we can continue 5cdf0e10cSrcweir# to build 680 OpenOffice.org series without java 6cdf0e10cSrcweir# this is not really a replacement for the existing java tool, just the 7cdf0e10cSrcweir# minimum required to make it work for now, the existing tool is still 8cdf0e10cSrcweir# the canonical base, changes to it will have to be mirrored here until 9cdf0e10cSrcweir# there is a java which is available for use by all 10cdf0e10cSrcweir#_____________________________________________ 11cdf0e10cSrcweir 12*23436e16SPedro Giffuniimport sys, string, os.path 13cdf0e10cSrcweir 14cdf0e10cSrcweirCFGFILE = os.environ["SOLARVER"] + "/" + os.environ["INPATH"] + "/inc/l10ntools/FCFGMerge.cfg" 15cdf0e10cSrcweir 16cdf0e10cSrcweirPROP_XMLVERSION = "xmlversion" # // <= global cfg file 17cdf0e10cSrcweirPROP_XMLENCODING = "xmlencoding" # // <= global cfg file 18cdf0e10cSrcweirPROP_XMLPATH = "xmlpath" # // <= global cfg file 19cdf0e10cSrcweirPROP_XMLPACKAGE = "xmlpackage" # // <= global cfg file 20cdf0e10cSrcweirPROP_SETNAME_TYPES = "setname_types" # // <= global cfg file 21cdf0e10cSrcweirPROP_SETNAME_FILTERS = "setname_filters" # // <= global cfg file 22cdf0e10cSrcweirPROP_SETNAME_LOADERS = "setname_frameloaders" # // <= global cfg file 23cdf0e10cSrcweirPROP_SETNAME_HANDLERS = "setname_contenthandlers" # // <= global cfg file 24cdf0e10cSrcweirPROP_SUBDIR_TYPES = "subdir_types" # // <= global cfg file 25cdf0e10cSrcweirPROP_SUBDIR_FILTERS = "subdir_filters" # // <= global cfg file 26cdf0e10cSrcweirPROP_SUBDIR_LOADERS = "subdir_frameloaders" # // <= global cfg file 27cdf0e10cSrcweirPROP_SUBDIR_HANDLERS = "subdir_contenthandlers" # // <= global cfg file 28cdf0e10cSrcweirPROP_EXTENSION_XCU = "extension_xcu" # // <= global cfg file 29cdf0e10cSrcweirPROP_EXTENSION_PKG = "extension_pkg" # // <= global cfg file 30cdf0e10cSrcweirPROP_DELIMITER = "delimiter" # // <= global cfg file 31cdf0e10cSrcweirPROP_TRIM = "trim" # // <= global cfg file 32cdf0e10cSrcweirPROP_DECODE = "decode" # // <= global cfg file 33cdf0e10cSrcweirPROP_FRAGMENTSDIR = "fragmentsdir" # // <= cmdline 34cdf0e10cSrcweirPROP_TEMPDIR = "tempdir" # // <= cmdline 35cdf0e10cSrcweirPROP_OUTDIR = "outdir" # // <= cmdline 36cdf0e10cSrcweirPROP_PKG = "pkg" # // <= cmdline 37cdf0e10cSrcweirPROP_TCFG = "tcfg" # // <= cmdline 38cdf0e10cSrcweirPROP_FCFG = "fcfg" # // <= cmdline 39cdf0e10cSrcweirPROP_LCFG = "lcfg" # // <= cmdline 40cdf0e10cSrcweirPROP_CCFG = "ccfg" # // <= cmdline 41cdf0e10cSrcweirPROP_LANGUAGEPACK = "languagepack" # // <= cmdline 42cdf0e10cSrcweirPROP_ITEMS = "items" # // <= pkg cfg files! 43cdf0e10cSrcweir 44cdf0e10cSrcweir#---begin java.util.Properties copy---# 45cdf0e10cSrcweir""" 46cdf0e10cSrcweir 47*23436e16SPedro GiffuniAn incomplete clean room implementation of 48cdf0e10cSrcweirjava.util.Properties written in Python. 49cdf0e10cSrcweir 50cdf0e10cSrcweirCopyright (C) 2002,2004 - Ollie Rutherfurd <oliver@rutherfurd.net> 51cdf0e10cSrcweir 52cdf0e10cSrcweirBased on: 53cdf0e10cSrcweir 54*23436e16SPedro Giffuni http://java.sun.com/j2se/1.3/docs/api/java/util/Properties.html 55cdf0e10cSrcweir 56cdf0e10cSrcweirMissing: 57cdf0e10cSrcweir 58cdf0e10cSrcweir - Currently, u\XXXX sequences are escaped when saving, but not unescaped 59cdf0e10cSrcweir when read.. 60cdf0e10cSrcweir 61cdf0e10cSrcweirLicense: Python License 62cdf0e10cSrcweir 63cdf0e10cSrcweirExample Usage: 64cdf0e10cSrcweir 65cdf0e10cSrcweir>>> from properties import Properties 66cdf0e10cSrcweir>>> props = Properties() 67cdf0e10cSrcweir>>> props['one'] = '1' 68cdf0e10cSrcweir>>> props['your name'] = "I don't know" 69cdf0e10cSrcweir>>> print '\n'.join(props.keys()) 70cdf0e10cSrcweiryour name 71cdf0e10cSrcweirone 72cdf0e10cSrcweir>>> from StringIO import StringIO 73cdf0e10cSrcweir>>> buff = StringIO() 74cdf0e10cSrcweir>>> props.store(buff, "a little example...") 75cdf0e10cSrcweir>>> buff.seek(0) 76cdf0e10cSrcweir>>> print buff.read() 77cdf0e10cSrcweir# a little example... 78cdf0e10cSrcweiryour\ name=I\ don\'t\ know 79cdf0e10cSrcweirone=1 80cdf0e10cSrcweir>>> print props['your name'] 81cdf0e10cSrcweirI don't know 82cdf0e10cSrcweir 83cdf0e10cSrcweir$Id: pyAltFCFGMerge,v 1.3 2007-12-07 10:57:44 vg Exp $ 84cdf0e10cSrcweir 85cdf0e10cSrcweir""" 86cdf0e10cSrcweir 87cdf0e10cSrcweir__all__ = ['Properties'] 88cdf0e10cSrcweir 89cdf0e10cSrcweir 90cdf0e10cSrcweirdef dec2hex(n): 91cdf0e10cSrcweir 92*23436e16SPedro Giffuni h = hex(n)[2:].upper() 93*23436e16SPedro Giffuni return '\\u' + '0' * (4 - len(h)) + h 94cdf0e10cSrcweir 95cdf0e10cSrcweir 96cdf0e10cSrcweirdef escapestr(s): 97cdf0e10cSrcweir 98*23436e16SPedro Giffuni buff = [] 99*23436e16SPedro Giffuni # QUESTION: escape leading or trailing spaces? 100*23436e16SPedro Giffuni for c in s: 101*23436e16SPedro Giffuni if c == '\\': 102*23436e16SPedro Giffuni buff.append('\\\\') 103*23436e16SPedro Giffuni elif c == '\t': 104*23436e16SPedro Giffuni buff.append('\\t') 105*23436e16SPedro Giffuni elif c == '\n': 106*23436e16SPedro Giffuni buff.append('\\n') 107*23436e16SPedro Giffuni elif c == '\r': 108*23436e16SPedro Giffuni buff.append('\\r') 109*23436e16SPedro Giffuni elif c == ' ': 110*23436e16SPedro Giffuni buff.append('\\ ') 111*23436e16SPedro Giffuni elif c == "'": 112*23436e16SPedro Giffuni buff.append("\\'") 113*23436e16SPedro Giffuni elif c == '"': 114*23436e16SPedro Giffuni buff.append('\\"') 115*23436e16SPedro Giffuni elif c == '#': 116*23436e16SPedro Giffuni buff.append('\\#') 117*23436e16SPedro Giffuni elif c == '!': 118*23436e16SPedro Giffuni buff.append('\\!') 119*23436e16SPedro Giffuni elif c == '=': 120*23436e16SPedro Giffuni buff.append('\\=') 121*23436e16SPedro Giffuni elif 32 <= ord(c) <= 126: 122*23436e16SPedro Giffuni buff.append(c) 123*23436e16SPedro Giffuni else: 124*23436e16SPedro Giffuni buff.append(dec2hex(c)) 125*23436e16SPedro Giffuni 126*23436e16SPedro Giffuni return ''.join(buff) 127cdf0e10cSrcweir 128cdf0e10cSrcweir 129cdf0e10cSrcweir# TODO: add support for \uXXXX? 130cdf0e10cSrcweirdef unescapestr(line): 131cdf0e10cSrcweir 132*23436e16SPedro Giffuni buff = [] 133*23436e16SPedro Giffuni escape = 0 134*23436e16SPedro Giffuni for i in range(len(line)): 135*23436e16SPedro Giffuni c = line[i] 136*23436e16SPedro Giffuni if c == '\\': 137*23436e16SPedro Giffuni if escape: 138*23436e16SPedro Giffuni escape = 0 139*23436e16SPedro Giffuni buff.append('\\') 140*23436e16SPedro Giffuni continue 141*23436e16SPedro Giffuni else: 142*23436e16SPedro Giffuni # this is to deal with '\' 143*23436e16SPedro Giffuni # acting as a line continuation 144*23436e16SPedro Giffuni # character 145*23436e16SPedro Giffuni if i == len(line) - 1: 146*23436e16SPedro Giffuni buff.append('\\') 147*23436e16SPedro Giffuni break 148*23436e16SPedro Giffuni else: 149*23436e16SPedro Giffuni escape = 1 150*23436e16SPedro Giffuni continue 151*23436e16SPedro Giffuni elif c == 'n': 152*23436e16SPedro Giffuni if escape: 153*23436e16SPedro Giffuni escape = 0 154*23436e16SPedro Giffuni buff.append('\n') 155*23436e16SPedro Giffuni continue 156*23436e16SPedro Giffuni elif c == 'r': 157*23436e16SPedro Giffuni if escape: 158*23436e16SPedro Giffuni escape = 0 159*23436e16SPedro Giffuni buff.append('\r') 160*23436e16SPedro Giffuni continue 161*23436e16SPedro Giffuni elif c == 't': 162*23436e16SPedro Giffuni if escape: 163*23436e16SPedro Giffuni escape = 0 164*23436e16SPedro Giffuni buff.append('\t') 165*23436e16SPedro Giffuni continue 166*23436e16SPedro Giffuni 167*23436e16SPedro Giffuni buff.append(c) 168*23436e16SPedro Giffuni 169*23436e16SPedro Giffuni # make sure escape doesn't stay one 170*23436e16SPedro Giffuni # all expected escape sequences either break 171*23436e16SPedro Giffuni # or continue, so this should be safe 172*23436e16SPedro Giffuni if escape: 173*23436e16SPedro Giffuni escape = 0 174*23436e16SPedro Giffuni 175*23436e16SPedro Giffuni return ''.join(buff) 176cdf0e10cSrcweir 177cdf0e10cSrcweir 178cdf0e10cSrcweir 179cdf0e10cSrcweirclass Properties(dict): 180cdf0e10cSrcweir 181*23436e16SPedro Giffuni def __init__(self, defaults={}): 182*23436e16SPedro Giffuni dict.__init__(self) 183*23436e16SPedro Giffuni for n,v in defaults.items(): 184*23436e16SPedro Giffuni self[n] = v 185*23436e16SPedro Giffuni 186*23436e16SPedro Giffuni def __getittem__(self,key): 187*23436e16SPedro Giffuni try: 188*23436e16SPedro Giffuni return dict.__getittem__(self,key) 189*23436e16SPedro Giffuni except KeyError: 190*23436e16SPedro Giffuni return None 191*23436e16SPedro Giffuni 192*23436e16SPedro Giffuni def read(self,filename): 193*23436e16SPedro Giffuni """ 194*23436e16SPedro Giffuni Reads properties from a file (java Property class 195*23436e16SPedro Giffuni reads from an input stream -- see load()). 196*23436e16SPedro Giffuni """ 197*23436e16SPedro Giffuni f = None 198*23436e16SPedro Giffuni try: 199*23436e16SPedro Giffuni f = open(filename) 200*23436e16SPedro Giffuni self.load(f) 201*23436e16SPedro Giffuni finally: 202*23436e16SPedro Giffuni if f: 203*23436e16SPedro Giffuni f.close() 204*23436e16SPedro Giffuni 205*23436e16SPedro Giffuni def load(self, buff): 206*23436e16SPedro Giffuni """ 207*23436e16SPedro Giffuni Reads properties from a stream (StringIO, file, etc...) 208*23436e16SPedro Giffuni """ 209*23436e16SPedro Giffuni props = readprops(buff) 210*23436e16SPedro Giffuni #for n,v in props.iteritems(): 211*23436e16SPedro Giffuni for n in props.keys(): 212*23436e16SPedro Giffuni self[n] = props[n] 213cdf0e10cSrcweir 214cdf0e10cSrcweirdef readprops(buff): 215cdf0e10cSrcweir 216*23436e16SPedro Giffuni name,value = None,'' 217*23436e16SPedro Giffuni props = {} 218*23436e16SPedro Giffuni continued = 0 219*23436e16SPedro Giffuni 220*23436e16SPedro Giffuni while 1: 221*23436e16SPedro Giffuni line = buff.readline() 222*23436e16SPedro Giffuni if not line: 223*23436e16SPedro Giffuni break 224*23436e16SPedro Giffuni line = line.strip() 225*23436e16SPedro Giffuni 226*23436e16SPedro Giffuni # empty line 227*23436e16SPedro Giffuni if not line: 228*23436e16SPedro Giffuni continue 229*23436e16SPedro Giffuni 230*23436e16SPedro Giffuni # comment 231*23436e16SPedro Giffuni if line[0] in ('#','!'): 232*23436e16SPedro Giffuni continue 233*23436e16SPedro Giffuni 234*23436e16SPedro Giffuni # find name 235*23436e16SPedro Giffuni i,escaped = 0,0 236*23436e16SPedro Giffuni while i < len(line): 237*23436e16SPedro Giffuni c = line[i] 238*23436e16SPedro Giffuni 239*23436e16SPedro Giffuni if c == '\\': 240*23436e16SPedro Giffuni if escaped: 241*23436e16SPedro Giffuni escaped = 0 242*23436e16SPedro Giffuni else: 243*23436e16SPedro Giffuni escaped = 1 244*23436e16SPedro Giffuni i += 1 245*23436e16SPedro Giffuni continue 246*23436e16SPedro Giffuni 247*23436e16SPedro Giffuni elif c in (' ', '\t', ':', '=') and not escaped: 248*23436e16SPedro Giffuni name = unescapestr(line[:i]) 249*23436e16SPedro Giffuni break 250*23436e16SPedro Giffuni 251*23436e16SPedro Giffuni # make sure escaped doesn't stay on 252*23436e16SPedro Giffuni if escaped: 253*23436e16SPedro Giffuni escaped = 0 254*23436e16SPedro Giffuni 255*23436e16SPedro Giffuni i += 1 256*23436e16SPedro Giffuni 257*23436e16SPedro Giffuni # no dlimiter was found, name is entire line, there is no value 258*23436e16SPedro Giffuni if name == None: 259*23436e16SPedro Giffuni name = unescapestr(line.lstrip()) 260*23436e16SPedro Giffuni 261*23436e16SPedro Giffuni # skip delimiter 262*23436e16SPedro Giffuni while line[i:i+1] in ('\t', ' ', ':', '='): 263*23436e16SPedro Giffuni i += 1 264*23436e16SPedro Giffuni 265*23436e16SPedro Giffuni value = unescapestr(line[i:].strip()) 266*23436e16SPedro Giffuni while value[-1:] == '\\': 267*23436e16SPedro Giffuni value = value[:-1] # remove \ 268*23436e16SPedro Giffuni line = buff.readline() 269*23436e16SPedro Giffuni if not line: 270*23436e16SPedro Giffuni break 271*23436e16SPedro Giffuni value += unescapestr(line.strip()) 272*23436e16SPedro Giffuni 273*23436e16SPedro Giffuni #print 'value:',value ## 274*23436e16SPedro Giffuni props[name] = value 275*23436e16SPedro Giffuni 276*23436e16SPedro Giffuni return props 277cdf0e10cSrcweir#---end java.util.Properties copy---# 278cdf0e10cSrcweir 279cdf0e10cSrcweir# Its a simple command line tool, which can merge different XML fragments 280cdf0e10cSrcweir# together. Such fragments must exist as files on disk, will be moved into 281cdf0e10cSrcweir# one file together on disk. 282*23436e16SPedro Giffuni# 283cdf0e10cSrcweir# @author Andreas Schluens 284*23436e16SPedro Giffuni# 285cdf0e10cSrcweirdef run(sCmdLine): 286cdf0e10cSrcweir printCopyright() 287cdf0e10cSrcweir 288cdf0e10cSrcweir aCfg = ConfigHelper(CFGFILE, sCmdLine) 289cdf0e10cSrcweir 290cdf0e10cSrcweir # help requested? 291cdf0e10cSrcweir if aCfg.isHelp(): 292cdf0e10cSrcweir printHelp() 293cdf0e10cSrcweir sys.exit(-1) 294cdf0e10cSrcweir 295cdf0e10cSrcweir #create new merge object and start operation 296cdf0e10cSrcweir aMerger = Merger(aCfg) 297cdf0e10cSrcweir aMerger.merge() 298cdf0e10cSrcweir 299cdf0e10cSrcweir sys.exit(0) 300cdf0e10cSrcweir 301cdf0e10cSrcweir#prints out a copyright message on stdout. 302cdf0e10cSrcweirdef printCopyright(): 303*23436e16SPedro Giffuni print("FCFGMerge") 304*23436e16SPedro Giffuni print("Copyright: 2003 by Red Hat, Inc., based on FCFGMerge.java` by Sun") 305*23436e16SPedro Giffuni print("All Rights Reserved.") 306cdf0e10cSrcweir 307cdf0e10cSrcweir#prints out a help message on stdout. 308cdf0e10cSrcweirdef printHelp(): 309*23436e16SPedro Giffuni print("____________________________________________________________") 310*23436e16SPedro Giffuni print("usage: FCFGMerge cfg=<file name>") 311*23436e16SPedro Giffuni print("parameters:") 312*23436e16SPedro Giffuni print("\tcfg=<file name>") 313*23436e16SPedro Giffuni print("\t\tmust point to a system file, which contains") 314*23436e16SPedro Giffuni print("\t\tall neccessary configuration data for the merge process.") 315*23436e16SPedro Giffuni print("\tFurther cou can specify every parameter allowed in the") 316*23436e16SPedro Giffuni print("\tconfig file as command line parameter too, to overwrite") 317*23436e16SPedro Giffuni print("\tthe value from the file.") 318cdf0e10cSrcweir 319cdf0e10cSrcweirdef StringTokenizer(mstring, separators, isSepIncluded=0): 320cdf0e10cSrcweir#Return a list of tokens given a base string and a string of 321cdf0e10cSrcweir#separators, optionally including the separators if asked for""" 322cdf0e10cSrcweir token='' 323cdf0e10cSrcweir tokenList=[] 324cdf0e10cSrcweir for c in mstring: 325cdf0e10cSrcweir if c in separators: 326cdf0e10cSrcweir if token != '': 327cdf0e10cSrcweir tokenList.append(token) 328cdf0e10cSrcweir token='' 329cdf0e10cSrcweir if isSepIncluded: 330cdf0e10cSrcweir tokenList.append(c) 331cdf0e10cSrcweir else: 332cdf0e10cSrcweir token+=c 333cdf0e10cSrcweir if token: 334cdf0e10cSrcweir tokenList.append(token) 335cdf0e10cSrcweir return tokenList 336cdf0e10cSrcweir 337cdf0e10cSrcweir# can be used to analyze command line parameters 338cdf0e10cSrcweir# and merge it together with might existing config 339cdf0e10cSrcweir# files. That provides the possibility to overwrite 340cdf0e10cSrcweir# config values via command line parameter. 341*23436e16SPedro Giffuni# 342cdf0e10cSrcweir# @author Andreas Schluens 343cdf0e10cSrcweirclass ConfigHelper: 344cdf0e10cSrcweir def __init__(self, sPropFile, lCommandLineArgs): 345*23436e16SPedro Giffuni self.m_bEmpty = 1 346cdf0e10cSrcweir # first load prop file, so its values can be overwritten 347cdf0e10cSrcweir # by command line args later 348cdf0e10cSrcweir # Do it only, if a valid file name was given. 349cdf0e10cSrcweir # But in case this file name is wrong, throw an exception. 350cdf0e10cSrcweir # So the outside code can react! 351cdf0e10cSrcweir if sPropFile != None and len(sPropFile) > 0: 352cdf0e10cSrcweir self.props = Properties() 353cdf0e10cSrcweir self.props.read(sPropFile) 354cdf0e10cSrcweir 355cdf0e10cSrcweir count = 0 356cdf0e10cSrcweir if lCommandLineArgs != None: 357cdf0e10cSrcweir count = len(lCommandLineArgs) 358*23436e16SPedro Giffuni print("Count is {c}".format(c=count)) 359cdf0e10cSrcweir self.m_bEmpty = (count < 1) 360cdf0e10cSrcweir 361*23436e16SPedro Giffuni #print( lCommandLineArgs, "and len is", count ) 362cdf0e10cSrcweir for arg in range(count): 363cdf0e10cSrcweir # is it a named-value argument? 364cdf0e10cSrcweir # Note: We ignores double "=" signs! => search from left to right 365cdf0e10cSrcweir pos = lCommandLineArgs[arg].find('=') 366cdf0e10cSrcweir if pos != -1: 367cdf0e10cSrcweir sArg = lCommandLineArgs[arg][0:pos] 368cdf0e10cSrcweir sValue = lCommandLineArgs[arg][pos+1:] 369cdf0e10cSrcweir self.props[sArg] = sValue 370cdf0e10cSrcweir continue 371cdf0e10cSrcweir 372cdf0e10cSrcweir # is it a boolean argument? 373cdf0e10cSrcweir # Note: Because "--" and "-" will be interpreted as the same 374cdf0e10cSrcweir # we search from right to left! 375*23436e16SPedro Giffuni pos = lCommandLineArgs[arg].rfind('-') 376cdf0e10cSrcweir if pos == -1: 377cdf0e10cSrcweir pos = lCommandLineArgs[arg].rfind('/') 378cdf0e10cSrcweir if pos != -1: 379cdf0e10cSrcweir sArg = lCommandLineArgs[arg][pos+1:] 380cdf0e10cSrcweir self.props[sArg] = 1 381cdf0e10cSrcweir continue 382*23436e16SPedro Giffuni 383*23436e16SPedro Giffuni raise Exception("Invalid command line detected. The argument \""+lCommandLineArgs[arg]+"\" use an unsupported format.") 384cdf0e10cSrcweir 385cdf0e10cSrcweir# for item in self.props: 386cdf0e10cSrcweir# print item, '->', self.props[item] 387cdf0e10cSrcweir 388cdf0e10cSrcweir def isHelp(self): 389cdf0e10cSrcweir return ( 390*23436e16SPedro Giffuni ("help" in self.props) or 391*23436e16SPedro Giffuni ("?" in self.props ) or 392*23436e16SPedro Giffuni ("h" in self.props ) 393cdf0e10cSrcweir ) 394cdf0e10cSrcweir 395cdf0e10cSrcweir def getValue(self, sProp): 396*23436e16SPedro Giffuni if not sProp in self.props: 397cdf0e10cSrcweir raise Exception("The requested config value \""+sProp+"\" "\ 398cdf0e10cSrcweir "does not exists!"); 399cdf0e10cSrcweir return self.props[sProp]; 400cdf0e10cSrcweir 401cdf0e10cSrcweir def getValueWithDefault(self, sProp, default): 402*23436e16SPedro Giffuni if not sProp in self.props: 403*23436e16SPedro Giffuni return default; 404cdf0e10cSrcweir return self.props[sProp]; 405cdf0e10cSrcweir 406cdf0e10cSrcweir def getStringList(self, sProp, sDelimiter, bTrim, bDecode): 407*23436e16SPedro Giffuni if not sProp in self.props: 408cdf0e10cSrcweir raise Exception("The requested config value \""+sProp+"\" does "\ 409cdf0e10cSrcweir "not exists!"); 410cdf0e10cSrcweir sValue = self.props[sProp] 411cdf0e10cSrcweir 412cdf0e10cSrcweir lValue = [] 413cdf0e10cSrcweir lTokens = StringTokenizer(sValue, sDelimiter) 414cdf0e10cSrcweir for sToken in lTokens: 415cdf0e10cSrcweir if bTrim: 416*23436e16SPedro Giffuni sToken = sToken.strip() 417*23436e16SPedro Giffuni 418cdf0e10cSrcweir # remove "" 419cdf0e10cSrcweir if ((bDecode) and (sToken.find("\"") == 0) and \ 420cdf0e10cSrcweir (sToken.rfind("\"") == len(sToken)-1)): 421cdf0e10cSrcweir sToken = sToken[1, len(sToken)-1] 422cdf0e10cSrcweir lValue.append(sToken) 423cdf0e10cSrcweir 424cdf0e10cSrcweir return lValue 425cdf0e10cSrcweir 426cdf0e10cSrcweirdef generateHeader(sVersion, sEncoding, sPath, sPackage, bLanguagePack): 427cdf0e10cSrcweir sHeader = "<?xml version=\"" 428cdf0e10cSrcweir sHeader += sVersion 429cdf0e10cSrcweir sHeader += "\" encoding=\"" 430cdf0e10cSrcweir sHeader += sEncoding 431cdf0e10cSrcweir sHeader += "\"?>\n" 432cdf0e10cSrcweir 433cdf0e10cSrcweir if bLanguagePack: 434cdf0e10cSrcweir sHeader += "<oor:component-data oor:package=\"" 435cdf0e10cSrcweir sHeader += sPath 436cdf0e10cSrcweir sHeader += "\" oor:name=\"" 437cdf0e10cSrcweir sHeader += sPackage 438cdf0e10cSrcweir sHeader += "\" xmlns:install=\"http://openoffice.org/2004/installation\"" 439cdf0e10cSrcweir sHeader += " xmlns:oor=\"http://openoffice.org/2001/registry\"" 440cdf0e10cSrcweir sHeader += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" 441cdf0e10cSrcweir sHeader += " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" 442cdf0e10cSrcweir else: 443cdf0e10cSrcweir sHeader += "<oor:component-data xmlns:oor=\"http://openoffice.org/2001/registry\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" oor:package=\"" 444cdf0e10cSrcweir sHeader += sPath 445cdf0e10cSrcweir sHeader += "\" oor:name=\"" 446cdf0e10cSrcweir sHeader += sPackage 447cdf0e10cSrcweir sHeader += "\">\n" 448cdf0e10cSrcweir return sHeader 449cdf0e10cSrcweir 450cdf0e10cSrcweirdef generateFooter(): 451cdf0e10cSrcweir return "</oor:component-data>\n" 452cdf0e10cSrcweir 453cdf0e10cSrcweir# can merge different xml fragments together. 454*23436e16SPedro Giffuni# 455cdf0e10cSrcweir# @author Caolan McNamara converted from the original java by Andreas Schluens 456*23436e16SPedro Giffuni# 457cdf0e10cSrcweirclass Merger: 458cdf0e10cSrcweir def __init__(self, aCfg): 459cdf0e10cSrcweir self.m_aCfg = aCfg 460cdf0e10cSrcweir 461cdf0e10cSrcweir self.m_aFragmentsDir = self.m_aCfg.getValue(PROP_FRAGMENTSDIR) 462cdf0e10cSrcweir 463cdf0e10cSrcweir sDelimiter = self.m_aCfg.getValue(PROP_DELIMITER) 464cdf0e10cSrcweir bTrim = self.m_aCfg.getValue(PROP_TRIM) 465cdf0e10cSrcweir bDecode = self.m_aCfg.getValue(PROP_DECODE) 466cdf0e10cSrcweir 467cdf0e10cSrcweir try: 468cdf0e10cSrcweir aFcfg = ConfigHelper(self.m_aCfg.getValue(PROP_TCFG), None) 469cdf0e10cSrcweir self.m_lTypes = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode) 470cdf0e10cSrcweir except: 471cdf0e10cSrcweir self.m_lTypes = [] 472cdf0e10cSrcweir 473cdf0e10cSrcweir try: 474cdf0e10cSrcweir aFcfg = ConfigHelper(self.m_aCfg.getValue(PROP_FCFG), None) 475cdf0e10cSrcweir self.m_lFilters = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode) 476cdf0e10cSrcweir except: 477*23436e16SPedro Giffuni print( "Filters are empty" ) 478cdf0e10cSrcweir self.m_lFilters = [] 479cdf0e10cSrcweir 480cdf0e10cSrcweir try: 481cdf0e10cSrcweir aFcfg = ConfigHelper(self.m_aCfg.getValue(PROP_LCFG), None) 482cdf0e10cSrcweir self.m_lLoaders = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode) 483cdf0e10cSrcweir except: 484cdf0e10cSrcweir self.m_lLoaders = [] 485cdf0e10cSrcweir 486cdf0e10cSrcweir try: 487cdf0e10cSrcweir aFcfg = ConfigHelper(self.m_aCfg.getValue(PROP_CCFG), None) 488cdf0e10cSrcweir self.m_lHandlers = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode) 489cdf0e10cSrcweir except: 490cdf0e10cSrcweir self.m_lHandlers = [] 491cdf0e10cSrcweir 492cdf0e10cSrcweir def merge(self): 493cdf0e10cSrcweir sPackage = self.m_aCfg.getValue(PROP_PKG) 494cdf0e10cSrcweir 495*23436e16SPedro Giffuni print("create package \""+sPackage+"\" ...") 496*23436e16SPedro Giffuni print("generate package header ... ") 497cdf0e10cSrcweir 498cdf0e10cSrcweir sBuffer = generateHeader(\ 499cdf0e10cSrcweir self.m_aCfg.getValue(PROP_XMLVERSION ),\ 500cdf0e10cSrcweir self.m_aCfg.getValue(PROP_XMLENCODING),\ 501cdf0e10cSrcweir self.m_aCfg.getValue(PROP_XMLPATH ),\ 502cdf0e10cSrcweir self.m_aCfg.getValue(PROP_XMLPACKAGE ),\ 503cdf0e10cSrcweir self.m_aCfg.getValueWithDefault(PROP_LANGUAGEPACK, False)) 504cdf0e10cSrcweir 505cdf0e10cSrcweir # counts all transfered fragments 506cdf0e10cSrcweir # Can be used later to decide, if a generated package file 507cdf0e10cSrcweir # contains "nothing"! 508cdf0e10cSrcweir nItemCount = 0 509cdf0e10cSrcweir 510cdf0e10cSrcweir for i in range(4): 511cdf0e10cSrcweir sSetName = None 512cdf0e10cSrcweir sSubDir = None 513cdf0e10cSrcweir lFragments = None 514cdf0e10cSrcweir 515cdf0e10cSrcweir try: 516cdf0e10cSrcweir if i == 0: #types 517*23436e16SPedro Giffuni print("generate set for types ... ") 518cdf0e10cSrcweir sSetName = self.m_aCfg.getValue(PROP_SETNAME_TYPES) 519cdf0e10cSrcweir sSubDir = self.m_aCfg.getValue(PROP_SUBDIR_TYPES ) 520cdf0e10cSrcweir lFragments = self.m_lTypes 521cdf0e10cSrcweir elif i == 1: # filters 522*23436e16SPedro Giffuni print("generate set for filter ... ") 523cdf0e10cSrcweir sSetName = self.m_aCfg.getValue(PROP_SETNAME_FILTERS) 524cdf0e10cSrcweir sSubDir = self.m_aCfg.getValue(PROP_SUBDIR_FILTERS ) 525cdf0e10cSrcweir lFragments = self.m_lFilters 526cdf0e10cSrcweir elif i == 2: # loaders 527*23436e16SPedro Giffuni print("generate set for frame loader ... ") 528cdf0e10cSrcweir sSetName = self.m_aCfg.getValue(PROP_SETNAME_LOADERS) 529cdf0e10cSrcweir sSubDir = self.m_aCfg.getValue(PROP_SUBDIR_LOADERS ) 530cdf0e10cSrcweir lFragments = self.m_lLoaders 531cdf0e10cSrcweir elif i == 3: # handlers 532*23436e16SPedro Giffuni print("generate set for content handler ... ") 533cdf0e10cSrcweir sSetName = self.m_aCfg.getValue(PROP_SETNAME_HANDLERS) 534cdf0e10cSrcweir sSubDir = self.m_aCfg.getValue(PROP_SUBDIR_HANDLERS ) 535cdf0e10cSrcweir lFragments = self.m_lHandlers 536cdf0e10cSrcweir except: 537cdf0e10cSrcweir continue 538cdf0e10cSrcweir 539*23436e16SPedro Giffuni print("Length of Fragments: {f} Set Name {setname} Subdir {subdir}". 540*23436e16SPedro Giffuni format(f=len(lFragments),setname=sSetName,subdir=sSubDir)) 541*23436e16SPedro Giffuni #sys.stdin.readline() 542cdf0e10cSrcweir nItemCount = nItemCount + len(lFragments) 543cdf0e10cSrcweir 544cdf0e10cSrcweir sBuffer = sBuffer + self.getFragments(\ 545cdf0e10cSrcweir os.path.join(self.m_aFragmentsDir, sSubDir), \ 546cdf0e10cSrcweir sSetName, lFragments, 1) 547cdf0e10cSrcweir 548*23436e16SPedro Giffuni print("generate package footer ... ") 549cdf0e10cSrcweir sBuffer = sBuffer + generateFooter() 550cdf0e10cSrcweir 551cdf0e10cSrcweir # Attention! 552*23436e16SPedro Giffuni # If the package seems to be empty, it make no sense to generate a 553*23436e16SPedro Giffuni # corresponding xml file. We should suppress writing of this file on 554*23436e16SPedro Giffuni # disk completely ... 555cdf0e10cSrcweir if nItemCount < 1: 556*23436e16SPedro Giffuni print("Package is empty and will not result into an xml file on disk!? Please check configuration file.") 557cdf0e10cSrcweir return 558*23436e16SPedro Giffuni print("package contains "+str(nItemCount)+" items") 559cdf0e10cSrcweir 560*23436e16SPedro Giffuni aPackage = open(sPackage, mode="w") 561*23436e16SPedro Giffuni print("write temp package {pkg}".format(pkg=sPackage)) 562cdf0e10cSrcweir aPackage.write(sBuffer) 563cdf0e10cSrcweir 564cdf0e10cSrcweir def getFragments(self, aDir, sSetName, lFragments, nPrettyTabs): 565*23436e16SPedro Giffuni sBuffer = '' 566cdf0e10cSrcweir sExtXcu = self.m_aCfg.getValue(PROP_EXTENSION_XCU); 567cdf0e10cSrcweir 568cdf0e10cSrcweir if len(lFragments) < 1: 569cdf0e10cSrcweir return sBuffer 570*23436e16SPedro Giffuni 571cdf0e10cSrcweir for tabs in range(nPrettyTabs): 572cdf0e10cSrcweir sBuffer = sBuffer + "\t" 573cdf0e10cSrcweir sBuffer = sBuffer + "<node oor:name=\""+sSetName+"\">\n" 574cdf0e10cSrcweir nPrettyTabs = nPrettyTabs + 1 575cdf0e10cSrcweir 576cdf0e10cSrcweir for sFragment in lFragments: 577cdf0e10cSrcweir sFragPath = os.path.join(aDir, sFragment+"."+sExtXcu) 578cdf0e10cSrcweir try: 579cdf0e10cSrcweir aFragmentFile = open(sFragPath) 580cdf0e10cSrcweir except: 581cdf0e10cSrcweir # handle simple files only and check for existence! 582cdf0e10cSrcweir raise Exception("fragment \""+sFragPath+"\" does not exists.") 583cdf0e10cSrcweir 584*23436e16SPedro Giffuni print("merge fragment \""+sFragPath+"\" ...") 585cdf0e10cSrcweir sBuffer = sBuffer + aFragmentFile.read() 586*23436e16SPedro Giffuni 587cdf0e10cSrcweir sBuffer = sBuffer + "\n" 588cdf0e10cSrcweir 589cdf0e10cSrcweir nPrettyTabs = nPrettyTabs - 1 590cdf0e10cSrcweir for tabs in range(nPrettyTabs): 591cdf0e10cSrcweir sBuffer = sBuffer + "\t" 592cdf0e10cSrcweir sBuffer = sBuffer + "</node>\n" 593cdf0e10cSrcweir return sBuffer 594cdf0e10cSrcweir 595cdf0e10cSrcweirrun(sys.argv) 596