#!/usr/bin/python # Converts command-based snippets to new file-based snippet syntax # NOTE: This is only meant to help, it is not perfect! Check the file # afterwards to make sure it's correct. import sys import re import os def Usage(): print """\ Usage: convertSnips.py -h or --help Print this help and exit or: convertSnips.py inputfile Print .snippets file or: convertSnips.py inputfile outputfile Output to file""" def FindSnippet(line): """\ Try to find a snippet in the given line. If it is found, return the converted snippet; otherwise, return -1.\ """ snippet = re.search("exe ['\"](GlobalSnip|Snipp)(!)? (\S+) (.*)['\"]", line) if not snippet: return -1 trigger = snippet.group(3) text = "\t" + snippet.group(4) if snippet.group(2): # Process multi-snippet endSnip = re.search(r'\s*\\"(.*?)\\"\s*(.*)', text) if not endSnip: endSnip = re.search('\s*"(.*?)"\s*(.*)', text) if not endSnip: return -1 trigger += ' ' + endSnip.group(1) # Add name to snippet declaration text = "\t" + endSnip.group(2) return trigger + "\n" + text newLines = [] def ProcessLine(line): """\ Search the line for a snippet or comment, and append it to newLines[] if it is found.\ """ snippet = FindSnippet(line) if snippet == -1: comment = re.match('^"(.*)', line) if comment: newLines.append('#' + comment.group(1)) else: newLines.append('snippet ' + snippet) return snippet def Output(lines, file = None): outputLines = '' for snippet in lines: for line in snippet.split("\\n"): line = re.sub(r'\\t', '\t', line) line = re.sub(r'\\\\', r'\\', line) if not re.match('^(\#|snippet)', line): line = "\t" + line outputLines += line + "\n" if file: try: output = open(file, 'w') except IOError, e: raise SystemExit('convertSnips.py: %s' % e) output.write(outputLines) else: print outputLines, def main(argv = None): if argv is None: argv = sys.argv[1:] if not argv or '-h' in argv or '--help' in argv: Usage() return 1 try: input = open(argv[0], 'r') except IOError, e: raise SystemExit('convertSnips.py: %s' % e) snippet = -1 for line in input.readlines(): if snippet == -1: snippet = ProcessLine(line) else: concat = re.search(r"^\s+(\\\s*)?(\.\s*)?['\"](.*)['\"]", line) if concat: newLines[-1] += "\n" + concat.group(3) # Add concatenated lines else: snippet = ProcessLine(line) if len(argv) == 1: Output(newLines) else: Output(newLines, argv[1]) if __name__ == '__main__': sys.exit(main())