diff --git a/problemtools/ProblemPlasTeX/ProblemsetMacros.py b/problemtools/ProblemPlasTeX/ProblemsetMacros.py index fadd4a3b..1079d605 100644 --- a/problemtools/ProblemPlasTeX/ProblemsetMacros.py +++ b/problemtools/ProblemPlasTeX/ProblemsetMacros.py @@ -1,14 +1,21 @@ import sys import os import os.path -import codecs -import cgi +import io from plasTeX.DOM import Node from plasTeX.Base import Command from plasTeX.Base import DimenCommand from plasTeX.Logging import getLogger import plasTeX.Packages.graphics as graphics +if sys.version_info.major == 2: + import cgi + def plastex_escape(s): + return cgi.escape(s) +else: + def plastex_escape(s): + return s + log = getLogger() status = getLogger('status') @@ -46,8 +53,8 @@ class sampletable(Command): args = 'header1 file1:str header2 file2:str' def read_sample_file(self, filename): - data = open(filename, 'rb').read().decode('utf8') - data = cgi.escape(data) + data = io.open(filename, 'r', encoding='utf-8').read() + data = plastex_escape(data) return data def invoke(self, tex): @@ -70,7 +77,7 @@ class sampletableinteractive(Command): args = 'header read write file:str' def read_sample_interaction(self, filename): - data = open(filename, 'rb').read().decode('utf8') + data = io.open(filename, 'r', encoding='utf-8').read() messages = [] cur_msg = [] cur_mode = None @@ -82,12 +89,12 @@ def read_sample_interaction(self, filename): line = line[1:] if mode != cur_mode: if cur_mode: messages.append({'mode': cur_mode, - 'data': cgi.escape('\n'.join(cur_msg))}) + 'data': plastex_escape('\n'.join(cur_msg))}) cur_msg = [] cur_msg.append(line) cur_mode = mode if cur_mode: messages.append({'mode': cur_mode, - 'data': cgi.escape('\n'.join(cur_msg))}) + 'data': plastex_escape('\n'.join(cur_msg))}) return messages def invoke(self, tex): diff --git a/problemtools/ProblemPlasTeX/listingsutf8.py b/problemtools/ProblemPlasTeX/listingsutf8.py index da3d4cee..2a2d1f56 100644 --- a/problemtools/ProblemPlasTeX/listingsutf8.py +++ b/problemtools/ProblemPlasTeX/listingsutf8.py @@ -1,8 +1,10 @@ from plasTeX.Base import Command from plasTeX.Logging import getLogger -import cgi import os +import io + +import ProblemsetMacros log = getLogger() @@ -13,8 +15,8 @@ class lstinputlisting(Command): args = '* [ options:dict ] file:str' def read_file(self, filename): - data = open(filename, 'r').read().decode('utf8') - data = cgi.escape(data) + data = io.open(filename, 'r', encoding='utf-8').read() + data = ProblemsetMacros.plastex_escape(data) return data def invoke(self, tex): diff --git a/problemtools/verifyproblem.py b/problemtools/verifyproblem.py index c3a8b3af..4be46423 100644 --- a/problemtools/verifyproblem.py +++ b/problemtools/verifyproblem.py @@ -300,7 +300,8 @@ def __init__(self, problem, datadir, parent=None): configfile = os.path.join(self._datadir, 'testdata.yaml') if os.path.isfile(configfile): try: - self.config = yaml.safe_load(file(configfile)) + with open(configfile) as f: + self.config = yaml.safe_load(f) except Exception as e: self.error(e) self.config = {}