import datatypes class Generator: def __init__(self, config, context, factories): self.config = config self.context = context self.factories = factories 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() lang_pages.reverse() pages_modified[lang] = lang_pages self.context['pages_modified'] = pages_modified # TODO hidden pages # 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 # build_date self.context['build_date'] = datatypes.Date("now", self.config) # 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]) 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 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.link.path, lang, {'page': page}) # all tags for tag in self.context['tags'][lang].values(): writer.write_template('tag.html', tag.link.path, lang, {'tag': tag}) # homepages for languages self.generate_homepage(writer, lang, lang + "/index.html") # homepage self.generate_homepage(writer, self.config['lang']['default'], "index.html")