diff -r 82f11024044a -r 932c358ece3e Orb/python/orb/filerenamer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Orb/python/orb/filerenamer.py Fri Apr 23 20:45:58 2010 +0100 @@ -0,0 +1,139 @@ +# Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies) All rights reserved. +# This component and the accompanying materials are made available under the terms of the License +# "Eclipse Public License v1.0" which accompanies this distribution, +# and is available at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# System Documentation Tools +# Description: +# +import os.path +import sys +import unittest +import xml +import stat +import logging +from cStringIO import StringIO +from xml.etree import ElementTree as etree +from lib import scan, main, XmlParser, StubXmlParser +from optparse import OptionParser + +__version__ = '0.1' + + +UNSAFE_CHARS = ("\n", "\t", ":", "?", ",", "=", ".", "\\", "/", "[", "]", "|", "<", ">", "+", ";", '"', "-") + + +class FileRenamer(object): + """ + Given an xml file this class returns a MODE compatable filename + + >>> fr = FileRenamer(xmlparser=StubXmlParser()) + >>> fr.rename(r"c:\\temp\\xml\\class_c_active_scheduler.xml") + 'class_c_active_scheduler=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.reference' + """ + def __init__(self, xmlparser=XmlParser(), publishing_target="mode"): + self.parser = xmlparser + self.publishing_target = publishing_target + + def _escape(self, filename): + for char in UNSAFE_CHARS: + filename = filename.replace(char, "") + filename = filename.encode('unicode-escape', 'ignore') + filename = filename.replace(" ", "-") + return filename + + def rename(self, xmlfile): + """ + Return DITA MODE compliant filename. + Format of resultant filenames is: + title=identifier=version=language=resolution.extension + Examples: + Test-Document=GUID-1234=1=en=.reference + """ + id = self.parser.parse(xmlfile) + filename = os.path.basename(xmlfile) + filename, ext = os.path.splitext(filename) + if self.publishing_target == "mode": + filename = self._escape(filename) + newfilename = "=".join((filename, id, '1', 'en', '')) + ext = ext if ext == ".ditamap" else ".reference" + elif self.publishing_target == "ditaot": + newfilename = id + ext = ext = ext if ext == ".ditamap" else ".xml" + return newfilename + ext + + +def rename(indir, publishing_target): + fr = FileRenamer(publishing_target=publishing_target) + for filepath in scan(indir): + newfilename = os.path.join(os.path.dirname(filepath), fr.rename(filepath)) + try: + os.chmod(filepath, stat.S_IWRITE) + except Exception, e: + logging.error('Unable to make file \"%s\" writable, error was: %s' % (filepath, e)) + continue + else: + logging.debug("Renaming %s to %s" % (filepath, newfilename)) + try: + os.rename(filepath, newfilename) + except Exception, e: + logging.error('Unable to rename file \"%s\" to \"%s\", error was: %s' % (filepath, newfilename, e)) + +def main(): + usage = "usage: %prog \n" + parser = OptionParser(usage, version='%prog ' + __version__) + parser.add_option("-p", dest="publishing_target", type="choice", choices=["mode", "ditaot"], default="mode", + help="Publishing Target: mode|ditaot, [default: %default]") + parser.add_option("-l", "--loglevel", type="int", default=30, help="Log Level (debug=10, info=20, warning=30, [error=40], critical=50)") + (options, args) = parser.parse_args() + if len(args) < 1: + parser.print_help() + parser.error("Please supply the path to the XML content") + + if options.loglevel: + logging.basicConfig(level=options.loglevel) + + rename(args[0],options.publishing_target) + +if __name__ == '__main__': + sys.exit(main()) + +###################################### +# Test code +###################################### + +class TestFileRenamer(unittest.TestCase): + def test_i_can_return_a_files_new_mode_name(self): + fr = FileRenamer(xmlparser=StubXmlParser(),publishing_target="mode") + newfile = fr.rename("hello.xml") + self.assertTrue(newfile == "hello=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.reference") + + def test_i_can_return_a_ditamaps_new_mode_name(self,publishing_target="mode"): + fr = FileRenamer(xmlparser=StubXmlParser()) + newfile = fr.rename("hello.ditamap") + self.assertTrue(newfile == "hello=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.ditamap") + + + def test_i_can_return_a_files_new_name_if_passed_an_absolute_path(self): + fr = FileRenamer(xmlparser=StubXmlParser()) + newfile = fr.rename("c:\\temp\\xml\\hello.xml") + self.assertTrue(newfile == "hello=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.reference") + + def test_i_can_remove_incompatable_characters_from_a_filename(self): + fr = FileRenamer(xmlparser=StubXmlParser()) + newfile = fr.rename("hello:?,=..xml") + self.assertTrue(newfile , "hello=GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F=1=en=.reference") + + def test_i_can_return_a_files_new_ditaot_name(self): + fr = FileRenamer(xmlparser=StubXmlParser(),publishing_target="ditaot") + newfile = fr.rename("hello.xml") + self.assertEquals(newfile, "GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F.xml") + + def test_i_can_return_a_ditamaps_new_ditaot_name(self): + fr = FileRenamer(xmlparser=StubXmlParser(),publishing_target="ditaot") + newfile = fr.rename("hello.ditamap") + self.assertEquals(newfile, "GUID-BED8A733-2ED7-31AD-A911-C1F4707C67F.ditamap")