Aug 12, 2015

Блог в reStructuredText разметке

../../../_images/uralbash.ru.png

Перевел тут блог с https://www.blogger.com/ на abakan/ablog. Блоггер это конечно хорошо, но у него крайне ограниченный WYSIWYG, тем более только из браузера. Ablog по сути это sphinx движок заточенный на блог со всеми плюшками, rST разметкой, RSS и disqus комментами.


Профит

  • Sphinx позволяет автоматизировать многие вещи
  • reStructuredText позволяет точно и красиво оформлять статьи, это как писать “курсач” в LaTeX заместо MS Office
  • писать в Vim :)
  • хоститься где угодно и хранить информацию у себя локально

Установка

Стабильная версия с PyPi
$ pip install ablog
Свежая версия из мастера
$ pip install git+https://github.com/abakan/ablog

Инициализация нового проекта

Можно добавить настройки в 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. У меня она выглядит так:

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. Например:

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

Пример кода этой статьи:

articles/2015/ablog.rst
.. 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:

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 с переопределенными шаблонами. Для этого нужно указать где искать шаблоны и в каком порядке:

conf.py указание пути по шаблонов темы
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates', ablog.get_html_templates_path()]

Добавляем в папку _templates нашего проекта шаблон layout.html:

_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
# -- disqus integration -------------------------------------------------------

# you can enable disqus_ by setting ``disqus_shortname`` variable.
# disqus_ short name for the blog.
disqus_shortname = "uralbash"

Правда у меня завелось только после переопределения шаблона page.html:

_templates/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 %}

Деплой

  1. Создать репу с именем <username>.github.io

  2. Добавить имя в настройки, например:

    conf.py настройки github pages
    github_pages = "uralbash"
    
  3. Сбилдить проект:

    $ ablog build
    
  4. Выложить на гитхаб:

    $ ablog deploy
    

Итог

На мой взгляд лучшее решения для reStructuredText блога, местами сырой, но активно развивается.


Comments

comments powered by Disqus