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)
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)
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
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)
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)
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']})], }
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"]})], }
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, }) ], }
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'])
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)], }
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)], }
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"], )
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"], )
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, } ) ], }
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"], })], }
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'])
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'])
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'])
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'])
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'])