Blob Blame History Raw
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)