Skip to content

Instantly share code, notes, and snippets.

@henningpohl
Last active January 11, 2016 13:08
Show Gist options
  • Save henningpohl/875d2b5297a12bf7e608 to your computer and use it in GitHub Desktop.
Save henningpohl/875d2b5297a12bf7e608 to your computer and use it in GitHub Desktop.
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