summaryrefslogtreecommitdiffstats
path: root/docs/manual.txt
diff options
context:
space:
mode:
Diffstat (limited to 'docs/manual.txt')
-rw-r--r--docs/manual.txt2025
1 files changed, 0 insertions, 2025 deletions
diff --git a/docs/manual.txt b/docs/manual.txt
deleted file mode 100644
index 09f428a..0000000
--- a/docs/manual.txt
+++ /dev/null
@@ -1,2025 +0,0 @@
-.. title: The Nikola Handbook
-.. slug: handbook
-.. date: 2012-03-30 23:00:00 UTC-03:00
-.. link:
-.. description:
-.. tags: mathjax
-
-The Nikola Handbook
-===================
-
-:Version: 7.6.4
-
-.. class:: alert alert-info pull-right
-
-.. contents::
-
-
-All You Need to Know
---------------------
-
-After you have Nikola `installed <https://getnikola.com/getting-started.html>`_:
-
-Create an empty site (with a setup wizard):
- ``nikola init mysite``
-
-You can create a site with demo files in it with ``nikola init --demo mysite``
-
-The rest of these commands have to be executed inside the new ``mysite`` folder.
-
-Create a post:
- ``nikola new_post``
-
-Edit the post:
- The filename should be in the output of the previous command.
- You can also use ``nikola new_post -e`` to open an editor automatically.
-
-Build the site:
- ``nikola build``
-
-Start the test server and open a browser:
- ``nikola serve -b``
-
-
-That should get you going. If you want to know more, this manual will always be here
-for you.
-
-DON'T READ THIS MANUAL. IF YOU NEED TO READ IT I FAILED, JUST USE THE THING.
-
-On the other hand, if anything about Nikola is not as obvious as it should be, by all
-means tell me about it :-)
-
-What's Nikola and what can you do with it?
-------------------------------------------
-
-Nikola is a static website and blog generator. The very short explanation is
-that it takes some texts you wrote, and uses them to create a folder full
-of HTML files. If you upload that folder to a server, you will have a
-rather full-featured website, done with little effort.
-
-Its original goal is to create blogs, but it supports most kind of sites, and
-can be used as a CMS, as long as what you present to the user is your own content
-instead of something the user generates.
-
-Nikola can do:
-
-* A blog (`example <http://ralsina.me>`__)
-* Your company's site
-* Your personal site
-* A software project's site (`example <https://getnikola.com>`__)
-* A book's site
-
-Since Nikola-based sites don't run any code on the server, there is no way to process
-user input in forms.
-
-Nikola can't do:
-
-* Twitter
-* Facebook
-* An Issue tracker
-* Anything with forms, really (except for `comments <#comments-and-annotations>`_!)
-
-Keep in mind that "static" doesn't mean **boring**. You can have animations, slides
-or whatever fancy CSS/HTML5 thingie you like. It only means all that HTML is
-generated already before being uploaded. On the other hand, Nikola sites will
-tend to be content-heavy. What Nikola is good at is at putting what you write
-out there.
-
-Getting Help
-------------
-
-.. class:: lead
-
-`Get help here! <https://getnikola.com/contact.html>`_
-
-TL;DR:
-
-* You can file bugs at `the issue tracker <https://github.com/getnikola/nikola/issues>`__
-* You can discuss Nikola at the `nikola-discuss google group <http://groups.google.com/group/nikola-discuss>`_
-* You can subscribe to `the Nikola Blog <https://getnikola.com/blog>`_
-* You can follow `Nikola on Twitter <https://twitter.com/GetNikola>`_
-
-Why Static?
------------
-
-Most "modern" websites are *dynamic* in the sense that the contents of the site
-live in a database, and are converted into presentation-ready HTML only when a
-user wants to see the page. That's great. However, it presents some minor issues
-that static site generators try to solve.
-
-In a static site, the whole site, every page, *everything*, is created before
-the first user even sees it and uploaded to the server as a simple folder full
-of HTML files (and images, CSS, etc).
-
-So, let's see some reasons for using static sites:
-
-Security
- Dynamic sites are prone to experience security issues. The solution for that
- is constant vigilance, keeping the software behind the site updated, and
- plain old good luck. The stack of software used to provide a static site,
- like those Nikola generates, is much smaller (Just a web server).
-
- A smaller software stack implies less security risk.
-
-Obsolescense
- If you create a site using (for example) WordPress, what happens when WordPress
- releases a new version? You have to update your WordPress. That is not optional,
- because of security and support issues. If I release a new version of Nikola, and
- you don't update, *nothing* happens. You can continue to use the version you
- have now forever, no problems.
-
- Also, in the longer term, the very foundations of dynamic sites shift. Can you
- still deploy a blog software based on Django 0.96? What happens when your
- host stops supporting the php version you rely on? And so on.
-
- You may say those are long term issues, or that they won't matter for years. Well,
- I believe things should work forever, or as close to it as we can make them.
- Nikola's static output and its input files will work as long as you can install
- a Python 2.7/3.3 or newer under Linux, Windows, or OS X and can find a server
- that sends files over HTTP. That's probably 10 or 15 years at least.
-
- Also, static sites are easily handled by the Internet Archive.
-
-Cost and Performance
- On dynamic sites, every time a reader wants a page, a whole lot of database
- queries are made. Then a whole pile of code chews that data, and HTML is
- produced, which is sent to the user. All that requires CPU and memory.
-
- On a static site, the highly optimized HTTP server reads the file from disk
- (or, if it's a popular file, from disk cache), and sends it to the user. You could
- probably serve a bazillion (technical term) pageviews from a phone using
- static sites.
-
-Lock-in
- On server-side blog platforms, sometimes you can't export your own data, or
- it's in strange formats you can't use in other services. I have switched
- blogging platforms from Advogato to PyCs to two homebrew systems, to Nikola,
- and have never lost a file, a URL, or a comment. That's because I have *always*
- had my own data in a format of my choice.
-
- With Nikola, you own your files, and you can do anything with them.
-
-Components
-----------
-
-Nikola provides the following features:
-
-* Blog support, including:
-
- * Indexes
- * RSS and Atom feeds
- * Tags and categories, with pages and feeds
- * Archives with custom granularity (yearly or monthly)
- * `Comments`_
- * Client-side tag clouds (needs manual configuration)
-
-* Static pages (not part of the blog)
-* `Math`_ rendering (via MathJax)
-* Custom output paths for generated pages
-* Pretty URLs (without ``.html``) that don’t need web server support
-* Easy page template customization
-* Internationalization support (my own blog is English and Spanish)
-* Sitemap generation (for search engines)
-* Custom deployment (if it’s a command, you can use it)
-* GitHub Pages deployment
-* Themes, easy appearance customization
-* `Multiple input formats <#supported-input-formats>`_, including reStructuredText and Markdown
-* Easy-to-create image galleries
-* Image thumbnail generation
-* Support for displaying source code listings
-* Image slideshows
-* Custom search
-* Asset (CSS/JS) bundling
-* gzip compression (for sending via your web server)
-* Open Graph, Twitter Cards
-* Hyphenation
-* Custom `post processing filters`_ (eg. for minifying files or better typography)
-
-Getting Started
----------------
-
-.. class:: lead
-
-To set Nikola up and create your first site, read the `Getting Started Guide <https://getnikola.com/getting-started.html>`_.
-
-Creating a Blog Post
---------------------
-
-To create a new post, the easiest way is to run ``nikola new_post``. You will
-be asked for a title for your post, and it will tell you where the post's file
-is located.
-
-By default, that file will contain also some extra information about your post ("the metadata").
-It can be placed in a separate file by using the ``-2`` option, but it's generally
-easier to keep it in a single location.
-
-The contents of your post have to be written (by default) in `reStructuredText <http://docutils.sf.net>`__
-but you can use a lot of different markups using the ``-f`` option.
-
-Currently, Nikola supports reStructuredText, Markdown, IPython (Jupyter) Notebooks, HTML as input,
-can also use Pandoc for conversion, and has support for BBCode, CreoleWiki, txt2tags, Textile
-and more via plugins — for more details, read the `input format documentation
-<#multiple-input-formats>`__.
-You can learn reStructuredText syntax with the `reST quickstart <https://getnikola.com/quickstart.html>`__.
-
-Please note that Nikola does not guarantee support for encodings other than
-UTF-8. We recommend converting your input files to that encoding. It will
-prevent bugs, and Nikola will write UTF-8 output anyway.
-
-You can control what markup compiler is used for each file extension with the ``COMPILERS``
-option. The default configuration expects them to be placed in ``posts`` but that can be
-changed (see below, the ``POSTS`` and ``PAGES`` options)
-
-This is how it works:
-
-.. code:: console
-
- $ nikola new_post
- Creating New Post
- -----------------
-
- Title: How to make money
- Scanning posts....done!
- INFO: new_post: Your post's text is at: posts/how-to-make-money.rst
-
-The content of that file is as follows:
-
-.. code:: restructuredtext
-
- .. title: How to make money
- .. slug: how-to-make-money
- .. date: 2012-09-15 19:52:05 UTC
- .. tags:
- .. link:
- .. description:
- .. type: text
-
- Write your post here.
-
-The ``slug`` is the page name. Since often titles will have
-characters that look bad on URLs, it's generated as a "clean" version of the title.
-The third line is the post's date, and is set to "now".
-
-The other lines are optional. Tags are comma-separated. The ``link`` is an original
-source for the content, and ``description`` is mostly useful for SEO.
-``type`` is the post type, whatever you set here (prepended with ``post-``)
-will become a CSS class of the ``<article>`` element for this post. Defaults to
-``text`` (resulting in a ``post-text`` class)
-
-You can add your own metadata fields in the same manner, if you use a theme that
-supports them (for example: ``.. author: John Doe``)
-
-To add these metadata fields to all new posts by default, you can set the
-variable ``ADDITIONAL_METADATA`` in your configuration. For example, you can
-add the author metadata to all new posts by default, by adding the following
-to your configuration:
-
-.. code:: python
-
- ADDITIONAL_METADATA = {
- 'author': 'John Doe'
- }
-
-.. sidebar:: Other Metadata Fields
-
- Nikola will also use other metadata fields:
-
- author
- Author of the post, will be used in the RSS feed and possibly in the post
- display (theme-dependent)
-
- annotations / noannotations
- Override the value of the ``ANNOTATIONS`` option for this specific post or page.
-
- category
- Like tags, except each post can have only one, and they usually have
- more descriptive names.
-
- filters
- See the `Post Processing Filters`_ section.
-
- hidetitle
- Set "True" if you do not want to see the **page** title as a
- heading of the output html file (does not work for posts).
-
- nocomments
- Set to "True" to disable comments. Example:
-
- .. code:: restructuredtext
-
- .. nocomments: True
-
- password
- The post will be encrypted and invisible until the reader enters the password.
- Also, the post's sourcecode will not be available.
-
- WARNING: **DO NOT** use for real confidential data. The algorithm used (RC4) is insecure. The implementation may also be easily brute-forced. Please consider using something else if you need *real* encryption!
-
- More information: `Issue #1547 <https://github.com/getnikola/nikola/issues/1547>`_
-
- previewimage
- Designate a preview or other representative image path relative to BASE_URL
- for use with Open Graph for posts. Adds the image when sharing on social
- media and many other uses.
-
- .. code:: restructuredtext
-
- .. previewimage: images/looks_great_on_facebook.png
-
- The image can be of any size and dimension (services will crop and adapt)
- but should less than 1 MB and be larger than 300x300 (ideally 600x600).
-
- template
- Change the template used to render this page/post specific page. That
- template needs to either be part of the theme, or be placed in a
- ``templates/`` folder inside your site.
-
- .. code:: restructuredtext
-
- .. template: story.tmpl
-
- enclosure
- Add an enclosure to this post when it's used in RSS. See `more information about enclosures <http://en.wikipedia.org/wiki/RSS_enclosure>`__
-
-.. note:: The Two-File Format
-
- Nikola originally used a separate ``.meta`` file. That will still work!
- The format of the meta files is the same as shown above (i.e. only
- the 7 base fields, in the order listed above), but without the
- explanations:
-
- .. code:: text
-
- How to make money
- how-to-make-money
- 2012-09-15 19:52:05 UTC
-
- However, starting with Nikola v7, you can now use ``.meta`` files and put
- all metadata you want, complete with the explanations — they look just like
- the beginning of our reST files.
-
- .. code:: restructuredtext
-
- .. title: How to make money
- .. slug: how-to-make-money
- .. date: 2012-09-15 19:52:05 UTC
-
- Both file formats are supported; however, the new format is preferred, if
- possible.
-
-If you are writing a multilingual site, you can also create a per-language
-post file (for example: ``how-to-make-money.es.txt`` with the default TRANSLATIONS_PATTERN, see below).
-This one can replace metadata of the default language, for example:
-
-* The translated title for the post or page
-* A translated version of the page name
-
-The pattern used for finding translations is controlled by the
-TRANSLATIONS_PATTERN variable in your configuration file.
-
-The default is to put the language code before the file extension,
-so the German translation of ``some_file.rst`` should be named
-``some_file.de.rst``. This is because the TRANSLATIONS_PATTERN variable is by
-default set to:
-
-.. code:: python
-
- TRANSLATIONS_PATTERN = "{path}.{lang}.{ext}"
-
-.. note:: Considered languages
-
- Nikola will only look for translation of input files for languages
- specified in the TRANSLATIONS variable.
-
-You can edit these files with your favourite text editor, and once you are happy
-with the contents, generate the pages using ``nikola build``.
-
-Nikola supports multiple languages for a post (we have almost 40 translations!). If you wish to
-add support for more languages, check out `the Transifex page for Nikola <https://www.transifex.com/projects/p/nikola/>`_
-
-The post page is generated using the ``post.tmpl`` template, which you can use
-to customize the output.
-
-The place where the post will be placed by ``new_post`` is based on the ``POSTS``
-and ``PAGES`` configuration options:
-
-.. code:: python
-
- # POSTS and PAGES contains (wildcard, destination, template) tuples.
- #
- # The wildcard is used to generate a list of reSt source files
- # (whatever/thing.txt).
- #
- # That fragment could have an associated metadata file (whatever/thing.meta),
- # and optionally translated files (example for Spanish, with code "es"):
- # whatever/thing.es.txt and whatever/thing.es.meta
- #
- # This assumes you use the default TRANSLATIONS_PATTERN.
- #
- # From those files, a set of HTML fragment files will be generated:
- # cache/whatever/thing.html (and maybe cache/whatever/thing.html.es)
- #
- # These files are combined with the template to produce rendered
- # pages, which will be placed at
- # output / TRANSLATIONS[lang] / destination / pagename.html
- #
- # where "pagename" is the "slug" specified in the metadata file.
- #
- # The difference between POSTS and PAGES is that POSTS are added
- # to feeds and are considered part of a blog, while PAGES are
- # just independent HTML pages.
- #
-
- POSTS = (
- ("posts/*.txt", "posts", "post.tmpl"),
- ("posts/*.rst", "posts", "post.tmpl"),
- )
- PAGES = (
- ("stories/*.txt", "stories", "story.tmpl"),
- ("stories/*.rst", "stories", "story.tmpl"),
- )
-
-``new_post`` will use the *first* path in ``POSTS`` (or ``PAGES`` if ``-p`` is
-supplied) that ends with the extension of your desired markup format (as
-defined in ``COMPILERS`` in ``conf.py``) as the directory that the new post will be
-written into. If no such entry can be found, the post won’t be created.
-
-The ``new_post`` command supports some options:
-
-.. code:: text
-
- $ nikola help new_post
- Purpose: create a new blog post or site page
- Usage: nikola new_post [options] [path]
-
- Options:
- -p, --page Create a page instead of a blog post. (see also: `nikola new_page`)
- -t ARG, --title=ARG Title for the post.
- -a ARG, --author=ARG Author of the post.
- --tags=ARG Comma-separated tags for the post.
- -1 Create the post with embedded metadata (single file format)
- -2 Create the post with separate metadata (two file format)
- -e Open the post (and meta file, if any) in $EDITOR after creation.
- -f ARG, --format=ARG Markup format for the post (use --available-formats for list)
- -F, --available-formats List all available input formats
- -s Schedule the post based on recurrence rule
- -i ARG, --import=ARG Import an existing file instead of creating a placeholder
-
-The optional ``path`` parameter tells nikola exactly where to put it instead of guessing from your config.
-So, if you do ``nikola new_post posts/random/foo.txt`` you will have a post in that path, with
-"foo" as its slug.
-
-Teasers
-~~~~~~~
-
-You may not want to show the complete content of your posts either on your
-index page or in RSS feeds, but to display instead only the beginning of them.
-
-If it's the case, you only need to add a "magical comment" in your post.
-
-In reStructuredText:
-
-.. code:: restructuredtext
-
- .. TEASER_END
-
-In Markdown (or basically, the resulting HTML of any format):
-
-.. code:: html
-
- <!-- TEASER_END -->
-
-By default all your RSS feeds will be shortened (they'll contain only teasers)
-whereas your index page will still show complete posts. You can change
-this behaviour with your ``conf.py``: ``INDEX_TEASERS`` defines whether index
-page should display the whole contents or only teasers. ``RSS_TEASERS``
-works the same way for your RSS feeds.
-
-By default, teasers will include a "read more" link at the end. If you want to
-change that text, you can use a custom teaser:
-
-.. code:: restructuredtext
-
- .. TEASER_END: click to read the rest of the article
-
-You can override the default value for ``TEASER_END`` in ``conf.py`` — for
-example, the following example will work for ``.. more``, and will be
-compatible with both WordPress and Nikola posts:
-
-..code:: python
-
- import re
- TEASER_REGEXP = re.compile('<!--\s*(more|TEASER_END)(:(.+))?\s*-->', re.IGNORECASE)
-
-Or you can completely customize the link using the ``READ_MORE_LINK`` option.
-
-.. code:: python
-
- # A HTML fragment with the Read more... link.
- # The following tags exist and are replaced for you:
- # {link} A link to the full post page.
- # {read_more} The string “Read more” in the current language.
- # {{ A literal { (U+007B LEFT CURLY BRACKET)
- # }} A literal } (U+007D RIGHT CURLY BRACKET)
- # READ_MORE_LINK = '<p class="more"><a href="{link}">{read_more}…</a></p>'
-
-
-Drafts
-~~~~~~
-
-If you add a "draft" tag to a post, then it will not be shown in indexes and feeds.
-It *will* be compiled, and if you deploy it it *will* be made available, so use
-with care. If you wish your drafts to be not available in your deployed site, you
-can set ``DEPLOY_DRAFTS = False`` in your configuration. This will not work if
-lazily include ``nikola build`` in your ``DEPLOY_COMMANDS``.
-
-Also if a post has a date in the future, it will not be shown in indexes until
-you rebuild after that date. This behavior can be disabled by setting
-``FUTURE_IS_NOW = True`` in your configuration, which will make future posts be
-published immediately. Posts dated in the future are *not* deployed by default
-(when ``FUTURE_IS_NOW = False``). To make future posts available in the
-deployed site, you can set ``DEPLOY_FUTURE = True`` in your configuration.
-Generally, you want FUTURE_IS_NOW and DEPLOY_FUTURE to be the same value.
-
-Private Posts
-~~~~~~~~~~~~~
-
-If you add a "private" tag to a post, then it will not be shown in indexes and feeds.
-It *will* be compiled, and if you deploy it it *will* be made available, so it will
-not generate 404s for people who had linked to it.
-
-Queuing Posts
-~~~~~~~~~~~~~
-
-Some blogs tend to have new posts based on a schedule (for example,
-every Mon, Wed, Fri) but the blog authors don't like to manually
-schedule their posts. You can schedule your blog posts based on a
-rule, by specifying a rule in the ``SCHEDULE_RULE`` in your
-configuration. You can either post specific blog posts according to
-this schedule by using the ``--schedule`` flag on the ``new_post``
-command or post all new posts according to this schedule by setting
-``SCHEDULE_ALL = True`` in your configuration. (Note: This feature
-requires that the ``FUTURE_IS_NOW`` setting is set to ``False``)
-
-For example, if you would like to schedule your posts to be on every
-Monday, Wednesday and Friday at 7am, add the following
-``SCHEDULE_RULE`` to your configuration:
-
-.. code:: python
-
- SCHEDULE_RULE = 'RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;BYHOUR=7;BYMINUTE=0;BYSECOND=0'
-
-For more details on how to specify a recurrence rule, look at the
-`iCal specification <http://www.kanzaki.com/docs/ical/rrule.html>`_.
-
-Say, you get a free Sunday, and want to write a flurry of new posts,
-or at least posts for the rest of the week, you would run the
-``new_post`` command with the ``--schedule`` flag, as many times as
-you want:
-
-.. code:: console
-
- $ nikola new_post --schedule
- # Creates a new post to be posted on Monday, 7am.
- $ nikola new_post -s
- # Creates a new post to be posted on Wednesday, 7am.
- $ nikola new_post -s
- # Creates a new post to be posted on Friday, 7am.
- .
- .
- .
-
-All these posts get queued up according to your schedule, but note
-that you will anyway need to build and deploy your site for the posts
-to appear online. You can have a cron job that does this regularly.
-
-Post Types
-~~~~~~~~~~
-
-Nikola supports specifying post types, just like Tumblr does. Post
-types affect the look of your posts, by adding a ``post-YOURINPUTHERE``
-CSS class to the post. Each post can have one and exactly one type. Nikola
-styles the following types in the default themes:
-
-.. class:: table table-bordered
-
-+-----------------+----------------------------+------------------+
-| Name(s) | Description | Styling |
-+=================+============================+==================+
-| text | plain text — default value | standard |
-+-----------------+----------------------------+------------------+
-| micro | “small” (short) posts | big serif font |
-+-----------------+----------------------------+------------------+
-
-Indexes
-~~~~~~~
-
-All your posts that are not drafts, private or dated in the future, will be
-shown in indexes.
-
-Settings
-````````
-
-Indexes are put in the ``INDEX_PATH`` directory, which defaults to an empty
-string (site root). The “main” index is ``index.html``, and all the further
-indexes are ``index-*.html``, respectively.
-
-By default, 10 posts are displayed on an index page. This can be changed with
-``INDEX_DISPLAY_POST_COUNT``. Indexes can show full posts or just the teasers,
-as controlled by the ``INDEX_TEASERS`` setting (defaults to ``False``).
-
-Titles of the pages can be controlled by using ``INDEXES_TITLES``,
-``INDEXES_PAGES`` and ``INDEXES_PAGES_MAIN`` settings.
-
-Categories and tags use simple lists by default that show only titles and
-dates; however, you can switch them to full indexes by using
-``CATEGORY_PAGES_ARE_INDEXES`` and ``TAG_PAGES_ARE_INDEXES``, respectively.
-
-Static indexes
-``````````````
-
-Nikola uses *static indexes* by default. This means that ``index-1.html`` has
-the oldest posts, and the newest posts past the first 10 are in
-``index-N.html``, where ``N`` is the highest number. Only the page with the
-highest number and the main page (``index-N.html`` and ``index.html``) are
-rebuilt (the others remain unchanged). The page that appears when you click
-*Older posts* on the index page, ``index-N.html``, might contain **less than 10
-posts** if there are not enough posts to fill up all pages.
-
-This can be disabled by setting ``INDEXES_STATIC`` to ``False``. In that mode,
-``index-1.html`` contains all the newest posts past the first 10 and will
-always contain 10 posts (unless you have less than 20). The last page,
-``index-N.html``, contains the oldest posts, and might contain less than 10
-posts. This is how many blog engines and CMSes behave. Note that this will
-lead to rebuilding all index pages, which might be a problem for larger blogs
-(with a lot of index pages).
-
-Creating a Page
----------------
-
-Pages are the same as posts, except that:
-
-* They are not added to the front page
-* They don't appear on the RSS feed
-* They use the ``story.tmpl`` template instead of ``post.tmpl`` by default
-
-The default configuration expects the page's metadata and text files to be on the
-``stories`` folder, but that can be changed (see ``PAGES`` option above).
-
-You can create the page's files manually or use the ``new_post`` command
-with the ``-p`` option, which will place the files in the folder that
-has ``use_in_feed`` set to False.
-
-Supported input formats
------------------------
-
-Nikola supports multiple input formats. Out of the box, we have compilers available for:
-
-* reStructuredText (default and pre-configured)
-* `Markdown`_
-* `IPython Notebook/Jupyter`_
-* `HTML`_
-* `PHP`_
-* anything `Pandoc`_ supports (including Textile, DocBook, LaTeX, MediaWiki,
- TWiki, OPML, Emacs Org-Mode, txt2tags, Microsoft Word .docx, EPUB, Haddock markup)
-
-Plus, we have specialized compilers in the Plugins Index for:
-
-* `AsciiDoc <https://plugins.getnikola.com/#asciidoc>`_
-* `BBCode <https://plugins.getnikola.com/#bbcode>`_
-* `CommonMark <https://plugins.getnikola.com/#commonmark>`_
-* `IRC logs <https://plugins.getnikola.com/#irclogs>`_
-* `Markmin <https://plugins.getnikola.com/#markmin>`_
-* `MediaWiki (smc.mw) <https://plugins.getnikola.com/#mediawiki>`_
-* `Misaka <https://plugins.getnikola.com/#misaka>`_
-* `ODT <https://plugins.getnikola.com/#odt>`_
-* `Emacs Org-Mode <https://plugins.getnikola.com/#orgmode>`_
-* `reST with HTML 5 output <https://plugins.getnikola.com/#rest_html5>`_
-* `Textile <https://plugins.getnikola.com/#textile>`_
-* `txt2tags <https://plugins.getnikola.com/#txt2tags>`_
-* `CreoleWiki <https://plugins.getnikola.com/#wiki>`_
-* `WordPress posts <https://plugins.getnikola.com/#wordpress_compiler>`_
-
-Configuring other input formats
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In order to use input formats other than reStructuredText, you need some extra
-setup.
-
-1. Make sure you have the compiler for the input format you want. Some
- input formats are supported out-of-the-box, but others must be installed from
- the Plugins repository. You may also need some extra dependencies. You
- will get helpful errors if you try to build when missing something.
-2. You must ensure the compiler and your desired input file extension is included
- in the ``COMPILERS`` dict and does not conflict with any other format. This
- is extremely important for the pandoc compiler.
-3. Finally, you must configure the ``POSTS`` and ``PAGES`` tuples. Follow the
- instructions and the format set by pre-existing entries. Make sure to use
- the same extension as is set in ``COMPILERS`` and configure the outputs
- properly.
-
-Markdown
-````````
-
-To use Markdown in your posts/pages, make sure ``markdown`` is in your
-``COMPILERS`` and that at least one of your desired extensions is defined in
-``POSTS`` and ``PAGES``.
-
-You can use Python-Markdown extensions by setting the ``MARKDOWN_EXTENSIONS``
-config option:
-
-.. code:: python
-
- MARKDOWN_EXTENSIONS = ['fenced_code', 'codehilite', 'extra']
-
-IPython Notebook/Jupyter
-````````````````````````
-
-To use Jupyter notebooks (previously known as IPython Notebooks) as posts/pages,
-make sure ``ipynb`` is in your ``COMPILERS`` and that the ``.ipynb`` extension
-is defined in ``POSTS`` and ``PAGES``.
-
-The ``-f`` argument to ``new_post`` should be used in the ``ipynb@KERNEL`` format.
-It defaults to Python in the version used by Nikola if not specified.
-
-HTML
-````
-
-To use plain HTML in your posts/pages, make sure ``html`` is in your
-``COMPILERS``
-and that the ``.html`` extension is defined in ``POSTS`` and ``PAGES``.
-
-PHP
-```
-
-There are two ways of using PHP within Nikola:
-
-1. To use PHP in your posts/pages (inside your site, with the theme and
- everything), make sure ``php`` is in your ``COMPILERS`` and that the ``.php``
- extension is defined in ``POSTS`` and ``PAGES``.
-2. To use PHP as standalone files (without any modifications), put them in
- ``files/`` (or whatever ``FILES_FOLDERS`` is configured to).
-
-Pandoc
-``````
-
-To use Pandoc, you must uncomment the entry in ``COMPILERS`` and set the
-extensions list to your desired extensions while also removing them from their
-original compilers. The input format is inferred from the extension by Pandoc.
-
-Using Pandoc for reStructuredText, Markdown and other input formats that have a
-standalone Nikola plugin is **not recommended** as it disables plugins and
-extensions that are usually provided by Nikola.
-
-Redirections
-------------
-
-If you need a page to be available in more than one place, you can define redirections
-in your ``conf.py``:
-
-.. code:: python
-
- # A list of redirection tuples, [("foo/from.html", "/bar/to.html")].
- #
- # A HTML file will be created in output/foo/from.html that redirects
- # to the "/bar/to.html" URL. notice that the "from" side MUST be a
- # relative URL.
- #
- # If you don't need any of these, just set to []
-
- REDIRECTIONS = [("index.html", "/weblog/index.html")]
-
-It's better if you can do these using your web server's configuration, but if
-you can't, this will work.
-
-Configuration
--------------
-
-The configuration file is called ``conf.py`` and can be used to customize a lot of
-what Nikola does. Its syntax is python, but if you don't know the language, it
-still should not be terribly hard to grasp.
-
-The default ``conf.py`` you get with Nikola should be fairly complete, and is quite
-commented.
-
-You surely want to edit these options:
-
-.. code:: python
-
- # Data about this site
- BLOG_AUTHOR = "Your Name" # (translatable)
- BLOG_TITLE = "Demo Site" # (translatable)
- SITE_URL = "https://getnikola.com/"
- BLOG_EMAIL = "joe@demo.site"
- BLOG_DESCRIPTION = "This is a demo site for Nikola." # (translatable)
-
-Some options are demarked with a (translatable) comment above or right next to
-them. For those options, two types of values can be provided:
-
-* a string, which will be used for all languages
-* a dict of language-value pairs, to have different values in each language
-
-.. note:: It is possible to load the configuration from another file by specifying
- ``--conf=path/to/other.file`` on Nikola's command line. For example, to
- build your blog using the configuration file ``configurations/test.conf.py``,
- you have to execute ``nikola build --conf=configurations/test.conf.py``.
-
-Customizing Your Site
----------------------
-
-There are lots of things you can do to personalize your website, but let's see
-the easy ones!
-
-CSS tweaking
- Using the default configuration, you can create a ``assets/css/custom.css``
- file under ``files/`` or in your theme and then it will be loaded from the
- ``<head>`` blocks of your site pages. Create it and put your CSS code there,
- for minimal disruption of the provided CSS files.
-
- If you feel tempted to touch other files in assets, you probably will be better off
- with a `custom theme <theming.html>`__.
-
- If you want to use LESS_ or Sass_ for your custom CSS, or the theme you use
- contains LESS or Sass code that you want to override, you will need to install
- the `LESS plugin <https://plugins.getnikola.com/#less>`__ or
- `SASS plugin <https://plugins.getnikola.com/#sass>`__ create a ``less`` or
- ``sass`` directory in your site root, put your ``.less`` or ``.scss`` files
- there and a targets file containing the list of files you want compiled.
-
-.. _LESS: http://lesscss.org/
-.. _Sass: http://sass-lang.com/
-
-Template tweaking
- If you really want to change the pages radically, you will want to do a
- `custom theme <theming.html>`__.
-
-
-Navigation Links
- The ``NAVIGATION_LINKS`` option lets you define what links go in a sidebar or menu
- (depending on your theme) so you can link to important pages, or to other sites.
-
- The format is a language-indexed dictionary, where each element is a tuple of
- tuples which are one of:
-
- 1. A (url, text) tuple, describing a link
- 2. A (((url, text), (url, text), (url, text)), title) tuple, describing a submenu / sublist.
-
- Example:
-
- .. code:: python
-
- NAVIGATION_LINKS = {
- DEFAULT_LANG: (
- ('/archive.html', 'Archives'),
- ('/categories/index.html', 'Tags'),
- ('/rss.xml', 'RSS'),
- ((('/foo', 'FOO'),
- ('/bar', 'BAR')), 'BAZ'),
- ),
- }
-
- .. note::
-
- 1. Support for submenus is theme-dependent. Only one level of
- submenus is supported.
-
- 2. Some themes, including the default Bootstrap 3 theme, may
- present issues if the menu is too large. (in ``bootstrap3``, the
- navbar can grow too large and cover contents.)
-
- 3. If you link to directories, make sure to follow ``STRIP_INDEXES``. If
- it’s set to ``True``, end your links with a ``/``, otherwise end them
- with ``/index.html`` — or else they won’t be hilighted when active.
-
- The ``SEARCH_FORM`` option contains the HTML code for a search form based on
- duckduckgo.com which should always work, but feel free to change it to
- something else.
-
-Footer
- ``CONTENT_FOOTER`` is displayed, small at the bottom of all pages, I use it for
- the copyright notice. The default shows a text formed using ``BLOG_AUTHOR``,
- ``BLOG_EMAIL``, the date and ``LICENSE``. Note you need to use
- ``CONTENT_FOOTER_FORMATS`` instead of regular str.format or %-formatting,
- for compatibility with the translatable settings feature.
-
-BODY_END
- This option lets you define a HTML snippet that will be added at the bottom of body.
- The main usage is a Google analytics snippet or something similar, but you can really
- put anything there. Good place for JavaScript.
-
-SOCIAL_BUTTONS_CODE
- The ``SOCIAL_BUTTONS_CODE`` option lets you define a HTML snippet that will be added
- at the bottom of body. It defaults to a snippet for AddThis, but you can
- really put anything there. See `social_buttons.html` for more details.
-
-Fancy Dates
------------
-
-Nikola can use various styles for presenting dates.
-
-DATE_FORMAT
- The date format to use if there is no JS or fancy dates are off. Compatible with Python’s ``strftime()`` syntax.
-
-JS_DATE_FORMAT
- The date format to use if fancy dates are on. Compatible with ``moment.js`` syntax.
-
-DATE_FANCINESS = 0
- Fancy dates are off, and DATE_FORMAT is used.
-
-DATE_FANCINESS = 1
- Dates are recalculated in user’s timezone. Requires JavaScript.
-
-DATE_FANCINESS = 2
- Dates are recalculated as relative time (eg. 2 days ago). Requires JavaScript.
-
-In order to use fancy dates, your theme must support them. The built-in Bootstrap family supports it, but other themes might not by default.
-
-For Mako:
-
-.. code:: html
-
- <!-- required scripts -- best handled with bundles -->
- <script src="/assets/js/moment-with-locales.min.js"></script>
- <script src="/assets/js/fancydates.js"></script>
-
- <!-- fancy dates code -->
- <script>
- moment.locale("${momentjs_locales[lang]}");
- fancydates(${date_fanciness}, ${js_date_format});
- </script>
- <!-- end fancy dates code -->
-
-
-For Jinja2:
-
-.. code:: html
-
- <!-- required scripts -- best handled with bundles -->
- <script src="/assets/js/moment-with-locales.min.js"></script>
- <script src="/assets/js/fancydates.js"></script>
-
- <!-- fancy dates code -->
- <script>
- moment.locale("{{ momentjs_locales[lang] }}");
- fancydates({{ date_fanciness }}, {{ js_date_format }});
- </script>
- <!-- end fancy dates code -->
-
-
-Adding Files
-------------
-
-Any files you want to be in ``output/`` but are not generated by Nikola (for example,
-``favicon.ico``) just put it in ``files/``. Everything there is copied into
-``output`` by the ``copy_files`` task. Remember that you can't have files that collide
-with files Nikola generates (it will give an error).
-
-.. admonition:: Important
-
- Don't put any files manually in ``output/``. Ever. Really.
- Maybe someday Nikola will just wipe ``output/`` (when you run ``nikola check -f --clean-files``) and then you will be sorry. So, please don't do that.
-
-If you want to copy more than one folder of static files into ``output`` you can
-change the FILES_FOLDERS option:
-
-.. code:: python
-
- # One or more folders containing files to be copied as-is into the output.
- # The format is a dictionary of "source" "relative destination".
- # Default is:
- # FILES_FOLDERS = {'files': '' }
- # Which means copy 'files' into 'output'
-
-Getting More Themes
--------------------
-
-There are a few themes for Nikola. They are available at
-the `Themes Index <https://themes.getnikola.com/>`_.
-Nikola has a built-in theme download/install mechanism to install those themes — the ``install_theme`` command:
-
-
-.. code:: console
-
- $ nikola install_theme -l
- Themes:
- -------
- blogtxt
- bootstrap3-gradients
- ⋮
- ⋮
-
- $ nikola install_theme blogtxt
- [2013-10-12T16:46:13Z] NOTICE: install_theme: Downloading:
- https://themes.getnikola.com/v6/blogtxt.zip
- [2013-10-12T16:46:15Z] NOTICE: install_theme: Extracting: blogtxt into themes
-
-And there you are, you now have themes/blogtxt installed. It's very
-rudimentary, but it should work in most cases.
-
-If you create a nice theme, please share it! You can do it as a pull
-request in the `GitHub repository <https://github.com/getnikola/nikola-themes>`__.
-
-One other option is to tweak an existing theme using a different color scheme,
-typography and CSS in general. Nikola provides a ``bootswatch_theme`` option
-to create a custom theme by downloading free CSS files from http://bootswatch.com:
-
-
-.. code:: console
-
- $ nikola bootswatch_theme -n custom_theme -s spruce -p bootstrap3
- [2013-10-12T16:46:58Z] NOTICE: bootswatch_theme: Creating 'custom_theme' theme
- from 'spruce' and 'bootstrap3'
- [2013-10-12T16:46:58Z] NOTICE: bootswatch_theme: Downloading:
- http://bootswatch.com//spruce/bootstrap.min.css
- [2013-10-12T16:46:58Z] NOTICE: bootswatch_theme: Downloading:
- http://bootswatch.com//spruce/bootstrap.css
- [2013-10-12T16:46:59Z] NOTICE: bootswatch_theme: Theme created. Change the THEME setting to "custom_theme" to use it.
-
-You can even try what different swatches do on an existing site using
-their handy `bootswatchlet <http://news.bootswatch.com/post/29555952123/a-bookmarklet-for-bootswatch>`_
-
-Play with it, there's cool stuff there. This feature was suggested by
-`clodo <http://elgalpondebanquito.com.ar>`_.
-
-Deployment
-----------
-
-Nikola doesn't really have a concept of deployment. However, if you can specify your
-deployment procedure as a series of commands, you can put them in the ``DEPLOY_COMMANDS``
-option, and run them with ``nikola deploy``.
-
-You can have multiple deployment presets. If you run ``nikola deploy``, the
-``default`` preset is executed. You can also specify the names of presets
-you want to run (eg. ``nikola deploy default``, multiple presets are allowed).
-
-One caveat is that if any command has a % in it, you should double them.
-
-Here is an example, from my own site's deployment script:
-
-.. code:: python
-
- DEPLOY_COMMANDS = {'default': [
- 'rsync -rav --delete output/ ralsina@lateral.netmanagers.com.ar:/srv/www/lateral',
- 'rdiff-backup output ~/blog-backup',
- "links -dump 'http://www.twingly.com/ping2?url=lateral.netmanagers.com.ar'",
- ]}
-
-Other interesting ideas are using
-`git as a deployment mechanism <http://toroid.org/ams/git-website-howto>`_ (or any other VCS
-for that matter), using `lftp mirror <http://lftp.yar.ru/>`_ or unison, or Dropbox.
-Any way you can think of to copy files from one place to another is good enough.
-
-Deploying to GitHub
-~~~~~~~~~~~~~~~~~~~
-
-Nikola provides a separate command ``github_deploy`` to deploy your site to
-GitHub pages. The command builds the site, commits the output to a gh-pages
-branch and pushes the output to GitHub. Nikola uses the `ghp-import command
-<https://github.com/davisp/ghp-import>`_ for this.
-
-The branch to use for committing the sources can be changed using the
-``GITHUB_DEPLOY_BRANCH`` option in your config. For a
-user.github.io/organization.github.io, this MUST be set to ``master``,
-and the branch containing the sources must be changed to something
-else, like ``deploy``, using the ``GITHUB_SOURCE_BRANCH`` option. The
-remote name to which the changes are pushed is ``origin`` by default,
-and can be changed using the ``GITHUB_REMOTE_NAME`` option. You also,
-obviously, need to have ``git`` on your PATH, and should be able to
-push to the repository specified as the remote.
-
-This command performs the following actions, when it is run:
-
-1. Builds the site
-2. Commit the output folder to the ``GITHUB_DEPLOY_BRANCH`` to this branch.
-3. Push the branch to the remote specified in ``GITHUB_REMOTE_NAME``!
-
-Comments and Annotations
-------------------------
-
-While Nikola creates static sites, there is a minimum level of user interaction you
-are probably expecting: comments.
-
-Nikola supports several third party comment systems:
-
-* `DISQUS <http://disqus.com>`_
-* `IntenseDebate <http://www.intensedebate.com/>`_
-* `LiveFyre <http://www.livefyre.com/>`_
-* `Moot <http://moot.it>`_
-* `Google+ <http://plus.google.com>`_
-* `Facebook <http://facebook.com/>`_
-* `isso <http://posativ.org/isso/>`_
-
-By default it will use DISQUS, but you can change by setting ``COMMENT_SYSTEM``
-to one of "disqus", "intensedebate", "livefyre", "moot", "googleplus",
-"facebook" or "isso"
-
-.. sidebar:: ``COMMENT_SYSTEM_ID``
-
- The value of ``COMMENT_SYSTEM_ID`` depends on what comment system you
- are using and you can see it in the system's admin interface.
-
- * For DISQUS it's called the **shortname**
- * In IntenseDebate it's the **IntenseDebate site acct**
- * In LiveFyre it's the **siteId**
- * In Moot it's your **username**
- * For Google Plus, ``COMMENT_SYSTEM_ID`` need not be set, but you must
- `verify your authorship <https://plus.google.com/authorship>`_
- * For Facebook, you need to `create an app
- <https://developers.facebook.com/apps>` (turn off sandbox mode!)
- and get an **App ID**
- * For isso, it is the URL of isso (must be world-accessible, encoded with
- Punycode (if using Internationalized Domain Names) and **have a trailing slash**,
- default ``http://localhost:8080/``)
-
-To use comments in a visible site, you should register with the service and
-then set the ``COMMENT_SYSTEM_ID`` option.
-
-I recommend 3rd party comments, and specially DISQUS because:
-
-1) It doesn't require any server-side software on your site
-2) They offer you a way to export your comments, so you can take
- them with you if you need to.
-3) It's free.
-4) It's damn nice.
-
-You can disable comments for a post by adding a "nocomments" metadata field to it:
-
-.. code:: restructuredtext
-
- .. nocomments: True
-
-.. admonition:: DISQUS Support
-
- In some cases, when you run the test site, you won't see the comments.
- That can be fixed by adding the disqus_developer flag to the templates
- but it's probably more trouble than it's worth.
-
-.. admonition:: Moot Support
-
- Moot doesn't support comment counts on index pages, and it requires adding
- this to your ``conf.py``:
-
- .. code-block:: python
-
- BODY_END = """
- <script src="//cdn.moot.it/1/moot.min.js"></script>
- """
- EXTRA_HEAD_DATA = """
- <link rel="stylesheet" type="text/css" href="//cdn.moot.it/1/moot.css">
- <meta name="viewport" content="width=device-width">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- """
-
-.. admonition:: Facebook Support
-
- You need jQuery, but not because Facebook wants it (see Issue
- #639).
-
-An alternative or complement to comments are annotations. Nikola integrates
-the annotation service provided by `AnnotateIt. <http://annotateit.org/>`_
-To use it, set the ``ANNOTATIONS`` option to True. This is specially useful
-if you want feedback on specific parts of your writing.
-
-You can enable or disable annotations for specific posts or pages using the
-``annotations`` and ``noannotations`` metadata.
-
-Annotations require JQuery and are therefore not supported in the base theme.
-You can check bootstrap theme's ``base.html`` for details on how to handle them in
-custom themes.
-
-Images and Galleries
---------------------
-
-To create an image gallery, all you have to do is add a folder inside ``galleries``,
-and put images there. Nikola will take care of creating thumbnails, index page, etc.
-
-If you click on images on a gallery, or on images with links in post, you will
-see a bigger image, thanks to the excellent `colorbox
-<http://www.jacklmoore.com/colorbox>`_. If don’t want this behavior, add an
-``.islink`` class to your image or link.
-
-The gallery pages are generated using the ``gallery.tmpl`` template, and you can
-customize it there (you could switch to another lightbox instead of colorbox, change
-its settings, change the layout, etc.).
-
-Images to be used in normal posts can be placed in the ``images`` folder. These
-images will be processed and have thumbnails created just as for galleries, but will
-then be copied directly to the corresponding path in the ``output`` directory, so you
-can reference it from whatever page you like, most easily using the ``thumbnail``
-reST extension. If you don't want thumbnails, just use the ``files`` folder instead.
-
-The ``conf.py`` options affecting images and gallery pages are these:
-
-.. code:: python
-
- # One or more folders containing galleries. The format is a dictionary of
- # {"source": "relative_destination"}, where galleries are looked for in
- # "source/" and the results will be located in
- # "OUTPUT_PATH/relative_destination/gallery_name"
- # Default is:
- GALLERY_FOLDERS = {"galleries": "galleries"}
- # More gallery options:
- THUMBNAIL_SIZE = 180
- MAX_IMAGE_SIZE = 1280
- USE_FILENAME_AS_TITLE = True
- EXTRA_IMAGE_EXTENSIONS = []
-
- # If set to False, it will sort by filename instead. Defaults to True
- GALLERY_SORT_BY_DATE = True
-
- # Folders containing images to be used in normal posts or pages. Images will be
- # scaled down according to IMAGE_THUMBNAIL_SIZE and MAX_IMAGE_SIZE options, but
- # will have to be referenced manually to be visible on the site
- # (the thumbnail has ``.thumbnail`` added before the file extension).
- # The format is a dictionary of {source: relative destination}.
-
- IMAGE_FOLDERS = {'images': 'images'}
- IMAGE_THUMBNAIL_SIZE = 400
-
-If you add a file in ``galleries/gallery_name/index.txt`` its contents will be
-converted to HTML and inserted above the images in the gallery page. The
-format is the same as for posts.
-
-If you add some image filenames in ``galleries/gallery_name/exclude.meta``, they
-will be excluded in the gallery page.
-
-If ``USE_FILENAME_AS_TITLE`` is True the filename (parsed as a readable string)
-is used as the photo caption. If the filename starts with a number, it will
-be stripped. For example ``03_an_amazing_sunrise.jpg`` will be render as *An amazing sunrise*.
-
-Here is a `demo gallery </galleries/demo>`_ of historic, public domain Nikola
-Tesla pictures taken from `this site <http://kerryr.net/pioneers/gallery/tesla.htm>`_.
-
-Post Processing Filters
------------------------
-
-You can apply post processing to the files in your site, in order to optimize them
-or change them in arbitrary ways. For example, you may want to compress all CSS
-and JS files using yui-compressor.
-
-To do that, you can use the provided helper adding this in your ``conf.py``:
-
-.. code:: python
-
- from nikola import filters
-
- FILTERS = {
- ".css": [filters.yui_compressor],
- ".js": [filters.yui_compressor],
- }
-
-Where ``filters.yui_compressor`` is a helper function provided by Nikola. You can
-replace that with strings describing command lines, or arbitrary python functions.
-
-If there's any specific thing you expect to be generally useful as a filter, contact
-me and I will add it to the filters library so that more people use it.
-
-The currently available filters are:
-
-.. sidebar:: Creating your own filters
-
- You can use any program name that works in place as a filter, like ``sed -i``
- and you can use arbitrary python functions as filters, too.
-
- If your program doesn't run in-place, then you can use Nikola's runinplace function.
- For example, this is how the yui_compressor filter is implemented:
-
- .. code-block:: python
-
- def yui_compressor(infile):
- return runinplace(r'yui-compressor --nomunge %1 -o %2', infile)
-
- You can turn any function into a filter using ``apply_to_text_file`` (for
- text files to be read in UTF-8) and ``apply_to_binary_file`` (for files to
- be read in binary mode).
-
- As a silly example, this would make everything uppercase and totally break
- your website:
-
- .. code-block:: python
-
- import string
- from nikola.filters import apply_to_text_file
- FILTERS = {
- ".html": [apply_to_text_file(string.upper)]
- }
-
-html_tidy_nowrap
- Prettify HTML 5 documents with `tidy5 <http://www.html-tidy.org/>`_
-
-html_tidy_wrap
- Prettify HTML 5 documents wrapped at 80 characters with `tidy5 <http://www.html-tidy.org/>`_
-
-html_tidy_wrap_attr
- Prettify HTML 5 documents and wrap lines and attributes with `tidy5 <http://www.html-tidy.org/>`_
-
-html_tidy_mini
- Minify HTML 5 into smaller documents with `tidy5 <http://www.html-tidy.org/>`_
-
-html_tidy_withconfig
- Run `tidy5 <http://www.html-tidy.org/>`_ with ``tidy5.conf`` as the config file (supplied by user)
-
-html5lib_minify
- Minify HTML5 using html5lib_minify
-
-html5lib_xmllike
- Format using html5lib
-
-typogrify
- Improve typography using `typogrify <http://static.mintchaos.com/projects/typogrify/>`__
-
-typogrify_sans_widont
- Same as typogrify without the widont filter
-
-minify_lines
- **THIS FILTER HAS BEEN TURNED INTO A NOOP** and currently does nothing.
-
-yui_compressor
- Compress CSS/JavaScript using `YUI compressor <http://yui.github.io/yuicompressor/>`_
-
-closure_compiler
- Compile, compress, and optimize JavaScript `Google Closure Compiler <https://developers.google.com/closure/compiler/>`_
-
-optipng
- Compress PNG files using `optipng <http://optipng.sourceforge.net/>`_
-
-jpegoptim
- Compress JPEG files using `jpegoptim <http://www.kokkonen.net/tjko/projects.html>`_
-
-
-You can apply filters to specific posts or pages by using the ``filters`` metadata field:
-
-.. code:: restructuredtext
-
- .. filters: filters.html_tidy_nowrap, "sed s/foo/bar"
-
-
-
-Optimizing Your Website
------------------------
-
-One of the main goals of Nikola is to make your site fast and light. So here are a few
-tips we have found when setting up Nikola with Apache. If you have more, or
-different ones, or about other web servers, please share!
-
-#. Use a speed testing tool. I used Yahoo's YSlow but you can use any of them, and
- it's probably a good idea to use more than one.
-
-#. Enable compression in Apache:
-
- .. code:: apache
-
- AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
-
-#. If even after you did the previous step the CSS files are not sent compressed:
-
- .. code:: apache
-
- AddType text/css .css
-
-#. Optionally you can create static compressed copies and save some CPU on your server
- with the GZIP_FILES option in Nikola.
-
-#. The webassets Nikola plugin can drastically decrease the number of CSS and JS files your site fetches.
-
-#. Through the filters feature, you can run your files through arbitrary commands, so that images
- are recompressed, JavaScript is minimized, etc.
-
-#. The USE_CDN option offloads standard JavaScript and CSS files to a CDN so they are not
- downloaded from your server.
-
-Math
-----
-
-Nikola supports math input via MathJax. It is activated via the math roles and
-directives of reStructuredText and the usual LaTeX delimiters (``\(inline\)``
-and ``\[display\]``) for other input formats.
-
-We **DO NOT** support the old, deprecated and error-prone ``$inline$``
-delimiters by default. If you want to use them, please add them manually,
-like this:
-
-.. code:: python
-
- MATHJAX_CONFIG = """
- <script type="text/x-mathjax-config">
- MathJax.Hub.Config({
- tex2jax: {
- inlineMath: [ ['$','$'], ["\\\(","\\\)"] ],
- displayMath: [ ['$$','$$'], ["\\\[","\\\]"] ],
- processEscapes: true
- },
- displayAlign: 'left', // Change this to 'center' to center equations.
- "HTML-CSS": {
- styles: {'.MathJax_Display': {"margin": 0}}
- }
- });
- </script>
- """
-
-Inline mathematics are produced using the reST `math` **role** or the ``\(…\)`` delimiters:
-
-Euler’s formula: :math:`e^{ix} = \cos x + i\sin x`
-
-In reST:
-
-.. code:: restructuredtext
-
- Euler’s formula: :math:`e^{ix} = \cos x + i\sin x`
-
-In other input formats:
-
-.. code:: text
-
- Euler’s formula: \(e^{ix} = \cos x + i\sin x\)
-
-Display mathematics are produced using the reST `math` **directive** or the ``\[…\]`` delimiters:
-
-.. math::
-
- \int \frac{dx}{1+ax}=\frac{1}{a}\ln(1+ax)+C
-
-
-In reST:
-
-.. code:: restructuredtext
-
- .. math::
-
- \int \frac{dx}{1+ax}=\frac{1}{a}\ln(1+ax)+C
-
-In other input formats:
-
-.. code:: text
-
- \[\int \frac{dx}{1+ax}=\frac{1}{a}\ln(1+ax)+C\]
-
-reStructuredText Extensions
----------------------------
-
-Nikola includes support for a few directives and roles that are not part of docutils, but which
-we think are handy for website development.
-
-Includes
-~~~~~~~~
-
-Nikola supports the standard reStructuredText ``include`` directive, but with a
-catch: filenames are relative to **Nikola site root** (directory with ``conf.py``)
-instead of the post location (eg. ``posts/`` directory)!
-
-Media
-~~~~~
-
-This directive lets you embed media from a variety of sites automatically by just passing the
-URL of the page. For example here are two random videos:
-
-.. code:: restructuredtext
-
- .. media:: http://vimeo.com/72425090
-
- .. media:: http://www.youtube.com/watch?v=wyRpAat5oz0
-
-It supports Instagram, Flickr, Github gists, Funny or Die, and dozens more, thanks to `Micawber <https://github.com/coleifer/micawber>`_
-
-YouTube
-~~~~~~~
-
-To link to a YouTube video, you need the id of the video. For example, if the
-URL of the video is http://www.youtube.com/watch?v=8N_tupPBtWQ what you need is
-**8N_tupPBtWQ**
-
-Once you have that, all you need to do is:
-
-.. code:: restructuredtext
-
- .. youtube:: 8N_tupPBtWQ
-
-Vimeo
-~~~~~
-
-To link to a Vimeo video, you need the id of the video. For example, if the
-URL of the video is http://www.vimeo.com/20241459 then the id is **20241459**
-
-Once you have that, all you need to do is:
-
-.. code:: restructuredtext
-
- .. vimeo:: 20241459
-
-If you have internet connectivity when generating your site, the height and width of
-the embedded player will be set to the native height and width of the video.
-You can override this if you wish:
-
-.. code:: restructuredtext
-
- .. vimeo:: 20241459
- :height: 240
- :width: 320
-
-Soundcloud
-~~~~~~~~~~
-
-This directive lets you share music from http://soundcloud.com You first need to get the
-ID for the piece, which you can find in the "share" link. For example, if the
-WordPress code starts like this:
-
-.. code:: text
-
- [soundcloud url="http://api.soundcloud.com/tracks/78131362"
-
-The ID is 78131362 and you can embed the audio with this:
-
-.. code:: restructuredtext
-
- .. soundcloud:: 78131362
-
-You can also embed playlists, via the `soundcloud_playlist` directive which works the same way.
-
- .. soundcloud_playlist:: 9411706
-
-Code
-~~~~
-
-The ``code`` directive has been included in docutils since version 0.9 and now
-replaces Nikola's ``code-block`` directive. To ease the transition, two aliases
-for ``code`` directive are provided: ``code-block`` and ``sourcecode``:
-
-.. code:: restructuredtext
-
- .. code-block:: python
- :number-lines:
-
- print("Our virtues and our failings are inseparable")
-
-Listing
-~~~~~~~
-
-To use this, you have to put your source code files inside ``listings`` or whatever folders
-your ``LISTINGS_FOLDERS`` variable is set to fetch files from. Assuming you have a ``foo.py``
-inside one of these folders:
-
-.. code:: restructuredtext
-
- .. listing:: foo.py python
-
-Will include the source code from ``foo.py``, highlight its syntax in python mode,
-and also create a ``listings/foo.py.html`` page (or in another directory, depending on
-``LISTINGS_FOLDER``) and the listing will have a title linking to it.
-
-Listings support the same options `reST includes`__ support (including
-various options for controlling which parts of the file are included), and also
-a ``linenos`` option for Sphinx compatibility.
-
-The ``LISTINGS_FOLDER`` configuration variable allows to specify a list of folders where
-to fetch listings from together with subfolder of the ``output`` folder where the
-processed listings should be put in. The default is, ``LISTINGS_FOLDERS = {'listings': 'listings'}``,
-which means that all source code files in ``listings`` will be taken and stored in ``output/listings``.
-Extending ``LISTINGS_FOLDERS`` to ``{'listings': 'listings', 'code': 'formatted-code'}``
-will additionally process all source code files in ``code`` and put the results into
-``output/formatted-code``.
-
-__ http://docutils.sourceforge.net/docs/ref/rst/directives.html#including-an-external-document-fragment
-
-.. note::
-
- Formerly, ``start-at`` and ``end-at`` options were supported; however,
- they do not work anymore (since v6.1.0) and you should now use ``start-after``
- and ``end-before``, respectively. You can also use ``start-line`` and
- ``end-line``.
-
-Gist
-~~~~
-
-You can easily embed GitHub gists with this directive, like this:
-
-.. code:: restructuredtext
-
- .. gist:: 2395294
-
-Producing this:
-
-.. gist:: 2395294
-
-This degrades gracefully if the browser doesn't support JavaScript.
-
-Thumbnails
-~~~~~~~~~~
-
-To include an image placed in the ``images`` folder (or other folders defined in ``IMAGE_FOLDERS``), use the
-``thumbnail`` directive, like this:
-
-.. code:: restructuredtext
-
- .. thumbnail:: ../tesla.jpg
-
-(make sure to check the file paths!)
-
-The small thumbnail will be placed in the page, and it will be linked to the bigger
-version of the image when clicked, using
-`colorbox <http://www.jacklmoore.com/colorbox>`_ by default. All options supported by
-the reST `image <http://docutils.sourceforge.net/docs/ref/rst/directives.html#image>`_
-directive are supported (except ``target``). If a body element is provided, the
-thumbnail will mimic the behavior of the
-`figure <http://docutils.sourceforge.net/docs/ref/rst/directives.html#figure>`_
-directive instead:
-
-.. code:: restructuredtext
-
- .. thumbnail:: ../tesla.jpg
-
- Nikola Tesla, the man that invented the 20th century.
-
-Slideshows
-~~~~~~~~~~
-
-To create an image slideshow, you can use the ``slides`` directive. For example:
-
-.. code:: restructuredtext
-
- .. slides::
-
- /galleries/demo/tesla_conducts_lg.jpg
- /galleries/demo/tesla_lightning2_lg.jpg
- /galleries/demo/tesla4_lg.jpg
- /galleries/demo/tesla_lightning1_lg.jpg
- /galleries/demo/tesla_tower1_lg.jpg
-
-Chart
-~~~~~
-
-This directive is a thin wrapper around `Pygal <http://pygal.org/>`_ and will produce charts
-as SVG files embedded directly in your pages.
-
-Here's an example of how it works:
-
-.. code:: restructuredtext
-
- .. chart:: Bar
- :title: 'Browser usage evolution (in %)'
- :x_labels: ["2002", "2003", "2004", "2005", "2006", "2007"]
-
- 'Firefox', [None, None, 0, 16.6, 25, 31]
- 'Chrome', [None, None, None, None, None, None]
- 'IE', [85.8, 84.6, 84.7, 74.5, 66, 58.6]
- 'Others', [14.2, 15.4, 15.3, 8.9, 9, 10.4]
-
-The argument passed next to the directive (Bar in that example) is the type of chart, and can be one of
-Line, StackedLine, Bar, StackedBar, HorizontalBar, XY, DateY, Pie, Radar, Dot, Funnel, Gauge, Pyramid. For
-examples of what each kind of graph is, `check here <http://pygal.org/chart_types/>`_
-
-It can take *a lot* of options to let you customize the charts (in the example, title and x_labels).
-You can use any option described in `the pygal docs <http://pygal.org/basic_customizations/>`_
-
-Finally, the content of the directive is the actual data, in the form of a label and
-a list of values, one series per line.
-
-Doc
-~~~
-
-This role is useful to make links to other post or page inside the same site.
-
-Here's an example:
-
-.. code:: restructuredtext
-
- Take a look at :doc:`my other post <creating-a-theme>` about theme creating.
-
-In this case we are giving the portion of text we want to link. So, the result will be:
-
- Take a look at :doc:`my other post <creating-a-theme>` about theme creating.
-
-If we want to use the post's title as the link's text, just do:
-
-.. code:: restructuredtext
-
- Take a look at :doc:`creating-a-theme` to know how to do it.
-
-and it will produce:
-
- Take a look at :doc:`creating-a-theme` to know how to do it.
-
-Post List
-~~~~~~~~~
-
-.. WARNING::
-
- Any post or page that uses this directive will be considered out of date,
- every time a post is added or deleted, causing maybe unnecessary rebuilds.
-
- On the other hand, it will sometimes **not** be considered out of date if
- a post content changes, so it can sometimes be shown outdated, in those
- cases, use ``nikola build -a`` to force a total rebuild.
-
-
-This directive can be used to generate a list of posts. You could use it, for
-example, to make a list of the latest 5 blog posts, or a list of all blog posts
-with the tag ``nikola``:
-
-.. code:: restructuredtext
-
- Here are my 5 latest and greatest blog posts:
-
- .. post-list::
- :stop: 5
-
- These are all my posts about Nikola:
-
- .. post-list::
- :tags: nikola
-
-The following options are recognized:
-
-* ``start`` : integer
- The index of the first post to show.
- A negative value like ``-3`` will show the *last* three posts in the
- post-list.
- Defaults to None.
-
-* ``stop`` : integer
- The index of the last post to show.
- A value negative value like ``-1`` will show every post, but not the
- *last* in the post-list.
- Defaults to None.
-
-* ``reverse`` : flag
- Reverse the order of the post-list.
- Defaults is to not reverse the order of posts.
-
-* ``sort``: string
- Sort post list by one of each post's attributes, usually ``title`` or a
- custom ``priority``. Defaults to None (chronological sorting).
-
-* ``tags`` : string [, string...]
- Filter posts to show only posts having at least one of the ``tags``.
- Defaults to None.
-
-* ``categories`` : string [, string...]
- Filter posts to show only posts having one of the ``categories``.
- Defaults to None.
-
-* ``slugs`` : string [, string...]
- Filter posts to show only posts having at least one of the ``slugs``.
- Defaults to None.
-
-* ``all`` : flag
- Shows all posts and pages in the post list.
- Defaults to show only posts with set *use_in_feeds*.
-
-* ``lang`` : string
- The language of post *titles* and *links*.
- Defaults to default language.
-
-* ``template`` : string
- The name of an alternative template to render the post-list.
- Defaults to ``post_list_directive.tmpl``
-
-* ``id`` : string
- A manual id for the post list.
- Defaults to a random name composed by ``'post_list_' + uuid.uuid4().hex``.
-
-The post list directive uses the ``post_list_directive.tmpl`` template file (or
-another one, if you use the ``template`` option) to generate the list's HTML. By
-default, this is an unordered list with dates and clickable post titles. See
-the template file in Nikola's base theme for an example of how this works.
-
-The list may fail to update in some cases, please run ``nikola build -a`` with
-the appropriate path if this happens.
-
-We recommend using stories with dates in the past (1970-01-01) to avoid
-dependency issues.
-
-Importing your WordPress site into Nikola
------------------------------------------
-
-If you like Nikola, and want to start using it, but you have a WordPress blog, Nikola
-supports importing it. Here are the steps to do it:
-
-1. Get an XML dump of your site [#]_
-2. ``nikola import_wordpress mysite.wordpress.2012-12-20.xml``
-
-After some time, this will create a ``new_site`` folder with all your data. It currently supports
-the following:
-
-* All your posts and pages
-* Keeps “draft” status
-* Your tags and categories
-* Imports your attachments and fixes links to point to the right places
-* Will try to add redirects that send the old post URLs to the new ones
-* Will give you a URL map so you know where each old post was
-
- This is also useful for DISQUS thread migration, or server-based 301
- redirects!
-
-* Allows you to export your comments with each post
-* Exports information on attachments per post
-* There are different methods to transfer the content of your posts:
-
- - You can convert them to HTML with the WordPress page compiler plugin
- for Nikola. This will format the posts including supported shortcodes
- the same way as WordPress does. Use the ``--transform-to-html`` option
- to convert your posts to HTML.
-
- If you use this option, you do not need to install the plugin
- permanently. You can ask Nikola to install the plugin into the subdirectory
- ``plugins`` of the current working directory by specifying
- the ``--install-wordpress-compiler`` option.
-
- - You can leave the posts the way they are and use the WordPress page
- compiler plugin to render them when building your new blog. This also
- allows you to create new posts using the WordPress syntax, or to manually
- add more shortcode plugins later. Use the ``--use-wordpress-compiler``
- option to not touch your posts.
-
- If you want to use this option, you have to install the plugin permanently.
- You can ask Nikola to install the plugin into your new site by specifying
- the ``--install-wordpress-compiler`` option.
-
- - You can let Nikola convert your posts to Markdown. This is *not* error
- free, because WordPress uses some unholy mix of HTML and strange things.
- This is the default option and requires no plugins.
-
- You will find your old posts in ``new_site/posts/post-title.html`` in the first case,
- ``new_site/posts/post-title.wp`` in the second case or ``new_site/posts/post-title.md``
- in the last case if you need to edit or fix any of them.
-
- Please note that the page compiler currently only supports the ``[code]`` shortcode,
- but other shortcodes can be supported via plugins.
-
- Also note that the WordPress page compiler is licensed under GPL v2 since
- it uses code from WordPress itself, while Nikola is licensed under the more
- liberal MIT license.
-
-This feature is a work in progress, and the only way to improve it is to have it used for
-as many sites as possible and make it work better each time, so we are happy to get requests
-about it.
-
-.. [#] The dump needs to be in 1.2 format. You can check by reading it, it should say
- ``xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/"`` near the top of the
- file. If it says ``1.1`` instead of ``1.2`` you will have to update your
- WordPress before dumping.
-
- Other versions may or may not work.
-
-Importing to a custom location or into an existing site
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-It is possible to either import into a location you desire or into an already existing Nikola site.
-To do so you can specify a location after the dump:
-
-.. code:: console
-
- $ nikola import_wordpress mysite.wordpress.2012-12-20.xml -o import_location
-
-With this command Nikola will import into the folder ``import_location``.
-
-If the folder already exists Nikola will not overwrite an existing ``conf.py``.
-Instead a new file with a timestamp at the end of the filename will be created.
-
-Using Twitter Cards
--------------------
-
-Nikola supports Twitter Card summaries, but they are disabled by default.
-
-Twitter Cards enable you to show additional information in Tweets that link
-to you content.
-Nikola supports `Twitter Cards <https://dev.twitter.com/docs/cards>`_.
-They are implemented to use *Open Graph* tags whenever possible.
-
-.. admonition:: Important
-
- To use Twitter Cards you need to opt-in on Twitter.
- To do so, please visit https://cards-dev.twitter.com/validator
-
-Images displayed come from the `previewimage` meta tag.
-
-You can specify the card type by using the `card` parameter in TWITTER_CARD.
-
-To enable and configure your use of Twitter Cards, please modify the
-corresponding lines in your ``conf.py``:
-
-.. code-block:: python
-
- TWITTER_CARD = {
- 'use_twitter_cards': True, # enable Twitter Cards
- 'card': 'summary', # Card type, you can also use 'summary_large_image',
- # see https://dev.twitter.com/cards/types
- 'site': '@website', # twitter nick for the website
- 'creator': '@username', # Username for the content creator / author.
- }
-
-Custom Plugins
---------------
-
-You can create your own plugins (see :doc:`extending`) and use them in your own
-site by putting them in a ``plugins/`` folder. You can also put them in
-directories listed in the ``EXTRA_PLUGINS_DIRS`` configuration variable.
-
-
-Getting Extra Plugins
----------------------
-
-If you want extra plugins, there is also the `Plugins Index <https://plugins.getnikola.com/>`_.
-
-Similarly to themes, there is a nice, built-in command to manage them —
-``plugin``:
-
-.. code:: console
-
- $ nikola plugin -l
- Plugins:
- --------
- helloworld
- tags
- ⋮
- ⋮
-
- $ nikola plugin --install helloworld
- [2013-10-12T16:51:56Z] NOTICE: install_plugin: Downloading: https://plugins.getnikola.com/v6/helloworld.zip
- [2013-10-12T16:51:58Z] NOTICE: install_plugin: Extracting: helloworld into plugins
- plugins/helloworld/requirements.txt
- [2013-10-12T16:51:58Z] NOTICE: install_plugin: This plugin has Python dependencies.
- [2013-10-12T16:51:58Z] NOTICE: install_plugin: Installing dependencies with pip...
- ⋮
- ⋮
- [2013-10-12T16:51:59Z] NOTICE: install_plugin: Dependency installation succeeded.
- [2013-10-12T16:51:59Z] NOTICE: install_plugin: This plugin has a sample config file.
- Contents of the conf.py.sample file:
-
- # Should the Hello World plugin say “BYE” instead?
- BYE_WORLD = False
-
-Then you also can uninstall your plugins:
-
-.. code:: console
-
- $ nikola plugin --uninstall tags
- [2014-04-15T08:59:24Z] WARNING: plugin: About to uninstall plugin: tags
- [2014-04-15T08:59:24Z] WARNING: plugin: This will delete /home/ralsina/foo/plugins/tags
- Are you sure? [y/n] y
- [2014-04-15T08:59:26Z] WARNING: plugin: Removing /home/ralsina/foo/plugins/tags
-
-And upgrade them:
-
-.. code:: console
-
- $ nikola plugin --upgrade
- [2014-04-15T09:00:18Z] WARNING: plugin: This is not very smart, it just reinstalls some plugins and hopes for the best
- Will upgrade 1 plugins: graphviz
- Upgrading graphviz
- [2014-04-15T09:00:20Z] INFO: plugin: Downloading: https://plugins.getnikola.com/v7/graphviz.zip
- [2014-04-15T09:00:20Z] INFO: plugin: Extracting: graphviz into /home/ralsina/.nikola/plugins/
- [2014-04-15T09:00:20Z] NOTICE: plugin: This plugin has third-party dependencies you need to install manually.
- Contents of the requirements-nonpy.txt file:
-
- Graphviz
- http://www.graphviz.org/
-
- You have to install those yourself or through a package manager.
-
-You can also share plugins you created with the community! Visit the
-`GitHub repository <https://github.com/getnikola/plugins>`__ to find out more.
-
-You can use the plugins in this repository without installing them into your
-site, by cloning the repository and adding the path of the plugins directory to
-the ``EXTRA_PLUGINS_DIRS`` list in your configuration.
-
-Advanced Features
------------------
-
-Debugging
-~~~~~~~~~
-
-For pdb debugging in Nikola, you should use ``doit.tools.set_trace()`` instead
-of the usual pdb call. By default, doit (and thus Nikola) redirects stdout and
-stderr. Thus, you must use the different call. (Alternatively, you could run
-with ``nikola build -v 2``, which disables the redirections.)
-
-Shell Tab Completion
-~~~~~~~~~~~~~~~~~~~~
-
-Since Nikola is a command line tool, and this is the 21st century, it's handy to have smart tab-completion
-so that you don't have to type the full commands.
-
-To enable this, you can use the ``nikola tabcompletion`` command like this,
-depending on your shell:
-
-.. code:: console
-
- $ nikola tabcompletion --shell bash --hardcode-tasks > _nikola_bash
- $ nikola tabcompletion --shell zsh --hardcode-tasks > _nikola_zsh
-
-The ``--hardcode-tasks`` adds tasks to the completion and may need updating periodically.
-
-Please refer to your shell’s documentation for help on how to use those files.
-
-License
--------
-
-Nikola is released under the `MIT license <https://getnikola.com/license.html>`_, which is a free software license. Some
-components shipped along with Nikola, or required by it are released under
-other licenses.
-
-If you are not familiar with free software licensing: In general, you should be able to
-do pretty much anything you want, unless you modify Nikola. If you modify it, and share
-it with someone else, that someone else should get all your modifications under the same
-license you got it.