Aug 12, 2015
|
Перевел тут блог с https://www.blogger.com/ на abakan/ablog. Блоггер это конечно хорошо, но у него крайне ограниченный WYSIWYG, тем более только из браузера. Ablog по сути это sphinx движок заточенный на блог со всеми плюшками, rST разметкой, RSS и disqus комментами.
Можно добавить настройки в conf.py
уже существующего проекта:
# 1. Add 'ablog' to list of extensions
extensions = [
'...',
'ablog'
]
# 2. Add ablog templates path
import ablog
# 2a. if `templates_path` is not defined
templates_path = [ablog.get_html_templates_path()]
# 2b. if `templates_path` is defined
templates_path.append(ablog.get_html_templates_path())
Или создать новый проект:
$ ablog start
Что бы собрать блог нужно выполнить:
$ ablog build
HTML страницы создаются в папке _website
Что запустить блог достаточно выполнить:
$ ablog serve
теперь он доступен по адресу http://127:0.0.1:8000/
Главная страница блога это index.rst
. У меня она выглядит так:
.. postlist:: 100500
:excerpts:
:date: %d-%m-%Y
:format: {date} | {title}
Статьи могут находится в любом месте проекта, Ablog их находит автоматически. Я отвожу для этого отдельную папку:
articles/
├── 2011
│ ├── breadcrumbs.rst
│ ├── capslock.rst
│ ├── content_assigment.rst
│ ├── couchdb.rst
│ ├── demo.rst
│ ├── fa_keyerror.rst
│ ├── fa_rest_controller.rst
│ ├── formalchemy.rst
│ ├── java_iceweasel.rst
│ ├── js_rrd.rst
│ ├── peyote.rst
│ ├── psycopg2.rst
│ ├── pylons_backslash.rst
│ ├── pylons_jscss_minificator.rst
│ ├── repoze.what.rst
│ ├── rrd_cut2.rst
│ ├── rrd_cut.rst
│ ├── rrdtool_ds18b20.rst
│ ├── snmp.rst
│ ├── sqlalchemy_mixin.rst
│ ├── sqlalchemy_trigger.rst
│ ├── sqlalchemy_uml.rst
│ ├── sqlalchemy_why_postgres.rst
│ ├── thinkpad_trackpoint.rst
│ ├── wtforms.rst
│ ├── wtform_validation.rst
│ ├── xfce_button.rst
│ └── xfce_display.rst
├── 2012
│ ├── 3com.rst
│ ├── ajax_triple_select.rst
│ ├── arch_book.rst
│ ├── boyan.rst
│ ├── cms_pyramid2.rst
│ ├── cms_pyramid.rst
│ ├── debian_bc.rst
│ ├── fortune.rst
│ ├── http_header_pyramid.rst
│ ├── jinja_pylons_i18n.rst
│ ├── jinja_pyramid_i18n.rst
│ ├── jinja_silent_none.rst
│ ├── lisp_book.rst
│ ├── lisp.rst
│ ├── matplotlib_numpy_and_virtualenv.rst
│ ├── osm_example.rst
│ ├── osm_geotagging.rst
│ ├── paramiko.rst
│ ├── penguin_troll.rst
│ ├── penguin_vs_leo.rst
│ ├── pg_book.rst
│ ├── proxmox.rst
│ ├── proxy_apt.rst
│ ├── pycrypto_virtualenv.rst
│ ├── pylons_console.rst
│ ├── pylons_csv.rst
│ ├── pylons_yapsy.rst
│ ├── pypi.rst
│ ├── pyramid_as_django.rst
│ ├── pyramid_blog.rst
│ ├── pyramid_formalchemy.rst
│ ├── python_labirint.rst
│ ├── python_snmp.rst
│ ├── pyyandexmap.rst
│ ├── qtile.rst
│ ├── redactor-js.rst
│ ├── rrd_faketime.rst
│ ├── rrdtool.rst
│ ├── sa_big_table.rst
│ ├── shared_net.rst
│ ├── sphinx_github.rst
│ ├── sran.rst
│ ├── vi_book.rst
│ └── x220t_buttons.rst
├── 2013
│ ├── car_differ.rst
│ ├── dbsession_includeme.rst
│ ├── flag_jinja2.rst
│ ├── hdaps_music.rst
│ ├── hstore_plpython.rst
│ ├── jinja2_lorem_ipsum.rst
│ ├── linux_attack.rst
│ ├── matrix.rst
│ ├── penguin.rst
│ ├── python_vim.rst
│ ├── reason_names_of.rst
│ ├── sacrud_alfa_0_1_0.rst
│ ├── sacrud_demo.rst
│ ├── sacrud_howto.rst
│ ├── sacrud_release_0_0_3.rst
│ ├── sacrud_release_0_1_0.rst
│ ├── sacrud.rst
│ ├── vi_book.rst
│ ├── vim_book.rst
│ ├── wat.rst
│ └── where_to_start.rst
├── 2014
│ ├── alembic_pyramid.rst
│ ├── chameleon_deform.rst
│ ├── ci.rst
│ ├── cornice.rst
│ ├── django-hyango.rst
│ ├── go.rst
│ ├── ia32-libs-multiarch:i386.rst
│ ├── king_penguin.rst
│ ├── man_month_book.rst
│ ├── panel_pyramid_dt.rst
│ ├── sacrud_release_0.1.1.rst
│ ├── sacrud_release_0.1.2.rst
│ ├── scrum.rst
│ ├── sphinx.rst
│ ├── sqlalchemy_mptt_0_0_5.rst
│ ├── sqlalchemy_mptt.rst
│ └── sqlite_to_pg.rst
└── 2015
└── ablog.rst
5 directories, 111 files
Что бы файл *.rst
стал статьей в нем должна находится директива post
.
Например:
.. post:: 15 Apr, 2013
:tags: tips, ablog, directive
:category: Example, How To
:author: Ahmet, Durden
:location: Pittsburgh, SF
:redirect: blog/old-page-name-for-the-post
:excerpt: 2
:image: 1
Пример кода этой статьи:
.. post:: 12 Aug, 2015 12:06
:tags: Python, reStructuredText, Sphinx
:category: Python
:author: Uralbash
:language: ru
.. _ablog:
Блог в reStructuredText разметке
================================
.. image:: /_static/2015/uralbash.ru.png
:align: left
:width: 500px
Перевел тут блог с https://www.blogger.com/ на :github:`abakan/ablog`. Блоггер
это конечно хорошо, но у него крайне ограниченный WYSIWYG, тем более только из
браузера. :l:`Ablog` по сути это :pypi:`sphinx` движок заточенный на блог со
всеми плюшками, rST разметкой, RSS и disqus комментами.
.. raw:: html
<br clear="both"/>
<test/>
Профит
------
* :pypi:`Sphinx` позволяет автоматизировать многие вещи
* ``reStructuredText`` позволяет точно и красиво оформлять статьи, это как
писать "курсач" в LaTeX заместо MS Office
* писать в :l:`Vim` :)
* хоститься где угодно и хранить информацию у себя локально
Установка
---------
.. code-block:: bash
:caption: Стабильная версия с PyPi
$ pip install ablog
.. code-block:: bash
:caption: Свежая версия из мастера
$ pip install git+https://github.com/abakan/ablog
Инициализация нового проекта
----------------------------
.. seealso::
http://ablog.readthedocs.org/manual/ablog-quick-start/
Можно добавить настройки в ``conf.py`` уже существующего проекта:
.. code-block:: python
# 1. Add 'ablog' to list of extensions
extensions = [
'...',
'ablog'
]
# 2. Add ablog templates path
import ablog
# 2a. if `templates_path` is not defined
templates_path = [ablog.get_html_templates_path()]
# 2b. if `templates_path` is defined
templates_path.append(ablog.get_html_templates_path())
Или создать новый проект:
.. code-block:: bash
$ ablog start
Сборка и запуск
---------------
Что бы собрать блог нужно выполнить:
.. code-block:: bash
$ ablog build
HTML страницы создаются в папке ``_website``
Что запустить блог достаточно выполнить:
.. code-block:: bash
$ ablog serve
теперь он доступен по адресу http://127:0.0.1:8000/
Статьи
------
Главная страница блога это ``index.rst``. У меня она выглядит так:
.. code-block:: rst
:caption: index.rst
.. postlist:: 100500
:excerpts:
:date: %d-%m-%Y
:format: {date} | {title}
Статьи могут находится в любом месте проекта, :l:`Ablog` их находит
автоматически. Я отвожу для этого отдельную папку:
.. code-block:: bash
articles/
├── 2011
│ ├── breadcrumbs.rst
│ ├── capslock.rst
│ ├── content_assigment.rst
│ ├── couchdb.rst
│ ├── demo.rst
│ ├── fa_keyerror.rst
│ ├── fa_rest_controller.rst
│ ├── formalchemy.rst
│ ├── java_iceweasel.rst
│ ├── js_rrd.rst
│ ├── peyote.rst
│ ├── psycopg2.rst
│ ├── pylons_backslash.rst
│ ├── pylons_jscss_minificator.rst
│ ├── repoze.what.rst
│ ├── rrd_cut2.rst
│ ├── rrd_cut.rst
│ ├── rrdtool_ds18b20.rst
│ ├── snmp.rst
│ ├── sqlalchemy_mixin.rst
│ ├── sqlalchemy_trigger.rst
│ ├── sqlalchemy_uml.rst
│ ├── sqlalchemy_why_postgres.rst
│ ├── thinkpad_trackpoint.rst
│ ├── wtforms.rst
│ ├── wtform_validation.rst
│ ├── xfce_button.rst
│ └── xfce_display.rst
├── 2012
│ ├── 3com.rst
│ ├── ajax_triple_select.rst
│ ├── arch_book.rst
│ ├── boyan.rst
│ ├── cms_pyramid2.rst
│ ├── cms_pyramid.rst
│ ├── debian_bc.rst
│ ├── fortune.rst
│ ├── http_header_pyramid.rst
│ ├── jinja_pylons_i18n.rst
│ ├── jinja_pyramid_i18n.rst
│ ├── jinja_silent_none.rst
│ ├── lisp_book.rst
│ ├── lisp.rst
│ ├── matplotlib_numpy_and_virtualenv.rst
│ ├── osm_example.rst
│ ├── osm_geotagging.rst
│ ├── paramiko.rst
│ ├── penguin_troll.rst
│ ├── penguin_vs_leo.rst
│ ├── pg_book.rst
│ ├── proxmox.rst
│ ├── proxy_apt.rst
│ ├── pycrypto_virtualenv.rst
│ ├── pylons_console.rst
│ ├── pylons_csv.rst
│ ├── pylons_yapsy.rst
│ ├── pypi.rst
│ ├── pyramid_as_django.rst
│ ├── pyramid_blog.rst
│ ├── pyramid_formalchemy.rst
│ ├── python_labirint.rst
│ ├── python_snmp.rst
│ ├── pyyandexmap.rst
│ ├── qtile.rst
│ ├── redactor-js.rst
│ ├── rrd_faketime.rst
│ ├── rrdtool.rst
│ ├── sa_big_table.rst
│ ├── shared_net.rst
│ ├── sphinx_github.rst
│ ├── sran.rst
│ ├── vi_book.rst
│ └── x220t_buttons.rst
├── 2013
│ ├── car_differ.rst
│ ├── dbsession_includeme.rst
│ ├── flag_jinja2.rst
│ ├── hdaps_music.rst
│ ├── hstore_plpython.rst
│ ├── jinja2_lorem_ipsum.rst
│ ├── linux_attack.rst
│ ├── matrix.rst
│ ├── penguin.rst
│ ├── python_vim.rst
│ ├── reason_names_of.rst
│ ├── sacrud_alfa_0_1_0.rst
│ ├── sacrud_demo.rst
│ ├── sacrud_howto.rst
│ ├── sacrud_release_0_0_3.rst
│ ├── sacrud_release_0_1_0.rst
│ ├── sacrud.rst
│ ├── vi_book.rst
│ ├── vim_book.rst
│ ├── wat.rst
│ └── where_to_start.rst
├── 2014
│ ├── alembic_pyramid.rst
│ ├── chameleon_deform.rst
│ ├── ci.rst
│ ├── cornice.rst
│ ├── django-hyango.rst
│ ├── go.rst
│ ├── ia32-libs-multiarch:i386.rst
│ ├── king_penguin.rst
│ ├── man_month_book.rst
│ ├── panel_pyramid_dt.rst
│ ├── sacrud_release_0.1.1.rst
│ ├── sacrud_release_0.1.2.rst
│ ├── scrum.rst
│ ├── sphinx.rst
│ ├── sqlalchemy_mptt_0_0_5.rst
│ ├── sqlalchemy_mptt.rst
│ └── sqlite_to_pg.rst
└── 2015
└── ablog.rst
5 directories, 111 files
Что бы файл ``*.rst`` стал статьей в нем должна находится директива ``post``.
Например:
.. code-block:: rst
:caption: foo.rst
.. post:: 15 Apr, 2013
:tags: tips, ablog, directive
:category: Example, How To
:author: Ahmet, Durden
:location: Pittsburgh, SF
:redirect: blog/old-page-name-for-the-post
:excerpt: 2
:image: 1
.. seealso::
http://ablog.readthedocs.org/manual/posting-and-listing/#directive-post
Пример кода этой статьи:
.. literalinclude:: /articles/2015/ablog.rst
:language: rst
:caption: articles/2015/ablog.rst
Тема
----
Тема по умолчанию `Alabaster <https://github.com/bitprophet/alabaster>`_, но
можно поменять стандартными способами в ``conf.py``:
.. no-code-block:: python
:caption: conf.py установка темы
import itcase_sphinx_theme
...
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'itcase'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options = {
'github_button': False,
}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = [itcase_sphinx_theme.get_html_themes_path()]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
html_title = "Ural penguins"
Я использую :github:`ITCase/itcase_sphinx_theme` с переопределенными шаблонами.
Для этого нужно указать где искать шаблоны и в каком порядке:
.. code-block:: python
:caption: conf.py указание пути по шаблонов темы
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates', ablog.get_html_templates_path()]
Добавляем в папку ``_templates`` нашего проекта шаблон ``layout.html``:
.. literalinclude:: /_templates/layout.html
:language: html+jinja
:caption: _templates/layout.html
Комменты
--------
.. seealso::
http://ablog.readthedocs.org/manual/ablog-configuration-options/#disqus-integration
DISQUS ставится просто:
.. code-block:: python
:caption: настройки DISQUS
# -- disqus integration -------------------------------------------------------
# you can enable disqus_ by setting ``disqus_shortname`` variable.
# disqus_ short name for the blog.
disqus_shortname = "uralbash"
Правда у меня завелось только после переопределения шаблона ``page.html``:
.. literalinclude:: /_templates/page.html
:language: html+jinja
:caption: _templates/page.html
:emphasize-lines: 37
Деплой
------
.. note::
http://ablog.readthedocs.org/manual/deploy-to-github-pages/
#. Создать репу с именем ``<username>.github.io``
#. Добавить имя в настройки, например:
.. code-block:: python
:caption: conf.py настройки github pages
github_pages = "uralbash"
#. Сбилдить проект:
.. code-block:: bash
$ ablog build
#. Выложить на гитхаб:
.. code-block:: bash
$ ablog deploy
Итог
----
На мой взгляд лучшее решения для ``reStructuredText`` блога, местами сырой, но
активно развивается.
Тема по умолчанию Alabaster, но
можно поменять стандартными способами в conf.py
:
import itcase_sphinx_theme
...
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'itcase'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options = {
'github_button': False,
}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = [itcase_sphinx_theme.get_html_themes_path()]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
html_title = "Ural penguins"
Я использую ITCase/itcase_sphinx_theme с переопределенными шаблонами. Для этого нужно указать где искать шаблоны и в каком порядке:
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates', ablog.get_html_templates_path()]
Добавляем в папку _templates
нашего проекта шаблон layout.html
:
{% extends "base.html" %}
{% block breadcrumbs %}
<div class="head" style="background-image: url('/_static/bg.jpg');
background-size: 100%;
background-repeat: no-repeat;
height: 200px">
<a href="/">
<div style="width:100%; height: 75%">
<h1 style="padding-top:15px;padding-left:15px;font-size:60px">Ural penguins</h1>
</div>
</a>
<table style="
border-collapse: unset !important;
border-spacing: 1 !important;">
<tr>
<td style="padding-right: 2px">
<a href="/pages/pyramid/index.html">
<div style="background: white;width:100px;height:50px;line-height:50px;text-align:center;"
onmouseover="this.style.background='lightgrey';" onmouseout="this.style.background='white';">
Pyramid
</div>
</a>
</td>
<td>
<a href="/pages/nixos/index.html">
<div style="background: white;width:100px;height:50px;line-height:50px;text-align:center;"
onmouseover="this.style.background='lightgrey';" onmouseout="this.style.background='white';">
NixOS
</div>
</a>
</td>
</tr>
</table>
</div>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<div class="badge" style="width:100%;height:80px">
<!-- uralbash.ru -->
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-2884502571619359"
data-ad-slot="9876011339"
data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
{% endblock %}
{% block extrahead %}
<style type="text/css">
html, body {
background: #545d5c !important;
}
.page__left .menu {
width: 0px;
}
.page__right {
background-color: #e7e7e7;
margin: 0 0 0 30px;
}
.rst-content {
padding: 13px;
}
.footer {
padding: 13px;
}
/* unvisited link */
ul.postlist-style-none a:link, .head a:link {
color: #222;
text-decoration: none;
}
/* visited link */
ul.postlist-style-none a:visited, .head a:visited {
color: #222;
text-decoration: none;
}
/* mouse over link */
ul.postlist-style-none a:hover, .head a:hover {
color: #222;
text-decoration: none;
}
ul.postlist-style-none a:active, .head a:active {
color: #222;
text-decoration: none;
}
ul.postlist-style-none li {
list-style-type: none;
}
ul.postlist-style-none li p.first {
color: red !important;
font: 1.8em "Open Sans",Arial,sans-serif !important;
}
.first a {
font-weight: bold;
}
.first em {
font-style: normal !important;
}
.wrapper__inner {
padding: 0px 30px 0 0 !important;
}
.strike {
text-decoration: line-through;
}
</style>
{% endblock %}
{% block footer %}
{{ super() }}
<div class="footer__theme">
<a href="https://github.com/sunpy/ablog" class="footer__theme-link">
Ablog powered.
</a>
</div>
<div class="footer__theme">
<a href="http://uralbash.ru/blog/atom.xml" class="footer__theme-link">
RSS/Atom
</a>
</div>
<div class="footer__theme">
<a href="https://uralbash.blogspot.com" class="footer__theme-link">
Старый блог
</a>
</div>
{% endblock %}
DISQUS ставится просто:
# -- disqus integration -------------------------------------------------------
# you can enable disqus_ by setting ``disqus_shortname`` variable.
# disqus_ short name for the blog.
disqus_shortname = "uralbash"
Правда у меня завелось только после переопределения шаблона page.html
:
{%- extends "layout.html" %}
{% set fa = ablog.fontawesome %}
{%- block extrahead %}
{{ super() }}
{% if atom_feed %}
<link rel="alternate" type="application/atom+xml" href="{{ pathto(feed_path, 1) }}/atom.xml" title="{{ ablog.blog_title }}">
{% endif %}
{% if ablog.fontawesome_link_cdn%}
<link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css" rel="stylesheet">
{% elif ablog.fontawesome_css_file %}
<link rel="stylesheet" href="{{ pathto('_static/' + ablog.fontawesome_css_file, 1) }}" type="text/css" />
{% endif %}
<style type="text/css">
ul.ablog-archive {list-style: none; overflow: auto; margin-left: 0px}
ul.ablog-archive li {float: left; margin-right: 5px; font-size: 80%}
ul.post-list-style-disc {list-style-type: disc;}
ul.post-list-style-none {list-style-type: none;}
ul.post-list-style-circle {list-style-type: circle;}
</style>
{% endblock %}
{% block body %}
<script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script>
<table>
<tr>
<td>
<div class="yashare-auto-init" data-yashareL10n="ru"
data-yashareType="medium"
data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,gplus"
data-yashareTheme="counter"></div>
</td>
<td>
{% include "my_postcard.html" %}
</td>
</tr>
</table>
{{ body }}
<div class="section">
{% if pagename in ablog %}
{% include "postnavy.html" %}
{% endif %}
{%- if not internal_build and (pagename != 'index') %}
{# {% if ablog.disqus_shortname and ablog.blog_baseurl and ((pagename in ablog and (ablog[pagename].published or ablog.disqus_drafts)) or (not pagename in ablog and ablog.disqus_pages)) %} #}
<div class="section">
<br />
<script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script><div class="yashare-auto-init" data-yashareL10n="ru" data-yashareType="medium" data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,gplus" data-yashareTheme="counter"></div>
<h2>Comments</h2>
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = '{{ ablog.disqus_shortname }}'; // required: replace example with your forum shortname
var disqus_identifier = '{{ablog.page_id(pagename)}}';
var disqus_title = '{{title|e}}';
{# var disqus_url = '{{ablog.page_url(pagename)}}'; #}
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
{% endif %}
</div>
{% endblock %}
Создать репу с именем <username>.github.io
Добавить имя в настройки, например:
github_pages = "uralbash"
Сбилдить проект:
$ ablog build
Выложить на гитхаб:
$ ablog deploy
На мой взгляд лучшее решения для reStructuredText
блога, местами сырой, но
активно развивается.