76 lines
3 KiB
Python
76 lines
3 KiB
Python
'''This script allows to walk (and potentially patch) files (content.xml,
|
|
styles.xml...) contained within a given ODF file or within all ODF files
|
|
found in some folder.'''
|
|
|
|
# ------------------------------------------------------------------------------
|
|
import sys, os.path, time
|
|
from appy.shared.zip import unzip, zip
|
|
from appy.shared.utils import getOsTempFolder, FolderDeleter, executeCommand
|
|
|
|
# ------------------------------------------------------------------------------
|
|
usage = '''Usage: python odfWalk.py [file|folder] yourScript.
|
|
|
|
If *file* is given, it is the path to an ODF file (odt or ods). This single
|
|
file will be walked.
|
|
If *folder* is given, we will walk all ODF files found in this folder and
|
|
sub-folders.
|
|
|
|
*yourScript* is the path to a Python script that will be run on every walked
|
|
file. It will be called with a single arg containing the absolute path to the
|
|
folder containing the unzipped file content (content.xml, styles.xml...).'''
|
|
|
|
# ------------------------------------------------------------------------------
|
|
class OdfWalk:
|
|
toUnzip = ('.ods', '.odt')
|
|
def __init__(self, fileOrFolder, script):
|
|
self.fileOrFolder = fileOrFolder
|
|
self.script = script
|
|
self.tempFolder = getOsTempFolder()
|
|
|
|
def walkFile(self, fileName):
|
|
'''Unzip p_fileName in a temp folder, call self.script, and then re-zip
|
|
the result.'''
|
|
print 'Walking %s...' % fileName
|
|
# Create a temp folder
|
|
name = 'f%f' % time.time()
|
|
tempFolder = os.path.join(self.tempFolder, name)
|
|
os.mkdir(tempFolder)
|
|
# Unzip the file in it
|
|
unzip(fileName, tempFolder)
|
|
# Call self.script
|
|
py = sys.executable or 'python'
|
|
cmd = '%s %s %s' % (py, self.script, tempFolder)
|
|
print ' Running %s...' % cmd,
|
|
os.system(cmd)
|
|
# Re-zip the result
|
|
zip(fileName, tempFolder, odf=True)
|
|
FolderDeleter.delete(tempFolder)
|
|
print 'done.'
|
|
|
|
def run(self):
|
|
if os.path.isfile(self.fileOrFolder):
|
|
self.walkFile(self.fileOrFolder)
|
|
elif os.path.isdir(self.fileOrFolder):
|
|
# Walk all files found in this folder
|
|
for dir, dirnames, filenames in os.walk(self.fileOrFolder):
|
|
for name in filenames:
|
|
if os.path.splitext(name)[1] in self.toUnzip:
|
|
self.walkFile(os.path.join(dir, name))
|
|
else:
|
|
print('%s does not exist.' % self.fileOrFolder)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) != 3:
|
|
print(usage)
|
|
sys.exit()
|
|
# Warn the user.
|
|
print 'All the files in %s will be modified. ' \
|
|
'Are you sure? [y/N] ' % sys.argv[1],
|
|
response = sys.stdin.readline().strip().lower()
|
|
if response == 'y':
|
|
OdfWalk(sys.argv[1], sys.argv[2]).run()
|
|
else:
|
|
print 'Canceled.'
|
|
# ------------------------------------------------------------------------------
|