Skip to content
Snippets Groups Projects
generator.py 4.8 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, factories):
    
    Jake's avatar
    Jake committed
            self.config = config
            self.context = context
    
            self.factories = factories
    
    Jake's avatar
    Jake committed
    
    
        def generate_context(self):
            # files
            self.context['files'] = self.factories['file'].all()
    
    Jake's avatar
    Jake committed
    
    
    Jake's avatar
    Jake committed
            pages = self.factories['page'].all()
    
    Jake's avatar
    Jake committed
            published_pages = []
    
    Jake's avatar
    Jake committed
            hidden_pages = []
    
    Jake's avatar
    Jake committed
            for lang in self.config['lang']['supported']:
                for slug, page in pages[lang].items():
                    if page.status == "published":
                        published_pages.append(page)
    
    Jake's avatar
    Jake committed
                    elif page.status == "hidden":
                        hidden_pages.append(page)
    
    Jake's avatar
    Jake committed
    
    
    
    Jake's avatar
    Jake committed
            # set context.pages from published_pages as a dict of languages containing dicts of slugs
            all_published_pages = {}
            for lang in self.config['lang']['supported']:
                all_published_pages[lang] = {}
    
    Jake's avatar
    Jake committed
            for page in published_pages:
    
    Jake's avatar
    Jake committed
                if page.slug in all_published_pages[page.lang]:
                    raise Exception("duplicate language (",lang,") for slug '", slug ,"'")
                all_published_pages[page.lang][page.slug] = page
            self.context['pages'] = all_published_pages
    
            # set context.hidden_pages from hidden_pages as a dict of languages containing dicts of slugs
            all_hidden_pages = {}
            for lang in self.config['lang']['supported']:
                all_hidden_pages[lang] = {}
            for page in hidden_pages:
                if page.slug in all_hidden_pages[page.lang]:
    
    Jake's avatar
    Jake committed
                    raise Exception("duplicate language (",lang,") for slug '", slug ,"'")
    
    Jake's avatar
    Jake committed
                all_hidden_pages[page.lang][page.slug] = page
            self.context['hidden_pages'] = all_hidden_pages
    
    Jake's avatar
    Jake committed
    
            # 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()
    
    Jake's avatar
    Jake committed
                lang_pages.reverse()
    
    Jake's avatar
    Jake committed
                pages_modified[lang] = lang_pages
            self.context['pages_modified'] = pages_modified
    
            # TODO draft pages
            # TODO authors
    
    
            # tags
    
            self.context['tags'] = self.factories['tag'].all()
    
            # categories
            self.context['categories'] = {}
            for lang in self.config['lang']['supported']:
                self.context['categories'][lang] = {}
                for tag in self.context['tags'][lang].values():
                    if tag.is_category:
                        self.context['categories'][lang][tag.name] = tag
    
    Jake's avatar
    Jake committed
    
    
    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 lang in self.config['lang']['supported']:
                relevant_pages[lang] = []
    
            for prio, page in relevant_pages_tuple:
    
                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.factories['config'].get(lang)['homepage']['page']
            writer.write_template(page.template, path , lang, {'page': page}, page.config)
    
    Jake's avatar
    Jake committed
    
    
        def generate_output(self, writer):
    
            for fname, f in self.context['files'].items():
                    #print ("writing binary file: ", fname)
                    writer.write_file(f.link.path, f.rawcontents, mode="wb")
    
    Jake's avatar
    Jake committed
    
            for lang in self.config['lang']['supported']:
    
    Jake's avatar
    Jake committed
                # all published pages
    
                print(lang, "-> Generatng all published pages.")
    
    Jake's avatar
    Jake committed
                for page in self.context['pages'][lang].values():
    
    Jake's avatar
    Jake committed
                    writer.write_template(page.template, page.link.path, lang, {'page': page}, page.config)
    
    Jake's avatar
    Jake committed
    
    
    Jake's avatar
    Jake committed
                # all hidden pages
    
                print(lang, "-> Generatng all hidden pages.")
    
    Jake's avatar
    Jake committed
                for page in self.context['hidden_pages'][lang].values():
                    #print(page.slug)
                    writer.write_template(page.template, page.link.path, lang, {'page': page}, page.config)
    
    
    Jake's avatar
    Jake committed
                # all tags
    
                print(lang, "-> Generatng all tags.")
    
                for tag in self.context['tags'][lang].values():
    
    Jake's avatar
    Jake committed
                    writer.write_template('tag.html', tag.link.path, lang, {'tag': tag}, tag.config)
    
    Jake's avatar
    Jake committed
    
    
    Jake's avatar
    Jake committed
                # homepages for languages
    
                print(lang, "-> Generatng homepage.")
    
    Jake's avatar
    Jake committed
                self.generate_homepage(writer, lang, lang + "/index.html")
    
    Jake's avatar
    Jake committed
    
    
    Jake's avatar
    Jake committed
            # homepage
            self.generate_homepage(writer, self.config['lang']['default'], "index.html")