Escape special LaTeX characters
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
from abc import ABCMeta, abstractmethod
|
from abc import ABCMeta, abstractmethod
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
import re
|
||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
import tempfile
|
import tempfile
|
||||||
@@ -102,6 +103,21 @@ if win():
|
|||||||
else:
|
else:
|
||||||
_LATEX_FOUND = search_for("lualatex")
|
_LATEX_FOUND = search_for("lualatex")
|
||||||
|
|
||||||
|
def escape(text):
|
||||||
|
lookup = {
|
||||||
|
'&': '\\&',
|
||||||
|
'%': '\\%',
|
||||||
|
'$': '\\$',
|
||||||
|
'#': '\\#',
|
||||||
|
'_': '\\_',
|
||||||
|
'{': '\\{',
|
||||||
|
'}': '\\}',
|
||||||
|
'~': '\\~{}',
|
||||||
|
'^': '\\^{}',
|
||||||
|
'\\': '\\textbackslash{}'
|
||||||
|
}
|
||||||
|
pattern = re.compile('|'.join([re.escape(key) for key in lookup.keys()]))
|
||||||
|
return pattern.sub(lambda match: lookup[match.group(0)], text)
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@@ -417,8 +433,8 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
|||||||
nick = name.get_nick_name()
|
nick = name.get_nick_name()
|
||||||
surn = name.get_surname()
|
surn = name.get_surname()
|
||||||
name_parts = [self.format_given_names(name),
|
name_parts = [self.format_given_names(name),
|
||||||
'\\nick{{{}}}'.format(nick) if nick else '',
|
'\\nick{{{}}}'.format(escape(nick)) if nick else '',
|
||||||
'\\surn{{{}}}'.format(surn) if surn else '']
|
'\\surn{{{}}}'.format(escape(surn)) if surn else '']
|
||||||
self.write(level+1, 'name = {{{}}},\n'.format(
|
self.write(level+1, 'name = {{{}}},\n'.format(
|
||||||
' '.join([e for e in name_parts if e])))
|
' '.join([e for e in name_parts if e])))
|
||||||
for eventref in person.get_event_ref_list():
|
for eventref in person.get_event_ref_list():
|
||||||
@@ -434,9 +450,11 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
|||||||
self.write_event(db, level+1, event)
|
self.write_event(db, level+1, event)
|
||||||
for attr in person.get_attribute_list():
|
for attr in person.get_attribute_list():
|
||||||
if str(attr.get_type()) == 'Occupation':
|
if str(attr.get_type()) == 'Occupation':
|
||||||
self.write(level+1, 'profession = {%s},\n' % attr.get_value())
|
self.write(level+1, 'profession = {%s},\n' %
|
||||||
|
escape(attr.get_value()))
|
||||||
if str(attr.get_type()) == 'Comment':
|
if str(attr.get_type()) == 'Comment':
|
||||||
self.write(level+1, 'comment = {%s},\n' % attr.get_value())
|
self.write(level+1, 'comment = {%s},\n' %
|
||||||
|
escape(attr.get_value()))
|
||||||
for mediaref in person.get_media_list():
|
for mediaref in person.get_media_list():
|
||||||
media = db.get_media_from_handle(mediaref.ref)
|
media = db.get_media_from_handle(mediaref.ref)
|
||||||
path = media_path_full(db, media.get_path())
|
path = media_path_full(db, media.get_path())
|
||||||
@@ -498,7 +516,7 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
|||||||
stop_date = self.format_iso(date.get_stop_ymd(), calendar)
|
stop_date = self.format_iso(date.get_stop_ymd(), calendar)
|
||||||
date_str = date_str + '/' + stop_date
|
date_str = date_str + '/' + stop_date
|
||||||
|
|
||||||
place = _pd.display_event(db, event)
|
place = escape(_pd.display_event(db, event))
|
||||||
|
|
||||||
if modifier:
|
if modifier:
|
||||||
event_type += '+'
|
event_type += '+'
|
||||||
@@ -521,14 +539,14 @@ class TreeDocBase(BaseDoc, TreeDoc):
|
|||||||
if call in first:
|
if call in first:
|
||||||
where = first.index(call)
|
where = first.index(call)
|
||||||
return '{before}\\pref{{{call}}}{after}'.format(
|
return '{before}\\pref{{{call}}}{after}'.format(
|
||||||
before=first[:where],
|
before=escape(first[:where]),
|
||||||
call=call,
|
call=escape(call),
|
||||||
after=first[where+len(call):])
|
after=escape(first[where+len(call):]))
|
||||||
else:
|
else:
|
||||||
# ignore erroneous call name
|
# ignore erroneous call name
|
||||||
return first
|
return escape(first)
|
||||||
else:
|
else:
|
||||||
return first
|
return escape(first)
|
||||||
|
|
||||||
def format_iso(self, date_tuple, calendar):
|
def format_iso(self, date_tuple, calendar):
|
||||||
"""
|
"""
|
||||||
|
Reference in New Issue
Block a user