Merge branch 'master' of https://github.com/arulrajnet/attila into upstream

This commit is contained in:
Yorick Barbanneau 2020-02-19 10:57:30 +01:00
commit 1057189416
21 changed files with 304 additions and 77 deletions

28
.github/workflows/main.yml vendored Normal file
View file

@ -0,0 +1,28 @@
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-18.04
strategy:
max-parallel: 4
matrix:
python-version: [2.7, 3.5, 3.6, 3.7]
steps:
- uses: actions/checkout@v1
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r tests/requirements.txt
pelican-themes -i ../attila
- name: Test with pytest
run: |
cd tests
pytest

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
*.pyc
*.log
output
tests/.cache/

View file

@ -81,14 +81,20 @@ You can set cover images for your blog, article, page, tag, category and author.
The is the cover image for your site main index.html.
To set blog cover, set the property `HEADER_COVER` in
To set blog cover, set the property `HOME_COVER` in
`pelicanconf.py`:
[source,python]
----
HEADER_COVER = '/assets/images/blog_cover.png'
HOME_COVER = '/assets/images/blog_cover.png'
----
[NOTE]
====
HEADER_COVER property is deprecated. Work around will be use HOME_COVER and use cover in individual articles.
This property will be used if there is no cover image set to an article, page, tag, category, author.
====
[[article-cover]]
==== Article Cover
@ -167,17 +173,22 @@ For more refer link:#author-bio[author] .
=== Header Color
To define a simple header background color, set the property
`HEADER_COLOR` in `pelicanconf.py`:
`HOME_COLOR` in `pelicanconf.py`:
[source,python]
----
HEADER_COLOR = 'black'
HOME_COLOR = 'black'
----
you can use any valid css color. This will be used if there is no cover
image set in link:#articles[article] level and site level.
This property will be used if there is no cover image set to an article, page, tag, category, author.
[NOTE]
====
HEADER_COLOR property is deprecated. Work around will be use HOME_COLOR and use color in individual articles.
This property will be used if there is no HEADER_COVER and cover image set to an article, page, tag, category, author.
====
[[social-urls]]
=== Social URLs

File diff suppressed because one or more lines are too long

View file

@ -15,7 +15,7 @@
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -36,8 +36,6 @@
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="blog-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -27,10 +27,10 @@
{% set selected_color = HEADER_COLOR %}
{% endif %}
{% block canonical_url %}<link href="{{ SITEURL }}/{{ article.url }}" rel="canonical" />{% endblock canonical_url %}
{% block head %}
{{ super() }}
<link href="{{ SITEURL }}/{{ article.url }}" rel="canonical" />
{% for keyword in article.keywords %}
<meta name="keywords" content="{{keyword}}" >
{% endfor %}
@ -63,7 +63,7 @@
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="post-header" class="has-cover">
<header id="post-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -102,8 +102,6 @@
<div class="post-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="post-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="post-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -46,7 +46,7 @@
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -66,14 +66,12 @@
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="blog-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>
{% if AUTHORS_BIO and author.name.lower() in AUTHORS_BIO %}
<section id="blog-author" class="has-cover" >
<section id="blog-author" {% if selected_cover or selected_color %}class="has-cover"{% endif %} >
<div class="inner">
<aside class="post-author">
{% if selected_avatar %}

View file

@ -16,7 +16,7 @@
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -37,8 +37,6 @@
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="blog-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -21,7 +21,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="referrer" content="origin" />
<meta name="generator" content="Pelican" />
<link href="{{ SITEURL }}/" rel="canonical" />
{% block canonical_url %}<link href="{{ SITEURL }}/" rel="canonical" />{% endblock canonical_url %}
<!-- Feed -->
{% for name,link in SOCIAL if name.lower() in ['rss', 'rss-square', 'feed'] %}
@ -116,6 +116,7 @@
</footer>
</section>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript" src="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/js/script.js"></script>
{% if JS_OVERRIDE %}

View file

