Skip to content
Snippets Groups Projects
Commit 72e8a882 authored by Robin Sonnabend's avatar Robin Sonnabend
Browse files

Compiling the latex version works

parent 2ba18b3f
No related branches found
No related tags found
No related merge requests found
...@@ -243,7 +243,7 @@ class Remark(Element): ...@@ -243,7 +243,7 @@ class Remark(Element):
class Fork(Element): class Fork(Element):
def __init__(self, environment, name, parent, linenumber, children=None): def __init__(self, environment, name, parent, linenumber, children=None):
self.environment = environment if environment is None or len(environment) > 0 else None self.environment = environment if environment is None or len(environment) > 0 else None
self.name = name if name is None or len(name) > 0 else None self.name = name.strip() if (name is not None and len(name) > 0) else None
self.parent = parent self.parent = parent
self.linenumber = linenumber self.linenumber = linenumber
self.children = [] if children is None else children self.children = [] if children is None else children
......
% protokoll.cls -- version 0.1 -- last changed: see mtime of the file ;)
%
%
% Author: Sebastian G�nther <samson@asta.rwth-aachen.de>
% zuerst mal LaTeX's formalzeug
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{protokoll2}[2004/06/04 protokoll.cls v0.1 macht Protokolle (VV)]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
%\ExecuteOptions{draft}
\ProcessOptions\relax
% die restlichen optionen geben wir an article weiter
\LoadClass[a4paper]{article}
% so ein paar sachen die wir eh immer brauchen
\RequirePackage{ngerman}
\RequirePackage[T1]{fontenc}
\RequirePackage[utf8]{inputenc}
\RequirePackage[vmargin=1.5cm,hmargin={1.5cm,1.2cm},bindingoffset=8mm]{geometry}
%\RequirePackage{lineno}
\RequirePackage{longtable}
\RequirePackage{framed}
\RequirePackage{eurosym}
\RequirePackage{csquotes}
% nicht einr�cken und benutzerinnendefinierte kopfzeile
\setlength{\parindent}{0cm}
\setlength{\parskip}{1ex}
\pagestyle{myheadings}
\renewcommand*{\rmdefault}{phv}
\renewcommand*{\sfdefault}{phv}
% Titel
\newcommand{\Kopf}[1]{\markboth{#1}{#1}}
\newcommand{\Titel}[2]{
\markboth{#2}{#2}
\markright{#2}
\thispagestyle{plain}
\begin{center}
\textbf{#1}
\end{center}
}
% Tops
\renewcommand{\thesection}{TOP~\arabic{section}}
\renewcommand{\thesubsection}{TOP~\arabic{section}~(\alph{subsection})}
\newcommand{\TOP}[1]{\section{#1}}
\newcommand{\unterTOP}[1]{\subsection{#1}}
% F�rs Inhaltsverzeichnisanpassen
\renewcommand{\l@section}{\@dottedtocline{1}{1.5em}{4em}}
\renewcommand{\l@subsection}{\@dottedtocline{2}{5.5em}{5.2em}}
\renewcommand{\contentsname}{Tagesordnung}
\newcommand{\Inhalt}{\tableofcontents}
% Zeilen-Numerierungen
\newcommand{\ZeilenNummerierung}{\pagewiselinenumbers\linenumbers}
\newcommand{\EndeZeilenNummerierung}{\nolinenumbers}
% Anwesenheit
\newenvironment{Anw}{\begin{list}{}{%
\renewcommand{\makelabel}[1]{\hfill ##1 }%
\settowidth{\labelwidth}{Anwesenheit:~}%
\addtolength{\labelwidth}{\labelsep}%
\setlength{\leftmargin}{\labelwidth}%
\addtolength{\leftmargin}{\labelsep}%
\addtolength{\leftmargin}{\labelsep}%
\setlength{\itemsep}{0pt}%
\setlength{\parsep}{0pt}%
\setlength{\topsep}{0pt}%
}%
}%
{\end{list}}
% Abwesenheit
\newenvironment{Abw}{\begin{list}{}{%
\renewcommand{\makelabel}[1]{\hfill ##1 }%
\settowidth{\labelwidth}{Anwesenheit:~}%
\addtolength{\labelwidth}{\labelsep}%
\setlength{\leftmargin}{\labelwidth}%
\addtolength{\leftmargin}{\labelsep}%
\addtolength{\leftmargin}{\labelsep}%
\setlength{\itemsep}{0pt}%
\setlength{\parsep}{0pt}%
\setlength{\topsep}{0pt}%
}%
}%
{\end{list}}
% Abk�rzungen
\newenvironment{Abk}{%
\begin{list}{}{%
Abkürzungen:
\renewcommand{\makelabel}[1]{\hfill ##1 }%
\setlength{\labelwidth}{2cm}%
\addtolength{\labelwidth}{\labelsep}%
\setlength{\leftmargin}{\labelwidth}%
\addtolength{\leftmargin}{\labelsep}%
\addtolength{\leftmargin}{\labelsep}%
\setlength{\itemsep}{0pt}%
\setlength{\parsep}{0pt}%
\setlength{\topsep}{0pt}%
}%
}%
{\end{list}}
% Unterschriften f�r eine und zwei Personen
\newcommand{\Unterschrift}[2]{
\vspace*{1.4cm}
\begin{center}
\rule{.4\linewidth}{.15mm} \\
#1 \\
\footnotesize{(#2)}
\end{center}
}
\newcommand{\ZweiUnterschrift}[4]{
\vspace*{1.4cm}
\begin{center}
\parbox[t]{.4\linewidth}{
\rule{\linewidth}{.15mm} \\
\vspace*{-.4cm}\begin{center}
#1 \\
\footnotesize{(#2)}
\end{center}
}
\hspace*{.1\linewidth}
\parbox[t]{.4\linewidth}{
\rule{\linewidth}{.15mm} \\
\vspace*{-.4cm}\begin{center}
#3 \\
\footnotesize{(#4)}
\end{center}
}
\end{center}
}
% \newcommand{\Antrag}[1]{
% % \setlength{\arrayrulewidth}{2mm}
% % \begin{longtable}{|ll}
% % \hspace{2mm} & \parbox[t]{17cm}{#1}
% % \end{longtable}
% \begingroup
% \rule{2mm}{2mm}
% \leftskip10cm
% % \rightskip\leftskip
% #1
% \par
% \endgroup
% }
\newcommand{\Antrag}[1]{
\setlength{\arrayrulewidth}{2mm}
\begin{longtable}{|ll}
% \hspace{2mm} & \parbox[t]{17cm}{#1}
\hspace{2mm} & \begin{minipage}{17cm} #1\end{minipage}
\end{longtable}
}
\newenvironment{antrag}
{%
\par%
\begingroup%
\leftskip1cm%
}
{\par\endgroup}
\newcommand{\Bericht}[1]{
\Antrag{#1}
}
\newcommand{\PE}[2]{\textbf{Persönliche Erklärung von #1:}\\\emph{\glqq{}#2\grqq{}}\\}
...@@ -3,6 +3,7 @@ from flask import render_template ...@@ -3,6 +3,7 @@ from flask import render_template
import os import os
import subprocess import subprocess
import shutil import shutil
import tempfile
from models.database import Document, Protocol, Error, Todo, Decision, TOP, DefaultTOP from models.database import Document, Protocol, Error, Todo, Decision, TOP, DefaultTOP
from server import celery, app from server import celery, app
...@@ -49,7 +50,8 @@ def parse_protocol_async(protocol_id, encoded_kwargs): ...@@ -49,7 +50,8 @@ def parse_protocol_async(protocol_id, encoded_kwargs):
protocol = Protocol.query.filter_by(id=protocol_id).first() protocol = Protocol.query.filter_by(id=protocol_id).first()
if protocol is None: if protocol is None:
raise Exception("No protocol given. Aborting parsing.") raise Exception("No protocol given. Aborting parsing.")
for error in protocol.errors: old_errors = list(protocol.errors)
for error in old_errors:
protocol.errors.remove(error) protocol.errors.remove(error)
db.session.commit() db.session.commit()
if protocol.source is None: if protocol.source is None:
...@@ -158,55 +160,58 @@ def parse_protocol_async(protocol_id, encoded_kwargs): ...@@ -158,55 +160,58 @@ def parse_protocol_async(protocol_id, encoded_kwargs):
top = TOP(protocol.id, fork.name, index, False) top = TOP(protocol.id, fork.name, index, False)
db.session.add(top) db.session.add(top)
db.session.commit() db.session.commit()
protocol.done = True
db.session.commit()
latex_source = texenv.get_template("protocol.tex").render(protocol=protocol, tree=tree)
compile(latex_source, protocol)
protocol.done = True
db.session.commit()
def compile(content, protocol):
compile_async.delay(content, protocol.id)
@celery.task @celery.task
def compile_async(name, document_id): def compile_async(content, protocol_id):
is_error = False with tempfile.TemporaryDirectory() as compile_dir, app.app_context():
protocol = Protocol.query.filter_by(id=protocol_id).first()
try: try:
current = os.getcwd() current = os.getcwd()
os.chdir("latex") protocol_source_filename = "protocol.tex"
os.makedirs("bin", exist_ok=True) protocol_target_filename = "protocol.tex"
log_filename = "protocol.log"
with open(os.path.join(compile_dir, protocol_source_filename), "w") as source_file:
source_file.write(content)
shutil.copy("static/tex/protokoll2.cls", compile_dir)
os.chdir(compile_dir)
command = [ command = [
"/usr/bin/xelatex", "/usr/bin/xelatex",
"-halt-on-error", "-halt-on-error",
"-file-line-error", "-file-line-error",
"-output-directory", "bin", protocol_source_filename
"{}.tex".format(name)
] ]
subprocess.check_call(command, universal_newlines=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) subprocess.check_call(command, universal_newlines=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
subprocess.check_call(command, universal_newlines=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) subprocess.check_call(command, universal_newlines=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
os.chdir(current) os.chdir(current)
os.makedirs("documents/pdf", exist_ok=True) document = Document(protocol.id, name="protokoll_{}_{}.pdf".format(protocol.protocoltype.short_name, date_filter(protocol.date)), filename="", is_compiled=True)
shutil.copy("latex/bin/{}.pdf".format(name), "documents/pdf/") db.session.add(document)
for typ in ["pdf", "log", "aux", "out"]: db.session.commit()
silent_remove("latex/bin/{}.{}".format(name, typ)) target_filename = "compiled-{}.pdf".format(document.id)
silent_remove("latex/{}.tex".format(name)) document.filename = target_filename
shutil.copy(os.path.join(compile_dir, protocol_target_filename), os.path.join("documents", target_filename))
db.session.commit()
except subprocess.SubprocessError: except subprocess.SubprocessError:
is_error = True log = ""
with app.app_context(): total_log_filename = os.path.join(compile_dir, log_filename)
document = Document.query.filter_by(id=document_id).first() if os.path.isfile(total_log_filename):
if document is not None: with open(total_log_filename, "r") as log_file:
document.ready = False log = log_file.read()
document.error = True else:
log = "Logfile not found."
error = protocol.create_error("Compiling", "Compiling LaTeX failed", log)
db.session.add(error)
db.session.commit() db.session.commit()
finally: finally:
# TODO: activate deleting files in error case too
#for typ in ["pdf", "log", "aux", "out"]:
# silent_remove("latex/bin/{}.{}".format(name, typ))
#silent_remove("latex/{}.tex".format(name))
os.chdir(current) os.chdir(current)
if not is_error:
with app.app_context():
document = Document.query.filter_by(id=document_id).first()
if document is not None:
document.ready = True
db.session.commit()
def send_mail(mail): def send_mail(mail):
send_mail_async.delay(mail.id) send_mail_async.delay(mail.id)
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
\begin{itemize} \begin{itemize}
\ENV{if protocol.decisions|length > 0} \ENV{if protocol.decisions|length > 0}
\ENV{for decision in protocol.decisions} \ENV{for decision in protocol.decisions}
\item \VAR{decisions.content|escape_tex} \item \VAR{decision.content|escape_tex}
\ENV{endfor} \ENV{endfor}
\ENV{else} \ENV{else}
\item Keine Beschlüsse \item Keine Beschlüsse
...@@ -43,8 +43,8 @@ ...@@ -43,8 +43,8 @@
Beginn der Sitzung: \VAR{protocol.start_time|timify} Beginn der Sitzung: \VAR{protocol.start_time|timify}
\ENV{for top in tree.children} \ENV{for top in tree.children}
\TOP{\VAR{top.name}} % here we probably have information doubly \TOP{\VAR{top.name|escape_tex}} % here we probably have information doubly
\VAR{top.render()} \VAR{top.render()|escape_tex}
\ENV{endfor} \ENV{endfor}
Ende der Sitzung: \VAR{protocol.end_time|timify} Ende der Sitzung: \VAR{protocol.end_time|timify}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment