diff options
-rwxr-xr-x | makesite.py | 13 | ||||
-rw-r--r-- | test/test_content.py | 14 | ||||
-rw-r--r-- | test/test_pages.py | 48 | ||||
-rw-r--r-- | test/test_truncate.py | 9 |
4 files changed, 69 insertions, 15 deletions
diff --git a/makesite.py b/makesite.py index cf23374..f4dcf0f 100755 --- a/makesite.py +++ b/makesite.py @@ -107,10 +107,9 @@ def read_content(filename): except ImportError as e: log('WARNING: Cannot render Markdown in {}: {}', filename, str(e)) - # Update the dictionary with content, summary, and RFC 2822 date. + # Update the dictionary with content and RFC 2822 date. content.update({ 'content': text, - 'summary': truncate(text), 'rfc_2822_date': rfc_2822_format(content['date']) }) @@ -130,10 +129,17 @@ def make_pages(src, dst, layout, **params): for src_path in glob.glob(src): content = read_content(src_path) - items.append(content) page_params = dict(params, **content) + # Populate placeholders in content if content-rendering is enabled. + if page_params.get('render') == 'yes': + rendered_content = render(page_params['content'], **page_params) + page_params['content'] = rendered_content + content['content'] = rendered_content + + items.append(content) + dst_path = render(dst, **page_params) output = render(layout, **page_params) @@ -148,6 +154,7 @@ def make_list(posts, dst, list_layout, item_layout, **params): items = [] for post in posts: item_params = dict(params, **post) + item_params['summary'] = truncate(post['content']) item = render(item_layout, **item_params) items.append(item) diff --git a/test/test_content.py b/test/test_content.py index 06ec97d..66342d9 100644 --- a/test/test_content.py +++ b/test/test_content.py @@ -11,7 +11,6 @@ class ContentTest(unittest.TestCase): self.blog_path = path.temppath('blog') self.undated_path = os.path.join(self.blog_path, 'foo.txt') self.dated_path = os.path.join(self.blog_path, '2018-01-01-foo.txt') - self.long_post_path = os.path.join(self.blog_path, 'bar.txt') self.normal_post_path = os.path.join(self.blog_path, 'baz.txt') self.md_post_path = os.path.join(self.blog_path, 'qux.md') self.no_md_post_path = os.path.join(self.blog_path, 'qux.txt') @@ -24,10 +23,6 @@ class ContentTest(unittest.TestCase): with open(self.dated_path, 'w') as f: f.write('hello world') - with open(self.long_post_path, 'w') as f: - self.long_text = ' \n'.join('word' + str(i) for i in range(50)) - f.write(self.long_text) - with open(self.normal_post_path, 'w') as f: f.write('<!-- a: 1 -->\n<!-- b: 2 -->\nFoo') @@ -45,13 +40,8 @@ class ContentTest(unittest.TestCase): self.mock_args = args def test_content_content(self): - content = makesite.read_content(self.long_post_path) - self.assertEqual(content['content'], self.long_text) - - def test_content_summary(self): - content = makesite.read_content(self.long_post_path) - expected_text = ' '.join('word' + str(i) for i in range(25)) - self.assertEqual(content['summary'], expected_text) + content = makesite.read_content(self.undated_path) + self.assertEqual(content['content'], 'hello world') def test_content_date(self): content = makesite.read_content(self.dated_path) diff --git a/test/test_pages.py b/test/test_pages.py index 9f52fb7..0fefdaa 100644 --- a/test/test_pages.py +++ b/test/test_pages.py @@ -22,6 +22,10 @@ class PagesTest(unittest.TestCase): f.write('<!-- tag: foo -->Foo') with open(os.path.join(self.blog_path, 'header-bar.txt'), 'w') as f: f.write('<!-- title: bar -->Bar') + with open(os.path.join(self.blog_path, 'placeholder-foo.txt'), 'w') as f: + f.write('<!-- title: foo -->{{ title }}:{{ author }}:Foo') + with open(os.path.join(self.blog_path, 'placeholder-bar.txt'), 'w') as f: + f.write('<!-- title: bar --><!-- render: yes -->{{ title }}:{{ author }}:Bar') def tearDown(self): shutil.rmtree(self.blog_path) @@ -77,3 +81,47 @@ class PagesTest(unittest.TestCase): self.assertEqual(f.read(), '{{ title }}:foo:Foo') with open(os.path.join(self.site_path, 'header-bar.txt')) as f: self.assertEqual(f.read(), 'bar:{{ tag }}:Bar') + + def test_content_no_rendering(self): + # Test that placeholders are not populated in content rendering + # by default. + src = os.path.join(self.blog_path, 'placeholder-foo.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '<div>{{ content }}</div>' + makesite.make_pages(src, dst, tpl, author='Admin') + with open(os.path.join(self.site_path, 'placeholder-foo.txt')) as f: + self.assertEqual(f.read(), '<div>{{ title }}:{{ author }}:Foo</div>') + + def test_content_rendering_via_kwargs(self): + # Test that placeholders are populated in content rendering when + # requested in make_pages. + src = os.path.join(self.blog_path, 'placeholder-foo.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '<div>{{ content }}</div>' + makesite.make_pages(src, dst, tpl, author='Admin', render='yes') + with open(os.path.join(self.site_path, 'placeholder-foo.txt')) as f: + self.assertEqual(f.read(), '<div>foo:Admin:Foo</div>') + + def test_content_rendering_via_header(self): + # Test that placeholders are populated in content rendering when + # requested in content header. + src = os.path.join(self.blog_path, 'placeholder-bar.txt') + dst = os.path.join(self.site_path, '{{ slug }}.txt') + tpl = '<div>{{ content }}</div>' + makesite.make_pages(src, dst, tpl, author='Admin') + with open(os.path.join(self.site_path, 'placeholder-bar.txt')) as f: + self.assertEqual(f.read(), '<div>bar:Admin:Bar</div>') + + def test_rendered_content_in_summary(self): + # Test that placeholders are populated in summary if and only if + # content rendering is enabled. + src = os.path.join(self.blog_path, 'placeholder*.txt') + post_dst = os.path.join(self.site_path, '{{ slug }}.txt') + list_dst = os.path.join(self.site_path, 'list.txt') + post_layout = '' + list_layout = '<div>{{ content }}</div>' + item_layout = '<p>{{ summary }}</p>' + posts = makesite.make_pages(src, post_dst, post_layout, author='Admin') + makesite.make_list(posts, list_dst, list_layout, item_layout) + with open(os.path.join(self.site_path, 'list.txt')) as f: + self.assertEqual(f.read(), '<div><p>{{ title }}:{{ author }}:Foo</p><p>bar:Admin:Bar</p></div>') diff --git a/test/test_truncate.py b/test/test_truncate.py new file mode 100644 index 0000000..3486d71 --- /dev/null +++ b/test/test_truncate.py @@ -0,0 +1,9 @@ +import unittest +import makesite + + +class TruncateTest(unittest.TestCase): + def test_truncate(self): + long_text = ' \n'.join('word' + str(i) for i in range(50)) + expected_text = ' '.join('word' + str(i) for i in range(25)) + self.assertEqual(makesite.truncate(long_text), expected_text) |