#!/usr/bin/env python # -*- coding: iso-8859-1 -*- # iso-8859-1,latin-1,utf-8 # convert foswiki format to latex # imports from sys import argv,exit # get input file name try: inFile = argv[1] except IndexError: print 'Usage:' print argv[0], 'inFile' exit(1) # function to make strings fit for laTeX def latex_mystring(mystring): """Convert a string to a laTeX-readable format""" mystring = mystring.replace('_',r"\_") mystring = mystring.replace('&',r"\&") # mystring = mystring.replace('$',r"\$") mystring = mystring.replace('%',r"\%") mystring = mystring.replace('#',r"\#") mystring = mystring.replace('~',r"\~{}") mystring = mystring.replace('ä',r'\"a') mystring = mystring.replace('ö',r'\"o') mystring = mystring.replace('ü',r'\"u') # mystring = mystring.replace(u'\u00FC',r'\"u') # mystring = mystring.replace(u'\xfc',r'\"u') # mystring = mystring.replace('\xc3\xbc',r'\"u') mystring = mystring.replace('Ä',r'\"A') mystring = mystring.replace('Ö',r'\"O') mystring = mystring.replace('Ü',r'\"U') mystring = mystring.replace('ß',r'\ss{}') mystring = mystring.replace('ê',r'\^e') mystring = mystring.replace('í',r'\'i') mystring = mystring.replace('â',r'\^a') mystring = mystring.replace('å',r'\aa{}') # mystring = mystring.replace(r'\n',r'\\*') mystring = mystring.replace(r'\n',', ') return mystring # function for replacements def convert_foswiki2latex(oldLine): """Convert a foswiki line to latex""" # transfer to new variable newLine = oldLine # replace section heading format if newLine.find('---++++') != -1: # there is no corresponding level in latex article style; just change to bold face and add empty line afterwards newLine = newLine.replace('---++++ ',r'\textbf{') newLine = newLine[:-1] + '}' + '\n\n' elif line.find('---+++') != -1: newLine = newLine.replace('---+++ ',r'\subsubsection{') newLine = newLine[:-1] + '}' + '\n' elif line.find('---++') != -1: newLine = newLine.replace('---++ ',r'\subsection{') newLine = newLine[:-1] + '}' + '\n' elif line.find('---+') != -1: newLine = newLine.replace('---+ ',r'\section{') newLine = newLine[:-1] + '}' + '\n' # itemize environment -- must be before bold face! # attention: spacing before item matters for internal handling of enumerate/itemize in this script. do not change! newLine = newLine.replace(' * ',r' \item ') # second-level itemize newLine = newLine.replace(' * ',r' \item ') # first-level itemize # enumerate environment # attention: spacing before item matters for internal handling of enumerate/itemize in this script. do not change! newLine = newLine.replace(' 1 ',r' \item ') # second-level itemize newLine = newLine.replace(' 1 ',r'\item ') # first-level itemize # bold face -- keep after itemize! while newLine.rfind('*') != -1: # while there are asterisks newLine = newLine.replace('*',r'\textbf{',1) # replace first instance newLine = newLine.replace('*',r'}',1) # replace second instance # # italics # while newLine.rfind('_') != -1: # while there are asterisks # newLine = newLine.replace('_',r'\emph{',1) # replace first instance # newLine = newLine.replace('_',r'}',1) # replace second instance # special characters newLine = latex_mystring(newLine) # verbatim environment newLine = newLine.replace('',r'\begin{verbatim}') newLine = newLine.replace('',r'\end{verbatim}') # comment areas newLine = newLine.replace('',r'%') # done return newLine # read input file inObj = open(inFile,'r') #from codecs import open #inObj = open(inFile,'r',"utf-8") inLines = inObj.readlines() inObj.close() # write output file header (all writing to standard out) print r'\documentclass[a4paper]{article}' print r'\begin{document}' print ' ' print ' ' # replace stuff in file # itemize/enumerate environment flags isItem1 = False isItem2 = False isEnum1 = False isEnum2 = False for line in inLines: newLine = convert_foswiki2latex(line) # newLine = unicode(newLine,"iso-8859-1") # if for itemize/enumerate wrappers # itemize 1 if not isItem1: if newLine[:6] == ' \item': # itemize 1 isItem1 = True newLine = r'\begin{itemize}' + '\n' + newLine else: if newLine[:6] != ' \item': isItem1 = False newLine = r'\end{itemize}' + '\n' + newLine # itemize 2 if not isItem2: if newLine[:8] == ' \item': # itemize 2 isItem2 = True newLine = r'\begin{itemize}' + '\n' + newLine else: if newLine[:8] != ' \item': isItem2 = False newLine = r'\end{itemize}' + '\n' + newLine # enum 1 if not isEnum1: if newLine[:5] == '\item': # enum 1 isEnum1 = True newLine = r'\begin{enumerate}' + '\n' + newLine else: if newLine[:5] != '\item': isEnum1 = False newLine = r'\end{enumerate}' + '\n' + newLine # enum 2 if not isEnum2: if newLine[:7] == ' \item': # enum 2 isEnum2 = True newLine = r'\begin{enumerate}' + '\n' + newLine else: if newLine[:7] != ' \item': isEnum2 = False newLine = r'\end{enumerate}' + '\n' + newLine # write new line to latex file print newLine[:-1] # drop the new line character # if newLine[:8] == ' \item': # itemize 2 # if newLine[:7] == ' \item': # enum 2 # if newLine[:6] == ' \item': # itemize 1 # if newLine[:5] == '\item': # enum 1 # write output file footer print ' ' print ' ' print '\end{document}'