Пример #1
0
    def render_gallery_index(
        self, template_name, output_name, context, index_dst_path, img_name_list, thumbs, file_dep, kw
    ):
        """Build the gallery index."""

        # The photo array needs to be created here, because
        # it relies on thumbnails already being created on
        # output

        photo_array = []
        d_name = os.path.dirname(output_name)
        for name, thumb_name in zip(img_name_list, thumbs):
            im = Image.open(os.path.join(d_name, thumb_name))
            w, h = im.size
            title = ""
            if kw["use_filename_as_title"]:
                title = utils.unslugify(os.path.splitext(name)[0])
            photo_array.append({"url": name, "url_thumb": thumb_name, "title": title, "size": {"w": w, "h": h}})
        context["photo_array_json"] = json.dumps(photo_array)
        context["photo_array"] = photo_array

        if os.path.exists(index_dst_path):
            with codecs.open(index_dst_path, "rb", "utf8") as fd:
                context["text"] = fd.read()
            file_dep.append(index_dst_path)
        else:
            context["text"] = ""
        self.site.render_template(template_name, output_name, context)
Пример #2
0
    def render_gallery_index(self, template_name, output_name, context, img_list, thumbs, file_dep):
        """Build the gallery index."""

        # The photo array needs to be created here, because
        # it relies on thumbnails already being created on
        # output

        def url_from_path(p):
            url = "/".join(os.path.relpath(p, os.path.dirname(output_name) + os.sep).split(os.sep))
            return url

        photo_array = []
        for img, thumb in zip(img_list, thumbs):
            im = Image.open(thumb)
            w, h = im.size
            title = ""
            if self.kw["use_filename_as_title"]:
                title = utils.unslugify(os.path.splitext(img)[0])
            # Thumbs are files in output, we need URLs
            photo_array.append(
                {"url": url_from_path(img), "url_thumb": url_from_path(thumb), "title": title, "size": {"w": w, "h": h}}
            )
        context["photo_array_json"] = json.dumps(photo_array)
        context["photo_array"] = photo_array

        self.site.render_template(template_name, output_name, context)
Пример #3
0
    def extract_filename(self, filename: str, lang: str) -> dict:
        """Try to read the metadata from the filename based on the given re.

        This requires to use symbolic group names in the pattern.
        The part to read the metadata from the filename based on a regular
        expression is taken from Pelican - pelican/readers.py
        """
        match = re.match(self.site.config['FILE_METADATA_REGEXP'], filename)
        meta = {}

        if match:
            for key, value in match.groupdict().items():
                k = key.lower().strip()  # metadata must be lowercase
                if k == 'title' and self.site.config['FILE_METADATA_UNSLUGIFY_TITLES']:
                    meta[k] = unslugify(value, lang, discard_numbers=False)
                else:
                    meta[k] = value

        return meta
Пример #4
0
    def render_gallery_index(
            self,
            template_name,
            output_name,
            context,
            index_dst_path,
            img_name_list,
            thumbs,
            file_dep,
            kw):
        """Build the gallery index."""

        # The photo array needs to be created here, because
        # it relies on thumbnails already being created on
        # output

        photo_array = []
        d_name = os.path.dirname(output_name)
        for name, thumb_name in zip(img_name_list, thumbs):
            im = Image.open(os.path.join(d_name, thumb_name))
            w, h = im.size
            title = ''
            if kw['use_filename_as_title']:
                title = utils.unslugify(os.path.splitext(name)[0])
            photo_array.append({
                'url': name,
                'url_thumb': thumb_name,
                'title': title,
                'size': {
                    'w': w,
                    'h': h
                },
            })
        context['photo_array_json'] = json.dumps(photo_array)
        context['photo_array'] = photo_array

        if os.path.exists(index_dst_path):
            with codecs.open(index_dst_path, "rb", "utf8") as fd:
                context['text'] = fd.read()
            file_dep.append(index_dst_path)
        else:
            context['text'] = ''
        self.site.render_template(template_name, output_name, context)
Пример #5
0
    def extract_filename(self, filename: str, lang: str) -> dict:
        """Try to read the metadata from the filename based on the given re.

        This requires to use symbolic group names in the pattern.
        The part to read the metadata from the filename based on a regular
        expression is taken from Pelican - pelican/readers.py
        """
        match = re.match(self.site.config['FILE_METADATA_REGEXP'], filename)
        meta = {}

        if match:
            for key, value in match.groupdict().items():
                k = key.lower().strip()  # metadata must be lowercase
                if k == 'title' and self.site.config['FILE_METADATA_UNSLUGIFY_TITLES']:
                    meta[k] = unslugify(value, lang, discard_numbers=False)
                else:
                    meta[k] = value

        return meta
Пример #6
0
    def render_gallery_index(
            self,
            template_name,
            output_name,
            context,
            index_dst_path,
            img_name_list,
            thumbs,
            file_dep,
            kw):
        """Build the gallery index."""

        # The photo array needs to be created here, because
        # it relies on thumbnails already being created on
        # output

        photo_array = []
        d_name = os.path.dirname(output_name)
        for name, thumb_name in zip(img_name_list, thumbs):
            im = Image.open(os.path.join(d_name, thumb_name))
            w, h = im.size
            title = ''
            if kw['use_filename_as_title']:
                title = utils.unslugify(os.path.splitext(name)[0])
            photo_array.append({
                'url': name,
                'url_thumb': thumb_name,
                'title': title,
                'size': {
                    'w': w,
                    'h': h
                },
            })
        context['photo_array_json'] = json.dumps(photo_array)
        context['photo_array'] = photo_array

        if os.path.exists(index_dst_path):
            with codecs.open(index_dst_path, "rb", "utf8") as fd:
                context['text'] = fd.read()
            file_dep.append(index_dst_path)
        else:
            context['text'] = ''
        self.site.render_template(template_name, output_name, context)
Пример #7
0
    def render_gallery_index(
            self,
            template_name,
            output_name,
            context,
            img_list,
            thumbs,
            file_dep):
        """Build the gallery index."""

        # The photo array needs to be created here, because
        # it relies on thumbnails already being created on
        # output

        def url_from_path(p):
            url = '/'.join(os.path.relpath(p, os.path.dirname(output_name) + os.sep).split(os.sep))
            return url

        photo_array = []
        for img, thumb in zip(img_list, thumbs):
            im = Image.open(thumb)
            w, h = im.size
            title = ''
            if self.kw['use_filename_as_title']:
                title = utils.unslugify(os.path.splitext(img)[0])
            # Thumbs are files in output, we need URLs
            photo_array.append({
                'url': url_from_path(img),
                'url_thumb': url_from_path(thumb),
                'title': title,
                'size': {
                    'w': w,
                    'h': h
                },
            })
        context['photo_array_json'] = json.dumps(photo_array)
        context['photo_array'] = photo_array

        self.site.render_template(template_name, output_name, context)
Пример #8
0
    def render_gallery_index(
            self,
            template_name,
            output_name,
            context,
            img_list,
            thumbs,
            file_dep):
        """Build the gallery index."""

        # The photo array needs to be created here, because
        # it relies on thumbnails already being created on
        # output

        def url_from_path(p):
            url = '/'.join(os.path.relpath(p, os.path.dirname(output_name) + os.sep).split(os.sep))
            return url

        photo_array = []
        for img, thumb in zip(img_list, thumbs):
            im = Image.open(thumb)
            w, h = im.size
            title = ''
            if self.kw['use_filename_as_title']:
                title = utils.unslugify(os.path.splitext(img)[0])
            # Thumbs are files in output, we need URLs
            photo_array.append({
                'url': url_from_path(img),
                'url_thumb': url_from_path(thumb),
                'title': title,
                'size': {
                    'w': w,
                    'h': h
                },
            })
        context['photo_array_json'] = json.dumps(photo_array)
        context['photo_array'] = photo_array

        self.site.render_template(template_name, output_name, context)