@ -15,7 +15,7 @@
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -36,8 +36,6 @@
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="blog-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -23,7 +23,7 @@
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -45,8 +45,6 @@
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="blog-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -12,14 +12,22 @@
{% else %}
{% set selected_cover = SITEURL+"/"+HEADER_COVER %}
{% endif %}
{% elif HOME_COVER %}
{% if HOME_COVER|lower|truncate(4, True, '') == "http" %}
{% set selected_cover = HOME_COVER %}
{% else %}
{% set selected_cover = SITEURL+"/"+HOME_COVER %}
{% endif %}
{% elif HEADER_COLOR %}
{% set selected_color = HEADER_COLOR %}
{% elif HOME_COLOR %}
{% set selected_color = HOME_COLOR %}
{% endif %}
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -40,8 +48,6 @@
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="blog-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -2,6 +2,10 @@
{% block title %}{{ page.title }}{% endblock title %}
{% block canonical_url %}
<link href="{{ SITEURL }}/{{ page.url }}" rel="canonical" />
{% endblock canonical_url %}
{# <!-- Choosing cover image --> #}
{% if page.cover %}
{% if page.cover|lower|truncate(4, True, '') == "http" %}
@ -30,7 +34,7 @@
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="post-header" class="has-cover">
<header id="post-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -51,8 +55,6 @@
<div class="post-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="post-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="post-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -2,10 +2,20 @@
{% block title %}{{ SITENAME }} - Archives for {{ period | reverse | join (' ') }}{% endblock %}
{% if HEADER_COVER %}
{% if HEADER_COVER|lower|truncate(4, True, '') == "http" %}
{% set selected_cover = HEADER_COVER %}
{% else %}
{% set selected_cover = SITEURL+"/"+HEADER_COVER %}
{% endif %}
{% elif HEADER_COLOR %}
{% set selected_color = HEADER_COLOR %}
{% endif %}
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -22,12 +32,10 @@
</span>
</nav>
<h1 class="post-title">Archives for {{ period | reverse | join (' ') }}</h1>
{% if HEADER_COVER %}
<div class="blog-cover cover" style="background-image: url('{{ HEADER_COVER }}')">
{% elif HEADER_COLOR %}
<div class="post-cover cover" style="background-color: {{ HEADER_COLOR }}">
{% else %}
<div class="post-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% if selected_cover %}
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% endif %}
</div>
</header>

View file

@ -23,7 +23,7 @@
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -45,8 +45,6 @@
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="blog-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -15,7 +15,7 @@
{% block header %}
<!-- Page Header -->
<!-- Set your background image for this header on the line below. -->
<header id="blog-header" class="has-cover">
<header id="blog-header" {% if selected_cover or selected_color %}class="has-cover"{% endif %}>
<div class="inner">
<nav id="navigation">
{% if SITE_LOGO %}
@ -36,8 +36,6 @@
<div class="blog-cover cover" style="background-image: url('{{ selected_cover }}')">
{% elif selected_color %}
<div class="blog-cover cover" style="background-color: {{ selected_color }}">
{% else %}
<div class="blog-cover cover" style="background-image: url('{{ SITEURL }}/{{ THEME_STATIC_DIR }}/images/post-bg.jpg')">
{% endif %}
</div>
</header>

View file

@ -4,6 +4,7 @@ from __future__ import unicode_literals
AUTHOR = u'Zutrinken'
SITENAME = u'Attila Demo'
SITESUBTITLE = u'Blog description here.'
SITEURL = ''
PATH = 'content'
@ -114,6 +115,18 @@ COLOR_SCHEME_CSS = 'github.css'
CSS_OVERRIDE = ['assets/css/myblog.css']
# Jinja config - Pelican 4
JINJA_ENVIRONMENT = {
'extensions' :[
'jinja2.ext.loopcontrols',
'jinja2.ext.i18n',
'jinja2.ext.with_',
'jinja2.ext.do'
]
}
JINJA_FILTERS = {'max': max}
# AUTHORS_BIO = {
# "arul": {
# "name": "Arul",

3
tests/requirements.txt Normal file
View file

@ -0,0 +1,3 @@
pelican
BeautifulSoup4
pytest

View file

@ -246,10 +246,15 @@ class BaseTest(object):
def gen_article_and_html_from_rst(self, rstPath):
content, metadata = self.reader.read(rstPath)
article = Article(content=content, metadata=metadata)
generator = ArticlesGenerator( context=self.settings.copy(), settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR)
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 = filter(f, generator.context["articles"])[0]
result = list(filter(f, generator.context["articles"]))[0]
self.writer.write_file(
result.save_as, generator.get_template('article'),
generator.context, article=result)
@ -259,10 +264,15 @@ class BaseTest(object):
def gen_page_and_html_from_rst(self, rstPath):
content, metadata = self.reader.read(rstPath)
page = Page(content=content, metadata=metadata)
generator = PagesGenerator( context=self.settings.copy(), settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR)
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 = filter(f, generator.context["pages"])[0]
result = list(filter(f, generator.context["pages"]))[0]
self.writer.write_file(
result.save_as, generator.get_template('page'),
generator.context, page=result)
@ -270,7 +280,12 @@ class BaseTest(object):
return (result, soup)
def gen_tag_and_html_from_name(self, name):
generator = ArticlesGenerator( context=self.settings.copy(), settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR)
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
@ -283,7 +298,12 @@ class BaseTest(object):
return (selectedTag, soup)
def gen_category_and_html_from_name(self, name):
generator = ArticlesGenerator( context=self.settings.copy(), settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR)
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
@ -296,7 +316,12 @@ class BaseTest(object):
return (selectedCategory, soup)
def gen_author_and_html_from_name(self, name):
generator = ArticlesGenerator( context=self.settings.copy(), settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR)
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

View file

