#!/usr/bin/python

import re

class LaTeXDoc:
	def header (self, title):
		return r"""\NeedsTeXFormat{LaTeX2e}
\documentclass[a4paper]{article}
\title{%s}

\usepackage[german,english]{babel}
\selectlanguage{english}

\usepackage{times}
\usepackage[leqno]{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{german}
\usepackage{makeidx}
\usepackage{listings}
\usepackage{color}

\newcommand{\textcap}{\textit}
\newcommand{\imgS}[4]{\begin{figure}[!ht]
  \centerline{{\includegraphics[scale=#2]{#1}}}
  {
  \linespread{1.0}
  \textcap{\textbf{\caption[#3]
    {\fontsize{10}{12pt}\textmd{\textcap{#4}}}}}
  }
\end{figure}}
\newcommand{\fig}[3]{\begin{figure}[!ht]
	\centerline{{\input{#1}}}
	{
		\linespread{1.0}
		\textcap{\textbf{\caption[#2]
		{\fontsize{10}{12pt}\textmd{\textcap{#3}}}}}
	}
\end{figure}}

\begin{document}
\sloppy
""" % title

	def footer (self):
		return '\end{document}'

	def image (self, fname, scale, short_desc, long_desc):
		return """\imgS{%s}{%s}
{%s}
{%s}
""" % (fname, scale, short_desc, long_desc)

	def listing (self, fname, desc):
		return '\lstinputlisting[caption={%s}]{%s}' % (desc, fname)

	def _list (self, inp, listname, regex1, regex2):
		tmp = re.split(regex1, inp)
		inp = tmp[0]
		for enum in tmp[1:]:
			tmp2 = enum.split('\n')
			for i in range(len(tmp2)):
				if tmp2[i] == '' or tmp2[i].startswith('\\'):
					break
			inp += """\\begin{%s}
\item %s
\end{%s}
%s""" % (listname, '\n'.join(tmp2[:i]), listname, '\n'.join(tmp2[i:]))
		inp = re.sub(regex2, r'\item ', inp)
		return inp

	def _escape_chars (self, inp):
		inp = re.sub('<', '$<$', inp)
		inp = re.sub('>', '$>$', inp)
		inp = re.sub('_', '\\_', inp)
		return inp

	def fromWiki (self, inp, title='No title'):
		inp = re.sub('#![a-z]', '', inp)
		inp = re.sub('\r', '', inp)

		tmp = re.split(r'(?m)^{{{$', inp)
		inp = self._escape_chars(tmp[0])
		for enum in tmp[1:]:
			tmp2 = re.split(r'(?m)^}}}$', enum)
			inp += '\\begin{verbatim}\n%s\end{verbatim}\n' % tmp2[0]
			inp += self._escape_chars(tmp2[1])

		inp = re.sub(r'= (.*?) =', r'\section{\1}', inp)
		inp = re.sub(r"'''(.*?)'''", r'\\textbf{\1}', inp)
		inp = re.sub(r"''(.*?)''", r'\\textit{\1}', inp)

		inp = self._list(inp, 'enumerate', r'(?m)^1\. ', r'(?m)^[0-9]\. ')
		inp = self._list(inp, 'itemize', r'(?m)^ \* ', r'(?m)^ \* ')

		return self.header(title) + inp + self.footer()

if __name__ == '__main__':
	tex = LaTeXDoc()
	src = file('test.txt').read()
	tex = tex.fromWiki(src, title='CTL and Matlab')
	file('test.tex', 'w').write(tex)

# vim: nofoldenable