Пример #9
0
    def gen_tasks(self):
        """Render image galleries."""

        kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'blog_description': self.site.config['BLOG_DESCRIPTION'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
        }

        # FIXME: lots of work is done even when images don't change,
        # which should be moved into the task.

        template_name = "gallery.tmpl"

        gallery_list = []
        for root, dirs, files in os.walk('galleries'):
            gallery_list.append(root)
        if not gallery_list:
            yield {
                'basename': 'render_galleries',
                'actions': [],
                }
            return

        # gallery_path is "gallery/name"
        for gallery_path in gallery_list:
            # gallery_name is "name"
            splitted = gallery_path.split(os.sep)[1:]
            if not splitted:
                gallery_name = ''
            else:
                gallery_name = os.path.join(*splitted)
            # output_gallery is "output/GALLERY_PATH/name"
            output_gallery = os.path.dirname(os.path.join(kw["output_folder"],
                self.site.path("gallery", gallery_name, None)))
            if not os.path.isdir(output_gallery):
                yield {
                    'basename': 'render_galleries',
                    'name': output_gallery,
                    'actions': [(os.makedirs, (output_gallery,))],
                    'targets': [output_gallery],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                    }
            # image_list contains "gallery/name/image_name.jpg"
            image_list = glob.glob(gallery_path + "/*jpg") +\
                glob.glob(gallery_path + "/*JPG") +\
                glob.glob(gallery_path + "/*PNG") +\
                glob.glob(gallery_path + "/*png")

            # Filter ignore images
            try:
                def add_gallery_path(index):
                    return "{0}/{1}".format(gallery_path, index)

                exclude_path = os.path.join(gallery_path, "exclude.meta")
                try:
                    f = open(exclude_path, 'r')
                    excluded_image_name_list = f.read().split()
                except IOError:
                    excluded_image_name_list = []

                excluded_image_list = map(add_gallery_path,
                    excluded_image_name_list)
                image_set = set(image_list) - set(excluded_image_list)
                image_list = list(image_set)
            except IOError:
                pass

            # List of sub-galleries
            folder_list = [x.split(os.sep)[-2] for x in
                glob.glob(os.path.join(gallery_path, '*') + os.sep)]

            crumbs = gallery_path.split(os.sep)[:-1]
            crumbs.append(os.path.basename(gallery_name))
            # TODO: write this in human
            paths = ['/'.join(['..'] * (len(crumbs) - 1 - i)) for i in
                range(len(crumbs[:-1]))] + ['#']
            crumbs = zip(paths, crumbs)

            image_list = [x for x in image_list if "thumbnail" not in x]
            # Sort by date
            image_list.sort(cmp=lambda a, b: cmp(
                self.image_date(a), self.image_date(b)))
            image_name_list = [os.path.basename(x) for x in image_list]

            thumbs = []
            # Do thumbnails and copy originals
            for img, img_name in zip(image_list, image_name_list):
                # img is "galleries/name/image_name.jpg"
                # img_name is "image_name.jpg"
                # fname, ext are "image_name", ".jpg"
                fname, ext = os.path.splitext(img_name)
                # thumb_path is
                # "output/GALLERY_PATH/name/image_name.thumbnail.jpg"
                thumb_path = os.path.join(output_gallery,
                    fname + ".thumbnail" + ext)
                # thumb_path is "output/GALLERY_PATH/name/image_name.jpg"
                orig_dest_path = os.path.join(output_gallery, img_name)
                thumbs.append(os.path.basename(thumb_path))
                yield {
                    'basename': 'render_galleries',
                    'name': thumb_path,
                    'file_dep': [img],
                    'targets': [thumb_path],
                    'actions': [
                        (self.resize_image,
                            (img, thumb_path, kw['thumbnail_size']))
                    ],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }
                yield {
                    'basename': 'render_galleries',
                    'name': orig_dest_path,
                    'file_dep': [img],
                    'targets': [orig_dest_path],
                    'actions': [
                        (self.resize_image,
                            (img, orig_dest_path, kw['max_image_size']))
                    ],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            # Remove excluded images
            if excluded_image_name_list:
                for img, img_name in zip(excluded_image_list,
                        excluded_image_name_list):
                    # img_name is "image_name.jpg"
                    # fname, ext are "image_name", ".jpg"
                    fname, ext = os.path.splitext(img_name)
                    excluded_thumb_dest_path = os.path.join(output_gallery,
                        fname + ".thumbnail" + ext)
                    excluded_dest_path = os.path.join(output_gallery, img_name)
                    yield {
                        'basename': 'render_galleries',
                        'name': excluded_thumb_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_thumb_dest_path],
                        'actions': [
                            (utils.remove_file, (excluded_thumb_dest_path,))
                        ],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }
                    yield {
                        'basename': 'render_galleries',
                        'name': excluded_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_dest_path],
                        'actions': [
                            (utils.remove_file, (excluded_dest_path,))
                        ],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }

            output_name = os.path.join(output_gallery, "index.html")
            context = {}
            context["lang"] = kw["default_lang"]
            context["title"] = os.path.basename(gallery_path)
            context["description"] = kw["blog_description"]
            if kw['use_filename_as_title']:
                img_titles = ['title="%s"' % utils.unslugify(fn[:-4])
                              for fn in image_name_list]
            else:
                img_titles = [''] * len(image_name_list)
            context["images"] = zip(image_name_list, thumbs, img_titles)
            context["folders"] = folder_list
            context["crumbs"] = crumbs
            context["permalink"] = self.site.link(
                "gallery", gallery_name, None)

            # Use galleries/name/index.txt to generate a blurb for
            # the gallery, if it exists
            index_path = os.path.join(gallery_path, "index.txt")
            index_dst_path = os.path.join(gallery_path, "index.html")
            if os.path.exists(index_path):
                compile_html = self.site.get_compiler(index_path)
                yield {
                    'basename': 'render_galleries',
                    'name': output_name.encode('utf-8'),
                    'file_dep': [index_path],
                    'targets': [index_dst_path],
                    'actions': [(compile_html,
                        [index_path, index_dst_path])],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            file_dep = self.site.template_system.template_deps(
                template_name) + image_list

            def render_gallery(output_name, context, index_dst_path):
                if os.path.exists(index_dst_path):
                    with codecs.open(index_dst_path, "rb", "utf8") as fd:
                        context['text'] = fd.read()
                    file_dep.append(index_dst_path)
                else:
                    context['text'] = ''
                self.site.render_template(template_name, output_name, context)

            yield {
                'basename': 'render_galleries',
                'name': output_name,
                'file_dep': file_dep,
                'targets': [output_name],
                'actions': [(render_gallery,
                    (output_name, context, index_dst_path))],
                'clean': True,
                'uptodate': [utils.config_changed({
                    1: kw,
                    2: self.site.config['GLOBAL_CONTEXT']})],
            }
Пример #10
0
    def gen_tasks(self):
        """Render image galleries."""

        kw = {
            "thumbnail_size": self.site.config["THUMBNAIL_SIZE"],
            "max_image_size": self.site.config["MAX_IMAGE_SIZE"],
            "output_folder": self.site.config["OUTPUT_FOLDER"],
            "cache_folder": self.site.config["CACHE_FOLDER"],
            "default_lang": self.site.config["DEFAULT_LANG"],
            "blog_description": self.site.config["BLOG_DESCRIPTION"],
            "use_filename_as_title": self.site.config["USE_FILENAME_AS_TITLE"],
        }

        # FIXME: lots of work is done even when images don't change,
        # which should be moved into the task.

        template_name = "gallery.tmpl"

        gallery_list = []
        for root, dirs, files in os.walk("galleries"):
            gallery_list.append(root)
        if not gallery_list:
            yield {"basename": "render_galleries", "actions": []}
            return

        # gallery_path is "gallery/name"
        for gallery_path in gallery_list:
            # gallery_name is "name"
            splitted = gallery_path.split(os.sep)[1:]
            if not splitted:
                gallery_name = ""
            else:
                gallery_name = os.path.join(*splitted)
            # output_gallery is "output/GALLERY_PATH/name"
            output_gallery = os.path.dirname(
                os.path.join(kw["output_folder"], self.site.path("gallery", gallery_name, None))
            )
            if not os.path.isdir(output_gallery):
                yield {
                    "basename": "render_galleries",
                    "name": output_gallery,
                    "actions": [(os.makedirs, (output_gallery,))],
                    "targets": [output_gallery],
                    "clean": True,
                    "uptodate": [utils.config_changed(kw)],
                }
            # image_list contains "gallery/name/image_name.jpg"
            image_list = (
                glob.glob(gallery_path + "/*jpg")
                + glob.glob(gallery_path + "/*JPG")
                + glob.glob(gallery_path + "/*PNG")
                + glob.glob(gallery_path + "/*png")
            )

            # Filter ignore images
            try:

                def add_gallery_path(index):
                    return "{0}/{1}".format(gallery_path, index)

                exclude_path = os.path.join(gallery_path, "exclude.meta")
                try:
                    f = open(exclude_path, "r")
                    excluded_image_name_list = f.read().split()
                except IOError:
                    excluded_image_name_list = []

                excluded_image_list = map(add_gallery_path, excluded_image_name_list)
                image_set = set(image_list) - set(excluded_image_list)
                image_list = list(image_set)
            except IOError:
                pass

            # List of sub-galleries
            folder_list = [x.split(os.sep)[-2] for x in glob.glob(os.path.join(gallery_path, "*") + os.sep)]

            crumbs = gallery_path.split(os.sep)[:-1]
            crumbs.append(os.path.basename(gallery_name))
            # TODO: write this in human
            paths = ["/".join([".."] * (len(crumbs) - 1 - i)) for i in range(len(crumbs[:-1]))] + ["#"]
            crumbs = zip(paths, crumbs)

            image_list = [x for x in image_list if "thumbnail" not in x]
            # Sort by date
            image_list.sort(cmp=lambda a, b: cmp(self.image_date(a), self.image_date(b)))
            image_name_list = [os.path.basename(x) for x in image_list]

            thumbs = []
            # Do thumbnails and copy originals
            for img, img_name in zip(image_list, image_name_list):
                # img is "galleries/name/image_name.jpg"
                # img_name is "image_name.jpg"
                # fname, ext are "image_name", ".jpg"
                fname, ext = os.path.splitext(img_name)
                # thumb_path is
                # "output/GALLERY_PATH/name/image_name.thumbnail.jpg"
                thumb_path = os.path.join(output_gallery, fname + ".thumbnail" + ext)
                # thumb_path is "output/GALLERY_PATH/name/image_name.jpg"
                orig_dest_path = os.path.join(output_gallery, img_name)
                thumbs.append(os.path.basename(thumb_path))
                yield {
                    "basename": "render_galleries",
                    "name": thumb_path,
                    "file_dep": [img],
                    "targets": [thumb_path],
                    "actions": [(self.resize_image, (img, thumb_path, kw["thumbnail_size"]))],
                    "clean": True,
                    "uptodate": [utils.config_changed(kw)],
                }
                yield {
                    "basename": "render_galleries",
                    "name": orig_dest_path,
                    "file_dep": [img],
                    "targets": [orig_dest_path],
                    "actions": [(self.resize_image, (img, orig_dest_path, kw["max_image_size"]))],
                    "clean": True,
                    "uptodate": [utils.config_changed(kw)],
                }

            # Remove excluded images
            if excluded_image_name_list:
                for img, img_name in zip(excluded_image_list, excluded_image_name_list):
                    # img_name is "image_name.jpg"
                    # fname, ext are "image_name", ".jpg"
                    fname, ext = os.path.splitext(img_name)
                    excluded_thumb_dest_path = os.path.join(output_gallery, fname + ".thumbnail" + ext)
                    excluded_dest_path = os.path.join(output_gallery, img_name)
                    yield {
                        "basename": "render_galleries",
                        "name": excluded_thumb_dest_path,
                        "file_dep": [exclude_path],
                        #'targets': [excluded_thumb_dest_path],
                        "actions": [(utils.remove_file, (excluded_thumb_dest_path,))],
                        "clean": True,
                        "uptodate": [utils.config_changed(kw)],
                    }
                    yield {
                        "basename": "render_galleries",
                        "name": excluded_dest_path,
                        "file_dep": [exclude_path],
                        #'targets': [excluded_dest_path],
                        "actions": [(utils.remove_file, (excluded_dest_path,))],
                        "clean": True,
                        "uptodate": [utils.config_changed(kw)],
                    }

            output_name = os.path.join(output_gallery, "index.html")
            context = {}
            context["lang"] = kw["default_lang"]
            context["title"] = os.path.basename(gallery_path)
            context["description"] = kw["blog_description"]
            if kw["use_filename_as_title"]:
                img_titles = ['title="%s"' % utils.unslugify(fn[:-4]) for fn in image_name_list]
            else:
                img_titles = [""] * len(image_name_list)
            context["images"] = zip(image_name_list, thumbs, img_titles)
            context["folders"] = folder_list
            context["crumbs"] = crumbs
            context["permalink"] = self.site.link("gallery", gallery_name, None)

            # Use galleries/name/index.txt to generate a blurb for
            # the gallery, if it exists
            index_path = os.path.join(gallery_path, "index.txt")
            cache_dir = os.path.join(kw["cache_folder"], "galleries")
            if not os.path.isdir(cache_dir):
                os.makedirs(cache_dir)
            index_dst_path = os.path.join(cache_dir, unicode(uuid.uuid1()) + ".html")
            if os.path.exists(index_path):
                compile_html = self.site.get_compiler(index_path)
                yield {
                    "basename": "render_galleries",
                    "name": index_dst_path.encode("utf-8"),
                    "file_dep": [index_path],
                    "targets": [index_dst_path],
                    "actions": [(compile_html, [index_path, index_dst_path])],
                    "clean": True,
                    "uptodate": [utils.config_changed(kw)],
                }

            file_dep = self.site.template_system.template_deps(template_name) + image_list

            def render_gallery(output_name, context, index_dst_path):
                if os.path.exists(index_dst_path):
                    with codecs.open(index_dst_path, "rb", "utf8") as fd:
                        context["text"] = fd.read()
                    file_dep.append(index_dst_path)
                else:
                    context["text"] = ""
                self.site.render_template(template_name, output_name, context)

            yield {
                "basename": "render_galleries",
                "name": output_name,
                "file_dep": file_dep,
                "targets": [output_name],
                "actions": [(render_gallery, (output_name, context, index_dst_path))],
                "clean": True,
                "uptodate": [utils.config_changed({1: kw, 2: self.site.config["GLOBAL_CONTEXT"]})],
            }
Пример #11
0
    def gen_tasks(self):
        """Render image galleries."""

        kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'cache_folder': self.site.config['CACHE_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'blog_description': self.site.config['BLOG_DESCRIPTION'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
            'gallery_path': self.site.config['GALLERY_PATH']
        }

        # FIXME: lots of work is done even when images don't change,
        # which should be moved into the task.

        template_name = "gallery.tmpl"

        gallery_list = []
        for root, dirs, files in os.walk(kw['gallery_path']):
            gallery_list.append(root)
        if not gallery_list:
            yield {
                'basename': str('render_galleries'),
                'actions': [],
            }
            return

        # gallery_path is "gallery/name"
        for gallery_path in gallery_list:
            # gallery_name is "name"
            splitted = gallery_path.split(os.sep)[1:]
            if not splitted:
                gallery_name = ''
            else:
                gallery_name = os.path.join(*splitted)

            # Task to create gallery in output/
            # output_gallery is "output/GALLERY_PATH/name"
            output_gallery = os.path.dirname(
                os.path.join(kw["output_folder"],
                             self.site.path("gallery", gallery_name, None)))
            output_name = os.path.join(output_gallery,
                                       self.site.config['INDEX_FILE'])
            if not os.path.isdir(output_gallery):
                yield {
                    'basename': str('render_galleries'),
                    'name': output_gallery,
                    'actions': [(os.makedirs, (output_gallery, ))],
                    'targets': [output_gallery],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            # Gather image_list contains "gallery/name/image_name.jpg"
            image_list = glob.glob(gallery_path + "/*jpg") +\
                glob.glob(gallery_path + "/*JPG") +\
                glob.glob(gallery_path + "/*png") +\
                glob.glob(gallery_path + "/*PNG")

            # Filter ignored images
            try:
                exclude_path = os.path.join(gallery_path, "exclude.meta")
                try:
                    f = open(exclude_path, 'r')
                    excluded_image_name_list = f.read().split()
                except IOError:
                    excluded_image_name_list = []
                excluded_image_list = [
                    "{0}/{1}".format(gallery_path, i)
                    for i in excluded_image_name_list
                ]
                image_set = set(image_list) - set(excluded_image_list)
                image_list = list(image_set)
            except IOError:
                pass

            # List of sub-galleries
            folder_list = [
                x.split(os.sep)[-2]
                for x in glob.glob(os.path.join(gallery_path, '*') + os.sep)
            ]

            crumbs = utils.get_crumbs(gallery_path)

            image_list = [x for x in image_list if "thumbnail" not in x]
            # Sort by date
            image_list.sort(key=lambda a: self.image_date(a))
            image_name_list = [os.path.basename(x) for x in image_list]

            # Do thumbnails and copy originals
            thumbs = []
            for img, img_name in list(zip(image_list, image_name_list)):
                # img is "galleries/name/image_name.jpg"
                # img_name is "image_name.jpg"
                # fname, ext are "image_name", ".jpg"
                fname, ext = os.path.splitext(img_name)
                # thumb_path is
                # "output/GALLERY_PATH/name/image_name.thumbnail.jpg"
                thumb_path = os.path.join(output_gallery,
                                          ".thumbnail".join([fname, ext]))
                # thumb_path is "output/GALLERY_PATH/name/image_name.jpg"
                orig_dest_path = os.path.join(output_gallery, img_name)
                thumbs.append(os.path.basename(thumb_path))
                yield {
                    'basename':
                    str('render_galleries'),
                    'name':
                    thumb_path,
                    'file_dep': [img],
                    'targets': [thumb_path],
                    'actions': [(self.resize_image, (img, thumb_path,
                                                     kw['thumbnail_size']))],
                    'clean':
                    True,
                    'uptodate': [utils.config_changed(kw)],
                }
                yield {
                    'basename':
                    str('render_galleries'),
                    'name':
                    orig_dest_path,
                    'file_dep': [img],
                    'targets': [orig_dest_path],
                    'actions': [(self.resize_image, (img, orig_dest_path,
                                                     kw['max_image_size']))],
                    'clean':
                    True,
                    'uptodate': [utils.config_changed(kw)],
                }

            # Remove excluded images
            if excluded_image_name_list:
                for img, img_name in zip(excluded_image_list,
                                         excluded_image_name_list):
                    # img_name is "image_name.jpg"
                    # fname, ext are "image_name", ".jpg"
                    fname, ext = os.path.splitext(img_name)
                    excluded_thumb_dest_path = os.path.join(
                        output_gallery, ".thumbnail".join([fname, ext]))
                    excluded_dest_path = os.path.join(output_gallery, img_name)
                    yield {
                        'basename':
                        str('render_galleries_clean'),
                        'name':
                        excluded_thumb_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_thumb_dest_path],
                        'actions':
                        [(utils.remove_file, (excluded_thumb_dest_path, ))],
                        'clean':
                        True,
                        'uptodate': [utils.config_changed(kw)],
                    }
                    yield {
                        'basename': str('render_galleries_clean'),
                        'name': excluded_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_dest_path],
                        'actions':
                        [(utils.remove_file, (excluded_dest_path, ))],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }

            # Use galleries/name/index.txt to generate a blurb for
            # the gallery, if it exists.

            index_path = os.path.join(gallery_path, "index.txt")
            cache_dir = os.path.join(kw["cache_folder"], 'galleries')
            if not os.path.isdir(cache_dir):
                os.makedirs(cache_dir)
            index_dst_path = os.path.join(
                cache_dir,
                str(
                    hashlib.sha224(index_path.encode('utf-8')).hexdigest() +
                    '.html'))
            if os.path.exists(index_path):
                compile_html = self.site.get_compiler(index_path).compile_html
                yield {
                    'basename': str('render_galleries'),
                    'name': index_dst_path,
                    'file_dep': [index_path],
                    'targets': [index_dst_path],
                    'actions':
                    [(compile_html, [index_path, index_dst_path, True])],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            context = {}
            context["lang"] = kw["default_lang"]
            context["title"] = os.path.basename(gallery_path)
            context["description"] = kw["blog_description"]
            if kw['use_filename_as_title']:
                img_titles = [
                    'id="{0}" alt="{1}" title="{2}"'.format(
                        fn[:-4], fn[:-4], utils.unslugify(fn[:-4]))
                    for fn in image_name_list
                ]
            else:
                img_titles = [''] * len(image_name_list)
            # In the future, remove images from context, use photo_array
            context["images"] = list(zip(image_name_list, thumbs, img_titles))
            context["folders"] = folder_list
            context["crumbs"] = crumbs
            context["permalink"] = self.site.link("gallery", gallery_name,
                                                  None)
            context["enable_comments"] = (
                self.site.config["COMMENTS_IN_GALLERIES"])
            context["thumbnail_size"] = kw["thumbnail_size"]

            file_dep = self.site.template_system.template_deps(
                template_name) + image_list

            yield {
                'basename':
                str('render_galleries'),
                'name':
                output_name,
                'file_dep':
                file_dep,
                'targets': [output_name],
                'actions':
                [(self.render_gallery_index,
                  (template_name, output_name, context, index_dst_path,
                   image_name_list, thumbs, file_dep, kw))],
                'clean':
                True,
                'uptodate': [
                    utils.config_changed({
                        1:
                        kw,
                        2:
                        self.site.config['GLOBAL_CONTEXT'],
                        3:
                        self.site.config["COMMENTS_IN_GALLERIES"],
                        4:
                        context,
                    })
                ],
            }
Пример #12
0
    def gen_tasks(self):
        """Render image galleries."""
        self.image_ext_list = self.image_ext_list_builtin
        self.image_ext_list.extend(self.site.config.get('EXTRA_IMAGE_EXTENSIONS', []))

        for k, v in self.site.GLOBAL_CONTEXT['template_hooks'].items():
            self.kw['||template_hooks|{0}||'.format(k)] = v._items

        yield self.group_task()

        template_name = "gallery.tmpl"

        # Create all output folders
        for task in self.create_galleries():
            yield task

        # For each gallery:
        for gallery, input_folder, output_folder in self.gallery_list:

            # Create subfolder list
            folder_list = [(x, x.split(os.sep)[-2]) for x in
                           glob.glob(os.path.join(gallery, '*') + os.sep)]

            # Parse index into a post (with translations)
            post = self.parse_index(gallery, input_folder, output_folder)

            # Create image list, filter exclusions
            image_list = self.get_image_list(gallery)

            # Create thumbnails and large images in destination
            for image in image_list:
                for task in self.create_target_images(image, input_folder):
                    yield task

            # Remove excluded images
            for image in self.get_excluded_images(gallery):
                for task in self.remove_excluded_image(image, input_folder):
                    yield task

            for lang in self.kw['translations']:
                # save navigation links as dependencies
                self.kw['navigation_links|{0}'.format(lang)] = self.kw['global_context']['navigation_links'](lang)

            # Create index.html for each language
            for lang in self.kw['translations']:

                dst = os.path.join(
                    self.kw['output_folder'],
                    self.site.path("gallery", gallery, lang))
                dst = os.path.normpath(dst)

                for k in self.site._GLOBAL_CONTEXT_TRANSLATABLE:
                    self.kw[k] = self.site.GLOBAL_CONTEXT[k](lang)

                context = {}
                context["lang"] = lang
                if post:
                    context["title"] = post.title(lang)
                else:
                    context["title"] = os.path.basename(gallery)
                context["description"] = None

                image_name_list = [os.path.basename(p) for p in image_list]

                if self.kw['use_filename_as_title']:
                    img_titles = []
                    for fn in image_name_list:
                        name_without_ext = os.path.splitext(os.path.basename(fn))[0]
                        img_titles.append(utils.unslugify(name_without_ext))
                else:
                    img_titles = [''] * len(image_name_list)

                thumbs = ['.thumbnail'.join(os.path.splitext(p)) for p in image_list]
                thumbs = [os.path.join(self.kw['output_folder'], output_folder, os.path.relpath(t, input_folder)) for t in thumbs]
                dst_img_list = [os.path.join(output_folder, os.path.relpath(t, input_folder)) for t in image_list]
                dest_img_list = [os.path.join(self.kw['output_folder'], t) for t in dst_img_list]

                folders = []

                # Generate friendly gallery names
                for path, folder in folder_list:
                    fpost = self.parse_index(path, input_folder, output_folder)
                    if fpost:
                        ft = fpost.title(lang) or folder
                    else:
                        ft = folder
                    if not folder.endswith('/'):
                        folder += '/'
                    folders.append((folder, ft))

                context["folders"] = natsort.natsorted(
                    folders, alg=natsort.ns.F | natsort.ns.IC)
                context["crumbs"] = utils.get_crumbs(gallery, index_folder=self, lang=lang)
                context["permalink"] = self.site.link("gallery", gallery, lang)
                context["enable_comments"] = self.kw['comments_in_galleries']
                context["thumbnail_size"] = self.kw["thumbnail_size"]
                context["pagekind"] = ["gallery_front"]

                if post:
                    yield {
                        'basename': self.name,
                        'name': post.translated_base_path(lang),
                        'targets': [post.translated_base_path(lang)],
                        'file_dep': post.fragment_deps(lang),
                        'actions': [(post.compile, [lang])],
                        'uptodate': [utils.config_changed(self.kw.copy(), 'nikola.plugins.task.galleries:post')] + post.fragment_deps_uptodate(lang)
                    }
                    context['post'] = post
                else:
                    context['post'] = None
                file_dep = self.site.template_system.template_deps(
                    template_name) + image_list + thumbs
                file_dep_dest = self.site.template_system.template_deps(
                    template_name) + dest_img_list + thumbs
                if post:
                    file_dep += [post.translated_base_path(l) for l in self.kw['translations']]
                    file_dep_dest += [post.translated_base_path(l) for l in self.kw['translations']]

                context["pagekind"] = ["gallery_page"]

                yield utils.apply_filters({
                    'basename': self.name,
                    'name': dst,
                    'file_dep': file_dep,
                    'targets': [dst],
                    'actions': [
                        (self.render_gallery_index, (
                            template_name,
                            dst,
                            context.copy(),
                            dest_img_list,
                            img_titles,
                            thumbs,
                            file_dep))],
                    'clean': True,
                    'uptodate': [utils.config_changed({
                        1: self.kw.copy(),
                        2: self.site.config["COMMENTS_IN_GALLERIES"],
                        3: context.copy(),
                    }, 'nikola.plugins.task.galleries:gallery')],
                }, self.kw['filters'])

                # RSS for the gallery
                if self.kw["generate_rss"]:
                    rss_dst = os.path.join(
                        self.kw['output_folder'],
                        self.site.path("gallery_rss", gallery, lang))
                    rss_dst = os.path.normpath(rss_dst)

                    yield utils.apply_filters({
                        'basename': self.name,
                        'name': rss_dst,
                        'file_dep': file_dep_dest,
                        'targets': [rss_dst],
                        'actions': [
                            (self.gallery_rss, (
                                image_list,
                                dst_img_list,
                                img_titles,
                                lang,
                                self.site.link("gallery_rss", gallery, lang),
                                rss_dst,
                                context['title']
                            ))],
                        'clean': True,
                        'uptodate': [utils.config_changed({
                            1: self.kw.copy(),
                        }, 'nikola.plugins.task.galleries:rss')],
                    }, self.kw['filters'])
Пример #13
0
    def gen_tasks(self):
        """Render image galleries."""

        kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'blog_description': self.site.config['BLOG_DESCRIPTION'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
        }

        # FIXME: lots of work is done even when images don't change,
        # which should be moved into the task.

        template_name = "gallery.tmpl"

        gallery_list = glob.glob("galleries/*")
        # Fail quick if we don't have galleries, so we don't
        # require PIL
        Image = None
        if not gallery_list:
            yield {
                'basename': 'render_galleries',
                'actions': [],
                }
            return
        try:
            import Image as _Image
            import ExifTags
            Image = _Image
        except ImportError:
            try:
                from PIL import Image as _Image, ExifTags  # NOQA
                Image = _Image
            except ImportError:
                pass
        if Image:
            def _resize_image(src, dst, max_size):
                im = Image.open(src)
                w, h = im.size
                if w > max_size or h > max_size:
                    size = max_size, max_size
                    try:
                        exif = im._getexif()
                    except Exception:
                        exif = None
                    if exif is not None:
                        for tag, value in exif.items():
                            decoded = ExifTags.TAGS.get(tag, tag)

                            if decoded == 'Orientation':
                                if value == 3:
                                    im = im.rotate(180)
                                elif value == 6:
                                    im = im.rotate(270)
                                elif value == 8:
                                    im = im.rotate(90)

                                break

                    im.thumbnail(size, Image.ANTIALIAS)
                    im.save(dst)

                else:
                    utils.copy_file(src, dst)

            def create_thumb(src, dst):
                return _resize_image(src, dst, kw['thumbnail_size'])

            def create_resized_image(src, dst):
                return _resize_image(src, dst, kw['max_image_size'])

            dates = {}

            def image_date(src):
                if src not in dates:
                    im = Image.open(src)
                    try:
                        exif = im._getexif()
                    except Exception:
                        exif = None
                    if exif is not None:
                        for tag, value in exif.items():
                            decoded = ExifTags.TAGS.get(tag, tag)
                            if decoded == 'DateTimeOriginal':
                                try:
                                    dates[src] = datetime.datetime.strptime(
                                        value, r'%Y:%m:%d %H:%M:%S')
                                    break
                                except ValueError:  # Invalid EXIF date.
                                    pass
                if src not in dates:
                    dates[src] = datetime.datetime.fromtimestamp(
                        os.stat(src).st_mtime)
                return dates[src]

        else:
            create_thumb = utils.copy_file
            create_resized_image = utils.copy_file

        # gallery_path is "gallery/name"
        for gallery_path in gallery_list:
            # gallery_name is "name"
            gallery_name = os.path.basename(gallery_path)
            # output_gallery is "output/GALLERY_PATH/name"
            output_gallery = os.path.dirname(os.path.join(kw["output_folder"],
                self.site.path("gallery", gallery_name, None)))
            if not os.path.isdir(output_gallery):
                yield {
                    'basename': 'render_galleries',
                    'name': output_gallery,
                    'actions': [(os.makedirs, (output_gallery,))],
                    'targets': [output_gallery],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                    }
            # image_list contains "gallery/name/image_name.jpg"
            image_list = glob.glob(gallery_path + "/*jpg") +\
                glob.glob(gallery_path + "/*JPG") +\
                glob.glob(gallery_path + "/*PNG") +\
                glob.glob(gallery_path + "/*png")

            # Filter ignore images
            try:
                def add_gallery_path(index):
                    return "{0}/{1}".format(gallery_path, index)

                exclude_path = os.path.join(gallery_path, "exclude.meta")
                try:
                    f = open(exclude_path, 'r')
                    excluded_image_name_list = f.read().split()
                except IOError:
                    excluded_image_name_list = []

                excluded_image_list = map(add_gallery_path,
                    excluded_image_name_list)
                image_set = set(image_list) - set(excluded_image_list)
                image_list = list(image_set)
            except IOError:
                pass

            image_list = [x for x in image_list if "thumbnail" not in x]
            # Sort by date
            image_list.sort(cmp=lambda a, b: cmp(image_date(a), image_date(b)))
            image_name_list = [os.path.basename(x) for x in image_list]

            thumbs = []
            # Do thumbnails and copy originals
            for img, img_name in zip(image_list, image_name_list):
                # img is "galleries/name/image_name.jpg"
                # img_name is "image_name.jpg"
                # fname, ext are "image_name", ".jpg"
                fname, ext = os.path.splitext(img_name)
                # thumb_path is
                # "output/GALLERY_PATH/name/image_name.thumbnail.jpg"
                thumb_path = os.path.join(output_gallery,
                    fname + ".thumbnail" + ext)
                # thumb_path is "output/GALLERY_PATH/name/image_name.jpg"
                orig_dest_path = os.path.join(output_gallery, img_name)
                thumbs.append(os.path.basename(thumb_path))
                yield {
                    'basename': 'render_galleries',
                    'name': thumb_path,
                    'file_dep': [img],
                    'targets': [thumb_path],
                    'actions': [
                        (create_thumb, (img, thumb_path))
                    ],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }
                yield {
                    'basename': 'render_galleries',
                    'name': orig_dest_path,
                    'file_dep': [img],
                    'targets': [orig_dest_path],
                    'actions': [
                        (create_resized_image, (img, orig_dest_path))
                    ],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            # Remove excluded images
            if excluded_image_name_list:
                for img, img_name in zip(excluded_image_list,
                        excluded_image_name_list):
                    # img_name is "image_name.jpg"
                    # fname, ext are "image_name", ".jpg"
                    fname, ext = os.path.splitext(img_name)
                    excluded_thumb_dest_path = os.path.join(output_gallery,
                        fname + ".thumbnail" + ext)
                    excluded_dest_path = os.path.join(output_gallery, img_name)
                    yield {
                        'basename': 'render_galleries',
                        'name': excluded_thumb_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_thumb_dest_path],
                        'actions': [
                            (utils.remove_file, (excluded_thumb_dest_path,))
                        ],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }
                    yield {
                        'basename': 'render_galleries',
                        'name': excluded_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_dest_path],
                        'actions': [
                            (utils.remove_file, (excluded_dest_path,))
                        ],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }

            output_name = os.path.join(output_gallery, "index.html")
            context = {}
            context["lang"] = kw["default_lang"]
            context["title"] = os.path.basename(gallery_path)
            context["description"] = kw["blog_description"]
            if kw['use_filename_as_title']:
                img_titles = ['title="%s"' % utils.unslugify(fn[:-4])
                              for fn in image_name_list]
            else:
                img_titles = [''] * len(image_name_list)
            context["images"] = zip(image_name_list, thumbs, img_titles)
            context["permalink"] = self.site.link(
                "gallery", gallery_name, None)

            # Use galleries/name/index.txt to generate a blurb for
            # the gallery, if it exists
            index_path = os.path.join(gallery_path, "index.txt")
            index_dst_path = os.path.join(gallery_path, "index.html")
            if os.path.exists(index_path):
                compile_html = self.site.get_compiler(index_path)
                yield {
                    'basename': 'render_galleries',
                    'name': index_dst_path.encode('utf-8'),
                    'file_dep': [index_path],
                    'targets': [index_dst_path],
                    'actions': [(compile_html,
                        [index_path, index_dst_path])],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            file_dep = self.site.template_system.template_deps(
                template_name) + image_list

            def render_gallery(output_name, context, index_dst_path):
                if os.path.exists(index_dst_path):
                    with codecs.open(index_dst_path, "rb", "utf8") as fd:
                        context['text'] = fd.read()
                    file_dep.append(index_dst_path)
                else:
                    context['text'] = ''
                self.site.render_template(template_name, output_name, context)

            yield {
                'basename': 'render_galleries',
                'name': gallery_path,
                'file_dep': file_dep,
                'targets': [output_name],
                'actions': [(render_gallery,
                    (output_name, context, index_dst_path))],
                'clean': True,
                'uptodate': [utils.config_changed(kw)],
            }
Пример #14
0
    def gen_tasks(self):
        """Render image galleries."""

        kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'blog_description': self.site.config['BLOG_DESCRIPTION'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
        }

        # FIXME: lots of work is done even when images don't change,
        # which should be moved into the task.

        template_name = "gallery.tmpl"

        gallery_list = glob.glob("galleries/*")
        # Fail quick if we don't have galleries, so we don't
        # require PIL
        Image = None
        if not gallery_list:
            yield {
                'basename': 'render_galleries',
                'actions': [],
                }
            return
        try:
            import Image as _Image
            import ExifTags
            Image = _Image
        except ImportError:
            try:
                from PIL import Image as _Image, ExifTags  # NOQA
                Image = _Image
            except ImportError:
                pass
        if Image:
            def _resize_image(src, dst, max_size):
                im = Image.open(src)
                w, h = im.size
                if w > max_size or h > max_size:
                    size = max_size, max_size
                    try:
                        exif = im._getexif()
                    except Exception:
                        exif = None
                    if exif is not None:
                        for tag, value in exif.items():
                            decoded = ExifTags.TAGS.get(tag, tag)

                            if decoded == 'Orientation':
                                if value == 3:
                                    im = im.rotate(180)
                                elif value == 6:
                                    im = im.rotate(270)
                                elif value == 8:
                                    im = im.rotate(90)

                                break

                    im.thumbnail(size, Image.ANTIALIAS)
                    im.save(dst)

                else:
                    utils.copy_file(src, dst)

            def create_thumb(src, dst):
                return _resize_image(src, dst, kw['thumbnail_size'])

            def create_resized_image(src, dst):
                return _resize_image(src, dst, kw['max_image_size'])

            dates = {}

            def image_date(src):
                if src not in dates:
                    im = Image.open(src)
                    try:
                        exif = im._getexif()
                    except Exception:
                        exif = None
                    if exif is not None:
                        for tag, value in exif.items():
                            decoded = ExifTags.TAGS.get(tag, tag)
                            if decoded == 'DateTimeOriginal':
                                try:
                                    dates[src] = datetime.datetime.strptime(
                                        value, r'%Y:%m:%d %H:%M:%S')
                                    break
                                except ValueError:  # Invalid EXIF date.
                                    pass
                if src not in dates:
                    dates[src] = datetime.datetime.fromtimestamp(
                        os.stat(src).st_mtime)
                return dates[src]

        else:
            create_thumb = utils.copy_file
            create_resized_image = utils.copy_file

        # gallery_path is "gallery/name"
        for gallery_path in gallery_list:
            # gallery_name is "name"
            gallery_name = os.path.basename(gallery_path)
            # output_gallery is "output/GALLERY_PATH/name"
            output_gallery = os.path.dirname(os.path.join(kw["output_folder"],
                self.site.path("gallery", gallery_name, None)))
            if not os.path.isdir(output_gallery):
                yield {
                    'basename': 'render_galleries',
                    'name': output_gallery,
                    'actions': [(os.makedirs, (output_gallery,))],
                    'targets': [output_gallery],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                    }
            # image_list contains "gallery/name/image_name.jpg"
            image_list = glob.glob(gallery_path + "/*jpg") +\
                glob.glob(gallery_path + "/*JPG") +\
                glob.glob(gallery_path + "/*PNG") +\
                glob.glob(gallery_path + "/*png")

            # Filter ignore images
            try:
                def add_gallery_path(index):
                    return "{0}/{1}".format(gallery_path, index)

                exclude_path = os.path.join(gallery_path, "exclude.meta")
                try:
                    f = open(exclude_path, 'r')
                    excluded_image_name_list = f.read().split()
                except IOError:
                    excluded_image_name_list = []

                excluded_image_list = map(add_gallery_path,
                    excluded_image_name_list)
                image_set = set(image_list) - set(excluded_image_list)
                image_list = list(image_set)
            except IOError:
                pass

            image_list = [x for x in image_list if "thumbnail" not in x]
            # Sort by date
            image_list.sort(cmp=lambda a, b: cmp(image_date(a), image_date(b)))
            image_name_list = [os.path.basename(x) for x in image_list]

            thumbs = []
            # Do thumbnails and copy originals
            for img, img_name in zip(image_list, image_name_list):
                # img is "galleries/name/image_name.jpg"
                # img_name is "image_name.jpg"
                # fname, ext are "image_name", ".jpg"
                fname, ext = os.path.splitext(img_name)
                # thumb_path is
                # "output/GALLERY_PATH/name/image_name.thumbnail.jpg"
                thumb_path = os.path.join(output_gallery,
                    fname + ".thumbnail" + ext)
                # thumb_path is "output/GALLERY_PATH/name/image_name.jpg"
                orig_dest_path = os.path.join(output_gallery, img_name)
                thumbs.append(os.path.basename(thumb_path))
                yield {
                    'basename': 'render_galleries',
                    'name': thumb_path,
                    'file_dep': [img],
                    'targets': [thumb_path],
                    'actions': [
                        (create_thumb, (img, thumb_path))
                    ],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }
                yield {
                    'basename': 'render_galleries',
                    'name': orig_dest_path,
                    'file_dep': [img],
                    'targets': [orig_dest_path],
                    'actions': [
                        (create_resized_image, (img, orig_dest_path))
                    ],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            # Remove excluded images
            if excluded_image_name_list:
                for img, img_name in zip(excluded_image_list,
                        excluded_image_name_list):
                    # img_name is "image_name.jpg"
                    # fname, ext are "image_name", ".jpg"
                    fname, ext = os.path.splitext(img_name)
                    excluded_thumb_dest_path = os.path.join(output_gallery,
                        fname + ".thumbnail" + ext)
                    excluded_dest_path = os.path.join(output_gallery, img_name)
                    yield {
                        'basename': 'render_galleries',
                        'name': excluded_thumb_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_thumb_dest_path],
                        'actions': [
                            (utils.remove_file, (excluded_thumb_dest_path,))
                        ],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }
                    yield {
                        'basename': 'render_galleries',
                        'name': excluded_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_dest_path],
                        'actions': [
                            (utils.remove_file, (excluded_dest_path,))
                        ],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }

            output_name = os.path.join(output_gallery, "index.html")
            context = {}
            context["lang"] = kw["default_lang"]
            context["title"] = os.path.basename(gallery_path)
            context["description"] = kw["blog_description"]
            if kw['use_filename_as_title']:
                img_titles = ['title="%s"' % utils.unslugify(fn[:-4])
                              for fn in image_name_list]
            else:
                img_titles = [''] * len(image_name_list)
            context["images"] = zip(image_name_list, thumbs, img_titles)
            context["permalink"] = self.site.link(
                "gallery", gallery_name, None)

            # Use galleries/name/index.txt to generate a blurb for
            # the gallery, if it exists
            index_path = os.path.join(gallery_path, "index.txt")
            index_dst_path = os.path.join(gallery_path, "index.html")
            if os.path.exists(index_path):
                compile_html = self.site.get_compiler(index_path)
                yield {
                    'basename': 'render_galleries',
                    'name': output_name.encode('utf-8'),
                    'file_dep': [index_path],
                    'targets': [index_dst_path],
                    'actions': [(compile_html,
                        [index_path, index_dst_path])],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            file_dep = self.site.template_system.template_deps(
                template_name) + image_list

            def render_gallery(output_name, context, index_dst_path):
                if os.path.exists(index_dst_path):
                    with codecs.open(index_dst_path, "rb", "utf8") as fd:
                        context['text'] = fd.read()
                    file_dep.append(index_dst_path)
                else:
                    context['text'] = ''
                self.site.render_template(template_name, output_name, context)

            yield {
                'basename': 'render_galleries',
                'name': gallery_path,
                'file_dep': file_dep,
                'targets': [output_name],
                'actions': [(render_gallery,
                    (output_name, context, index_dst_path))],
                'clean': True,
                'uptodate': [utils.config_changed(kw)],
            }
Пример #15
0
    def gen_tasks(self):
        """Render image galleries."""

        if Image is None:
            req_missing(["pillow"], "render galleries")

        self.image_ext_list = self.image_ext_list_builtin
        self.image_ext_list.extend(self.site.config.get("EXTRA_IMAGE_EXTENSIONS", []))

        for k, v in self.site.GLOBAL_CONTEXT["template_hooks"].items():
            self.kw["||template_hooks|{0}||".format(k)] = v._items

        yield self.group_task()

        template_name = "gallery.tmpl"

        # Create all output folders
        for task in self.create_galleries():
            yield task

        # For each gallery:
        for gallery, input_folder, output_folder in self.gallery_list:

            # Create subfolder list
            folder_list = [(x, x.split(os.sep)[-2]) for x in glob.glob(os.path.join(gallery, "*") + os.sep)]

            # Parse index into a post (with translations)
            post = self.parse_index(gallery, input_folder, output_folder)

            # Create image list, filter exclusions
            image_list = self.get_image_list(gallery)

            # Sort as needed
            # Sort by date
            if self.kw["sort_by_date"]:
                image_list.sort(key=lambda a: self.image_date(a))
            else:  # Sort by name
                image_list.sort()

            # Create thumbnails and large images in destination
            for image in image_list:
                for task in self.create_target_images(image, input_folder):
                    yield task

            # Remove excluded images
            for image in self.get_excluded_images(gallery):
                for task in self.remove_excluded_image(image, input_folder):
                    yield task

            crumbs = utils.get_crumbs(gallery, index_folder=self)

            # Create index.html for each language
            for lang in self.kw["translations"]:
                # save navigation links as dependencies
                self.kw["navigation_links|{0}".format(lang)] = self.kw["global_context"]["navigation_links"](lang)

                dst = os.path.join(self.kw["output_folder"], self.site.path("gallery", gallery, lang))
                dst = os.path.normpath(dst)

                for k in self.site._GLOBAL_CONTEXT_TRANSLATABLE:
                    self.kw[k] = self.site.GLOBAL_CONTEXT[k](lang)

                context = {}
                context["lang"] = lang
                if post:
                    context["title"] = post.title(lang)
                else:
                    context["title"] = os.path.basename(gallery)
                context["description"] = None

                image_name_list = [os.path.basename(p) for p in image_list]

                if self.kw["use_filename_as_title"]:
                    img_titles = []
                    for fn in image_name_list:
                        name_without_ext = os.path.splitext(os.path.basename(fn))[0]
                        img_titles.append(utils.unslugify(name_without_ext))
                else:
                    img_titles = [""] * len(image_name_list)

                thumbs = [".thumbnail".join(os.path.splitext(p)) for p in image_list]
                thumbs = [
                    os.path.join(self.kw["output_folder"], output_folder, os.path.relpath(t, input_folder))
                    for t in thumbs
                ]
                dst_img_list = [os.path.join(output_folder, os.path.relpath(t, input_folder)) for t in image_list]
                dest_img_list = [os.path.join(self.kw["output_folder"], t) for t in dst_img_list]

                folders = []

                # Generate friendly gallery names
                for path, folder in folder_list:
                    fpost = self.parse_index(path, input_folder, output_folder)
                    if fpost:
                        ft = fpost.title(lang) or folder
                    else:
                        ft = folder
                    if not folder.endswith("/"):
                        folder += "/"
                    folders.append((folder, ft))

                context["folders"] = natsort.natsorted(folders, alg=natsort.ns.F | natsort.ns.IC)
                context["crumbs"] = crumbs
                context["permalink"] = self.site.link("gallery", gallery, lang)
                context["enable_comments"] = self.kw["comments_in_galleries"]
                context["thumbnail_size"] = self.kw["thumbnail_size"]

                if post:
                    yield {
                        "basename": self.name,
                        "name": post.translated_base_path(lang),
                        "targets": [post.translated_base_path(lang)],
                        "file_dep": post.fragment_deps(lang),
                        "actions": [(post.compile, [lang])],
                        "uptodate": [utils.config_changed(self.kw, "nikola.plugins.task.galleries:post")]
                        + post.fragment_deps_uptodate(lang),
                    }
                    context["post"] = post
                else:
                    context["post"] = None
                file_dep = self.site.template_system.template_deps(template_name) + image_list + thumbs
                file_dep_dest = self.site.template_system.template_deps(template_name) + dest_img_list + thumbs
                if post:
                    file_dep += [post.translated_base_path(l) for l in self.kw["translations"]]
                    file_dep_dest += [post.translated_base_path(l) for l in self.kw["translations"]]

                yield utils.apply_filters(
                    {
                        "basename": self.name,
                        "name": dst,
                        "file_dep": file_dep,
                        "targets": [dst],
                        "actions": [
                            (
                                self.render_gallery_index,
                                (template_name, dst, context, dest_img_list, img_titles, thumbs, file_dep),
                            )
                        ],
                        "clean": True,
                        "uptodate": [
                            utils.config_changed(
                                {1: self.kw, 2: self.site.config["COMMENTS_IN_GALLERIES"], 3: context.copy()},
                                "nikola.plugins.task.galleries:gallery",
                            )
                        ],
                    },
                    self.kw["filters"],
                )

                # RSS for the gallery
                if self.kw["generate_rss"]:
                    rss_dst = os.path.join(self.kw["output_folder"], self.site.path("gallery_rss", gallery, lang))
                    rss_dst = os.path.normpath(rss_dst)

                    yield utils.apply_filters(
                        {
                            "basename": self.name,
                            "name": rss_dst,
                            "file_dep": file_dep_dest,
                            "targets": [rss_dst],
                            "actions": [
                                (
                                    self.gallery_rss,
                                    (
                                        image_list,
                                        dst_img_list,
                                        img_titles,
                                        lang,
                                        self.site.link("gallery_rss", gallery, lang),
                                        rss_dst,
                                        context["title"],
                                    ),
                                )
                            ],
                            "clean": True,
                            "uptodate": [utils.config_changed({1: self.kw}, "nikola.plugins.task.galleries:rss")],
                        },
                        self.kw["filters"],
                    )
Пример #16
0
    def gen_tasks(self):
        """Render image galleries."""

        self.logger = utils.get_logger("render_galleries", self.site.loghandlers)
        self.image_ext_list = [".jpg", ".png", ".jpeg", ".gif", ".svg", ".bmp", ".tiff"]
        self.image_ext_list.extend(self.site.config.get("EXTRA_IMAGE_EXTENSIONS", []))

        self.kw = {
            "thumbnail_size": self.site.config["THUMBNAIL_SIZE"],
            "max_image_size": self.site.config["MAX_IMAGE_SIZE"],
            "output_folder": self.site.config["OUTPUT_FOLDER"],
            "cache_folder": self.site.config["CACHE_FOLDER"],
            "default_lang": self.site.config["DEFAULT_LANG"],
            "use_filename_as_title": self.site.config["USE_FILENAME_AS_TITLE"],
            "gallery_path": self.site.config["GALLERY_PATH"],
            "sort_by_date": self.site.config["GALLERY_SORT_BY_DATE"],
            "filters": self.site.config["FILTERS"],
            "translations": self.site.config["TRANSLATIONS"],
            "global_context": self.site.GLOBAL_CONTEXT,
            "feed_length": self.site.config["FEED_LENGTH"],
        }

        yield self.group_task()

        template_name = "gallery.tmpl"

        # Find all galleries we need to process
        self.find_galleries()

        # Create all output folders
        for task in self.create_galleries():
            yield task

        # For each gallery:
        for gallery in self.gallery_list:

            # Create subfolder list
            folder_list = [(x, x.split(os.sep)[-2]) for x in glob.glob(os.path.join(gallery, "*") + os.sep)]

            # Parse index into a post (with translations)
            post = self.parse_index(gallery)

            # Create image list, filter exclusions
            image_list = self.get_image_list(gallery)

            # Sort as needed
            # Sort by date
            if self.kw["sort_by_date"]:
                image_list.sort(key=lambda a: self.image_date(a))
            else:  # Sort by name
                image_list.sort()

            # Create thumbnails and large images in destination
            for image in image_list:
                for task in self.create_target_images(image):
                    yield task

            # Remove excluded images
            for image in self.get_excluded_images(gallery):
                for task in self.remove_excluded_image(image):
                    yield task

            crumbs = utils.get_crumbs(gallery)

            # Create index.html for each language
            for lang in self.kw["translations"]:
                dst = os.path.join(
                    self.kw["output_folder"],
                    self.site.path("gallery", os.path.relpath(gallery, self.kw["gallery_path"]), lang),
                )
                dst = os.path.normpath(dst)

                context = {}
                context["lang"] = lang
                if post:
                    context["title"] = post.title(lang)
                else:
                    context["title"] = os.path.basename(gallery)
                context["description"] = None

                image_name_list = [os.path.basename(p) for p in image_list]

                if self.kw["use_filename_as_title"]:
                    img_titles = []
                    for fn in image_name_list:
                        name_without_ext = os.path.splitext(fn)[0]
                        img_titles.append(
                            'id="{0}" alt="{1}" title="{2}"'.format(
                                name_without_ext, name_without_ext, utils.unslugify(name_without_ext)
                            )
                        )
                else:
                    img_titles = [""] * len(image_name_list)

                thumbs = [".thumbnail".join(os.path.splitext(p)) for p in image_list]
                thumbs = [os.path.join(self.kw["output_folder"], t) for t in thumbs]

                folders = []

                # Generate friendly gallery names
                for path, folder in folder_list:
                    fpost = self.parse_index(path)
                    if fpost:
                        ft = fpost.title(lang) or folder
                    else:
                        ft = folder
                    folders.append((folder, ft))

                ## TODO: in v7 remove images from context, use photo_array
                context["images"] = list(zip(image_name_list, thumbs, img_titles))
                context["folders"] = folders
                context["crumbs"] = crumbs
                context["permalink"] = self.site.link("gallery", os.path.basename(gallery), lang)
                # FIXME: use kw
                context["enable_comments"] = self.site.config["COMMENTS_IN_GALLERIES"]
                context["thumbnail_size"] = self.kw["thumbnail_size"]

                # FIXME: render post in a task
                if post:
                    post.compile(lang)
                    context["text"] = post.text(lang)
                else:
                    context["text"] = ""

                file_dep = self.site.template_system.template_deps(template_name) + image_list + thumbs

                yield utils.apply_filters(
                    {
                        "basename": self.name,
                        "name": dst,
                        "file_dep": file_dep,
                        "targets": [dst],
                        "actions": [
                            (self.render_gallery_index, (template_name, dst, context, image_list, thumbs, file_dep))
                        ],
                        "clean": True,
                        "uptodate": [
                            utils.config_changed({1: self.kw, 2: self.site.config["COMMENTS_IN_GALLERIES"], 3: context})
                        ],
                    },
                    self.kw["filters"],
                )

                # RSS for the gallery
                rss_dst = os.path.join(
                    self.kw["output_folder"],
                    self.site.path("gallery_rss", os.path.relpath(gallery, self.kw["gallery_path"]), lang),
                )
                rss_dst = os.path.normpath(rss_dst)

                yield utils.apply_filters(
                    {
                        "basename": self.name,
                        "name": rss_dst,
                        "file_dep": file_dep,
                        "targets": [rss_dst],
                        "actions": [
                            (
                                self.gallery_rss,
                                (
                                    image_list,
                                    img_titles,
                                    lang,
                                    self.site.link("gallery_rss", os.path.basename(gallery), lang),
                                    rss_dst,
                                    context["title"],
                                ),
                            )
                        ],
                        "clean": True,
                        "uptodate": [utils.config_changed({1: self.kw})],
                    },
                    self.kw["filters"],
                )
Пример #17
0
    def gen_tasks(self):
        """Render image galleries."""

        kw = {
            "thumbnail_size": self.site.config["THUMBNAIL_SIZE"],
            "max_image_size": self.site.config["MAX_IMAGE_SIZE"],
            "output_folder": self.site.config["OUTPUT_FOLDER"],
            "cache_folder": self.site.config["CACHE_FOLDER"],
            "default_lang": self.site.config["DEFAULT_LANG"],
            "blog_description": self.site.config["BLOG_DESCRIPTION"],
            "use_filename_as_title": self.site.config["USE_FILENAME_AS_TITLE"],
            "gallery_path": self.site.config["GALLERY_PATH"],
        }

        # FIXME: lots of work is done even when images don't change,
        # which should be moved into the task.

        template_name = "gallery.tmpl"

        gallery_list = []
        for root, dirs, files in os.walk(kw["gallery_path"]):
            gallery_list.append(root)
        if not gallery_list:
            yield {"basename": str("render_galleries"), "actions": []}
            return

        # gallery_path is "gallery/name"
        for gallery_path in gallery_list:
            # gallery_name is "name"
            splitted = gallery_path.split(os.sep)[1:]
            if not splitted:
                gallery_name = ""
            else:
                gallery_name = os.path.join(*splitted)

            # Task to create gallery in output/
            # output_gallery is "output/GALLERY_PATH/name"
            output_gallery = os.path.dirname(
                os.path.join(kw["output_folder"], self.site.path("gallery", gallery_name, None))
            )
            output_name = os.path.join(output_gallery, self.site.config["INDEX_FILE"])
            if not os.path.isdir(output_gallery):
                yield {
                    "basename": str("render_galleries"),
                    "name": output_gallery,
                    "actions": [(os.makedirs, (output_gallery,))],
                    "targets": [output_gallery],
                    "clean": True,
                    "uptodate": [utils.config_changed(kw)],
                }

            # Gather image_list contains "gallery/name/image_name.jpg"
            image_list = (
                glob.glob(gallery_path + "/*jpg")
                + glob.glob(gallery_path + "/*JPG")
                + glob.glob(gallery_path + "/*png")
                + glob.glob(gallery_path + "/*PNG")
            )

            # Filter ignored images
            try:
                exclude_path = os.path.join(gallery_path, "exclude.meta")
                try:
                    f = open(exclude_path, "r")
                    excluded_image_name_list = f.read().split()
                except IOError:
                    excluded_image_name_list = []
                excluded_image_list = ["{0}/{1}".format(gallery_path, i) for i in excluded_image_name_list]
                image_set = set(image_list) - set(excluded_image_list)
                image_list = list(image_set)
            except IOError:
                pass

            # List of sub-galleries
            folder_list = [x.split(os.sep)[-2] for x in glob.glob(os.path.join(gallery_path, "*") + os.sep)]

            crumbs = utils.get_crumbs(gallery_path)

            image_list = [x for x in image_list if "thumbnail" not in x]
            # Sort by date
            image_list.sort(key=lambda a: self.image_date(a))
            image_name_list = [os.path.basename(x) for x in image_list]

            # Do thumbnails and copy originals
            thumbs = []
            for img, img_name in list(zip(image_list, image_name_list)):
                # img is "galleries/name/image_name.jpg"
                # img_name is "image_name.jpg"
                # fname, ext are "image_name", ".jpg"
                fname, ext = os.path.splitext(img_name)
                # thumb_path is
                # "output/GALLERY_PATH/name/image_name.thumbnail.jpg"
                thumb_path = os.path.join(output_gallery, ".thumbnail".join([fname, ext]))
                # thumb_path is "output/GALLERY_PATH/name/image_name.jpg"
                orig_dest_path = os.path.join(output_gallery, img_name)
                thumbs.append(os.path.basename(thumb_path))
                yield {
                    "basename": str("render_galleries"),
                    "name": thumb_path,
                    "file_dep": [img],
                    "targets": [thumb_path],
                    "actions": [(self.resize_image, (img, thumb_path, kw["thumbnail_size"]))],
                    "clean": True,
                    "uptodate": [utils.config_changed(kw)],
                }
                yield {
                    "basename": str("render_galleries"),
                    "name": orig_dest_path,
                    "file_dep": [img],
                    "targets": [orig_dest_path],
                    "actions": [(self.resize_image, (img, orig_dest_path, kw["max_image_size"]))],
                    "clean": True,
                    "uptodate": [utils.config_changed(kw)],
                }

            # Remove excluded images
            if excluded_image_name_list:
                for img, img_name in zip(excluded_image_list, excluded_image_name_list):
                    # img_name is "image_name.jpg"
                    # fname, ext are "image_name", ".jpg"
                    fname, ext = os.path.splitext(img_name)
                    excluded_thumb_dest_path = os.path.join(output_gallery, ".thumbnail".join([fname, ext]))
                    excluded_dest_path = os.path.join(output_gallery, img_name)
                    yield {
                        "basename": str("render_galleries_clean"),
                        "name": excluded_thumb_dest_path,
                        "file_dep": [exclude_path],
                        #'targets': [excluded_thumb_dest_path],
                        "actions": [(utils.remove_file, (excluded_thumb_dest_path,))],
                        "clean": True,
                        "uptodate": [utils.config_changed(kw)],
                    }
                    yield {
                        "basename": str("render_galleries_clean"),
                        "name": excluded_dest_path,
                        "file_dep": [exclude_path],
                        #'targets': [excluded_dest_path],
                        "actions": [(utils.remove_file, (excluded_dest_path,))],
                        "clean": True,
                        "uptodate": [utils.config_changed(kw)],
                    }

            # Use galleries/name/index.txt to generate a blurb for
            # the gallery, if it exists.

            index_path = os.path.join(gallery_path, "index.txt")
            cache_dir = os.path.join(kw["cache_folder"], "galleries")
            if not os.path.isdir(cache_dir):
                os.makedirs(cache_dir)
            index_dst_path = os.path.join(
                cache_dir, str(hashlib.sha224(index_path.encode("utf-8")).hexdigest() + ".html")
            )
            if os.path.exists(index_path):
                compile_html = self.site.get_compiler(index_path).compile_html
                yield {
                    "basename": str("render_galleries"),
                    "name": index_dst_path,
                    "file_dep": [index_path],
                    "targets": [index_dst_path],
                    "actions": [(compile_html, [index_path, index_dst_path, True])],
                    "clean": True,
                    "uptodate": [utils.config_changed(kw)],
                }

            context = {}
            context["lang"] = kw["default_lang"]
            context["title"] = os.path.basename(gallery_path)
            context["description"] = kw["blog_description"]
            if kw["use_filename_as_title"]:
                img_titles = [
                    'id="{0}" alt="{1}" title="{2}"'.format(fn[:-4], fn[:-4], utils.unslugify(fn[:-4]))
                    for fn in image_name_list
                ]
            else:
                img_titles = [""] * len(image_name_list)
            # In the future, remove images from context, use photo_array
            context["images"] = list(zip(image_name_list, thumbs, img_titles))
            context["folders"] = folder_list
            context["crumbs"] = crumbs
            context["permalink"] = self.site.link("gallery", gallery_name, None)
            context["enable_comments"] = self.site.config["COMMENTS_IN_GALLERIES"]
            context["thumbnail_size"] = kw["thumbnail_size"]

            file_dep = self.site.template_system.template_deps(template_name) + image_list

            yield {
                "basename": str("render_galleries"),
                "name": output_name,
                "file_dep": file_dep,
                "targets": [output_name],
                "actions": [
                    (
                        self.render_gallery_index,
                        (template_name, output_name, context, index_dst_path, image_name_list, thumbs, file_dep, kw),
                    )
                ],
                "clean": True,
                "uptodate": [
                    utils.config_changed(
                        {
                            1: kw,
                            2: self.site.config["GLOBAL_CONTEXT"],
                            3: self.site.config["COMMENTS_IN_GALLERIES"],
                            4: context,
                        }
                    )
                ],
            }
Пример #18
0
    def gen_tasks(self):
        """Render image galleries."""

        kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'cache_folder': self.site.config['CACHE_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'blog_description': self.site.config['BLOG_DESCRIPTION'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
            'gallery_path': self.site.config['GALLERY_PATH']
        }

        # FIXME: lots of work is done even when images don't change,
        # which should be moved into the task.

        template_name = "gallery.tmpl"

        gallery_list = []
        for root, dirs, files in os.walk(kw['gallery_path']):
            gallery_list.append(root)
        if not gallery_list:
            yield {
                'basename': str('render_galleries'),
                'actions': [],
            }
            return

        # gallery_path is "gallery/name"
        for gallery_path in gallery_list:
            # gallery_name is "name"
            splitted = gallery_path.split(os.sep)[1:]
            if not splitted:
                gallery_name = ''
            else:
                gallery_name = os.path.join(*splitted)
            # output_gallery is "output/GALLERY_PATH/name"
            output_gallery = os.path.dirname(os.path.join(
                kw["output_folder"], self.site.path("gallery", gallery_name,
                                                    None)))
            output_name = os.path.join(output_gallery, self.site.config['INDEX_FILE'])
            if not os.path.isdir(output_gallery):
                yield {
                    'basename': str('render_galleries'),
                    'name': output_gallery,
                    'actions': [(os.makedirs, (output_gallery,))],
                    'targets': [output_gallery],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }
            # image_list contains "gallery/name/image_name.jpg"
            image_list = glob.glob(gallery_path + "/*jpg") +\
                glob.glob(gallery_path + "/*JPG") +\
                glob.glob(gallery_path + "/*PNG") +\
                glob.glob(gallery_path + "/*png")

            # Filter ignore images
            try:
                def add_gallery_path(index):
                    return "{0}/{1}".format(gallery_path, index)

                exclude_path = os.path.join(gallery_path, "exclude.meta")
                try:
                    f = open(exclude_path, 'r')
                    excluded_image_name_list = f.read().split()
                except IOError:
                    excluded_image_name_list = []

                excluded_image_list = list(map(add_gallery_path,
                                               excluded_image_name_list))
                image_set = set(image_list) - set(excluded_image_list)
                image_list = list(image_set)
            except IOError:
                pass

            # List of sub-galleries
            folder_list = [x.split(os.sep)[-2] for x in
                           glob.glob(os.path.join(gallery_path, '*') + os.sep)]

            crumbs = utils.get_crumbs(gallery_path)

            image_list = [x for x in image_list if "thumbnail" not in x]
            # Sort by date
            image_list.sort(key=lambda a: self.image_date(a))
            image_name_list = [os.path.basename(x) for x in image_list]
            thumbs = []
            # Do thumbnails and copy originals
            for img, img_name in list(zip(image_list, image_name_list)):
                # img is "galleries/name/image_name.jpg"
                # img_name is "image_name.jpg"
                # fname, ext are "image_name", ".jpg"
                fname, ext = os.path.splitext(img_name)
                # thumb_path is
                # "output/GALLERY_PATH/name/image_name.thumbnail.jpg"
                thumb_path = os.path.join(output_gallery,
                                          ".thumbnail".join([fname, ext]))
                # thumb_path is "output/GALLERY_PATH/name/image_name.jpg"
                orig_dest_path = os.path.join(output_gallery, img_name)
                thumbs.append(os.path.basename(thumb_path))
                yield {
                    'basename': str('render_galleries'),
                    'name': thumb_path,
                    'file_dep': [img],
                    'targets': [thumb_path],
                    'actions': [
                        (self.resize_image,
                            (img, thumb_path, kw['thumbnail_size']))
                    ],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }
                yield {
                    'basename': str('render_galleries'),
                    'name': orig_dest_path,
                    'file_dep': [img],
                    'targets': [orig_dest_path],
                    'actions': [
                        (self.resize_image,
                            (img, orig_dest_path, kw['max_image_size']))
                    ],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            # Remove excluded images
            if excluded_image_name_list:
                for img, img_name in zip(excluded_image_list,
                                         excluded_image_name_list):
                    # img_name is "image_name.jpg"
                    # fname, ext are "image_name", ".jpg"
                    fname, ext = os.path.splitext(img_name)
                    excluded_thumb_dest_path = os.path.join(
                        output_gallery, ".thumbnail".join([fname, ext]))
                    excluded_dest_path = os.path.join(output_gallery, img_name)
                    yield {
                        'basename': str('render_galleries_clean'),
                        'name': excluded_thumb_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_thumb_dest_path],
                        'actions': [
                            (utils.remove_file, (excluded_thumb_dest_path,))
                        ],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }
                    yield {
                        'basename': str('render_galleries_clean'),
                        'name': excluded_dest_path,
                        'file_dep': [exclude_path],
                        #'targets': [excluded_dest_path],
                        'actions': [
                            (utils.remove_file, (excluded_dest_path,))
                        ],
                        'clean': True,
                        'uptodate': [utils.config_changed(kw)],
                    }

            context = {}
            context["lang"] = kw["default_lang"]
            context["title"] = os.path.basename(gallery_path)
            context["description"] = kw["blog_description"]
            if kw['use_filename_as_title']:
                img_titles = ['id="{0}" alt="{1}" title="{2}"'.format(
                    fn[:-4], fn[:-4], utils.unslugify(fn[:-4])) for fn
                    in image_name_list]
            else:
                img_titles = [''] * len(image_name_list)
            context["images"] = list(zip(image_name_list, thumbs, img_titles))
            context["folders"] = folder_list
            context["crumbs"] = crumbs
            context["permalink"] = self.site.link(
                "gallery", gallery_name, None)
            context["enable_comments"] = (
                self.site.config["COMMENTS_IN_GALLERIES"])

            # Use galleries/name/index.txt to generate a blurb for
            # the gallery, if it exists
            index_path = os.path.join(gallery_path, "index.txt")
            cache_dir = os.path.join(kw["cache_folder"], 'galleries')
            if not os.path.isdir(cache_dir):
                os.makedirs(cache_dir)
            index_dst_path = os.path.join(
                cache_dir,
                str(hashlib.sha224(index_path.encode('utf-8')).hexdigest() +
                    '.html'))
            if os.path.exists(index_path):
                compile_html = self.site.get_compiler(index_path).compile_html
                yield {
                    'basename': str('render_galleries'),
                    'name': index_dst_path,
                    'file_dep': [index_path],
                    'targets': [index_dst_path],
                    'actions': [(compile_html, [index_path, index_dst_path])],
                    'clean': True,
                    'uptodate': [utils.config_changed(kw)],
                }

            file_dep = self.site.template_system.template_deps(
                template_name) + image_list

            def render_gallery(output_name, context, index_dst_path):
                if os.path.exists(index_dst_path):
                    with codecs.open(index_dst_path, "rb", "utf8") as fd:
                        context['text'] = fd.read()
                    file_dep.append(index_dst_path)
                else:
                    context['text'] = ''
                self.site.render_template(template_name, output_name, context)

            yield {
                'basename': str('render_galleries'),
                'name': output_name,
                'file_dep': file_dep,
                'targets': [output_name],
                'actions': [(render_gallery, (output_name, context,
                                              index_dst_path))],
                'clean': True,
                'uptodate': [utils.config_changed({
                    1: kw,
                    2: self.site.config['GLOBAL_CONTEXT'],
                    3: self.site.config["COMMENTS_IN_GALLERIES"],
                })],
            }
Пример #19
0
    def gen_tasks(self):
        """Render image galleries."""

        if Image is None:
            req_missing(['pillow'], 'render galleries')

        self.logger = utils.get_logger('render_galleries', self.site.loghandlers)
        self.image_ext_list = ['.jpg', '.png', '.jpeg', '.gif', '.svg', '.bmp', '.tiff']
        self.image_ext_list.extend(self.site.config.get('EXTRA_IMAGE_EXTENSIONS', []))

        self.kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'cache_folder': self.site.config['CACHE_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
            'gallery_path': self.site.config['GALLERY_PATH'],
            'sort_by_date': self.site.config['GALLERY_SORT_BY_DATE'],
            'filters': self.site.config['FILTERS'],
            'translations': self.site.config['TRANSLATIONS'],
            'global_context': self.site.GLOBAL_CONTEXT,
            'feed_length': self.site.config['FEED_LENGTH'],
            'tzinfo': self.site.tzinfo,
            'comments_in_galleries': self.site.config['COMMENTS_IN_GALLERIES'],
            'generate_rss': self.site.config['GENERATE_RSS'],
        }

        for k, v in self.site.GLOBAL_CONTEXT['template_hooks'].items():
            self.kw['||template_hooks|{0}||'.format(k)] = v._items

        yield self.group_task()

        template_name = "gallery.tmpl"

        # Find all galleries we need to process
        self.find_galleries()

        # Create all output folders
        for task in self.create_galleries():
            yield task

        # For each gallery:
        for gallery in self.gallery_list:

            # Create subfolder list
            folder_list = [(x, x.split(os.sep)[-2]) for x in
                           glob.glob(os.path.join(gallery, '*') + os.sep)]

            # Parse index into a post (with translations)
            post = self.parse_index(gallery)

            # Create image list, filter exclusions
            image_list = self.get_image_list(gallery)

            # Sort as needed
            # Sort by date
            if self.kw['sort_by_date']:
                image_list.sort(key=lambda a: self.image_date(a))
            else:  # Sort by name
                image_list.sort()

            # Create thumbnails and large images in destination
            for image in image_list:
                for task in self.create_target_images(image):
                    yield task

            # Remove excluded images
            for image in self.get_excluded_images(gallery):
                for task in self.remove_excluded_image(image):
                    yield task

            crumbs = utils.get_crumbs(gallery, index_folder=self)

            # Create index.html for each language
            for lang in self.kw['translations']:
                # save navigation links as dependencies
                self.kw['navigation_links|{0}'.format(lang)] = self.kw['global_context']['navigation_links'](lang)

                dst = os.path.join(
                    self.kw['output_folder'],
                    self.site.path(
                        "gallery",
                        os.path.relpath(gallery, self.kw['gallery_path']), lang))
                dst = os.path.normpath(dst)

                for k in self.site._GLOBAL_CONTEXT_TRANSLATABLE:
                    self.kw[k] = self.site.GLOBAL_CONTEXT[k](lang)

                context = {}
                context["lang"] = lang
                if post:
                    context["title"] = post.title(lang)
                else:
                    context["title"] = os.path.basename(gallery)
                context["description"] = None

                image_name_list = [os.path.basename(p) for p in image_list]

                if self.kw['use_filename_as_title']:
                    img_titles = []
                    for fn in image_name_list:
                        name_without_ext = os.path.splitext(os.path.basename(fn))[0]
                        img_titles.append(utils.unslugify(name_without_ext))
                else:
                    img_titles = [''] * len(image_name_list)

                thumbs = ['.thumbnail'.join(os.path.splitext(p)) for p in image_list]
                thumbs = [os.path.join(self.kw['output_folder'], t) for t in thumbs]
                dest_img_list = [os.path.join(self.kw['output_folder'], t) for t in image_list]

                folders = []

                # Generate friendly gallery names
                for path, folder in folder_list:
                    fpost = self.parse_index(path)
                    if fpost:
                        ft = fpost.title(lang) or folder
                    else:
                        ft = folder
                    folders.append((folder, ft))

                context["folders"] = natsort.natsorted(folders)
                context["crumbs"] = crumbs
                context["permalink"] = self.site.link(
                    "gallery", os.path.basename(
                        os.path.relpath(gallery, self.kw['gallery_path'])), lang)
                context["enable_comments"] = self.kw['comments_in_galleries']
                context["thumbnail_size"] = self.kw["thumbnail_size"]

                if post:
                    yield {
                        'basename': self.name,
                        'name': post.translated_base_path(lang),
                        'targets': [post.translated_base_path(lang)],
                        'file_dep': post.fragment_deps(lang),
                        'actions': [(post.compile, [lang])],
                        'uptodate': [utils.config_changed(self.kw)]
                    }
                    context['post'] = post
                else:
                    context['post'] = None
                file_dep = self.site.template_system.template_deps(
                    template_name) + image_list + thumbs
                if post:
                    file_dep += [post.translated_base_path(l) for l in self.kw['translations']]

                yield utils.apply_filters({
                    'basename': self.name,
                    'name': dst,
                    'file_dep': file_dep,
                    'targets': [dst],
                    'actions': [
                        (self.render_gallery_index, (
                            template_name,
                            dst,
                            context,
                            dest_img_list,
                            img_titles,
                            thumbs,
                            file_dep))],
                    'clean': True,
                    'uptodate': [utils.config_changed({
                        1: self.kw,
                        2: self.site.config["COMMENTS_IN_GALLERIES"],
                        3: context,
                    })],
                }, self.kw['filters'])

                # RSS for the gallery
                if self.kw["generate_rss"]:
                    rss_dst = os.path.join(
                        self.kw['output_folder'],
                        self.site.path(
                            "gallery_rss",
                            os.path.relpath(gallery, self.kw['gallery_path']), lang))
                    rss_dst = os.path.normpath(rss_dst)

                    yield utils.apply_filters({
                        'basename': self.name,
                        'name': rss_dst,
                        'file_dep': file_dep,
                        'targets': [rss_dst],
                        'actions': [
                            (self.gallery_rss, (
                                image_list,
                                img_titles,
                                lang,
                                self.site.link(
                                    "gallery_rss", os.path.basename(gallery), lang),
                                rss_dst,
                                context['title']
                            ))],
                        'clean': True,
                        'uptodate': [utils.config_changed({
                            1: self.kw,
                        })],
                    }, self.kw['filters'])
Пример #20
0
    def gen_tasks(self):
        """Render image galleries."""

        if Image is None:
            req_missing(['pillow'], 'render galleries')

        self.logger = utils.get_logger('render_galleries', self.site.loghandlers)
        self.image_ext_list = ['.jpg', '.png', '.jpeg', '.gif', '.svg', '.bmp', '.tiff']
        self.image_ext_list.extend(self.site.config.get('EXTRA_IMAGE_EXTENSIONS', []))

        self.kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'cache_folder': self.site.config['CACHE_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
            'gallery_path': self.site.config['GALLERY_PATH'],
            'sort_by_date': self.site.config['GALLERY_SORT_BY_DATE'],
            'filters': self.site.config['FILTERS'],
            'translations': self.site.config['TRANSLATIONS'],
            'global_context': self.site.GLOBAL_CONTEXT,
            "feed_length": self.site.config['FEED_LENGTH'],
        }

        yield self.group_task()

        template_name = "gallery.tmpl"

        # Find all galleries we need to process
        self.find_galleries()

        # Create all output folders
        for task in self.create_galleries():
            yield task

        # For each gallery:
        for gallery in self.gallery_list:

            # Create subfolder list
            folder_list = [(x, x.split(os.sep)[-2]) for x in
                           glob.glob(os.path.join(gallery, '*') + os.sep)]

            # Parse index into a post (with translations)
            post = self.parse_index(gallery)

            # Create image list, filter exclusions
            image_list = self.get_image_list(gallery)

            # Sort as needed
            # Sort by date
            if self.kw['sort_by_date']:
                image_list.sort(key=lambda a: self.image_date(a))
            else:  # Sort by name
                image_list.sort()

            # Create thumbnails and large images in destination
            for image in image_list:
                for task in self.create_target_images(image):
                    yield task

            # Remove excluded images
            for image in self.get_excluded_images(gallery):
                for task in self.remove_excluded_image(image):
                    yield task

            crumbs = utils.get_crumbs(gallery, index_folder=self)

            # Create index.html for each language
            for lang in self.kw['translations']:
                dst = os.path.join(
                    self.kw['output_folder'],
                    self.site.path(
                        "gallery",
                        os.path.relpath(gallery, self.kw['gallery_path']), lang))
                dst = os.path.normpath(dst)

                context = {}
                context["lang"] = lang
                if post:
                    context["title"] = post.title(lang)
                else:
                    context["title"] = os.path.basename(gallery)
                context["description"] = None

                image_name_list = [os.path.basename(p) for p in image_list]

                if self.kw['use_filename_as_title']:
                    img_titles = []
                    for fn in image_name_list:
                        name_without_ext = os.path.splitext(fn)[0]
                        img_titles.append(
                            'id="{0}" alt="{1}" title="{2}"'.format(
                                name_without_ext,
                                name_without_ext,
                                utils.unslugify(name_without_ext)))
                else:
                    img_titles = [''] * len(image_name_list)

                thumbs = ['.thumbnail'.join(os.path.splitext(p)) for p in image_list]
                thumbs = [os.path.join(self.kw['output_folder'], t) for t in thumbs]
                dest_img_list = [os.path.join(self.kw['output_folder'], t) for t in image_list]

                folders = []

                # Generate friendly gallery names
                for path, folder in folder_list:
                    fpost = self.parse_index(path)
                    if fpost:
                        ft = fpost.title(lang) or folder
                    else:
                        ft = folder
                    folders.append((folder, ft))

                ## TODO: in v7 remove images from context, use photo_array
                context["images"] = list(zip(image_name_list, thumbs, img_titles))
                context["folders"] = folders
                context["crumbs"] = crumbs
                context["permalink"] = self.site.link(
                    "gallery", os.path.basename(gallery), lang)
                # FIXME: use kw
                context["enable_comments"] = (
                    self.site.config["COMMENTS_IN_GALLERIES"])
                context["thumbnail_size"] = self.kw["thumbnail_size"]

                # FIXME: render post in a task
                if post:
                    post.compile(lang)
                    context['text'] = post.text(lang)
                else:
                    context['text'] = ''

                file_dep = self.site.template_system.template_deps(
                    template_name) + image_list + thumbs

                yield utils.apply_filters({
                    'basename': self.name,
                    'name': dst,
                    'file_dep': file_dep,
                    'targets': [dst],
                    'actions': [
                        (self.render_gallery_index, (
                            template_name,
                            dst,
                            context,
                            dest_img_list,
                            thumbs,
                            file_dep))],
                    'clean': True,
                    'uptodate': [utils.config_changed({
                        1: self.kw,
                        2: self.site.config["COMMENTS_IN_GALLERIES"],
                        3: context,
                    })],
                }, self.kw['filters'])

                # RSS for the gallery
                rss_dst = os.path.join(
                    self.kw['output_folder'],
                    self.site.path(
                        "gallery_rss",
                        os.path.relpath(gallery, self.kw['gallery_path']), lang))
                rss_dst = os.path.normpath(rss_dst)

                yield utils.apply_filters({
                    'basename': self.name,
                    'name': rss_dst,
                    'file_dep': file_dep,
                    'targets': [rss_dst],
                    'actions': [
                        (self.gallery_rss, (
                            image_list,
                            img_titles,
                            lang,
                            self.site.link(
                                "gallery_rss", os.path.basename(gallery), lang),
                            rss_dst,
                            context['title']
                        ))],
                    'clean': True,
                    'uptodate': [utils.config_changed({
                        1: self.kw,
                    })],
                }, self.kw['filters'])
Пример #21
0
    def gen_tasks(self):
        """Render image galleries."""

        self.logger = utils.get_logger('render_galleries',
                                       self.site.loghandlers)
        self.image_ext_list = [
            '.jpg', '.png', '.jpeg', '.gif', '.svg', '.bmp', '.tiff'
        ]
        self.image_ext_list.extend(
            self.site.config.get('EXTRA_IMAGE_EXTENSIONS', []))

        self.kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'cache_folder': self.site.config['CACHE_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
            'gallery_path': self.site.config['GALLERY_PATH'],
            'sort_by_date': self.site.config['GALLERY_SORT_BY_DATE'],
            'filters': self.site.config['FILTERS'],
            'translations': self.site.config['TRANSLATIONS'],
            'global_context': self.site.GLOBAL_CONTEXT,
            "feed_length": self.site.config['FEED_LENGTH'],
        }

        yield self.group_task()

        template_name = "gallery.tmpl"

        # Find all galleries we need to process
        self.find_galleries()

        # Create all output folders
        for task in self.create_galleries():
            yield task

        # For each gallery:
        for gallery in self.gallery_list:

            # Create subfolder list
            folder_list = [
                (x, x.split(os.sep)[-2])
                for x in glob.glob(os.path.join(gallery, '*') + os.sep)
            ]

            # Parse index into a post (with translations)
            post = self.parse_index(gallery)

            # Create image list, filter exclusions
            image_list = self.get_image_list(gallery)

            # Sort as needed
            # Sort by date
            if self.kw['sort_by_date']:
                image_list.sort(key=lambda a: self.image_date(a))
            else:  # Sort by name
                image_list.sort()

            # Create thumbnails and large images in destination
            for image in image_list:
                for task in self.create_target_images(image):
                    yield task

            # Remove excluded images
            for image in self.get_excluded_images(gallery):
                for task in self.remove_excluded_image(image):
                    yield task

            crumbs = utils.get_crumbs(gallery)

            # Create index.html for each language
            for lang in self.kw['translations']:
                dst = os.path.join(
                    self.kw['output_folder'],
                    self.site.path(
                        "gallery",
                        os.path.relpath(gallery, self.kw['gallery_path']),
                        lang))
                dst = os.path.normpath(dst)

                context = {}
                context["lang"] = lang
                if post:
                    context["title"] = post.title(lang)
                else:
                    context["title"] = os.path.basename(gallery)
                context["description"] = None

                image_name_list = [os.path.basename(p) for p in image_list]

                if self.kw['use_filename_as_title']:
                    img_titles = []
                    for fn in image_name_list:
                        name_without_ext = os.path.splitext(fn)[0]
                        img_titles.append(
                            'id="{0}" alt="{1}" title="{2}"'.format(
                                name_without_ext, name_without_ext,
                                utils.unslugify(name_without_ext)))
                else:
                    img_titles = [''] * len(image_name_list)

                thumbs = [
                    '.thumbnail'.join(os.path.splitext(p)) for p in image_list
                ]
                thumbs = [
                    os.path.join(self.kw['output_folder'], t) for t in thumbs
                ]

                folders = []

                # Generate friendly gallery names
                for path, folder in folder_list:
                    fpost = self.parse_index(path)
                    if fpost:
                        ft = fpost.title(lang) or folder
                    else:
                        ft = folder
                    folders.append((folder, ft))

                ## TODO: in v7 remove images from context, use photo_array
                context["images"] = list(
                    zip(image_name_list, thumbs, img_titles))
                context["folders"] = folders
                context["crumbs"] = crumbs
                context["permalink"] = self.site.link(
                    "gallery", os.path.basename(gallery), lang)
                # FIXME: use kw
                context["enable_comments"] = (
                    self.site.config["COMMENTS_IN_GALLERIES"])
                context["thumbnail_size"] = self.kw["thumbnail_size"]

                # FIXME: render post in a task
                if post:
                    post.compile(lang)
                    context['text'] = post.text(lang)
                else:
                    context['text'] = ''

                file_dep = self.site.template_system.template_deps(
                    template_name) + image_list + thumbs

                yield utils.apply_filters(
                    {
                        'basename':
                        self.name,
                        'name':
                        dst,
                        'file_dep':
                        file_dep,
                        'targets': [dst],
                        'actions': [(self.render_gallery_index,
                                     (template_name, dst, context, image_list,
                                      thumbs, file_dep))],
                        'clean':
                        True,
                        'uptodate': [
                            utils.config_changed(
                                {
                                    1: self.kw,
                                    2:
                                    self.site.config["COMMENTS_IN_GALLERIES"],
                                    3: context,
                                })
                        ],
                    }, self.kw['filters'])

                # RSS for the gallery
                rss_dst = os.path.join(
                    self.kw['output_folder'],
                    self.site.path(
                        "gallery_rss",
                        os.path.relpath(gallery, self.kw['gallery_path']),
                        lang))
                rss_dst = os.path.normpath(rss_dst)

                yield utils.apply_filters(
                    {
                        'basename':
                        self.name,
                        'name':
                        rss_dst,
                        'file_dep':
                        file_dep,
                        'targets': [rss_dst],
                        'actions':
                        [(self.gallery_rss,
                          (image_list, img_titles, lang,
                           self.site.link("gallery_rss",
                                          os.path.basename(gallery),
                                          lang), rss_dst, context['title']))],
                        'clean':
                        True,
                        'uptodate': [utils.config_changed({
                            1: self.kw,
                        })],
                    }, self.kw['filters'])
Пример #22
0
    def gen_tasks(self):
        """Render image galleries."""
        self.image_ext_list = self.image_ext_list_builtin
        self.image_ext_list.extend(
            self.site.config.get('EXTRA_IMAGE_EXTENSIONS', []))

        for k, v in self.site.GLOBAL_CONTEXT['template_hooks'].items():
            self.kw['||template_hooks|{0}||'.format(k)] = v.calculate_deps()

        self.site.scan_posts()
        yield self.group_task()

        template_name = "gallery.tmpl"

        # Create all output folders
        for task in self.create_galleries():
            yield task

        # For each gallery:
        for gallery, input_folder, output_folder in self.gallery_list:

            # Create subfolder list
            folder_list = [
                (x, x.split(os.sep)[-2])
                for x in glob.glob(os.path.join(gallery, '*') + os.sep)
            ]

            # Parse index into a post (with translations)
            post = self.parse_index(gallery, input_folder, output_folder)

            # Create image list, filter exclusions
            image_list = self.get_image_list(gallery)

            # Create thumbnails and large images in destination
            for image in image_list:
                for task in self.create_target_images(image, input_folder):
                    yield task

            # Remove excluded images
            for image in self.get_excluded_images(gallery):
                for task in self.remove_excluded_image(image, input_folder):
                    yield task

            for lang in self.kw['translations']:
                # save navigation links as dependencies
                self.kw['navigation_links|{0}'.format(lang)] = self.kw[
                    'global_context']['navigation_links'](lang)

            # Create index.html for each language
            for lang in self.kw['translations']:

                dst = os.path.join(self.kw['output_folder'],
                                   self.site.path("gallery", gallery, lang))
                dst = os.path.normpath(dst)

                for k in self.site._GLOBAL_CONTEXT_TRANSLATABLE:
                    self.kw[k] = self.site.GLOBAL_CONTEXT[k](lang)

                context = {}

                # Do we have a metadata file?
                meta_path, order, captions, img_metadata = self.find_metadata(
                    gallery, lang)
                context['meta_path'] = meta_path
                context['order'] = order
                context['captions'] = captions
                context["lang"] = lang
                if post:
                    context["title"] = post.title(lang)
                else:
                    context["title"] = os.path.basename(gallery)
                context["description"] = None

                image_name_list = [os.path.basename(p) for p in image_list]

                if captions:
                    img_titles = []
                    for fn in image_name_list:
                        if fn in captions:
                            img_titles.append(captions[fn])
                        else:
                            if self.kw['use_filename_as_title']:
                                img_titles.append(fn)
                            else:
                                img_titles.append('')
                            self.logger.debug(
                                "Image {0} found in gallery but not listed in {1}"
                                .format(fn, context['meta_path']))
                elif self.kw['use_filename_as_title']:
                    img_titles = []
                    for fn in image_name_list:
                        name_without_ext = os.path.splitext(
                            os.path.basename(fn))[0]
                        img_titles.append(
                            utils.unslugify(name_without_ext, lang))
                else:
                    img_titles = [''] * len(image_name_list)

                thumbs = [
                    '.thumbnail'.join(os.path.splitext(p)) for p in image_list
                ]
                thumbs = [
                    os.path.join(self.kw['output_folder'], output_folder,
                                 os.path.relpath(t, input_folder))
                    for t in thumbs
                ]
                dst_img_list = [
                    os.path.join(output_folder,
                                 os.path.relpath(t, input_folder))
                    for t in image_list
                ]
                dest_img_list = [
                    os.path.join(self.kw['output_folder'], t)
                    for t in dst_img_list
                ]

                folders = []

                # Generate friendly gallery names
                for path, folder in folder_list:
                    fpost = self.parse_index(path, input_folder, output_folder)
                    if fpost:
                        ft = fpost.title(lang) or folder
                    else:
                        ft = folder
                    if not folder.endswith('/'):
                        folder += '/'
                    folders.append((folder, ft))

                context["gallery_path"] = gallery
                context["folders"] = natsort.natsorted(folders,
                                                       alg=natsort.ns.F
                                                       | natsort.ns.IC)
                context["crumbs"] = utils.get_crumbs(gallery,
                                                     index_folder=self,
                                                     lang=lang)
                context["permalink"] = self.site.link("gallery", gallery, lang)
                context["enable_comments"] = self.kw['comments_in_galleries']
                context["thumbnail_size"] = self.kw["thumbnail_size"]
                context["pagekind"] = ["gallery_front"]

                if post:
                    yield {
                        'basename':
                        self.name,
                        'name':
                        post.translated_base_path(lang),
                        'targets': [post.translated_base_path(lang)],
                        'file_dep':
                        post.fragment_deps(lang),
                        'actions': [(post.compile, [lang])],
                        'uptodate': [
                            utils.config_changed(
                                self.kw.copy(),
                                'nikola.plugins.task.galleries:post')
                        ] + post.fragment_deps_uptodate(lang)
                    }
                    context['post'] = post
                else:
                    context['post'] = None
                file_dep = self.site.template_system.template_deps(
                    template_name) + image_list + thumbs
                file_dep_dest = self.site.template_system.template_deps(
                    template_name) + dest_img_list + thumbs
                if post:
                    file_dep += [
                        post.translated_base_path(l)
                        for l in self.kw['translations']
                    ]
                    file_dep_dest += [
                        post.translated_base_path(l)
                        for l in self.kw['translations']
                    ]

                context["pagekind"] = ["gallery_page"]

                yield utils.apply_filters(
                    {
                        'basename':
                        self.name,
                        'name':
                        dst,
                        'file_dep':
                        file_dep,
                        'targets': [dst],
                        'actions':
                        [(self.render_gallery_index,
                          (template_name, dst, context.copy(), dest_img_list,
                           img_titles, thumbs, img_metadata))],
                        'clean':
                        True,
                        'uptodate': [
                            utils.config_changed(
                                {
                                    1: self.kw.copy(),
                                    2:
                                    self.site.config["COMMENTS_IN_GALLERIES"],
                                    3: context.copy(),
                                }, 'nikola.plugins.task.galleries:gallery')
                        ],
                    }, self.kw['filters'])

                # RSS for the gallery
                if self.kw["generate_rss"]:
                    rss_dst = os.path.join(
                        self.kw['output_folder'],
                        self.site.path("gallery_rss", gallery, lang))
                    rss_dst = os.path.normpath(rss_dst)

                    yield utils.apply_filters(
                        {
                            'basename':
                            self.name,
                            'name':
                            rss_dst,
                            'file_dep':
                            file_dep_dest,
                            'targets': [rss_dst],
                            'actions':
                            [(self.gallery_rss,
                              (image_list, dst_img_list, img_titles, lang,
                               self.site.link("gallery_rss", gallery, lang),
                               rss_dst, context['title']))],
                            'clean':
                            True,
                            'uptodate': [
                                utils.config_changed({
                                    1: self.kw.copy(),
                                }, 'nikola.plugins.task.galleries:rss')
                            ],
                        }, self.kw['filters'])
Пример #23
0
    def gen_tasks(self):
        """Render image galleries."""

        if Image is None:
            req_missing(['pillow'], 'render galleries')

        self.logger = utils.get_logger('render_galleries', self.site.loghandlers)
        self.image_ext_list = ['.jpg', '.png', '.jpeg', '.gif', '.svg', '.bmp', '.tiff']
        self.image_ext_list.extend(self.site.config.get('EXTRA_IMAGE_EXTENSIONS', []))

        self.kw = {
            'thumbnail_size': self.site.config['THUMBNAIL_SIZE'],
            'max_image_size': self.site.config['MAX_IMAGE_SIZE'],
            'output_folder': self.site.config['OUTPUT_FOLDER'],
            'cache_folder': self.site.config['CACHE_FOLDER'],
            'default_lang': self.site.config['DEFAULT_LANG'],
            'use_filename_as_title': self.site.config['USE_FILENAME_AS_TITLE'],
            'gallery_path': self.site.config['GALLERY_PATH'],
            'sort_by_date': self.site.config['GALLERY_SORT_BY_DATE'],
            'filters': self.site.config['FILTERS'],
            'translations': self.site.config['TRANSLATIONS'],
            'global_context': self.site.GLOBAL_CONTEXT,
            'feed_length': self.site.config['FEED_LENGTH'],
            'tzinfo': self.site.tzinfo,
            'comments_in_galleries': self.site.config['COMMENTS_IN_GALLERIES'],
            'generate_rss': self.site.config['GENERATE_RSS'],
        }

        for k, v in self.site.GLOBAL_CONTEXT['template_hooks'].items():
            self.kw['||template_hooks|{0}||'.format(k)] = v._items

        yield self.group_task()

        template_name = "gallery.tmpl"

        # Find all galleries we need to process
        self.find_galleries()

        # Create all output folders
        for task in self.create_galleries():
            yield task

        # For each gallery:
        for gallery in self.gallery_list:

            # Create subfolder list
            folder_list = [(x, x.split(os.sep)[-2]) for x in
                           glob.glob(os.path.join(gallery, '*') + os.sep)]

            # Parse index into a post (with translations)
            post = self.parse_index(gallery)

            # Create image list, filter exclusions
            image_list = self.get_image_list(gallery)

            # Sort as needed
            # Sort by date
            if self.kw['sort_by_date']:
                image_list.sort(key=lambda a: self.image_date(a))
            else:  # Sort by name
                image_list.sort()

            # Create thumbnails and large images in destination
            for image in image_list:
                for task in self.create_target_images(image):
                    yield task

            # Remove excluded images
            for image in self.get_excluded_images(gallery):
                for task in self.remove_excluded_image(image):
                    yield task

            crumbs = utils.get_crumbs(gallery, index_folder=self)

            # Create index.html for each language
            for lang in self.kw['translations']:
                # save navigation links as dependencies
                self.kw['navigation_links|{0}'.format(lang)] = self.kw['global_context']['navigation_links'](lang)

                dst = os.path.join(
                    self.kw['output_folder'],
                    self.site.path(
                        "gallery",
                        os.path.relpath(gallery, self.kw['gallery_path']), lang))
                dst = os.path.normpath(dst)

                for k in self.site._GLOBAL_CONTEXT_TRANSLATABLE:
                    self.kw[k] = self.site.GLOBAL_CONTEXT[k](lang)

                context = {}
                context["lang"] = lang
                if post:
                    context["title"] = post.title(lang)
                else:
                    context["title"] = os.path.basename(gallery)
                context["description"] = None

                image_name_list = [os.path.basename(p) for p in image_list]

                if self.kw['use_filename_as_title']:
                    img_titles = []
                    for fn in image_name_list:
                        name_without_ext = os.path.splitext(os.path.basename(fn))[0]
                        img_titles.append(utils.unslugify(name_without_ext))
                else:
                    img_titles = [''] * len(image_name_list)

                thumbs = ['.thumbnail'.join(os.path.splitext(p)) for p in image_list]
                thumbs = [os.path.join(self.kw['output_folder'], t) for t in thumbs]
                dest_img_list = [os.path.join(self.kw['output_folder'], t) for t in image_list]

                folders = []

                # Generate friendly gallery names
                for path, folder in folder_list:
                    fpost = self.parse_index(path)
                    if fpost:
                        ft = fpost.title(lang) or folder
                    else:
                        ft = folder
                    if not folder.endswith('/'):
                        folder += '/'
                    folders.append((folder, ft))

                context["folders"] = natsort.natsorted(folders)
                context["crumbs"] = crumbs
                context["permalink"] = self.site.link(
                    "gallery", os.path.basename(
                        os.path.relpath(gallery, self.kw['gallery_path'])), lang)
                context["enable_comments"] = self.kw['comments_in_galleries']
                context["thumbnail_size"] = self.kw["thumbnail_size"]

                if post:
                    yield {
                        'basename': self.name,
                        'name': post.translated_base_path(lang),
                        'targets': [post.translated_base_path(lang)],
                        'file_dep': post.fragment_deps(lang),
                        'actions': [(post.compile, [lang])],
                        'uptodate': [utils.config_changed(self.kw)]
                    }
                    context['post'] = post
                else:
                    context['post'] = None
                file_dep = self.site.template_system.template_deps(
                    template_name) + image_list + thumbs
                if post:
                    file_dep += [post.translated_base_path(l) for l in self.kw['translations']]

                yield utils.apply_filters({
                    'basename': self.name,
                    'name': dst,
                    'file_dep': file_dep,
                    'targets': [dst],
                    'actions': [
                        (self.render_gallery_index, (
                            template_name,
                            dst,
                            context,
                            dest_img_list,
                            img_titles,
                            thumbs,
                            file_dep))],
                    'clean': True,
                    'uptodate': [utils.config_changed({
                        1: self.kw,
                        2: self.site.config["COMMENTS_IN_GALLERIES"],
                        3: context,
                    })],
                }, self.kw['filters'])

                # RSS for the gallery
                if self.kw["generate_rss"]:
                    rss_dst = os.path.join(
                        self.kw['output_folder'],
                        self.site.path(
                            "gallery_rss",
                            os.path.relpath(gallery, self.kw['gallery_path']), lang))
                    rss_dst = os.path.normpath(rss_dst)

                    yield utils.apply_filters({
                        'basename': self.name,
                        'name': rss_dst,
                        'file_dep': file_dep,
                        'targets': [rss_dst],
                        'actions': [
                            (self.gallery_rss, (
                                image_list,
                                img_titles,
                                lang,
                                self.site.link(
                                    "gallery_rss", os.path.basename(gallery), lang),
                                rss_dst,
                                context['title']
                            ))],
                        'clean': True,
                        'uptodate': [utils.config_changed({
                            1: self.kw,
                        })],
                    }, self.kw['filters'])