@ -10,7 +10,7 @@ def tearDownModule():
print("teardown module")
try:
rmtree(OUTPUT_DIR)
except OSError, e:
except OSError as e:
print ("Error: %s - %s." % (e.filename,e.strerror))
class AuthorSocialLinksTest(unittest.TestCase, BaseTest):

View file

@ -13,7 +13,7 @@ def tearDownModule():
print("teardown module")
try:
rmtree(OUTPUT_DIR)
except OSError, e:
except OSError as e:
print ("Error: %s - %s." % (e.filename,e.strerror))
class ArticleCoverImageTest(unittest.TestCase, BaseTest):
@ -59,9 +59,9 @@ class ArticleCoverImageTest(unittest.TestCase, BaseTest):
def test_article_theme_cover(self):
rstPath="content/article_without_cover.rst"
result, soup = self.gen_article_and_html_from_rst(rstPath)
selected = soup.find(name="div", attrs={"class": "post-cover cover"})
selected = soup.find(id="post-header")
# Assertion
self.assertTrue("/theme/images/post-bg.jpg" in selected["style"])
self.assertTrue("class" not in selected)
def test_article_header_color(self):
self.settings['HEADER_COLOR']='blue'
@ -120,9 +120,9 @@ class PageCoverImageTest(unittest.TestCase, BaseTest):
def test_page_theme_cover(self):
rstPath="content/pages/page_without_cover_image.rst"
result, soup = self.gen_page_and_html_from_rst(rstPath)
selected = soup.find(name="div", attrs={"class": "post-cover cover"})
selected = soup.find(id="post-header")
# Assertion
self.assertTrue("/theme/images/post-bg.jpg" in selected["style"])
self.assertTrue("class" not in selected)
def test_page_header_color(self):
self.settings['HEADER_COLOR']='blue'
@ -156,9 +156,9 @@ class TagCoverImageTest(unittest.TestCase, BaseTest):
def test_footag_theme_cover(self):
result, soup = self.gen_tag_and_html_from_name("footag")
selected = soup.find(name="div", attrs={"class": "blog-cover cover"})
selected = soup.find(id="blog-header")
# Assertion
self.assertTrue("/theme/images/post-bg.jpg" in selected["style"])
self.assertTrue("class" not in selected)
def test_footag_cover(self):
tagName = "footag"
@ -204,9 +204,9 @@ class TagCoverImageTest(unittest.TestCase, BaseTest):
def test_bartag_theme_cover(self):
result, soup = self.gen_tag_and_html_from_name("bartag")
selected = soup.find(name="div", attrs={"class": "blog-cover cover"})
selected = soup.find(id="blog-header")
# Assertion
self.assertTrue("/theme/images/post-bg.jpg" in selected["style"])
self.assertTrue("class" not in selected)
def test_bartag_cover(self):
tagName = "bartag"
@ -261,9 +261,9 @@ class CategoryCoverImageTest(unittest.TestCase, BaseTest):
def test_foo_theme_cover(self):
result, soup = self.gen_category_and_html_from_name("foo")
selected = soup.find(name="div", attrs={"class": "blog-cover cover"})
selected = soup.find(id="blog-header")
# Assertion
self.assertTrue("/theme/images/post-bg.jpg" in selected["style"])
self.assertTrue("class" not in selected)
def test_foo_cover(self):
categoryName = "foo"
@ -309,9 +309,9 @@ class CategoryCoverImageTest(unittest.TestCase, BaseTest):
def test_bar_theme_cover(self):
result, soup = self.gen_category_and_html_from_name("bar")
selected = soup.find(name="div", attrs={"class": "blog-cover cover"})
selected = soup.find(id="blog-header")
# Assertion
self.assertTrue("/theme/images/post-bg.jpg" in selected["style"])
self.assertTrue("class" not in selected)
def test_bar_cover(self):
categoryName = "bar"
@ -365,9 +365,9 @@ class AuthorCoverImageTest(unittest.TestCase, BaseTest):
def test_arul_theme_cover(self):
result, soup = self.gen_author_and_html_from_name("arul")
selected = soup.find(name="div", attrs={"class": "blog-cover cover"})
selected = soup.find(id="blog-header")
# Assertion
self.assertTrue("/theme/images/post-bg.jpg" in selected["style"])
self.assertTrue("class" not in selected)
def test_arul_cover(self):
authorName = "arul"
@ -417,9 +417,9 @@ class AuthorCoverImageTest(unittest.TestCase, BaseTest):
def test_raj_theme_cover(self):
result, soup = self.gen_author_and_html_from_name("raj")
selected = soup.find(name="div", attrs={"class": "blog-cover cover"})
selected = soup.find(id="blog-header")
# Assertion
self.assertTrue("/theme/images/post-bg.jpg" in selected["style"])
self.assertTrue("class" not in selected)
def test_raj_cover(self):
authorName = "raj"