Skip to content
Snippets Groups Projects
generator.py 3.83 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jake's avatar
    Jake committed
    import datatypes
    
    Jake's avatar
    Jake committed
    
    class Generator:
        def __init__(self, config, context):
            self.config = config
            self.context = context
    
        def generate_context(self, pages, static_files):
            # static_files
            self.context['static_files'] = static_files
    
            published_pages = []
            for page in pages:
                if page.status == "published":
                    published_pages.append(page)
    
    
            # pages
            all_pages = {}
            for page in published_pages:
                if page.lang not in all_pages:
                    all_pages[page.lang] = {}
                if page.slug in all_pages[page.lang]:
                    raise Exception("duplicate language (",lang,") for slug '", slug ,"'")
                all_pages[page.lang][page.slug] = page
            self.context['pages'] = all_pages
    
            # pages_modified
            pages_modified = {}
            for lang in self.config['lang']['supported']:
                lang_pages = []
                for page in published_pages:
                    if page.lang == lang:
                        lang_pages.append(page)
                lang_pages.sort()
                pages_modified[lang] = lang_pages
            self.context['pages_modified'] = pages_modified
    
            # TODO hidden pages
            # TODO draft pages
            # TODO authors
    
            # categories
            categories = {}
            for page in published_pages:
    
    Jake's avatar
    Jake committed
                if page.lang not in categories:
                    categories[page.lang] = {}
                if page.category not in categories[page.lang]:
                    categories[page.lang][page.category] = []
                categories[page.lang][page.category].append(page)
    
    Jake's avatar
    Jake committed
            self.context['categories'] = categories
    
            # tags
            tags = {}
            for page in published_pages:
                for tag in page.tags:
    
    Jake's avatar
    Jake committed
                    if page.lang not in tags:
                        tags[page.lang] = {}
                    if tag not in tags[page.lang]:
                        tags[page.lang][tag] = []
                    tags[page.lang][tag].append(page)
    
    Jake's avatar
    Jake committed
            self.context['tags'] = tags
    
    
    Jake's avatar
    Jake committed
            # build_date
    
    Jake's avatar
    Jake committed
            self.context['build_date'] = datatypes.Date("now", self.config)
    
    Jake's avatar
    Jake committed
    
    
            # relevant_pages
            relevant_pages_tuple = []
            for page in published_pages:
                if page.relevance['is_relevant']:
                    relevant_pages_tuple.append((page.relevance['prio'], page))
            relevant_pages_tuple.sort(key=lambda x: x[0])
    
    Jake's avatar
    Jake committed
            relevant_pages_tuple.reverse()
    
            relevant_pages = {}
    
            for prio, page in relevant_pages_tuple:
    
                if page.lang not in relevant_pages:
                    relevant_pages[page.lang] = []
                relevant_pages[page.lang].append(page)
    
            self.context['relevant_pages'] = relevant_pages
            self.context['relevant_pages_tuple'] = relevant_pages_tuple
    
    
    
    
    Jake's avatar
    Jake committed
    
        def generate_homepage(self, writer, lang, path):
                page = self.context['pages'][lang][self.config['theme']['homepage_slug']]
                writer.write_template(page.template, path , lang, {'page': page})
    
    
        def generate_output(self, writer):
            for sf, raw in self.context['static_files'].items():
                    print ("writing binary file: ", sf)
                    writer.write_file(sf, raw, mode="wb")
    
            for lang in self.config['lang']['supported']:
                # all pages
                for page in self.context['pages'][lang].values():
                    writer.write_template(page.template, page.url, lang, {'page': page})
    
    
    Jake's avatar
    Jake committed
                # all tags
                for tag, tagpages in self.context['tags'][lang].items():
                    writer.write_template('tag.html', lang + '/tag/' + tag + '.html', lang, {'tag': tag, 'tagpages': tagpages})
    
    
    Jake's avatar
    Jake committed
                # homepages for languages
                self.generate_homepage(writer, lang, lang + "/index.html")
            
                
            # homepage
            self.generate_homepage(writer, self.config['lang']['default'], "index.html")