diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index f1818291aa..e0ea0b4c0a 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -334,6 +334,10 @@ def abspath(x): return os.path.abspath(os.path.expanduser(x)) +def escape_sr_pattern(exp): + return exp.replace('\n', '\ue123') + + def read_sr_patterns(path, log=None): import json, re pats = [] @@ -344,6 +348,7 @@ def read_sr_patterns(path, log=None): if pat is None: if not line.strip(): continue + line = line.replace('\ue123', '\n') try: re.compile(line) except: diff --git a/src/calibre/gui2/convert/search_and_replace.py b/src/calibre/gui2/convert/search_and_replace.py index bbd1b5b481..c31d6d9115 100644 --- a/src/calibre/gui2/convert/search_and_replace.py +++ b/src/calibre/gui2/convert/search_and_replace.py @@ -122,6 +122,7 @@ class SearchAndReplaceWidget(Widget, Ui_Form): show=True) def sr_save_clicked(self): + from calibre.ebooks.conversion.cli import escape_sr_pattern as escape filename = choose_save_file(self, 'sr_saved_patterns', _('Save calibre search-replace definitions file'), filters=[ @@ -130,7 +131,7 @@ class SearchAndReplaceWidget(Widget, Ui_Form): if filename: with codecs.open(filename, 'w', 'utf-8') as f: for search, replace in self.get_definitions(): - f.write(search + u'\n' + replace + u'\n\n') + f.write(escape(search) + u'\n' + escape(replace) + u'\n\n') def sr_up_clicked(self): self.cell_rearrange(-1)