from optparse import OptionParser import time, logging, os, sys, string, shutil import win32clipboard, win32con, random from urllib2 import urlopen from lxml import etree from os import sep class SyntaxHighlight: def __init__(self, code, language): self.syntax = self.script_path = self.script = None self.code = code self.lang = language self.options = [language] def setOption(self, option): if option not in self.options: self.options.append(option) def removeOption(self, option): if option in self.options: self.options.remove(option) def setScript(self, script): if '/' in script: s = '/' elif '\\' in script: s = '\\' else: s = sep self.script = script.split(s)[-1] if 'http://' in script: self.script_path = script def getSyntax(self): options = ':'.join(self.options) self.syntax = '' if self.script_path is not None: self.syntax += '%s' %(self.script_path, self.script) elif self.script is not None: self.syntax += self.script # I had to break these up or it killed my generated script! self.syntax += '<' self.syntax += 'textarea name="code" class="%s" cols="60" rows="10">' %(options) self.syntax += self.code self.syntax += '' return self.syntax def getLanguage(script): ext_dict = {'py':'python', 'java':'java', 'groovy':'java', 'cs':'csharp', 'css':'css', 'php':'php', 'rb':'ruby', 'sql':'sql'} ext = script.split('.')[-1] if ext.lower() not in ext_dict.keys(): return ext else: return ext_dict.get(ext) def setupLogging(level): if not os.access('log', os.F_OK): os.mkdir('log') logging.basicConfig(level=level, format='%(asctime)s [%(levelname)s] %(message)s', filename=os.path.abspath('log/convert_script.log'), filemode='w') # define a Handler which writes INFO messages or higher to the sys.stderr console = logging.StreamHandler() console.setLevel(level) # set a format which is simpler for console use formatter = logging.Formatter('%(name)-5s: [%(levelname)-5s] %(message)s') # tell the handler to use this format console.setFormatter(formatter) # add the handler to the root logger logging.getLogger('').addHandler(console) logger = logging.getLogger('ConvertScript') return logger def main(): # This method parses the options set at the command line and initializes the logger. parser = OptionParser() parser.add_option("-l", "--logging", type='int', dest="debug", help="LOG level. See http://docs.python.org/library/logging.html. Default: INFO", metavar="LOG", default=logging.INFO) parser.add_option("-s", "--script", type='string', dest="script", help="PATH to the script you want to include.", metavar="PATH", default=None) parser.add_option("", "--lang", type='string', dest="lang", help="Override the language the script is encoded in. Normally taken from the extension. Default: python", metavar="LANGUAGE", default='python') parser.add_option("", "--code", type='string', dest="code", help="Simple Code. If used you must also specify the --lang", metavar="CODE", default=None) parser.add_option('-g', '--no-gutter', action="store_true", dest="nogutter") parser.add_option('-c', '--no-controls', action="store_true", dest="nocontrols") parser.add_option('-f', '--first-line', type='int', dest="firstline", help="First line to start counting from.", metavar="CODE", default=None) parser.add_option('-n', '--show-columns', action="store_true", dest="showcolumns") opts, args = parser.parse_args() opts.collapse = None logger = setupLogging(opts.debug) return opts, args, logger if __name__ == "__main__": opts, args, logger = main() if opts.script is None and opts.code is None: logger.critical('Neither Script nor Code provided. Please specify a script (--script=PATH) or code (--code=CODE) command line option') sys.exit(1) if opts.code is not None and opts.lang is None: logger.critical('You must specify the language (--lang=LANGUAGE) when specifying code on the command line.') if opts.lang is None: opts.lang = getLanguage(opts.script) logger.debug('Setting Language Extension to: %s' %opts.lang) if opts.code: opts.nogutter = True opts.nocontrols = True code = opts.code else: opts.collapse = True if 'http://' in opts.script: f = urlopen(opts.script) else: f = open(opts.script) code = f.read() f.close() syntax = SyntaxHighlight(code, opts.lang) if opts.script is not None: syntax.setScript(opts.script) if opts.nogutter: syntax.setOption('nogutter') if opts.nocontrols: syntax.setOption('nocontrols') if opts.collapse: syntax.setOption('collapse') if opts.firstline is not None: syntax.setOption('firstline[%i]' %opts.firstline) if opts.showcolumns: syntax.setOption('showcolumns') syntax = syntax.getSyntax() logger.debug('Syntax: \n%s' %syntax) win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.SetClipboardText(syntax) win32clipboard.CloseClipboard()