diff --git a/src/calibre/ebooks/metadata/opf3.py b/src/calibre/ebooks/metadata/opf3.py
index 16c190240b..9c9a4d9c08 100644
--- a/src/calibre/ebooks/metadata/opf3.py
+++ b/src/calibre/ebooks/metadata/opf3.py
@@ -5,6 +5,7 @@
from __future__ import (unicode_literals, division, absolute_import,
print_function)
from collections import defaultdict
+from functools import wraps
import re
from lxml import etree
@@ -70,6 +71,17 @@ def ensure_id(root, elem):
eid = ensure_unique('id', frozenset(XPath('//*/@id')(root)))
elem.set('id', eid)
return eid
+
+def normalize_whitespace(text):
+ if not text:
+ return text
+ return re.sub(r'\s+', ' ', text).strip()
+
+def simple_text(f):
+ @wraps(f)
+ def wrapper(*args, **kw):
+ return normalize_whitespace(f(*args, **kw))
+ return wrapper
# }}}
# Prefixes {{{
@@ -229,10 +241,12 @@ def find_main_title(root, refines, remove_blanks=False):
main_title = first_title
return main_title
+@simple_text
def read_title(root, prefixes, refines):
main_title = find_main_title(root, refines)
return None if main_title is None else main_title.text.strip()
+@simple_text
def read_title_sort(root, prefixes, refines):
main_title = find_main_title(root, refines)
if main_title is not None:
diff --git a/src/calibre/ebooks/metadata/opf3_test.py b/src/calibre/ebooks/metadata/opf3_test.py
index 77a0b54095..6ca638df44 100644
--- a/src/calibre/ebooks/metadata/opf3_test.py
+++ b/src/calibre/ebooks/metadata/opf3_test.py
@@ -83,8 +83,9 @@ class TestOPF3(unittest.TestCase):
self.ae(rt(root), 'xxx')
self.ae(st(root, 'abc', 'cba'), 'abc')
self.ae(read_title_sort(root, reserved_prefixes, read_refines(root)), 'cba')
- root = self.get_opf('''yyyxxx
+ root = self.get_opf('''yyyx xx
main''')
+ self.ae(rt(root), 'x xx')
self.ae(read_title_sort(root, reserved_prefixes, read_refines(root)), 'sorted')
self.ae(st(root, 'abc'), 'abc')
# }}}