def initSettings(self): self.old_locale = locale.setlocale(locale.LC_ALL) locale.setlocale(locale.LC_ALL, str('C')) self.settings = get_my_settings() self.settings['THEME'] = "../" self.settings['filenames'] = {} self.reader = RstReader(self.settings) self.writer = Writer("output", self.settings)
def write_feed(gen, items, context, slug): if gen.settings['PELICAN_COMMENT_SYSTEM_FEED'] is None: return path = gen.settings['PELICAN_COMMENT_SYSTEM_FEED'] % slug writer = Writer(gen.output_path, settings=gen.settings) writer.write_feed(items, context, path)
def add_static_comments(gen, content): if gen.settings['PELICAN_COMMENT_SYSTEM'] != True: return content.comments_count = 0 content.comments = [] #Modify the local context, so we get proper values for the feed context = copy.copy(gen.context) context['SITEURL'] += "/" + content.url context['SITENAME'] = "Comments for: " + content.title context['SITESUBTITLE'] = "" path = gen.settings['PELICAN_COMMENT_SYSTEM_FEED'] % content.slug writer = Writer(gen.output_path, settings=gen.settings) folder = os.path.join(gen.settings['PELICAN_COMMENT_SYSTEM_DIR'], content.slug) if not os.path.isdir(folder): logger.debug("No comments found for: " + content.slug) writer.write_feed( [], context, path) return reader = MarkdownReader(gen.settings) comments = [] replies = [] for file in os.listdir(folder): name, extension = os.path.splitext(file) if extension[1:].lower() in reader.file_extensions: com_content, meta = reader.read(os.path.join(folder, file)) avatar_path = avatars.getAvatarPath(name, meta) com = Comment(file, avatar_path, com_content, meta, gen.settings, file, context) if 'replyto' in meta: replies.append( com ) else: comments.append( com ) writer.write_feed( comments + replies, context, path) #TODO: Fix this O(n²) loop for reply in replies: for comment in chain(comments, replies): if comment.id == reply.metadata['replyto']: comment.addReply(reply) count = 0 for comment in comments: comment.sortReplies() count += comment.countReplies() comments = sorted(comments) content.comments_count = len(comments) + count content.comments = comments
def test_turkish_locale(self): if platform == 'win32': locale_string = 'Turkish' else: locale_string = 'tr_TR.UTF-8' settings = read_settings( override={ 'LOCALE': locale_string, 'TEMPLATE_PAGES': { 'template/source.html': 'generated/file.html' } }) generator = TemplatePagesGenerator({'date': self.date}, settings, self.temp_content, '', self.temp_output) generator.env.filters.update({'strftime': utils.DateFormatter()}) writer = Writer(self.temp_output, settings=settings) generator.generate_output(writer) output_path = os.path.join(self.temp_output, 'generated', 'file.html') # output file has been generated self.assertTrue(os.path.exists(output_path)) # output content is correct with utils.pelican_open(output_path) as output_file: self.assertEqual(output_file, utils.strftime(self.date, 'date = %A, %d %B %Y'))
def test_generate_ctags(self): settings = get_settings(filenames={}) settings['GENERATE_CTAGS'] = True context = settings.copy() context['generated_content'] = dict() context['static_links'] = set() generator = ArticlesGenerator(context=context, settings=settings, path=TEST_CONTENT_DIR, theme=settings['THEME'], output_path=TEST_CONTENT_DIR) generator.generate_context() writer = Writer(TEST_CONTENT_DIR, settings=settings) generate_ctags(generator, writer) output_path = os.path.join(TEST_CONTENT_DIR, 'tags') self.assertTrue(os.path.exists(output_path)) try: # output content is correct with open(output_path, 'r') as output_file: ctags = [l.split('\t')[0] for l in output_file.readlines()] self.assertEqual([ 'bar', 'bar', 'foo', 'foo', 'foobar', 'foobar', 'マック', 'パイソン' ], ctags) finally: os.remove(output_path)
def test_generate_ctags(self): settings = get_settings(filenames={}) settings["GENERATE_CTAGS"] = True context = settings.copy() context["generated_content"] = dict() context["static_links"] = set() generator = ArticlesGenerator( context=context, settings=settings, path=TEST_CONTENT_DIR, theme=settings["THEME"], output_path=TEST_CONTENT_DIR, ) generator.generate_context() writer = Writer(TEST_CONTENT_DIR, settings=settings) generate_ctags(generator, writer) output_path = os.path.join(TEST_CONTENT_DIR, "tags") self.assertTrue(os.path.exists(output_path)) try: # output content is correct with open(output_path, "r") as output_file: ctags = [l.split("\t")[0] for l in output_file.readlines()] self.assertEqual( [ "bar", "bar", "foo", "foo", "foobar", "foobar", "マック", "パイソン" ], ctags, ) finally: os.remove(output_path)
def test_generate_output(self): settings = get_settings() settings['STATIC_PATHS'] = ['static'] settings['TEMPLATE_PAGES'] = { 'template/source.html': 'generated/file.html' } generator = TemplatePagesGenerator(context={'foo': 'bar'}, settings=settings, path=self.temp_content, theme='', output_path=self.temp_output) # create a dummy template file template_dir = os.path.join(self.temp_content, 'template') template_path = os.path.join(template_dir, 'source.html') os.makedirs(template_dir) with open(template_path, 'w') as template_file: template_file.write(self.TEMPLATE_CONTENT) writer = Writer(self.temp_output, settings=settings) generator.generate_output(writer) output_path = os.path.join(self.temp_output, 'generated', 'file.html') # output file has been generated self.assertTrue(os.path.exists(output_path)) # output content is correct with open(output_path, 'r') as output_file: self.assertEqual(output_file.read(), 'foo: bar')
def write_feed_all(gen, writer): if gen.settings['PELICAN_COMMENT_SYSTEM'] is not True: return if gen.settings['PELICAN_COMMENT_SYSTEM_FEED_ALL'] is None: return context = copy.copy(gen.context) context['SITENAME'] += " - All Comments" context['SITESUBTITLE'] = "" path = gen.settings['PELICAN_COMMENT_SYSTEM_FEED_ALL'] global _all_comments _all_comments = sorted(_all_comments) _all_comments.reverse() for com in _all_comments: com.title = com.article.title + " - " + com.title com.override_url = com.article.url + com.url writer = Writer(gen.output_path, settings=gen.settings) writer.write_feed(_all_comments, context, path)
def write_feed_all(gen, writer): if gen.settings["PELICAN_COMMENT_SYSTEM"] is not True: return if gen.settings["PELICAN_COMMENT_SYSTEM_FEED_ALL"] is None: return context = copy.copy(gen.context) context["SITENAME"] += " - All Comments" context["SITESUBTITLE"] = "" path = gen.settings["PELICAN_COMMENT_SYSTEM_FEED_ALL"] global _all_comments _all_comments = sorted(_all_comments) _all_comments.reverse() for com in _all_comments: com.title = com.article.title + " - " + com.title com.override_url = com.article.url + com.url writer = Writer(gen.output_path, settings=gen.settings) writer.write_feed(_all_comments, context, path)
def add_static_comments(gen, content): if gen.settings['PELICAN_COMMENT_SYSTEM'] != True: return content.comments_count = 0 content.comments = [] #Modify the local context, so we get proper values for the feed context = copy.copy(gen.context) context['SITEURL'] += "/" + content.url context['SITENAME'] = "Comments for: " + content.title context['SITESUBTITLE'] = "" path = gen.settings['PELICAN_COMMENT_SYSTEM_FEED'] % content.slug writer = Writer(gen.output_path, settings=gen.settings) folder = os.path.join(gen.settings['PELICAN_COMMENT_SYSTEM_DIR'], content.slug) if not os.path.isdir(folder): logger.debug("No comments found for: " + content.slug) writer.write_feed([], context, path) return reader = MarkdownReader(gen.settings) comments = [] replies = [] for file in os.listdir(folder): name, extension = os.path.splitext(file) if extension[1:].lower() in reader.file_extensions: com_content, meta = reader.read(os.path.join(folder, file)) avatar_path = avatars.getAvatarPath(name, meta) com = Comment(file, avatar_path, com_content, meta, gen.settings, file, context) if 'replyto' in meta: replies.append(com) else: comments.append(com) writer.write_feed(comments + replies, context, path) #TODO: Fix this O(n²) loop for reply in replies: for comment in chain(comments, replies): if comment.id == reply.metadata['replyto']: comment.addReply(reply) count = 0 for comment in comments: comment.sortReplies() count += comment.countReplies() comments = sorted(comments) content.comments_count = len(comments) + count content.comments = comments
def _get_writer(self): writers = [w for _, w in signals.get_writer.send(self) if isinstance(w, type)] num_writers = len(writers) if num_writers == 0: return Writer(self.output_path, settings=self.settings) if num_writers > 1: logger.warning("%s writers found, using only first one", num_writers) writer = writers[0] logger.debug("Found writer: %s", writer) return writer(self.output_path, settings=self.settings)
def get_writer(self): writers = [w for (_, w) in signals.get_writer.send(self) if isinstance(w, type)] writers_found = len(writers) if writers_found == 0: return Writer(self.output_path, settings=self.settings) else: writer = writers[0] if writers_found == 1: logger.debug('Found writer: %s', writer) else: logger.warning( '%s writers found, using only first one: %s', writers_found, writer) return writer(self.output_path, settings=self.settings)
def test_ok_on_custom_data(self): settings = get_settings(filenames={}) settings["PATH"] = join(CUR_DIR, "test_data") settings["PLUGINS"] = ["pelican-ipynb.markup"] # to also parse .ipynb files configure_settings(settings) pelican_mock = PelicanMock(settings) pelican_init(pelican_mock) Pelican.init_plugins(pelican_mock) with TemporaryDirectory() as tmpdirname: generator = _build_article_generator(settings, tmpdirname) process_rst_and_summaries([generator]) for article in generator.articles: if article.source_path.endswith(".rst"): self.assertIn("mathjaxscript_pelican", article.content) generator.generate_output(Writer(tmpdirname, settings=settings))
def generate_output(self, article, templates, file_num): settings = self.settings settings['TEMPLATE_PAGES'] = templates generator = TemplatePagesGenerator(context={ 'article': article, 'current_page': file_num }, settings=settings, path=settings['PATH'], theme=settings['THEME'], output_path=self.output_path) writer = Writer(self.output_path, settings=settings) generator.generate_output(writer) output_path = os.path.join(self.output_path, 'generated', 'file.html') # output content is correct with open(output_path, 'r') as output_file: rendered_html = output_file.read() return rendered_html
def get_writer(self): return Writer(self.output_path, settings=self.settings)
def get_writer(self, flavour=None): path = self.output_path if flavour != None: path = os.path.join(path, flavour) return Writer(path, settings=self.settings)
class BaseTest(object): def __init__(self): self.initSettings() def initSettings(self): self.old_locale = locale.setlocale(locale.LC_ALL) locale.setlocale(locale.LC_ALL, str('C')) self.settings = get_my_settings() self.settings['THEME'] = "../" self.settings['filenames'] = {} self.reader = RstReader(self.settings) self.writer = Writer("output", self.settings) def gen_article_and_html_from_rst(self, rstPath): content, metadata = self.reader.read(rstPath) article = Article(content=content, metadata=metadata) context = self.settings.copy() context['generated_content'] = {} context['static_links'] = set() context['static_content'] = {} context['localsiteurl'] = self.settings['SITEURL'] generator = ArticlesGenerator(context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) generator.generate_context() f = lambda a: True if (a.slug == article.slug) else False result = list(filter(f, generator.context["articles"]))[0] self.writer.write_file(result.save_as, generator.get_template('article'), generator.context, article=result) soup = BeautifulSoup( open("./" + self.writer.output_path + '/' + result.save_as), "html.parser") return (result, soup) def gen_page_and_html_from_rst(self, rstPath): content, metadata = self.reader.read(rstPath) page = Page(content=content, metadata=metadata) context = self.settings.copy() context['generated_content'] = {} context['static_links'] = set() context['static_content'] = {} context['localsiteurl'] = self.settings['SITEURL'] generator = PagesGenerator(context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) generator.generate_context() f = lambda a: True if (a.slug == page.slug) else False result = list(filter(f, generator.context["pages"]))[0] self.writer.write_file(result.save_as, generator.get_template('page'), generator.context, page=result) soup = BeautifulSoup( open("./" + self.writer.output_path + '/' + result.save_as), "html.parser") return (result, soup) def gen_tag_and_html_from_name(self, name): context = self.settings.copy() context['generated_content'] = {} context['static_links'] = set() context['static_content'] = {} context['localsiteurl'] = self.settings['SITEURL'] generator = ArticlesGenerator(context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) generator.generate_context() generator.generate_tags(self.writer.write_file) selectedTag = None for tag, articles in generator.tags.items(): if tag.name == name: selectedTag = tag soup = BeautifulSoup( open("./" + self.writer.output_path + '/' + selectedTag.save_as), "html.parser") return (selectedTag, soup) def gen_category_and_html_from_name(self, name): context = self.settings.copy() context['generated_content'] = {} context['static_links'] = set() context['static_content'] = {} context['localsiteurl'] = self.settings['SITEURL'] generator = ArticlesGenerator(context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) generator.generate_context() generator.generate_categories(self.writer.write_file) selectedCategory = None for category, articles in generator.categories: if category.name == name: selectedCategory = category soup = BeautifulSoup( open("./" + self.writer.output_path + '/' + selectedCategory.save_as), "html.parser") return (selectedCategory, soup) def gen_author_and_html_from_name(self, name): context = self.settings.copy() context['generated_content'] = {} context['static_links'] = set() context['static_content'] = {} context['localsiteurl'] = self.settings['SITEURL'] generator = ArticlesGenerator(context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) generator.generate_context() generator.generate_authors(self.writer.write_file) selectedAuthor = None for author, articles in generator.authors: if author.name == name: selectedAuthor = author soup = BeautifulSoup( open("./" + self.writer.output_path + '/' + selectedAuthor.save_as), "html.parser") return (selectedAuthor, soup)
def setUpClass(cls): feed_filter.initialized(None) cls.writer = Writer(".", get_settings())