From a761e393172e88a21fd5649d3f5cbdedeb13432e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 31 Mar 2014 16:08:15 +0530 Subject: [PATCH] Nicer prefix for index anchors --- src/calibre/ebooks/docx/fields.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/calibre/ebooks/docx/fields.py b/src/calibre/ebooks/docx/fields.py index 7db350a6d6..9e0e3d2a8c 100644 --- a/src/calibre/ebooks/docx/fields.py +++ b/src/calibre/ebooks/docx/fields.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import re, os, uuid +import re, os from calibre.ebooks.docx.names import XPath, get, namespaces TEST_INDEX = 'CALIBRE_TEST_INDEX' in os.environ @@ -88,10 +88,15 @@ class Fields(object): def __init__(self): self.fields = [] - self.bookmark_counter = 0 - self.bookmark_prefix = str(uuid.uuid4()) + self.index_bookmark_counter = 0 + self.index_bookmark_prefix = 'index-' def __call__(self, doc, log): + all_ids = frozenset(XPath('//*/@w:id')(doc)) + c = 0 + while self.index_bookmark_prefix in all_ids: + c += 1 + self.index_bookmark_prefix = self.index_bookmark_prefix.replace('-', '%d-' % c) stack = [] for elem in XPath( '//*[name()="w:p" or name()="w:r" or name()="w:instrText" or (name()="w:fldChar" and (@w:fldCharType="begin" or @w:fldCharType="end"))]')(doc): @@ -158,8 +163,8 @@ class Fields(object): if xe: # We insert a synthetic bookmark around this index item so that we # can link to it later - self.bookmark_counter += 1 - bmark = xe['anchor'] = '%s-%d' % (self.bookmark_prefix, self.bookmark_counter) + self.index_bookmark_counter += 1 + bmark = xe['anchor'] = '%s%d' % (self.index_bookmark_prefix, self.index_bookmark_counter) p = field.start.getparent() bm = p.makeelement(WORD('bookmarkStart')) bm.set(WORD('id'), bmark), bm.set(WORD('name'), bmark)