Skip to content

Commit

Permalink
Merge branch 'for-index-pages' into dev
Browse files Browse the repository at this point in the history
* Add collection support
* Add custom category settings
* Add new (default) theme, simple2
  • Loading branch information
tankywoo committed May 24, 2016
2 parents 575d768 + 4a4c1b9 commit 3a18550
Show file tree
Hide file tree
Showing 16 changed files with 799 additions and 65 deletions.
2 changes: 1 addition & 1 deletion simiki/config.py
Expand Up @@ -31,7 +31,7 @@ def _set_default_config():
"destination": "output",
"attach": "attach",
"themes_dir": "themes",
"theme": "simple",
"theme": "simple2",
"default_ext": "md",
"pygments": True,
"debug": False,
Expand Down
95 changes: 78 additions & 17 deletions simiki/generators.py
Expand Up @@ -250,13 +250,15 @@ def __init__(self, site_config, base_path, pages):
:pages: all pages' meta variables, dict type
'''
super(CatalogGenerator, self).__init__(site_config, base_path)
self.pages = pages
self._pages = pages
self.pages = None
self.structure = None

def get_content_structure_and_meta(self):
def get_structure(self):
"""Ref: http://stackoverflow.com/a/9619101/1276501"""
dct = {}
ext = self.site_config["default_ext"]
for path, meta in self.pages.items():
for path, meta in self._pages.items():
# Ignore other files
if not path.endswith(ext):
continue
Expand All @@ -268,9 +270,11 @@ def get_content_structure_and_meta(self):
else:
p = p.setdefault(x, {})

return dct.get(self.site_config['source'], {})
self.structure = dct.get(self.site_config['source'], {})

self.sort_structure()

def sort_structure(self, structure):
def sort_structure(self):
"""Sort index structure in lower-case, alphabetical order
Compare argument is a key/value structure, if the compare argument is a
Expand All @@ -291,21 +295,78 @@ def _cmp(arg1, arg2):
elif is_py3:
sorted_opts = {'key': cmp_to_key(_cmp)}

sorted_structure = copy.deepcopy(structure)
for k, _ in sorted_structure.items():
sorted_structure = OrderedDict(sorted(
sorted_structure.items(),
**sorted_opts
))
if k.endswith(".{0}".format(self.site_config["default_ext"])):
continue
sorted_structure[k] = self.sort_structure(sorted_structure[k])
return sorted_structure
def _sort(structure):
sorted_structure = copy.deepcopy(structure)
for k, _ in sorted_structure.items():
sorted_structure = OrderedDict(sorted(
sorted_structure.items(),
**sorted_opts
))
if k.endswith(".{0}".format(self.site_config["default_ext"])):
continue
sorted_structure[k] = _sort(sorted_structure[k])
return sorted_structure

self.structure = _sort(self.structure)

def get_pages(self):
# for custom category settings in _config.yml
_category = {}
for c in self.site_config.get('category', []):
c_name = c.pop('name')
_category[c_name] = c

def convert(d, prefix=''):
pages = []
for k, v in d.items():
if 'name' in v: # page
v.update({'fname': k})
pages.append(v)
else:
k_with_prefix = os.path.join(prefix, k)
_pages = convert(v, prefix=k_with_prefix)
_s_category = {'name': k, 'pages': _pages}
if k_with_prefix in _category:
_s_category.update(_category[k_with_prefix])
pages.append(_s_category)

return pages

# get pages from structure
self.pages = convert(self.structure)

self.update_pages_collection()

def update_pages_collection(self):
pages = copy.deepcopy(self.pages)
self.pages = []
# for two-level, first level is category
for category in pages:
_c_pages = []
_colls = {}
for page in category.pop('pages'):
if 'collection' in page:
coll_name = page['collection']
_colls.setdefault(coll_name, []).append(page)
else:
_c_pages.append(page)
colls = []
for _coll_n, _coll_p in _colls.items():
colls.append({'name': _coll_n, 'pages': _coll_p})
_c_pages.extend(colls)
category.update({'pages': _c_pages})
self.pages.append(category)

def get_template_vars(self):
template_vars = copy.deepcopy(self._template_vars)
structure = self.sort_structure(self.get_content_structure_and_meta())
template_vars['site'].update({'structure': structure})

self.get_structure()
# `structure' is deprecated and will be removed later
# use `pages' instead
template_vars['site'].update({'structure': self.structure})

self.get_pages()
template_vars.update({'pages': self.pages})

return template_vars

Expand Down
29 changes: 29 additions & 0 deletions simiki/themes/simple2/base.html
@@ -0,0 +1,29 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="Stylesheet" type="text/css" href="{{ site.root }}/static/css/style.css">
<link rel="Stylesheet" type="text/css" href="{{ site.root }}/static/css/tango.css">
<link rel="shortcut icon" href="{{ site.root }}/favicon.ico" type="image/x-icon">
<link rel="icon" href="{{ site.root }}/favicon.ico" type="image/x-icon">
<link rel="alternate" type="application/atom+xml" href="atom.xml" title="Atom feed">
<title>{% block title %}{{ site.title }}{% endblock %}</title>
<meta name="keywords" content="{{ site.keywords }}"/>
<meta name="description" content="{{ site.description }}"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
<div id="container">
{% block container %}
{{ page.content }}
{% endblock %}
</div>
<div id="footer">
<span>
<p>Copyright © {{ site.time.strftime("%Y") }} {{ site.author }}.
Powered by <a href="http://simiki.org/" target="_blank">Simiki</a>.</p>
<p>Site Generated {{ site.time.strftime("%Y-%m-%d %H:%M:%S") }}</p>
</span>
</div>
</body>
</html>
49 changes: 49 additions & 0 deletions simiki/themes/simple2/index.html
@@ -0,0 +1,49 @@
{%- extends "base.html" %}

{%- block title %}{{ site.title }}{% endblock %}

{%- block container %}
<div class="title">{{ site.title }}</div>

<div class="index">
{%- if site.index %} {# custom index page #}
{{ page.content }}
{%- else %} {# auto generate index page #}
{%- for category in pages %}
{%- if site.default_ext not in category %} {# is category #}
<div class="category">
<h2 id="{{ category.name }}">
{%- if 'label' in category %}{{ category.label }}
{%- else %}{{ category.name|capitalize }}{% endif %}
</h2>
<div class="category_pages">
<ul>
{%- for page in category.pages %}
<li class="pagelist">
{%- if site.default_ext in page.fname %} {# is page #}
<a href="./{{ category.name }}/{{ page.name }}.html">{{ page.title }}</a>
{%- if 'description' in page %}
&nbsp;&nbsp;&nbsp;{{ page.description }}
{% endif %}
{%- elif 'pages' in page %} {# is collection #}
{% set coll = page %} {# for readability #}
{{ coll.name }}&nbsp;&#58;&nbsp;
{%- for coll_page in coll.pages %}
<a href="./{{ category.name }}/{{ coll_page.name }}.html">{{ coll_page.title }}</a>
{%- if 'description' in coll_page %}
&nbsp;{{ coll_page.description }}
{% endif %}
{%- if not loop.last %}&nbsp;&#47;&nbsp;{% endif %}
{%- endfor %}
{%- endif %}
</li>
{%- endfor %}
</ul>
</div> <!-- end category_pages -->
</div> <!-- end category -->
{%- endif %}
<div class="clearfix"></div>
{%- endfor %}
{%- endif %}
</div>
{%- endblock %}
34 changes: 34 additions & 0 deletions simiki/themes/simple2/page.html
@@ -0,0 +1,34 @@
{%- extends "base.html" %}

{%- block title %}{{ page.title }} - {{ site.title }}{% endblock %}

{%- block container %}
<div id="header">
<div class="post-nav">
{%- if not default_home_page -%}
<a href="{{ site.root }}/">Home</a>
{%- if page.category -%}
{%- for c in page.category.split("/") -%}
{%- if loop.first -%}
{%- set id = c -%}
{%- else -%}
{% set id = id ~ "-" ~ c -%}
{%- endif -%}
&nbsp;&#187;&nbsp;<a href="{{ site.root }}/#{{ id }}">{{ c }}</a>
{%- endfor -%}
{%- endif -%}
&nbsp;&#187;&nbsp;{{ page.title }}
<span class="updated">Updated&nbsp;
{% if page.updated %}{{ page.updated }}
{% else %}{{ page.date }}{% endif %}
</span>
{%- endif -%}
</div>
</div>
<div class="clearfix"></div>

<div class="page_title">{{ page.title }}</div>

{{ page.content }}

{%- endblock %}

0 comments on commit 3a18550

Please sign in to comment.