From fe566d72116b147db680dcf8fba4a9c3a3e428dd Mon Sep 17 00:00:00 2001
From: Kovid Goyal <kovid@kovidgoyal.net>
Date: Wed, 31 Jul 2019 15:44:40 +0530
Subject: [PATCH 28/71] Preserve tag order when reading metadata from MOBI
files
---
src/calibre/ebooks/mobi/reader/headers.py | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/calibre/ebooks/mobi/reader/headers.py b/src/calibre/ebooks/mobi/reader/headers.py
index 4cd4cbd095..c164b95b52 100644
--- a/src/calibre/ebooks/mobi/reader/headers.py
+++ b/src/calibre/ebooks/mobi/reader/headers.py
@@ -21,6 +21,14 @@ from polyglot.builtins import unicode_type
NULL_INDEX = 0xffffffff
+def uniq(vals):
+ ''' Remove all duplicates from vals, while preserving order. '''
+ vals = vals or ()
+ seen = set()
+ seen_add = seen.add
+ return list(x for x in vals if x not in seen and not seen_add(x))
+
+
class EXTHHeader(object): # {{{
def __init__(self, raw, codec, title):
@@ -135,7 +143,7 @@ class EXTHHeader(object): # {{{
if not self.mi.tags:
self.mi.tags = []
self.mi.tags.extend([x.strip() for x in clean_xml_chars(self.decode(content)).split(';')])
- self.mi.tags = list(set(self.mi.tags))
+ self.mi.tags = uniq(self.mi.tags)
elif idx == 106:
try:
self.mi.pubdate = parse_date(self.decode(content), as_utc=False)