def test_get_crumbs(): crumbs = get_crumbs('galleries') assert len(crumbs) == 1 assert crumbs[0] == ['#', 'galleries'] crumbs = get_crumbs(os.path.join('galleries', 'demo')) assert len(crumbs) == 2 assert crumbs[0] == ['..', 'galleries'] assert crumbs[1] == ['#', 'demo'] crumbs = get_crumbs(os.path.join('listings', 'foo', 'bar'), is_file=True) assert len(crumbs) == 3 assert crumbs[0] == ['..', 'listings'] assert crumbs[1] == ['.', 'foo'] assert crumbs[2] == ['#', 'bar']
def render_listing(in_name, out_name, folders=[], files=[]): if in_name: with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight(fd.read(), lexer, HtmlFormatter(cssclass='code', linenos="table", nowrap=False, lineanchors=utils.slugify(f), anchorlinenos=True)) title = os.path.basename(in_name) else: code = '' title = '' crumbs = utils.get_crumbs(os.path.relpath(out_name, kw['output_folder']), is_file=True) context = { 'code': code, 'title': title, 'crumbs': crumbs, 'lang': kw['default_lang'], 'folders': folders, 'files': files, 'description': title, } self.site.render_template('listing.tmpl', out_name, context)
def render_listing(in_name, out_name): with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight(fd.read(), lexer, HtmlFormatter(cssclass='code', linenos="table", nowrap=False, lineanchors=utils.slugify(f), anchorlinenos=True)) title = os.path.basename(in_name) print("CRUMBSINOUT", in_name, out_name) #crumbs = out_name.split(os.sep)[1:-1] + [title] # TODO: write this in human #paths = ['/'.join(['..'] * (len(crumbs) - 2 - i)) for i in #range(len(crumbs[:-2]))] + ['.', '#'] crumbs = utils.get_crumbs(os.path.relpath(out_name, kw['output_folder']), is_file=True) context = { 'code': code, 'title': title, 'crumbs': crumbs, 'lang': kw['default_lang'], 'description': title, } self.site.render_template('listing.tmpl', out_name.encode('utf8'), context)
def render_listing(in_name, out_name, input_folder, output_folder, folders=[], files=[]): needs_ipython_css = False if in_name and in_name.endswith('.ipynb'): # Special handling: render ipynbs in listings (Issue #1900) ipynb_compiler = self.site.plugin_manager.getPluginByName("ipynb", "PageCompiler").plugin_object ipynb_raw = ipynb_compiler.compile_html_string(in_name, True) ipynb_html = lxml.html.fromstring(ipynb_raw) # The raw HTML contains garbage (scripts and styles), we can’t leave it in code = lxml.html.tostring(ipynb_html.xpath('//*[@id="notebook"]')[0], encoding='unicode') title = os.path.basename(in_name) needs_ipython_css = True elif in_name: with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight(fd.read(), lexer, utils.NikolaPygmentsHTML(in_name)) title = os.path.basename(in_name) else: code = '' title = os.path.split(os.path.dirname(out_name))[1] crumbs = utils.get_crumbs(os.path.relpath(out_name, self.kw['output_folder']), is_file=True) permalink = self.site.link( 'listing', os.path.join( input_folder, os.path.relpath( out_name[:-5], # remove '.html' os.path.join( self.kw['output_folder'], output_folder)))) if self.site.config['COPY_SOURCES'] and in_name: source_link = permalink[:-5] # remove '.html' else: source_link = None context = { 'code': code, 'title': title, 'crumbs': crumbs, 'permalink': permalink, 'lang': self.kw['default_lang'], 'folders': natsort.natsorted( folders, alg=natsort.ns.F | natsort.ns.IC), 'files': natsort.natsorted( files, alg=natsort.ns.F | natsort.ns.IC), 'description': title, 'source_link': source_link, 'pagekind': ['listing'], } if needs_ipython_css: # If someone does not have ipynb posts and only listings, we # need to enable ipynb CSS for ipynb listings. context['needs_ipython_css'] = True self.site.render_template('listing.tmpl', out_name, context)
def render_listing(in_name, out_name, input_folder, output_folder, folders=[], files=[]): if in_name: with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight( fd.read(), lexer, HtmlFormatter(cssclass='code', linenos="table", nowrap=False, lineanchors=utils.slugify(in_name, force=True), anchorlinenos=True)) # the pygments highlighter uses <div class="codehilite"><pre> # for code. We switch it to reST's <pre class="code">. code = CODERE.sub('<pre class="code literal-block">\\1</pre>', code) title = os.path.basename(in_name) else: code = '' title = os.path.split(os.path.dirname(out_name))[1] crumbs = utils.get_crumbs(os.path.relpath( out_name, self.kw['output_folder']), is_file=True) permalink = self.site.link( 'listing', os.path.join( input_folder, os.path.relpath( out_name[:-5], # remove '.html' os.path.join(self.kw['output_folder'], output_folder)))) if self.site.config['COPY_SOURCES']: source_link = permalink[:-5] # remove '.html' else: source_link = None context = { 'code': code, 'title': title, 'crumbs': crumbs, 'permalink': permalink, 'lang': self.kw['default_lang'], 'folders': natsort.natsorted(folders), 'files': natsort.natsorted(files), 'description': title, 'source_link': source_link, } self.site.render_template('listing.tmpl', out_name, context)
def render_listing(in_name, out_name, input_folder, output_folder, folders=[], files=[]): if in_name: with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight(fd.read(), lexer, HtmlFormatter(cssclass='code', linenos="table", nowrap=False, lineanchors=utils.slugify(in_name, force=True), anchorlinenos=True)) # the pygments highlighter uses <div class="codehilite"><pre> # for code. We switch it to reST's <pre class="code">. code = CODERE.sub('<pre class="code literal-block">\\1</pre>', code) title = os.path.basename(in_name) else: code = '' title = os.path.split(os.path.dirname(out_name))[1] crumbs = utils.get_crumbs(os.path.relpath(out_name, self.kw['output_folder']), is_file=True) permalink = self.site.link( 'listing', os.path.join( input_folder, os.path.relpath( out_name[:-5], # remove '.html' os.path.join( self.kw['output_folder'], output_folder)))) if self.site.config['COPY_SOURCES']: source_link = permalink[:-5] # remove '.html' else: source_link = None context = { 'code': code, 'title': title, 'crumbs': crumbs, 'permalink': permalink, 'lang': self.kw['default_lang'], 'folders': natsort.natsorted(folders), 'files': natsort.natsorted(files), 'description': title, 'source_link': source_link, } self.site.render_template('listing.tmpl', out_name, context)
def render_listing(in_name, out_name, folders=[], files=[]): if in_name: with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight(fd.read(), lexer, HtmlFormatter(cssclass='code', linenos="table", nowrap=False, lineanchors=utils.slugify(in_name), anchorlinenos=True)) title = os.path.basename(in_name) else: code = '' title = '' crumbs = utils.get_crumbs(os.path.relpath(out_name, kw['output_folder']), is_file=True) permalink = self.site.link( 'listing', os.path.relpath( out_name, os.path.join( kw['output_folder'], kw['listings_folder']))) if self.site.config['COPY_SOURCES']: source_link = permalink[:-5] else: source_link = None context = { 'code': code, 'title': title, 'crumbs': crumbs, 'permalink': permalink, 'lang': kw['default_lang'], 'folders': natsort.natsorted(folders), 'files': natsort.natsorted(files), 'description': title, 'source_link': source_link, } self.site.render_template('listing.tmpl', out_name, context)
def render_listing(in_name, out_name, input_folder, output_folder, folders=[], files=[]): if in_name: with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight(fd.read(), lexer, utils.NikolaPygmentsHTML(in_name)) title = os.path.basename(in_name) else: code = '' title = os.path.split(os.path.dirname(out_name))[1] crumbs = utils.get_crumbs(os.path.relpath(out_name, self.kw['output_folder']), is_file=True) permalink = self.site.link( 'listing', os.path.join( input_folder, os.path.relpath( out_name[:-5], # remove '.html' os.path.join( self.kw['output_folder'], output_folder)))) if self.site.config['COPY_SOURCES'] and in_name: source_link = permalink[:-5] # remove '.html' else: source_link = None context = { 'code': code, 'title': title, 'crumbs': crumbs, 'permalink': permalink, 'lang': self.kw['default_lang'], 'folders': natsort.natsorted( folders, alg=natsort.ns.F | natsort.ns.IC), 'files': natsort.natsorted( files, alg=natsort.ns.F | natsort.ns.IC), 'description': title, 'source_link': source_link, 'pagekind': ['listing'], } self.site.render_template('listing.tmpl', out_name, context)
def render_listing(in_name, out_name, input_folder, output_folder, folders=[], files=[]): if in_name: with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight(fd.read(), lexer, utils.NikolaPygmentsHTML(in_name)) title = os.path.basename(in_name) else: code = '' title = os.path.split(os.path.dirname(out_name))[1] crumbs = utils.get_crumbs(os.path.relpath(out_name, self.kw['output_folder']), is_file=True) permalink = self.site.link( 'listing', os.path.join( input_folder, os.path.relpath( out_name[:-5], # remove '.html' os.path.join( self.kw['output_folder'], output_folder)))) if self.site.config['COPY_SOURCES'] and in_name: source_link = permalink[:-5] # remove '.html' else: source_link = None context = { 'code': code, 'title': title, 'crumbs': crumbs, 'permalink': permalink, 'lang': self.kw['default_lang'], 'folders': natsort.natsorted( folders, alg=natsort.ns.F | natsort.ns.IC), 'files': natsort.natsorted( files, alg=natsort.ns.F | natsort.ns.IC), 'description': title, 'source_link': source_link, } self.site.render_template('listing.tmpl', out_name, context)
def render_listing(in_name, out_name, folders=[], files=[]): if in_name: with open(in_name, 'r') as fd: try: lexer = get_lexer_for_filename(in_name) except: lexer = TextLexer() code = highlight( fd.read(), lexer, HtmlFormatter(cssclass='code', linenos="table", nowrap=False, lineanchors=utils.slugify(in_name), anchorlinenos=True)) title = os.path.basename(in_name) else: code = '' title = '' crumbs = utils.get_crumbs(os.path.relpath(out_name, kw['output_folder']), is_file=True) permalink = self.site.link( 'listing', os.path.relpath( out_name, os.path.join(kw['output_folder'], kw['listings_folder']))) if self.site.config['COPY_SOURCES']: source_link = permalink[:-5] else: source_link = None context = { 'code': code, 'title': title, 'crumbs': crumbs, 'permalink': permalink, 'lang': kw['default_lang'], 'folders': natsort.natsorted(folders), 'files': natsort.natsorted(files), 'description': title, 'source_link': source_link, } self.site.render_template('listing.tmpl', out_name, context)
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.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.""" 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 test_get_crumbs(path, is_file, expected_crumbs): crumbs = get_crumbs(path, is_file=is_file) assert len(crumbs) == len(expected_crumbs) for crumb, expected_crumb in zip(crumbs, expected_crumbs): assert crumb == expected_crumb
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'], } 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.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"], "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.""" 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 render_listing(in_name, out_name, input_folder, output_folder, folders=[], files=[]): needs_ipython_css = False if in_name and in_name.endswith('.ipynb'): # Special handling: render ipynbs in listings (Issue #1900) ipynb_plugin = self.site.plugin_manager.getPluginByName("ipynb", "PageCompiler") if ipynb_plugin is None: msg = "To use .ipynb files as listings, you must set up the Jupyter compiler in COMPILERS and POSTS/PAGES." utils.LOGGER.error(msg) raise ValueError(msg) ipynb_compiler = ipynb_plugin.plugin_object with open(in_name, "r", encoding="utf8") as in_file: nb_json = ipynb_compiler._nbformat_read(in_file) code = ipynb_compiler._compile_string(nb_json) title = os.path.basename(in_name) needs_ipython_css = True elif in_name: with open(in_name, 'r', encoding='utf-8') as fd: try: lexer = get_lexer_for_filename(in_name) except Exception: try: lexer = guess_lexer(fd.read()) except Exception: lexer = TextLexer() fd.seek(0) code = highlight( fd.read(), lexer, utils.NikolaPygmentsHTML(in_name, linenos='table')) title = os.path.basename(in_name) else: code = '' title = os.path.split(os.path.dirname(out_name))[1] crumbs = utils.get_crumbs(os.path.relpath(out_name, self.kw['output_folder']), is_file=True) permalink = self.site.link( 'listing', os.path.join( input_folder, os.path.relpath( out_name[:-5], # remove '.html' os.path.join( self.kw['output_folder'], output_folder)))) if in_name: source_link = permalink[:-5] # remove '.html' else: source_link = None context = { 'code': code, 'title': title, 'crumbs': crumbs, 'permalink': permalink, 'lang': self.kw['default_lang'], 'folders': natsort.natsorted( folders, alg=natsort.ns.F | natsort.ns.IC), 'files': natsort.natsorted( files, alg=natsort.ns.F | natsort.ns.IC), 'description': title, 'source_link': source_link, 'pagekind': ['listing'], } if needs_ipython_css: # If someone does not have ipynb posts and only listings, we # need to enable ipynb CSS for ipynb listings. context['needs_ipython_css'] = True self.site.render_template('listing.tmpl', out_name, context)
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.""" 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'])
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"], )