+ # Extract fragments
+ closed_fragments, open_fragments = html.extract_fragments(fieldfile.path)
+ for fragment in closed_fragments.values():
+ try:
+ theme_names = [s.strip() for s in fragment.themes.split(',')]
+ except AttributeError:
+ continue
+ themes = []
+ for theme_name in theme_names:
+ if not theme_name:
+ continue
+ if lang == settings.LANGUAGE_CODE:
+ # Allow creating themes if book in default language.
+ tag, created = Tag.objects.get_or_create(
+ slug=slughifi(theme_name),
+ category='theme')
+ if created:
+ tag.name = theme_name
+ setattr(tag, "name_%s" % lang, theme_name)
+ tag.sort_key = sortify(theme_name.lower())
+ tag.save()
+ themes.append(tag)
+ elif lang is not None:
+ # Don't create unknown themes in non-default languages.
+ try:
+ tag = Tag.objects.get(category='theme',
+ **{"name_%s" % lang: theme_name})
+ except Tag.DoesNotExist:
+ pass
+ else:
+ themes.append(tag)
+ if not themes:
+ continue
+
+ text = fragment.to_string()
+ short_text = truncate_html_words(text, 15)
+ if text == short_text:
+ short_text = ''
+ new_fragment = Fragment.objects.create(anchor=fragment.id,
+ book=book, text=text, short_text=short_text)
+
+ new_fragment.save()
+ new_fragment.tags = set(meta_tags + themes + [book_tag] + ancestor_tags)
+ book.fix_tree_tags()
+ book.html_built.send(sender=book)
+ return True
+ return False
+
+@BuildEbook.register('cover_thumb')
+@task(ignore_result=True)
+class BuildCoverThumb(BuildEbook):
+ @classmethod
+ def transform(cls, wldoc, fieldfile):
+ from librarian.cover import WLCover
+ return WLCover(wldoc.book_info, height=193).output_file()
+
+
+
+class OverwritingFieldFile(FieldFile):
+ """
+ Deletes the old file before saving the new one.
+ """
+
+ def save(self, name, content, *args, **kwargs):
+ leave = kwargs.pop('leave', None)
+ # delete if there's a file already and there's a new one coming
+ if not leave and self and (not hasattr(content, 'path') or
+ content.path != self.path):
+ self.delete(save=False)
+ return super(OverwritingFieldFile, self).save(
+ name, content, *args, **kwargs)
+
+
+class OverwritingFileField(models.FileField):
+ attr_class = OverwritingFieldFile