diff --git a/shared/jekyll_import.py b/shared/jekyll_import.py index 547495169c8eef8b12c06df48f602d548c9e4a5f..a9f434bd4627d0c3ec3b3d93c05dca41ce7b04e1 100644 --- a/shared/jekyll_import.py +++ b/shared/jekyll_import.py @@ -12,6 +12,7 @@ from http.client import InvalidURL from io import StringIO from typing import List from urllib.error import HTTPError +from uuid import uuid4 import markdown.serializers import yaml @@ -387,15 +388,40 @@ class JekyllArticleImporter: text = re.split(r"^\s*$", text.strip(), flags=re.MULTILINE)[0] return plain_md.convert(text) - def handle_fancybox_gallery(self, article, meta: dict): + def handle_content(self, article, meta: dict, html: str): + """ + Převádí naparsované html do stremfieldů. + Pokud meta info článku obsahuje "fancybox" - tzn. v článku je galerie, + tak nejdříve očistíme HTML od for loopů galerie a podtom + v "self.handle_fancybox_gallery" získáme JSON data pro GalleryBlock + z ArticleMixinu. + Pokud článek galerii nemá (drtivá většina), tak uložíme jako + RichText (block type text). + """ + if meta.get("fancybox", None): + # Galerie josu v HTML ve formě dvou "{% for" tagů, + # ty potřebujeme zahodit z texxtu + html = re.sub( + "{% for(.*?){% for(.*?){% endfor %}(.*?){% endfor %}", + "", + html, + flags=re.DOTALL, + ) + + if "{% for" in html: # pro případ, že by byl jenom jeden + html = re.sub("{% for(.*?){% endfor %}", "", html, flags=re.DOTALL) + + text_data_dict = {"type": "text", "value": html} + gallery_data_dict = self.handle_fancybox_gallery(article, meta) + article.content = json.dumps([text_data_dict, gallery_data_dict]) + else: + text_data_dict = {"type": "text", "value": html} + article.content = json.dumps([text_data_dict]) + + def handle_fancybox_gallery(self, article, meta: dict) -> dict: for gallery in meta["fancybox"]: - # gallery by měl být dict o name a img + # gallery by měl být dict s name a img gallery_name = gallery.get("name", "") - if gallery_name: - article.content.append( - ("text", RichText("<h2>{}</h2>".format(gallery_name))) - ) - gallery_images = gallery.get("img", []) if not len(gallery_images): @@ -425,26 +451,21 @@ class JekyllArticleImporter: if log_message: self.page_log += "{}: {}".format(article.title, log_message) + data = { + "type": "gallery", + "value": {"gallery_items": []}, + "id": str(uuid4()), + } + if not wagtail_image_list: - return - # article.content += [("gallery", GalleryBlock(local_blocks=( - # 'gallery_items', ListBlock( - # child_block=ImageChooserBlock() - # ) TODO use JSON - # )))] - data = ( - "gallery", - [ - { - "gallery_items": [ # FIXME causing error 'list' object has no attribute 'items' - {"type": "item", "value": wagtail_image_list[0].id} - ] - } - ], - ) + return data - article.content.append(json.dumps(data)) - print(article.content) + for image in wagtail_image_list: + data["value"]["gallery_items"].append( + {"type": "item", "value": image.id, "id": str(uuid4())} + ) + + return data @staticmethod def handle_meta_is_str(meta: str) -> dict: @@ -516,10 +537,7 @@ class JekyllArticleImporter: article = self.page_model() article.perex = self.get_perex(md) or "..." - article.content = [("text", RichText(html))] - - if meta.get("fancybox", None): - self.handle_fancybox_gallery(article, meta) + self.handle_content(article, meta, html) if meta.get("date", None): meta_date = meta["date"] @@ -616,9 +634,12 @@ class JekyllArticleImporter: try: article.save() # ujistím se, že mám "redirect_page" pro Redirect uloženou - except: - pass - # self.create_redirects(article, match) + self.create_redirects(article, match) + except Exception as e: + msg = "{}: nelze uložit - {}".format(article.title, e) + logger.error(msg) + self.page_log += "{}\n".format(msg) + self.skipped_counter += 1 else: msg = "Nepodporovaná přípona souboru: %s" % ext logger.warning(msg)