out = StringIO()
text.transform(open(self.xml_file.path), out)
self.txt_file.save('%s.txt' % self.slug, ContentFile(out.getvalue()))
- self.save()
+
+
+ def build_html(self):
+ from tempfile import NamedTemporaryFile
+ from markupstring import MarkupString
+
+ meta_tags = list(self.tags.filter(
+ category__in=('author', 'epoch', 'genre', 'kind')))
+ book_tag = self.book_tag()
+
+ html_file = NamedTemporaryFile()
+ if html.transform(self.xml_file.path, html_file, parse_dublincore=False):
+ self.html_file.save('%s.html' % self.slug, File(html_file))
+
+ # get ancestor l-tags for adding to new fragments
+ ancestor_tags = []
+ p = self.parent
+ while p:
+ ancestor_tags.append(p.book_tag())
+ p = p.parent
+
+ # Delete old fragments and create them from scratch
+ self.fragments.all().delete()
+ # Extract fragments
+ closed_fragments, open_fragments = html.extract_fragments(self.html_file.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
+ tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name), category='theme')
+ if created:
+ tag.name = theme_name
+ tag.sort_key = theme_name.lower()
+ tag.save()
+ themes.append(tag)
+ if not themes:
+ continue
+
+ text = fragment.to_string()
+ short_text = ''
+ if (len(MarkupString(text)) > 240):
+ short_text = unicode(MarkupString(text)[:160])
+ new_fragment = Fragment.objects.create(anchor=fragment.id, book=self,
+ text=text, short_text=short_text)
+
+ new_fragment.save()
+ new_fragment.tags = set(meta_tags + themes + [book_tag] + ancestor_tags)
+ self.save()
+ return True
+ return False
@classmethod
@classmethod
def from_text_and_meta(cls, raw_file, book_info, overwrite=False, build_epub=True, build_txt=True):
import re
- from tempfile import NamedTemporaryFile
- from markupstring import MarkupString
- from django.core.files.storage import default_storage
# check for parts before we do anything
children = []
book._short_html = ''
book.save()
- book_tags = []
+ meta_tags = []
categories = (('kinds', 'kind'), ('genres', 'genre'), ('authors', 'author'), ('epochs', 'epoch'))
for field_name, category in categories:
try:
tag.name = tag_name
tag.sort_key = sortify(tag_sort_key.lower())
tag.save()
- book_tags.append(tag)
+ meta_tags.append(tag)
- book.tags = set(book_tags + book_shelves)
+ book.tags = set(meta_tags + book_shelves)
book_tag = book.book_tag()
# delete old fragments when overwriting
book.fragments.all().delete()
- html_file = NamedTemporaryFile()
- if html.transform(book.xml_file.path, html_file, parse_dublincore=False):
- book.html_file.save('%s.html' % book.slug, File(html_file), save=False)
-
- # get ancestor l-tags for adding to new fragments
- ancestor_tags = []
- p = book.parent
- while p:
- ancestor_tags.append(p.book_tag())
- p = p.parent
-
- # Extract fragments
- closed_fragments, open_fragments = html.extract_fragments(book.html_file.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
- tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name), category='theme')
- if created:
- tag.name = theme_name
- tag.sort_key = theme_name.lower()
- tag.save()
- themes.append(tag)
- if not themes:
- continue
-
- text = fragment.to_string()
- short_text = ''
- if (len(MarkupString(text)) > 240):
- short_text = unicode(MarkupString(text)[:160])
- new_fragment, created = Fragment.objects.get_or_create(anchor=fragment.id, book=book,
- defaults={'text': text, 'short_text': short_text})
-
- new_fragment.save()
- new_fragment.tags = set(book_tags + themes + [book_tag] + ancestor_tags)
-
+ if book.build_html():
if not settings.NO_BUILD_TXT and build_txt:
book.build_txt()
# the old tag shouldn't disappear
models.Tag.objects.get(slug="jim-lazy", category="author")
+ def test_book_remove_fragment(self):
+ BOOK_TEXT = """<utwor>
+ <opowiadanie>
+ <akap>
+ <begin id="m01" /><motyw id="m01">Love</motyw>Ala ma kota<end id="m01" />
+ <begin id="m02" /><motyw id="m02">Hatred</motyw>To kot Ali<end id="m02" />
+ </akap>
+ </opowiadanie></utwor>
+ """
+ BOOK_TEXT_AFTER = """<utwor>
+ <opowiadanie>
+ <akap>
+ <begin id="m01" /><motyw id="m01">Love</motyw>Ala ma kota<end id="m01" />
+ To kot Ali
+ </akap>
+ </opowiadanie></utwor>
+ """
+
+ book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info)
+ self.assertEqual(book.fragments.count(), 2)
+ book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT_AFTER), self.book_info, overwrite=True)
+ self.assertEqual(book.fragments.count(), 1)
+
def test_multiple_tags(self):
BOOK_TEXT = """<utwor />"""
self.book_info.authors = self.book_info.author, PersonStub(("Joe",), "Dilligent"),