diff --git a/Dockerfile b/Dockerfile
index dde2f1c52..525c3c6b7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,13 +6,13 @@ RUN apt-get update \
python-pyqt5 \
libdiscid0 \
libdiscid-dev \
- python-mutagen
+ python-mutagen
RUN mkdir -p /build/
ADD . /build/
WORKDIR /build/
ENV PYTHONPATH /usr/lib/python2.7/dist-packages
-RUN python setup.py build_ext -i
-RUN python setup.py build_locales -i
-CMD python setup.py test
\ No newline at end of file
+RUN python setup.py build_ext -i
+RUN python setup.py build_locales -i
+CMD python setup.py test
diff --git a/picard/ui/infodialog.py b/picard/ui/infodialog.py
index b33a17868..f36e0c1d9 100644
--- a/picard/ui/infodialog.py
+++ b/picard/ui/infodialog.py
@@ -26,7 +26,9 @@ from picard.file import File
from picard.track import Track
from picard.album import Album
from picard.coverart.image import CoverArtImageIOError
-from picard.util import format_time, encode_filename, bytes2human, webbrowser2, union_sorted_lists
+from picard.util import (format_time, encode_filename,
+ bytes2human, webbrowser2,
+ union_sorted_lists, htmlescape)
from picard.ui import PicardDialog
from picard.ui.ui_infodialog import Ui_InfoDialog
@@ -274,8 +276,8 @@ class FileInfoDialog(InfoDialog):
ch = str(ch)
info.append((_('Channels:'), ch))
return '
'.join(map(lambda i: '%s
%s' %
- (cgi.escape(i[0]),
- cgi.escape(i[1])), info))
+ (picard.util.htmlescape(i[0]),
+ picard.util.htmlescape(i[1])), info))
def _display_info_tab(self):
file = self.obj
@@ -297,7 +299,7 @@ class AlbumInfoDialog(InfoDialog):
if album.errors:
tabWidget.setTabText(tab_index, _("&Errors"))
text = '
'.join(map(lambda s: '%s' %
- '
'.join(unicode(cgi.escape(s))
+ '
'.join(unicode(picard.util.htmlescape(s))
.replace('\t', ' ')
.replace(' ', ' ')
.splitlines()
@@ -347,9 +349,9 @@ class ClusterInfoDialog(InfoDialog):
tabWidget.setTabText(tab_index, _("&Info"))
info = []
info.append("%s %s" % (_('Album:'),
- unicode(cgi.escape(cluster.metadata["album"]))))
+ unicode(picard.util.htmlescape(cluster.metadata["album"]))))
info.append("%s %s" % (_('Artist:'),
- unicode(cgi.escape(cluster.metadata["albumartist"]))))
+ unicode(picard.util.htmlescape(cluster.metadata["albumartist"]))))
info.append("")
lines = []
for file in cluster.iterfiles(False):
@@ -359,5 +361,5 @@ class ClusterInfoDialog(InfoDialog):
m["title"] + " - " + artist + " (" +
m["~length"] + ")")
info.append("%s
%s" % (_('Tracklist:'),
- '
'.join([unicode(cgi.escape(s)).replace(' ', ' ') for s in lines])))
+ '
'.join([unicode(picard.util.htmlescape(s)).replace(' ', ' ') for s in lines])))
self.ui.info.setText('
'.join(info))
diff --git a/picard/util/__init__.py b/picard/util/__init__.py
index 9b8e9c202..b32b7e839 100644
--- a/picard/util/__init__.py
+++ b/picard/util/__init__.py
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
+import cgi
import os
import ntpath
import re
@@ -410,6 +410,7 @@ def build_qurl(host, port=80, path=None, queryargs=None):
url.setQuery(url_query)
return url
+
def union_sorted_lists(list1, list2):
"""
Returns union of two sorted lists.
@@ -438,3 +439,7 @@ def union_sorted_lists(list1, list2):
union.extend(list1[i:])
return union
+
+
+def htmlescape(string):
+ return cgi.escape(string)