Last active
January 11, 2016 13:08
-
-
Save henningpohl/875d2b5297a12bf7e608 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import re | |
import os | |
import numpy | |
rParts = [ | |
("Your Assessment of this Paper's Contribution to HCI", "contribution"), | |
("Overall Rating", "rating"), | |
("Expertise", "expertise"), | |
("The Review", "review"), | |
("The Meta-Review", "metareview")] | |
def parseReviews(filename): | |
text = open(filename, 'r', encoding='utf8').read() | |
rData = dict(reviews=[]) | |
rData['conf'] = text.splitlines()[0] | |
titleQuery = re.search(r"Reviews of submission #([0-9]+): \"((.|\r\n|\n)*?\")", text) | |
if titleQuery: | |
rData['number'] = titleQuery.group(1) | |
rData['title'] = titleQuery.group(2) | |
splitExpr = r"(%s)" % "|".join([p[0] for p in rParts]) | |
reviews = re.split(r"[-]+ Submission [0-9]+, Review ([0-9]+) [-]+", text) | |
for rNo, rText in zip(reviews[1::2], reviews[2::2]): | |
review = dict(number=rNo) | |
rTypeQuery = re.search(r"Reviewer:\s+([a-z]+)", rText) | |
if rTypeQuery: | |
review['type'] = rTypeQuery.group(1) | |
parts = re.split(splitExpr, rText) | |
for partHeader, rPart in zip(parts[1::2], parts[2::2]): | |
key = [p[1] for p in rParts if p[0] == partHeader][0] | |
review[key] = rPart.strip() | |
review['ratingScore'] = float(re.search(r"([1-5]\.[05])", review['rating']).group(1)) | |
review['expertiseScore'] = float(re.search(r"([1-4])", review['expertise']).group(1)) | |
rData['reviews'].append(review) | |
ratings = [r['ratingScore'] for r in rData['reviews']] | |
expertise = [r['expertiseScore'] for r in rData['reviews']] | |
rData['scores'] = ratings | |
rData['avgScore'] = numpy.mean(ratings) | |
rData['stdDevScore'] = numpy.std(ratings) | |
return rData | |
def outputLaTeX(reviews): | |
scriptDir = os.path.dirname(os.path.realpath(__file__)) | |
filename = "Submission %s - All Reviews.tex" % reviews['number'] | |
with open(os.path.join(scriptDir, filename), 'w', encoding='utf8') as out: | |
intro = r""" | |
\documentclass[a4paper, twocolumn]{report} | |
\usepackage[vmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm,columnsep=20pt]{geometry} | |
\setlength{\parindent}{0pt} | |
\usepackage{times} | |
\usepackage[utf8]{inputenc} | |
\newenvironment{review}[3]{ | |
\textbf{Review: #1 \hfill Rating: #2 \hfill Expertise: #3 \hfill\hfill} | |
\par\vspace{-17pt} | |
\rule[-10pt]{\linewidth}{1pt} | |
\rule[0pt]{\linewidth}{1pt} | |
}{ | |
\par\vspace{-11pt} | |
\rule[-5pt]{\linewidth}{1pt} | |
\rule[5pt]{\linewidth}{1pt} | |
\par\vspace{0.2cm plus 0.2cm} | |
} | |
\newenvironment{summary}{ | |
\itshape | |
}{ | |
\par\rule[3pt]{\linewidth}{1pt} | |
} | |
\newenvironment{improve}{ | |
\par\rule[3pt]{\linewidth}{1pt} | |
\textbf{Areas for improvement:} | |
}{} | |
\begin{document} | |
""" | |
outro = r""" | |
\end{document}""" | |
title = r""" | |
\twocolumn[ | |
\begin{center} | |
{\LARGE %s \par} | |
{\large %s \par} | |
{\rule[4pt]{\linewidth}{1pt}\par} | |
\end{center} | |
] | |
""" | |
out.write(intro) | |
def tex_escape(s): | |
return s.replace('%', '\\%').replace('#', '\\#').replace('&', '\\&') | |
titleString = "(%s) %s" % (reviews['number'], reviews['title']) | |
subTitleString = "Scores: %s, Mean Score: %1.1f, Std-Dev: %1.2f" % (str(reviews['scores']), reviews['avgScore'], reviews['stdDevScore']) | |
out.write(title % (titleString, subTitleString)) | |
for review in reviews['reviews']: | |
out.write("\\begin{review}{%s (%s)}{%s}{%s}\n" % (review['number'], review['type'], review['rating'], review['expertise'])) | |
if 'contribution' in review: | |
out.write("\\begin{summary}\n") | |
out.write(tex_escape(review['contribution'])) | |
out.write("\\end{summary}\n") | |
if 'review' in review: | |
out.write(tex_escape(review['review'])) | |
if 'metareview' in review: | |
out.write(tex_escape(review['metareview'])) | |
out.write("\\end{review}\n") | |
out.write(outro) | |
if __name__ == '__main__': | |
if len(sys.argv) != 2: | |
print("call with review text file as parameter") | |
raw_input() | |
else: | |
reviews = parseReviews(sys.argv[1]) | |
outputLaTeX(reviews) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment