PK†½tA¿.î ‚‚pelican-3.0/genindex.html Index — Pelican 3 documentation

Index

Fork me on GitHub


PK†½tA~×L8484pelican-3.0/internals.html Pelican internals — Pelican 3 documentation

Pelican internals¶

This section describe how Pelican works internally. As you’ll see, it’s quite simple, but a bit of documentation doesn’t hurt. :)

You can also find in the Some history about Pelican section an excerpt of a report the original author wrote with some software design information.

Overall structure¶

What Pelican does is take a list of files and process them into some sort of output. Usually, the input files are reStructuredText and Markdown files, and the output is a blog, but both input and output can be anything you want.

The logic is separated into different classes and concepts:

  • Writers are responsible for writing files: .html files, RSS feeds, and so on. Since those operations are commonly used, the object is created once and then passed to the generators.
  • Readers are used to read from various formats (Markdown and reStructuredText for now, but the system is extensible). Given a file, they return metadata (author, tags, category, etc.) and content (HTML-formatted).
  • Generators generate the different outputs. For instance, Pelican comes with ArticlesGenerator and PageGenerator. Given a configuration, they can do whatever they want. Most of the time, it’s generating files from inputs.
  • Pelican also uses templates, so it’s easy to write your own theme. The syntax is Jinja2 and is very easy to learn, so don’t hesitate to jump in and build your own theme.

How to implement a new reader?¶

Is there an awesome markup language you want to add to Pelican? Well, the only thing you have to do is to create a class with a read method that returns HTML content and some metadata.

Take a look at the Markdown reader:

class MarkdownReader(Reader):
    enabled = bool(Markdown)

    def read(self, filename):
        """Parse content and metadata of markdown files"""
        text = open(filename)
        md = Markdown(extensions = ['meta', 'codehilite'])
        content = md.convert(text)

        metadata = {}
        for name, value in md.Meta.items():
            if name in _METADATA_FIELDS:
                meta = _METADATA_FIELDS[name](value[0])
            else:
                meta = value[0]
            metadata[name.lower()] = meta
        return content, metadata

Simple, isn’t it?

If your new reader requires additional Python dependencies, then you should wrap their import statements in a try...except block. Then inside the reader’s class, set the enabled class attribute to mark import success or failure. This makes it possible for users to continue using their favourite markup method without needing to install modules for formats they don’t use.

How to implement a new generator?¶

Generators have two important methods. You’re not forced to create both; only the existing ones will be called.

  • generate_context, that is called first, for all the generators. Do whatever you have to do, and update the global context if needed. This context is shared between all generators, and will be passed to the templates. For instance, the PageGenerator generate_context method finds all the pages, transforms them into objects, and populates the context with them. Be careful not to output anything using this context at this stage, as it is likely to change by the effect of other generators.
  • generate_output is then called. And guess what is it made for? Oh, generating the output. :) It’s here that you may want to look at the context and call the methods of the writer object that is passed as the first argument of this function. In the PageGenerator example, this method will look at all the pages recorded in the global context and output a file on the disk (using the writer method write_file) for each page encountered.
Fork me on GitHub


PK†½tA7.ßÁ>Á>pelican-3.0/pelican-themes.html pelican-themes — Pelican 3 documentation

pelican-themes¶

Description¶

pelican-themes is a command line tool for managing themes for Pelican.

Usage¶

pelican-themes [-h] [-l] [-i theme path [theme path ...]]
[-r theme name [theme name ...]]
[-s theme path [theme path ...]] [-v] [–version]

Optional arguments:¶

-h, --help Show the help an exit
-l, --list Show the themes already installed
-i theme_path, --install theme_path
 One or more themes to install
-r theme_name, --remove theme_name
 One or more themes to remove
-s theme_path, --symlink theme_path
 Same as “–install”, but create a symbolic link instead of copying the theme. Useful for theme development
-v, --verbose Verbose output
--version Print the version of this script

Examples¶

Listing the installed themes¶

With pelican-themes, you can see the available themes by using the -l or --list option:

$ pelican-themes -l
notmyidea
two-column@
simple
$ pelican-themes --list
notmyidea
two-column@
simple

In this example, we can see there are three themes available: notmyidea, simple, and two-column.

two-column is prefixed with an @ because this theme is not copied to the Pelican theme path, but is instead just linked to it (see Creating symbolic links for details about creating symbolic links).

Note that you can combine the --list option with the -v or --verbose option to get more verbose output, like this:

$ pelican-themes -v -l
/usr/local/lib/python2.6/dist-packages/pelican-2.6.0-py2.6.egg/pelican/themes/notmyidea
/usr/local/lib/python2.6/dist-packages/pelican-2.6.0-py2.6.egg/pelican/themes/two-column (symbolic link to `/home/skami/Dev/Python/pelican-themes/two-column')
/usr/local/lib/python2.6/dist-packages/pelican-2.6.0-py2.6.egg/pelican/themes/simple

Installing themes¶

You can install one or more themes using the -i or --install option. This option takes as argument the path(s) of the theme(s) you want to install, and can be combined with the verbose option:

# pelican-themes --install ~/Dev/Python/pelican-themes/notmyidea-cms --verbose
# pelican-themes --install ~/Dev/Python/pelican-themes/notmyidea-cms\
                           ~/Dev/Python/pelican-themes/martyalchin \
                           --verbose
# pelican-themes -vi ~/Dev/Python/pelican-themes/two-column

Removing themes¶

The pelican-themes command can also remove themes from the Pelican themes path. The -r or --remove option takes as argument the name(s) of the theme(s) you want to remove, and can be combined with the --verbose option.

# pelican-themes --remove two-column
# pelican-themes -r martyachin notmyidea-cmd -v

Doing several things at once¶

The --install, --remove and --symlink option are not mutually exclusive, so you can combine them in the same command line to do more than one operation at time, like this:

# pelican-themes --remove notmyidea-cms two-column \
                 --install ~/Dev/Python/pelican-themes/notmyidea-cms-fr \
                 --symlink ~/Dev/Python/pelican-themes/two-column \
                 --verbose

In this example, the theme notmyidea-cms is replaced by the theme notmyidea-cms-fr

See also¶

Fork me on GitHub


PK†½tAçÚ¸³…+…+pelican-3.0/changelog.html Release history — Pelican 3 documentation

Release history¶

3.0 (2012-08-08)¶

  • Refactored the way URLs are handled
  • Improved the English documentation
  • Fixed packaging using setuptools entrypoints
  • Added typogrify support
  • Added a way to disable feed generation
  • Added support for DIRECT_TEMPLATES
  • Allow multiple extensions for content files
  • Added LESS support
  • Improved the import script
  • Added functional tests
  • Rsync support in the generated Makefile
  • Improved feed support (easily pluggable with Feedburner for instance)
  • Added support for abbr in reST
  • Fixed a bunch of bugs :-)

2.8 (2012-02-28)¶

  • Dotclear importer
  • Allow the usage of Markdown extensions
  • Themes are now easily extensible
  • Don’t output pagination information if there is only one page
  • Add a page per author, with all their articles
  • Improved the test suite
  • Made the themes easier to extend
  • Removed Skribit support
  • Added a pelican-quickstart script
  • Fixed timezone-related issues
  • Added some scripts for Windows support
  • Date can be specified in seconds
  • Never fail when generating posts (skip and continue)
  • Allow the use of future dates
  • Support having different timezones per language
  • Enhanced the documentation

2.7 (2011-06-11)¶

  • Use logging rather than echoing to stdout
  • Support custom Jinja filters
  • Compatibility with Python 2.5
  • Added a theme manager
  • Packaged for Debian
  • Added draft support

2.6 (2011-03-08)¶

  • Changes in the output directory structure
  • Makes templates easier to work with / create
  • Added RSS support (was Atom-only)
  • Added tag support for the feeds
  • Enhance the documentation
  • Added another theme (brownstone)
  • Added translations
  • Added a way to use cleaner URLs with a rewrite url module (or equivalent)
  • Added a tag cloud
  • Added an autoreloading feature: the blog is automatically regenerated each time a modification is detected
  • Translate the documentation into French
  • Import a blog from an RSS feed
  • Pagination support
  • Added Skribit support

2.5 (2010-11-20)¶

  • Import from Wordpress
  • Added some new themes (martyalchin / wide-notmyidea)
  • First bug report!
  • Linkedin support
  • Added a FAQ
  • Google Analytics support
  • Twitter support
  • Use relative URLs, not static ones

2.4 (2010-11-06)¶

  • Minor themes changes
  • Add Disqus support (so we have comments)
  • Another code refactoring
  • Added config settings about pages
  • Blog entries can also be generated in PDF

2.3 (2010-10-31)¶

  • Markdown support

2.2 (2010-10-30)¶

  • Prettify output
  • Manages static pages as well

2.1 (2010-10-30)¶

  • Make notmyidea the default theme

2.0 (2010-10-30)¶

  • Refactoring to be more extensible
  • Change into the setting variables

1.2 (2010-09-28)¶

  • Added a debug option
  • Added per-category feeds
  • Use filesystem to get dates if no metadata is provided
  • Add Pygments support

1.1 (2010-08-19)¶

  • First working version
Fork me on GitHub


PK†½tAß8o=ÕVÕV pelican-3.0/getting_started.html Getting started — Pelican 3 documentation

Getting started¶

Installing Pelican¶

You’re ready? Let’s go! You can install Pelican via several different methods. The simplest is via pip:

$ pip install pelican

If you don’t have pip installed, an alternative method is easy_install:

$ easy_install pelican

While the above is the simplest method, the recommended approach is to create a virtual environment for Pelican via virtualenv and virtualenvwrapper before installing Pelican. Assuming you’ve followed the virtualenvwrapper installation and shell configuration steps, you can then open a new terminal session and create a new virtual environment for Pelican:

$ mkvirtualenv pelican

Once the virtual environment has been created and activated, Pelican can be be installed via pip or easy_install as noted above. Alternatively, if you have the project source, you can install Pelican using the distutils method:

$ cd path-to-Pelican-source
$ python setup.py install

If you have Git installed and prefer to install the latest bleeding-edge version of Pelican rather than a stable release, use the following command:

$ pip install -e git://github.com/getpelican/pelican#egg=pelican

If you plan on using Markdown as a markup format, you’ll need to install the Markdown library as well:

$ pip install Markdown

Upgrading¶

If you installed a stable Pelican release via pip or easy_install and wish to upgrade to the latest stable release, you can do so by adding --upgrade to the relevant command. For pip, that would be:

$ pip install --upgrade pelican

If you installed Pelican via distutils or the bleeding-edge method, simply perform the same step to install the most recent version.

Dependencies¶

At this time, Pelican is dependent on the following Python packages:

  • feedgenerator, to generate the Atom feeds
  • jinja2, for templating support
  • docutils, for supporting reStructuredText as an input format

If you’re not using Python 2.7, you will also need the argparse package.

Optionally:

  • pygments, for syntax highlighting
  • Markdown, for supporting Markdown as an input format

Kickstart a blog¶

Following is a brief tutorial for those who want to get started right away. We’re going to assume that virtualenv and virtualenvwrapper are installed and configured; if you’ve installed Pelican outside of a virtual environment, you can skip to the pelican-quickstart command. Let’s first create a new virtual environment and install Pelican into it:

$ mkvirtualenv pelican
$ pip install pelican Markdown

Next we’ll create a directory to house our site content and configuration files, which can be located any place you prefer, and associate this new project with the currently-active virtual environment:

$ mkdir ~/code/yoursitename
$ cd ~/code/yoursitename
$ setvirtualenvproject

Now we can run the pelican-quickstart command, which will ask some questions about your site:

$ pelican-quickstart

Once you finish answering all the questions, you can begin adding content to the content folder that has been created for you. (See Writing articles using Pelican section below for more information about how to format your content.) Once you have some content to generate, you can convert it to HTML via the following command:

$ make html

If you’d prefer to have Pelican automatically regenerate your site every time a change is detected (handy when testing locally), use the following command instead:

$ make regenerate

To serve the site so it can be previewed in your browser at http://localhost:8000:

$ make serve

Normally you would need to run make regenerate and make serve in two separate terminal sessions, but you can run both at once via:

$ make devserver

The above command will simultaneously run Pelican in regeneration mode as well as serve the output at http://localhost:8000. Once you are done testing your changes, you should stop the development server via:

$ ./develop_server.sh stop

When you’re ready to publish your site, you can upload it via the method(s) you chose during the pelican-quickstart questionnaire. For this example, we’ll use rsync over ssh:

$ make rsync_upload

That’s it! Your site should now be live.

Writing articles using Pelican¶

File metadata¶

Pelican tries to be smart enough to get the information it needs from the file system (for instance, about the category of your articles), but some information you need to provide in the form of metadata inside your files.

You can provide this metadata in reStructuredText text files via the following syntax (give your file the .rst extension):

My super title
##############

:date: 2010-10-03 10:20
:tags: thats, awesome
:category: yeah
:author: Alexis Metaireau

Pelican implements an extension of reStructuredText to enable support for the abbr HTML tag. To use it, write something like this in your post:

This will be turned into :abbr:`HTML (HyperText Markup Language)`.

You can also use Markdown syntax (with a file ending in .md). Markdown generation will not work until you explicitly install the Markdown package, which can be done via pip install Markdown. Metadata syntax for Markdown posts should follow this pattern:

Date: 2010-12-03
Title: My super title
Tags: thats, awesome
Slug: my-super-post

This is the content of my super blog post.

Note that, aside from the title, none of this metadata is mandatory: if the date is not specified, Pelican will rely on the file’s “mtime” timestamp, and the category can be determined by the directory in which the file resides. For example, a file located at python/foobar/myfoobar.rst will have a category of foobar.

Generate your blog¶

The make shortcut commands mentioned in the Kickstart a blog section are mostly wrappers around the pelican command that generates the HTML from the content. The pelican command can also be run directly:

$ pelican /path/to/your/content/ [-s path/to/your/settings.py]

The above command will generate your weblog and save it in the content/ folder, using the default theme to produce a simple site. The default theme is simple HTML without styling and is provided so folks may use it as a basis for creating their own themes.

Pelican has other command-line switches available. Have a look at the help to see all the options you can use:

$ pelican --help

Auto-reload¶

It’s possible to tell Pelican to watch for your modifications, instead of manually re-running it every time you want to see your changes. To enable this, run the pelican command with the -r or --autoreload option.

Pages¶

If you create a folder named pages, all the files in it will be used to generate static pages.

Then, use the DISPLAY_PAGES_ON_MENU setting, which will add all the pages to the menu.

If you want to exclude any pages from being linked to or listed in the menu then add a status: hidden attribute to its metadata. This is useful for things like making error pages that fit the generated theme of your site.

Importing an existing blog¶

It is possible to import your blog from Dotclear, WordPress, and RSS feeds using a simple script. See Import from other blog software.

Translations¶

It is possible to translate articles. To do so, you need to add a lang meta attribute to your articles/pages and set a DEFAULT_LANG setting (which is English [en] by default). With those settings in place, only articles with the default language will be listed, and each article will be accompanied by a list of available translations for that article.

Pelican uses the article’s URL “slug” to determine if two or more articles are translations of one another. The slug can be set manually in the file’s metadata; if not set explicitly, Pelican will auto-generate the slug from the title of the article.

Here is an example of two articles, one in English and the other in French.

The English article:

Foobar is not dead
##################

:slug: foobar-is-not-dead
:lang: en

That's true, foobar is still alive!

And the French version:

Foobar n'est pas mort !
#######################

:slug: foobar-is-not-dead
:lang: fr

Oui oui, foobar est toujours vivant !

Post content quality notwithstanding, you can see that only item in common between the two articles is the slug, which is functioning here as an identifier. If you’d rather not explicitly define the slug this way, you must then instead ensure that the translated article titles are identical, since the slug will be auto-generated from the article title.

Syntax highlighting¶

Pelican is able to provide colorized syntax highlighting for your code blocks. To do so, you have to use the following conventions (you need to put this in your content files).

For RestructuredText:

.. code-block:: identifier

   your code goes here

For Markdown, format your code blocks thusly:

:::identifier
your code goes here

The specified identifier should be one that appears on the list of available lexers.

Publishing drafts¶

If you want to publish an article as a draft (for friends to review before publishing, for example), you can add a status: draft attribute to its metadata. That article will then be output to the drafts folder and not listed on the index page nor on any category page.

Viewing the generated files¶

The files generated by Pelican are static files, so you don’t actually need anything special to see what’s happening with the generated files.

You can either use your browser to open the files on your disk:

$ firefox output/index.html

Or run a simple web server using Python:

cd output && python -m SimpleHTTPServer
Fork me on GitHub


PK†½tA2ä#!!pelican-3.0/objects.inv# Sphinx inventory version 2 # Project: Pelican # Version: 3.0 # The remainder of this file is compressed using zlib. xÚm1 Ã0 EwŸBЮ)tí š¡è œXv ¶ed‡´·oƒœ!¥›ôÿû|ÉaòÉà J5· G Ð]Á5õ2×NÐo³ª3FŸ\—1øI§cb3±†;­P &F]±y`‰a¬ŠdþÔæw·­ùAf Ø(¨yšÑý`ÐU‹ó©üˆ¸Ÿ9Ȫ|ÌÄõˆŠ†¼³½0–)}?b9(dëªÕ°sÚPK†½tAz§²ú1ú1pelican-3.0/report.html Some history about Pelican — Pelican 3 documentation

Some history about Pelican¶

Warning

This page comes from a report the original author (Alexis Métaireau) wrote right after writing Pelican, in December 2010. The information may not be up-to-date.

Pelican is a simple static blog generator. It parses markup files (Markdown or reStructuredText for now) and generates an HTML folder with all the files in it. I’ve chosen to use Python to implement Pelican because it seemed to be simple and to fit to my needs. I did not wanted to define a class for each thing, but still wanted to keep my things loosely coupled. It turns out that it was exactly what I wanted. From time to time, thanks to the feedback of some users, it took me a very few time to provide fixes on it. So far, I’ve re-factored the Pelican code by two times; each time took less than 30 minutes.

Use case¶

I was previously using WordPress, a solution you can host on a web server to manage your blog. Most of the time, I prefer using markup languages such as Markdown or reStructuredText to type my articles. To do so, I use vim. I think it is important to let the people choose the tool they want to write the articles. In my opinion, a blog manager should just allow you to take any kind of input and transform it to a weblog. That’s what Pelican does. You can write your articles using the tool you want, and the markup language you want, and then generate a static HTML weblog.

_images/overall.png

To be flexible enough, Pelican has template support, so you can easily write your own themes if you want to.

Design process¶

Pelican came from a need I have. I started by creating a single file application, and I have make it grow to support what it does by now. To start, I wrote a piece of documentation about what I wanted to do. Then, I created the content I wanted to parse (the reStructuredText files) and started experimenting with the code. Pelican was 200 lines long and contained almost ten functions and one class when it was first usable.

I have been facing different problems all over the time and wanted to add features to Pelican while using it. The first change I have done was to add the support of a settings file. It is possible to pass the options to the command line, but can be tedious if there is a lot of them. In the same way, I have added the support of different things over time: Atom feeds, multiple themes, multiple markup support, etc. At some point, it appears that the “only one file” mantra was not good enough for Pelican, so I decided to rework a bit all that, and split this in multiple different files.

I’ve separated the logic in different classes and concepts:

  • writers are responsible of all the writing process of the files. They are responsible of writing .html files, RSS feeds and so on. Since those operations are commonly used, the object is created once, and then passed to the generators.
  • readers are used to read from various formats (Markdown and reStructuredText for now, but the system is extensible). Given a file, they return metadata (author, tags, category, etc) and content (HTML formatted).
  • generators generate the different outputs. For instance, Pelican comes with an ArticlesGenerator and PagesGenerator, into others. Given a configuration, they can do whatever you want them to do. Most of the time it’s generating files from inputs (user inputs and files).

I also deal with contents objects. They can be Articles, Pages, Quotes, or whatever you want. They are defined in the contents.py module and represent some content to be used by the program.

In more detail¶

Here is an overview of the classes involved in Pelican.

_images/uml.jpg

The interface does not really exist, and I have added it only to clarify the whole picture. I do use duck typing and not interfaces.

Internally, the following process is followed:

  • First of all, the command line is parsed, and some content from the user is used to initialize the different generator objects.
  • A context is created. It contains the settings from the command line and a settings file if provided.
  • The generate_context method of each generator is called, updating the context.
  • The writer is created and given to the generate_output method of each generator.

I make two calls because it is important that when the output is generated by the generators, the context will not change. In other words, the first method generate_context should modify the context, whereas the second generate_output method should not.

Then, it is up to the generators to do what the want, in the generate_context and generate_content method. Taking the ArticlesGenerator class will help to understand some others concepts. Here is what happens when calling the generate_context method:

  • Read the folder “pathâ€, looking for restructured text files, load each of them, and construct a content object (Article) with it. To do so, use Reader objects.
  • Update the context with all those articles.

Then, the generate_content method uses the context and the writer to generate the wanted output.

Fork me on GitHub


PK†½tAÀ-GìlElEpelican-3.0/index.html Pelican — Pelican 3 documentation

Pelican¶

Pelican is a static site generator, written in Python.

  • Write your weblog entries directly with your editor of choice (vim!) in reStructuredText or Markdown
  • Includes a simple CLI tool to (re)generate the weblog
  • Easy to interface with DVCSes and web hooks
  • Completely static output is easy to host anywhere

Features¶

Pelican currently supports:

  • Blog articles and pages
  • Comments, via an external service (Disqus). (Please note that while useful, Disqus is an external service, and thus the comment data will be somewhat outside of your control and potentially subject to data loss.)
  • Theming support (themes are created using Jinja2 templates)
  • PDF generation of the articles/pages (optional)
  • Publication of articles in multiple languages
  • Atom/RSS feeds
  • Code syntax highlighting
  • Compilation of LESS CSS (optional)
  • Import from WordPress, Dotclear, or RSS feeds
  • Integration with external tools: Twitter, Google Analytics, etc. (optional)

Why the name “Pelican”?¶

“Pelican” is an anagram for calepin, which means “notebook” in French. ;)

Source code¶

You can access the source code at: https://github.com/getpelican/pelican

Feedback / Contact us¶

If you want to see new features in Pelican, don’t hesitate to offer suggestions, clone the repository, etc. There are many ways to contribute. That’s open source, dude!

Send a message to “alexis at notmyidea dot org” with any requests/feedback! You can also join the team at #pelican on Freenode (or if you don’t have an IRC client handy, use the webchat for quick feedback.

Documentation¶

A French version of the documentation is available at Pelican.

Fork me on GitHub



PK†½tA:š7Ž9Ž9pelican-3.0/faq.html Frequently Asked Questions (FAQ) — Pelican 3 documentation

Frequently Asked Questions (FAQ)¶

Here is a summary of the frequently asked questions for Pelican.

What’s the best way to communicate a problem, question, or suggestion?¶

If you have a problem, question, or suggestion, please start by striking up a conversation on #pelican on Freenode. Those who don’t have an IRC client handy can jump in immediately via IRC webchat. Because of differing time zones, you may not get an immediate response to your question, but please be patient and stay logged into IRC — someone will almost always respond.

If you are unable to resolve your issue or if you have a feature request, please refer to the issue tracker.

How can I help?¶

There are several ways to help out. First, you can use Pelican and report any suggestions or problems you might have via IRC or the issue tracker.

If you want to contribute, please fork the git repository, create a new feature branch, make your changes, and issue a pull request. Someone will review your changes as soon as possible. Please refer to the How to Contribute section for more details.

You can also contribute by creating themes and improving the documentation.

Is it mandatory to have a configuration file?¶

No, it’s not. Configuration files are just an easy way to configure Pelican. For basic operations, it’s possible to specify options while invoking Pelican via the command line. See pelican --help for more information.

I’m creating my own theme. How do I use Pygments for syntax highlighting?¶

Pygments adds some classes to the generated content. These classes are used by themes to style code syntax highlighting via CSS. Specifically, you can customize the appearance of your syntax highlighting via the .codehilite pre class in your theme’s CSS file. To see how various styles can be used to render Django code, for example, you can use the demo on the project website.

How do I create my own theme?¶

Please refer to How to create themes for Pelican.

I want to use Markdown, but I got an error.¶

Markdown is not a hard dependency for Pelican, so you will need to explicitly install it. You can do so by typing:

$ (sudo) pip install markdown

In case you don’t have pip installed, consider installing it via:

$ (sudo) easy_install pip

Can I use arbitrary meta-data in my templates?¶

Yes. For example, to include a modified date in a Markdown post, one could include the following at the top of the article:

Modified: 2012-08-08

That meta-data can then be accessed in the template:

{% if article.modified %}
Last modified: {{ article.modified}}
{% endif %}

How do I assign custom templates on a per-page basis?¶

It’s as simple as adding an extra line of metadata to any pages or articles you want to have its own template.

template:template_name

Then just make sure to have the template installed in to your theme as template_name.html.

What if I want to disable feed generation?¶

To disable all feed generation set FEED_ATOM and FEED_RSS to None in your settings. Please note None and '' are not the same thing. The word None should not be surrounded by quotes.

I’m getting a warning about feeds generated without SITEURL being set properly¶

RSS and Atom feeds require all URLs and links in them to be absolute. In order to properly generate all URLs properly in Pelican you will need to set SITEURL to the full path of your blog. When using make html and the default Makefile provided by the pelican-quickstart bootstrap script to test build your site, it’s normal to see this warning since SITEURL is deliberately left undefined. If configured properly no other make commands should result in this warning.

Feeds are still generated when this warning is displayed but may not validate.

My feeds are broken since I upgraded to Pelican 3.0¶

Starting in 3.0, some of the FEED setting names were changed to more explicitly refer to the Atom feeds they inherently represent (much like the FEED_RSS setting names). Here is an exact list of the renamed setting names:

FEED -> FEED_ATOM
TAG_FEED -> TAG_FEED_ATOM
CATEGORY_FEED -> CATEGORY_FEED_ATOM

Older 2.x themes that referenced the old setting names may not link properly. In order to rectify this, please update your theme for compatibility with 3.0+ by changing the relevant values in your template files. For an example of complete feed headers and usage please check out the simple theme.

Fork me on GitHub


PK†½tAÊ^ädädpelican-3.0/searchindex.jsSearch.setIndex({objects:{},terms:{kickstart:[5,16],"\u00e9videm":[22,6],all:[13,19,12,2,22,3,15,10,20,16],prefix:21,"appr\u00e9hend":11,aider:[9,14],dist:[21,17],concaten:20,utilisateur:0,aug:20,tweet:[11,20],under:20,aux:[9,11,14],everi:16,"\u00e9diteur":9,"activ\u00e9":18,affect:[1,6],ajust:0,piwik_site_id:20,voir:[11,14,8,9,22,17],cmd:[21,17],upload:[10,16],direct:[2,9,18,20],second:[2,15,19,3],entr:[8,18],"fr\u00e9quemment":[8,14],tiret:6,penchez:8,permett:11,blue:2,asid:16,lessc:20,"new":[5,1,19,12,13,2,20,16],metadata:[13,19,12,3,15,20,16],widget:20,retrouvera:18,never:19,here:[1,20,12,13,2,3,15,10,16],met:[11,6],path:[22,12,20,11,7,3,15,10,21,16],"m\u00eame":[18,9,17,6],tant:[6,0],indiquez:11,datetim:[11,20],"acc\u00e8":[11,17],"_save_a":20,ziad:20,changer:0,releas:[5,16,19],unix:20,txt:[7,1,20],highli:20,describ:[2,1,13,20,3],would:[10,20,16,3],jpn:20,call:[15,10,13,20],asset:[2,20],recommend:[16,20],strike:12,assez:[8,9,6],type:[2,15,12,20],tell:16,"utilis\u00e9":[22,11,4],relat:[2,20,19],hurt:13,warn:[15,5,12,20],loss:5,moin:8,must:[2,16,20],join:5,setup:[8,1,16,20],work:[13,19,1,21,6,20,16],"g\u00e9rer":[11,17],existant:18,"g\u00e9rez":9,root:0,overrid:20,lexer:16,give:[1,16,20],want:[5,13,20,12,2,21,15,10,16],end:[16,20],jusqu:6,quot:[2,15,12,20],github_act:3,how:[5,1,20,12,13,2,3,16],cname:20,traver:22,answer:16,"fa\u00e7on":[8,17],quoi:11,config:19,updat:[2,15,12,1,13],after:[15,21],befor:[16,20],moteur:18,souci:6,util:[11,17],lancer:22,third:2,croissant:18,bootstrap:12,"acc\u00e9der":[18,9],exclud:[16,20],perform:16,maintain:20,environ:[5,1,16],incorpor:20,exclus:21,order:[2,5,12,20],oper:[15,7,12,13,21],peux:17,feedback:[15,5,9],over:[15,10,16,3],failur:13,becaus:[15,12,21,20],peut:[18,22,11,17],faudrait:11,piwik:20,flexibl:[15,20],cli:5,fit:[15,16],fix:[15,1,19],hidden:16,easier:19,split:15,them:[1,20,12,13,2,3,15,21],thei:[13,20,12,2,7,3,15],effectu:17,jinja2:[18,5,13,20,11,2,9,16],choic:5,thyme:20,develop_serv:16,"install\u00e9":[8,17],cepend:[8,11,4,6],each:[13,19,1,2,21,15,10,20,16],debug:19,choix:8,side:3,mean:[5,20],lign:[6,11,0,14,9,17],"cr\u00e9er":[18,6,11,14,9,22,17],diminutif:6,"cr\u00e9ez":[4,6],extract:3,"cl\u00e9":[18,6],"proc\u00e9don":8,content:[18,5,1,19,12,13,2,21,15,20,16,17],rewrit:[2,19],reader:[15,5,13],got:[5,12],serveur:11,generate_context:[15,13],article_lang_url:20,author_save_a:20,wherea:15,free:[2,11,1],standard:[5,1],generate_output:[15,13],twitter_usernam:[11,20],filter:[20,19],pagin:[2,5,20,18,19],unabl:12,render:[12,20],feed_rss:[2,11,12,20],hook:[5,10],alreadi:[2,21,20],messag:[8,5,7,10],cssmin:20,lister:[18,17],top:[2,12,20],tou:18,underlin:2,master:[8,10,1],too:20,tool:[5,20,1,7,21,15],setuptool:[8,19],took:15,sitenam:[11,20],somewhat:5,"document\u00e9":11,dotaddict:7,"m\u00e9ta":6,date_format:20,prendra:[11,17],provid:[1,19,12,3,15,20,16],project:[10,1,16,12],minut:15,raw:3,manner:20,seem:15,"pr\u00e9ciser":11,en_u:20,latter:1,avion:6,contact:5,voyon:17,zubin:20,anglophon:6,"r\u00e9pertoir":[22,11,6,17,0],usernam:[10,20],object:[2,15,13,20,3],doit:[18,11],dessu:[4,17],regular:2,"v\u00e9rifier":11,don:[5,1,19,12,13,2,3,20,16],commentair:9,doc:[21,17],doe:[15,13,20],dummi:1,efficac:6,dot:[5,9],utilitair:8,ajout:[14,6],radiu:2,syntax:[18,5,12,1,13,2,7,9,16],contactez:9,make:[1,19,12,13,2,3,15,10,20,16],involv:15,absolut:[12,20],page_url:20,menu:[2,11,16,20],configur:[18,5,12,6,11,13,22,14,15,9,20,16],apach:11,"cr\u00e9ant":14,"cr\u00e9ation":22,theme:[18,5,11,19,12,13,21,2,7,14,15,9,20,16,17],folder:[2,15,16,20],"s\u00e9par\u00e9":6,keep_output:11,datauri:20,stop:16,deviendra:[4,6],report:[1,19,12,13,6,15],boulot:6,emb:2,excel:10,"public":[5,7],sauc:22,reload:16,respond:12,fair:[11,6,17,0],mandatori:[2,5,12,16,20],result:12,respons:[15,12,13],fail:19,best:[5,12,20],subject:5,sorti:[9,22,11,17],conmmand:9,wikipedia:20,bien:[8,9,22,11,6],propr:[18,9,14],simplest:16,awai:16,irc:[5,12],approach:16,attribut:[2,13,16,20],extend:[2,18,19],were:[12,20],extens:[19,13,20,11,15,16],default_date_format:20,auteur:[9,11,6],auron:8,easi:[5,10,12,13,20],tag_save_a:20,zubin71:20,howev:20,article_generate_context:3,logic:[15,13,3],skribit:19,com:[5,20,1,7,3,8,9,10,16],"remarqu\u00e9":9,foobar:[16,20],height:2,tarek:20,guid:20,assum:[16,20],san:[8,11],three:21,been:[2,15,16,3],much:12,valu:[2,12,13,20],interest:10,basic:[5,12,1,20],"200px":2,hesit:[5,1,13,3],notmyidea:[5,19,20,21,9,22,17],xxx:[11,20],ani:[5,12,20,1,7,15,16],"t\u00eate":11,gnu:[22,11,6],servic:[5,9],voici:14,aid:[18,17],servir:11,calepin:[5,9],recevront:18,enlev:11,conf:[10,1,20],tediou:15,sever:[12,21,16,20],quand:[11,4,6],"h\u00e9sitez":9,receiv:2,suggest:[5,12],passon:11,thusli:16,descend:2,complet:[2,5,12,20],contr:[8,6],yyyyyi:[11,20],thu:5,inherit:[2,5],client:[5,12],thi:[1,20,12,13,2,7,3,15,10,21,16],endif:[12,3],gzip:20,voulez:[18,9,11,17,14],left:12,identifi:[20,16,6],just:[18,1,20,12,2,14,15,10,21,3],remarqu:11,"00703b9d":20,languag:[19,5,20,13,15,16],previous:[2,15],ell:[18,17],els:13,save:[2,16,20],adress:[18,9],anglai:[18,6],applic:15,deux:8,"pos\u00e9":14,"fran\u00e7ai":11,background:2,bouton:11,specif:[2,12,1],arbitrari:[5,12],manual:16,fournit:11,signal:[5,14,3],www:[11,20],right:[2,15,16],old:[2,12],deal:15,excerpt:13,dead:16,pointant:17,intern:[15,5,13],"g\u00e9n\u00e9r\u00e9":[18,22,14],reverse_category_ord:20,"sp\u00e9cifier":14,cncjuc:20,flux:[9,22,11],votrerepertoiresourc:8,tracker:12,articles_pag:[2,18],"400px":2,foi:[11,17],localhost:16,"premi\u00e8r":[8,9,22],core:[8,3],default_lang:[11,16,20,6],collez:6,repositori:[5,10,12,21],anagram:5,post:[19,12,2,7,10,20,16],"super":[2,4,16],chapter:20,mithra:20,surround:12,done:[15,16],commit:[10,1],produc:[16,20],article_save_a:20,endasset:20,soi:9,lien:[11,17],son:[8,9,22,18],lier:17,sou:17,lieu:17,wrap:13,git:[12,1,14,8,9,10,22,16],wai:[5,1,19,12,3,15,20,16],yoursitenam:16,support:[5,19,20,2,7,15,9,16,17],transform:[15,13],"class":[13,20,12,2,14,15,21,3,17],avail:[5,20,2,21,10,16],width:2,reli:[7,16,20],wordpress:[5,20,19,7,15,16],editor:5,fork:[12,1],head:2,medium:20,form:[10,16,20],offer:[5,20],forc:13,rsync_upload:16,synonym:20,truc:[9,4],codehilit:[12,13,20],freenod:[5,12],preview:16,ouvrez:22,bugfix:1,maximum:20,until:[16,20],"r\u00e9sum\u00e9":14,"accentu\u00e9":11,featur:[5,1,19,12,3,15,10,20],typographiqu:[9,0],petit:0,exist:[18,13,1,2,15,16],ship:3,check:[12,1,20],tip:[5,10],refactor:19,entrypoint:19,test:[19,5,12,0,1,7,3,9,20,16],dictionnair:18,langag:11,ici:[8,18,6],devon:6,consid:12,lorem:7,anywher:[5,20],bottom:2,"d\u00e9velopp":[8,17],actuel:[18,9],time:[13,19,1,2,12,21,15,10,16],push:10,sujet:14,google_analyt:[11,20],mydomain:20,concept:[8,15,13,3],chain:11,rentrer:11,skip:[16,19],global:[11,13,20],multilingu:6,retour:9,"requ\u00eat":9,decid:[15,20],depend:[7,1,13,16,12],zone:12,donner:6,"r\u00e9f\u00e9rer":14,sourc:[5,0,1,7,8,9,20,16],string:[20,3],feedgener:16,word:[15,12,20],exact:[12,17],did:15,iter:3,item:[13,16,20],team:5,quick:5,div:[2,17,21,20,3],brownston:19,dir:7,upper:20,arboresc:11,"compliqu\u00e9":[8,6],plu:[8,14,11,17,6],patient:12,appear:[15,12,16,20],beautifulsoup:7,"\u00e9l\u00e9ment":18,current:[2,5,20,16,3],fichier:[18,6,11,0,14,9,22,17],gener:[5,13,19,1,2,12,15,10,20,16],supprim:17,french:[5,16,19],modif:[19,14,21,8,16,17],address:20,along:20,"fonctionnalit\u00e9":[9,17],langu:6,rework:15,bon:[18,11],files_to_copi:20,commonli:[15,13],environn:[9,0],extra:[12,20],modul:[19,20,13,15,7,8],prefer:[15,16,20],instal:[5,12,0,1,13,21,7,3,8,9,10,20,16,17],pagegener:13,metaireau:16,dude:5,live:[1,16],pert:9,"d\u00e9placez":6,python:[5,13,19,1,15,7,21,8,9,20,16,17],peopl:15,enhanc:[1,19],appel:11,articles_pagin:[2,18],car:6,prepar:6,cap:[2,20],uniqu:20,cat:7,can:[5,12,19,1,13,21,2,7,3,15,10,20,16],default_categori:[11,20],purpos:[10,20],abord:14,favourit:13,pourrait:9,manqu:8,"d\u00e9croissant":18,alwai:[12,20],multipl:[15,5,20,19],write:[5,13,2,15,22,16],fourth:2,traduir:6,map:3,traduit:6,clone:[8,5,1],usabl:15,sinon:8,mai:[18,12,20,11,13,15,8,16,17],data:[5,12],mal:6,permet:[11,17,6],ghp:10,avant:11,page_lang_url:20,"metadonn\u00e9":11,inform:[12,19,11,13,14,15,20,16],"switch":16,combin:[21,17],callabl:3,"d\u00e9faut":[22,11,4,6],jeun:8,category_feed_rss:[2,11,20],still:[2,15,12,16,6],monitor:20,constructeur:11,display_pages_on_menu:[11,16,20],"reg\u00e9n\u00e9rer":11,window:[20,19],anagramm:9,main:[20,11,21,17,6],nom:[18,6,11,0,9,22,17],non:[14,11,6],initi:[15,6,3],lastfm:20,nou:[6,11,8,9,22,17],devient:4,now:[19,13,2,21,15,10,16],nor:16,dotclear:[5,7,16,19],name:[5,13,20,12,2,7,21,16],revers:20,separ:[15,13,16,20],gravatar:3,cett:[18,17,6],dispon:[18,17],domain:20,replac:[2,21],continu:[13,19],happen:[15,16],valeur:[18,11,6],leur:18,"clart\u00e9":6,bla:[22,4],feed_domain:20,org:[5,20,21,7,14,9,17],quitt:17,care:13,syndic:[9,22,11],turn:[15,16],place:[16,20],think:15,frequent:[5,12],first:[13,19,12,2,3,15,20,16],origin:[20,13,15,6,8,10],pelican:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],directli:[5,20,2,3,10,16],template_nam:12,onc:[15,13,16,21],votr:[18,22,6,11,14,9,4],affich:[18,11,17],oppos:1,open:[2,5,13,16,9],size:[2,20],given:[15,10,13],convent:[9,16,0],"fen\u00eatr":17,draft:[16,19],beatifulsoup:7,white:2,conveni:20,utlis:18,friend:16,gosquar:[11,20],copi:[2,20,21,17],specifi:[19,12,16,20,3],github:[5,11,20,1,3,8,9,10,16],enclos:20,mostli:16,than:[15,21,16,19],png:[21,17],serv:16,wide:[20,19],article_lang_save_a:20,favori:9,sera:[18,11,17],newest_first_arch:[11,20],browser:[16,20],pre:[2,12,21,20,17],aller:22,premier:[9,22],pri:11,argument:[7,13,21,17,3],engin:2,techniqu:4,notr:[22,11,6],note:[5,12,21,16,20],take:[13,2,21,15,10,3],obligatoir:[18,9,14],unittest2:1,monokai:20,begin:[16,20],sure:[12,20],"r\u00e9alis":[18,17],normal:[12,16,20],compress:20,direct_template_nam:20,coloris:14,doivent:18,"\u00e9diter":22,renam:12,quantiti:20,troi:17,"cr\u00e9\u00e9":22,show:[7,21],typogrifi:[20,19],hack:3,fifth:2,xml:[7,22,20],"diff\u00e9renc":6,onli:[19,13,3,15,20,16],explicitli:[2,12,16,20],"true":[16,20],activ:[2,11,16,20,3],css_file:[11,20],dict:[2,20],"diff\u00e9rent":[22,11],plugin_path:3,analyt:[5,11,20,19],analys:[9,22],prenant:4,variou:[15,12,13],get:[5,19,12,2,21,8,20,16],"proc\u00e9der":8,between:[13,16,20],ssl:20,"d\u00e9crit":18,inuit:20,ssh:16,balisag:11,requir:[7,12,13,20],output_path:[11,20],"h\u00e9berger":9,where:20,summari:[2,18,12,20],save_a:20,"cr\u00e9e":[9,17,14],diver:[9,11],concern:0,remarquerez:22,detect:[16,19],jeter:14,review:[12,16],enough:[15,16],nuag:18,"import":[19,5,13,6,11,2,7,3,15,9,10,16],page_nam:[2,18],comm:[22,11,17],come:[15,10,13,20],repertoir:[11,6],"r\u00e9f\u00e9renc":6,tutori:16,tout:[18,6,14,8,22,17],feed_atom:[2,11,12,20],improv:[12,1,20,19],"ins\u00e9rer":18,"\u00e9t\u00e9":[22,17],color:[2,16],overview:15,devrait:11,inspir:[2,18],exploit:17,besoin:[8,18,11,6],coupl:15,"m\u00e9taireau":[15,20],mark:[13,20],feed_max_item:20,addit:[13,20],"propri\u00e9t\u00e9":18,generate_cont:15,"d\u00e9tail":[11,17],those:[15,12,13,16,3],"case":[15,5,12,20],default_metadata:20,invok:[12,3],margin:2,"_metadata_field":13,argpars:16,advantag:10,stdout:19,pagesgener:[15,3],destin:20,"__init__":3,par:[18,22,6,11,14,8,4,17],develop:[5,1,21,16,20],generateur:9,author:[18,1,6,11,13,19,2,22,15,20,16],alphabet:20,same:[20,12,2,21,15,16],"ex\u00e9cut":0,"th\u00e8me":[18,11,14,9,22,17],pad:2,author_url:20,markdownread:13,document:[18,5,1,6,12,13,19,2,14,15,9,20],flake8:1,finish:16,wpcandi:7,someon:12,mani:[5,1],extern:[5,9],appropri:20,"r\u00e9cup\u00e9rez":8,markup:[13,20,11,7,15,16],category_nam:2,without:[5,13,20,12,3,21,16],default_orphan:20,vueillez:14,when:[19,1,20,12,15,16],webasset:20,"imm\u00e9diat":17,aura:0,europ:20,miscellan:11,hint:1,except:13,blog:[18,5,11,6,12,13,19,2,7,22,21,15,9,10,20,16,17],yuicompressor:20,hover:2,around:16,read:[15,13],gra:0,filyb:20,mot:6,category_feed_atom:[2,11,12,20],mon:[9,4,14],libr:18,aurez:8,server:[15,10,16,20],article_exclud:20,either:[16,3],page_save_a:20,output:[18,5,13,19,1,2,7,22,21,15,10,20,16],manag:[15,19,21,20,3],yyyi:[11,20,6],ascend:2,rsync:[16,19],easili:[15,19,3],exit:[7,21],refer:[12,20],accueil:18,notwithstand:16,"g\u00e9n\u00e9ration":9,broken:[5,12],src:[1,20],"cat\u00e9gori":[18,9,22,11,6],processor:20,pages_generator_init:3,piwik_ssl_url:20,"v\u00f4tre":18,tag_feed_rss:[2,11,20],your:[5,12,20,1,13,2,7,3,15,10,16],"regroup\u00e9":11,log:[12,20,19],celui:[11,14],start:[5,20,12,6,15,16],interfac:[15,5,20],lot:[15,6],theme_nam:21,tupl:[11,20],regard:[1,20],"remplac\u00e9":17,pull:[8,12,1,3],possibl:[13,20,12,2,14,15,4,16],"default":[2,12,16,20,19],verront:6,manuel:6,creat:[5,12,19,1,13,21,2,3,15,10,20,16],bugtrack:14,pourquoi:9,file:[5,13,19,12,2,7,3,15,10,20,16],cultur:11,incorrect:20,googl:[5,11,20,19],prepend:20,field:20,valid:[12,20],oubliez:8,you:[5,12,20,1,13,2,3,15,10,21,16],tag_feed_atom:[2,11,12,20],symbol:[21,17],important:11,"param\u00e8tr":[9,11,4,22,6],article_nam:2,directori:[19,11,2,7,10,20,16],descript:[18,5,20,21,2,7,3,9,17],theme_path:21,goe:16,statiqu:[18,9,11],"t\u00e9l\u00e9charger":8,potenti:5,chapitr:11,basera:11,"ziad\u00e9":20,illustr:20,"r\u00e9cent":11,follow:[1,20,12,2,3,15,10,16],disk:[13,16],delete_output_directori:20,contenu:[18,14],articl:[18,5,11,6,12,19,2,7,22,15,9,10,4,16,20],program:15,jinja_extens:[11,20],"4em":2,prendr:18,far:[15,20],faq:[19,5,14,12,9],projet:[8,14],sont:[18,9,14,11,0],fall:20,veri:[15,13,20],list:[18,5,12,20,11,13,2,3,21,16,17],small:[20,3],"pr\u00e9c\u00e9demment":17,ten:15,design:[15,5,13],pass:[2,15,1,13,20],further:20,ribbon:20,"propos\u00e9":14,what:[5,1,20,12,13,2,15,16],section:[12,20,11,13,3,16],abl:16,brief:16,delet:20,version:[5,19,1,21,2,3,8,20,16,17],sur:[18,0,11,14,8,17],peuvent:[17,0],method:[15,13,16,20],full:[12,20],behaviour:20,inher:12,ver:[11,17],modifi:[4,6,12,21,15,22],"param\u00e9tr":11,sender:3,"gr\u00e2ce":[17,14],social:[11,20,3],devserv:16,via:[5,12,20,1,8,9,10,16],aimez:8,vim:[15,5,17,21,9],filenam:13,href:[2,20],famili:2,default_d:[11,20],regist:3,two:[13,20,1,2,7,3,15,21,16,17],mort:16,prochain:11,n1k0:20,minor:19,more:[19,5,20,12,21,15,16],convinc:20,regarderai:14,particular:[1,20],"\u00e9crivez":9,none:[2,12,16,20],hous:16,dev:[21,17],histori:[15,5,13,19],learn:13,def:[13,3],typograph:20,share:[13,21,17],templat:[18,5,13,19,12,21,2,3,15,9,20,16,17],minimum:20,default_pagin:20,suivant:[8,18,6],xxxx:[11,20],rather:[16,19],anoth:[1,16,20,19],"\u00e9tant":9,simpl:[18,5,11,6,12,13,21,2,3,15,9,20,16,17],css:[18,5,12,20,11,2,14,21,17],isn:13,regener:[16,19],referenc:12,associ:16,"short":20,django:12,caus:20,ensembl:22,egg:[21,16,17],gosquared_sitenam:[11,20],help:[5,12,2,7,14,15,21,16,17],hypertext:16,soon:12,thymefe:20,installez:8,paramet:3,style:[2,12,16,20],surtout:11,html:[18,22,13,20,12,21,2,7,3,15,4,16,17],"op\u00e9rat":[17,14],might:[10,12,20],good:[15,20],"return":[15,13],timestamp:[16,20],dev_requir:1,cet:[4,17],optionnel:[9,11],"bas\u00e9":0,"d\u00e9taill\u00e9":17,micro:17,occasionn:9,found:20,unicod:11,idem:11,hard:12,idea:2,realli:[2,15,10],connect:3,thing:[13,20,1,2,12,21,15,10,16],author_nam:2,publish:[5,10,16,20],"g\u00e9n\u00e9r\u00e9e":[18,22],print:[21,3],symboliqu:17,tag_cloud:20,pui:[8,9,14,6],differ:[1,19,12,13,15,20,16],base:[22,6,11,2,14,9,20,3],dire:[9,4],put:[2,7,20,10,16],basi:[5,12,16],contient:18,english:[16,19],script:[12,19,11,21,20,16,17],assign:[5,12],feed:[5,13,19,12,2,7,22,3,15,20,16],dont:18,feel:2,mise:[8,9,6],misc:[11,20],number:20,donc:[8,18,11,17,6],"indiqu\u00e9":6,stabl:16,miss:[2,1],passer:[11,6],guess:13,pandoc:7,avec:[6,11,14,8,9,22,17],questionnair:16,unrestrict:20,"li\u00e9":[11,17],construct:[15,20],avez:[18,6,11,14,8,9,22,17],statement:13,"copi\u00e9":18,option:[5,19,12,21,7,14,15,20,16,17],pari:20,prend:17,reinstal:21,kind:15,produir:18,dossier:[18,22],remov:[19,21,17],jqueri:20,mkvirtualenv:[1,16],cleaner:19,img:[21,17],aussi:[8,17,14],astuc:[9,4],packag:[19,1,7,21,16,17],expir:20,dedic:20,suivr:11,equival:19,pep8:1,self:13,also:[5,13,19,12,2,7,21,15,20,16],article_url:20,append:[2,20],invoqu:14,suivi:17,distribut:0,choos:15,quelqu:[9,14],plan:16,compt:11,mybrand:20,github_url:[11,20],clean:20,pars:[15,7,13],usual:[13,20],awesom:[13,16],fond:8,session:16,page_exclud:20,font:[2,20],find:[10,13,20],summary_max_length:20,access:[2,5,12,20],pretti:20,writer:[15,13],solut:15,souhaitez:11,factor:15,tag_cloud_max_item:20,express:6,mainten:[22,11,6],rest:[7,19],mettr:[8,22,6],skami:[21,17],common:[2,16],hype:20,toujour:16,"caract\u00e8r":11,wrote:[15,13],"num\u00e9ro":8,set:[19,5,12,6,11,1,0,2,13,3,15,20,16],automatiqu:6,mantra:15,see:[5,13,20,12,21,16],close:2,someth:[16,20],vont:18,direct_templ:[20,19],pouvez:[18,6,11,14,9,17],restructur:15,premier_articl:[22,11,6],experi:15,altern:16,effet:17,javascript:20,isol:1,"pr\u00e9parat":6,category_save_a:20,popul:13,both:[1,13,16,20],last:[2,12,20],"sp\u00e9cifi\u00e9":11,alor:[8,9],erreur:8,context:[15,13],pdf:[19,5,11,20,9],whole:15,load:[15,20,3],markdown:[5,13,19,12,7,15,9,20,16],simpli:[10,16],point:15,header:[12,20],linux:[22,11,20,6],throughout:20,outil:[9,17],"th\u00e8m":[9,14],uglifyj:20,imag:[2,18,20],convert:[7,13,16],understand:[15,20],demand:14,look:[15,13,16,20,3],solid:2,getpelican:[5,20,1,8,9,16],"while":[5,20,12,2,15,16],smart:16,abov:[16,20],error:[5,12,16],loos:15,pack:20,"p\u00e9lican":14,conten:18,readi:16,vou:[18,22,6,11,14,8,9,4,17],"compl\u00e9ter":14,decor:2,"syst\u00eam":0,moment:[18,20],user:[15,10,1,13,20],jour:[8,9,6],typic:20,recent:16,lower:13,lib:[21,17],older:[12,20],biologeek:20,entri:[5,19,3],endfor:[20,3],propos:22,github_activity_fe:3,obtenir:22,faisant:11,restructuredtext:[5,13,7,15,9,16],shortcut:16,"affect\u00e9":6,input:[15,7,13,16,20],subsequ:2,build:[12,13],"g\u00e9n\u00e9rer":[18,9,11,6],format:[13,6,11,1,7,15,20,16],article_gener:3,bit:[15,13,20],"d\u00e9fini":18,docutil:16,"d\u00e9p\u00f4t":[9,17,14],resolv:12,collect:[7,20],"id\u00e9":14,pratiqu:[9,17],autoreload:[16,19],encount:13,some:[5,13,19,1,12,15,10,20,16],back:20,sampl:[7,1,20],"cr\u00e9era":18,"n\u00e9cessit":17,virtualenv:[1,16],rien:[8,6],peu:[8,22],per:[5,12,19],substitut:20,larg:20,slash:20,machin:11,previou:20,run:[5,10,1,16],barbaz:20,step:16,savoir:6,"\u00eatre":[8,18,11,17],most:[15,13,16,20],article_generator_init:3,"m\u00e9thode":[8,9],libert:20,ceci:[22,17],"donn\u00e9":[9,6],block:[2,13,16],visit:2,ensur:16,chang:[1,19,12,13,2,15,20,16],span:[2,20,21,17],plusieur:[14,17,6],question:[5,14,12,16,9],stylesheet:[2,20],"long":[8,15],custom:[5,12,1,20,19],traduct:[18,9,11,4,6],includ:[18,5,12,20],suit:[5,11,1,19],conseil:6,properli:[5,12,20],link:[12,20,11,2,21,16,17],translat:[5,19,16,20,3],atom:[5,11,19,12,2,7,22,3,15,20,16],inclu:11,line:[20,12,2,7,21,15,16],info:20,utc:20,utf:[11,20],highlight:[5,20,12,2,21,16,17],siteurl:[2,5,11,12,20],utilis:[18,11,14,9,4,17],doesn:[13,20],repres:[15,12,20],repren:8,dates_pagin:[2,18],titl:[2,18,20,16,3],comprendr:6,chacun:18,simplehttpserv:16,articlesgener:[15,13,3],"ordonn\u00e9":18,lang:[20,16,6],"maturit\u00e9":8,tag_fe:12,rst2pdf:20,utilisez:8,came:15,pluggabl:19,code:[19,5,12,0,11,1,15,3,8,9,20,16],edg:16,scratch:2,pdf_processor:11,webchat:[5,12],feedpars:3,coumn:[21,17],tag_url:20,send:[5,3],objet:[18,11],relev:[12,16],settingsfil:20,tri:[16,20],notez:[9,17],button:20,"try":[1,13],pleas:[5,12,1],monospac:2,"derni\u00e8r":8,translation_fe:[2,11,20],akounet:20,"cod\u00e9":9,jump:[12,13],download:[2,7,20],folk:16,compat:[12,19],index:[18,20,2,21,22,16,17],cell:22,capital:18,cela:[18,4,17,6],whatev:[15,10,13],chose:[11,16,17],closur:20,quell:[8,9,18],let:[15,16,3],sinc:[5,13,20,12,2,3,15,16],"tr\u00e8":[8,18],great:2,convers:[7,12],opinion:15,implement:[15,5,13,16,3],honor:20,firefox:[21,16,17],autant:11,appli:20,"employ\u00e9":17,apt:[8,21,17],"boolean":20,duck:15,cloud:[2,5,19,20,3],from:[5,13,19,1,21,2,7,3,15,10,20,16],usa:20,commun:[18,5,12],"lam\u00e9":11,upgrad:[8,5,12,16],next:16,websit:[12,20],few:[15,20,3],usr:[21,17],sort:[13,14],trail:20,train:18,category_fe:12,pour:[18,22,6,11,0,14,8,9,4,17],thin:2,aliv:16,control:[5,20],quickstart:[12,16,20,19],process:[2,5,15,13,20],pages_gener:3,sudo:[12,21,17],tag:[18,5,13,6,11,19,2,22,3,15,9,20,16],instead:[21,16,20],pages_generate_context:3,static_path:[11,20],watch:16,notebook:5,backup:7,robot:20,element:[2,3],issu:[12,20,19],prettifi:19,allow:[15,10,1,20,19],wpfile:7,voyez:6,bunch:19,chosen:[15,20],martyachin:[21,17],eux:18,"\u00e9critur":11,"d\u00e9sign":11,"syst\u00e8m":[8,17],handl:[20,19],auto:16,dan:[18,6,11,8,9,22,17],overal:[5,13],handi:[5,12,16],"\u00e9galement":[9,17],autr:[8,22,11,6,0],devez:18,kpanic:3,anyth:[13,16],revu:11,prendreuncaf:20,mode:16,"2em":2,pygment:[5,19,12,14,9,20,16],oui:16,piwik_url:20,meta:[5,12,13,16],"static":[18,5,19,20,2,21,15,10,16,17],our:16,patch:1,"probl\u00e8m":14,special:16,out:[15,12,21,17],variabl:[18,5,19,20,2,3,9],categori:[18,22,13,6,11,19,2,7,15,20,16],rel:[2,20,19],clarifi:15,insid:[13,16],manipul:8,qua:14,que:[18,6,11,0,14,8,9,22,17],pendant:18,dictionari:20,qui:[18,9,17,6],oeil:14,bleed:16,ajoutez:14,could:12,rafraichissez:11,ask:[5,12,16],keep:[2,15],length:20,lancez:6,organis:18,chaqu:[18,11],outsid:[5,16],timezon:[20,19],softwar:[5,7,13,16],suffix:20,suffit:6,qualiti:16,ressembl:11,echo:19,date:[18,11,6,12,19,2,22,15,9,10,4,16,20],facil:[9,14,6],fonctionn:17,fait:[11,14],mkdir:16,system:[20,13,2,7,15,16],wrapper:16,grow:15,md_extens:20,termin:16,"final":[18,11],disqu:[19,5,11,20,9],article_dir:20,shell:16,"1em":2,"d\u00e9cortiqu":22,accompani:16,rst:[22,11,16,20,6],exactli:[15,21],rss:[5,13,19,11,12,2,7,15,20,16],contribu:14,"repr\u00e9sent":22,structur:[18,5,19,13,2,9],category_url:20,page_dir:20,py2:[21,17],correspond:[2,18,22,0],disqus_sitenam:[11,20],faut:11,mettez:[18,6],have:[5,1,19,12,13,21,2,3,15,20,16],need:[13,20,12,2,3,15,10,16],allon:[8,22,11,6],border:2,paquet:[8,0],min:[2,20],choisir:[8,9],which:[5,20,1,2,3,10,21,16],seront:18,page_lang_save_a:20,singl:[15,20],"configur\u00e9":11,who:[12,16],assets_url:20,discov:1,deploi:10,why:5,placement:20,url:[19,11,6,12,9,4,16,20],request:[5,12,1,3],face:15,determin:16,personnalis:[9,4,6],text:[2,15,13,16,20],verbos:[21,17],paginated_direct_templ:20,cloner:9,principal:22,soyez:18,locat:[16,20],should:[1,20,12,13,2,15,16],"5px":2,local:[20,21,16,17],contribut:[5,12,1],"exp\u00e9rienc":9,montrer:17,abbr:[16,19],theme_static_path:20,enabl:[13,16,20],organ:2,tag_nam:2,grai:2,rappel:0,integr:[5,20],contain:[2,15,10,20],menuitem:20,static_theme_path:11,view:16,orphan:20,"pass\u00e9":[18,11],statu:16,manpag:20,pattern:16,written:[5,7],chemin:[11,17],kei:[2,20],notam:0,entir:[2,21],otherwis:20,avon:6,dates_pag:[2,18],thank:[15,20],myfoobar:16,instant:11,plugin:[5,20,3],admin:20,quitter:17,etc:[18,5,20,13,2,15,9],instanc:[15,13,16,19],strftime:20,comment:[18,5,19,20,14,9],setvirtualenvproject:16,arriv:8,"d\u00e9finir":[18,6],respect:[2,18,1,20],quit:13,quotat:20,write_fil:13,titr:[18,11,4],vivant:16,immedi:12,dvcse:5,deliber:12,laquel:8,minifi:20,defin:[2,15,20,16,3],indiqu:11,endblock:2,virtualenvwrapp:[1,16],almost:[15,12,20],demo:[12,14],tutoriel:22,site:[5,11,6,12,7,14,20,16],linkedin:19,archiv:[2,18,22,11,20],effac:11,martyalchin:[19,21,17],ja_jp:20,http:[5,14,20,1,7,3,8,9,21,16,17],upon:20,effect:13,moyen:14,distutil:16,"modifi\u00e9":11,mention:16,rajout:6,well:[13,16,20,19],weblog:[15,5,1,16],exampl:[5,13,20,12,2,7,3,21,16],command:[11,20,1,21,7,14,15,17,16,12],oft:17,filesystem:19,undefin:12,unit2:1,latest:16,"g\u00e9n\u00e8re":11,newest:20,relative_url:20,less:[15,5,20,19],feedburn:[20,19],simultan:16,web:[15,5,16],jinja:19,virgul:6,makefil:[12,19],exempl:[18,22,6,11,0,9,4,17],add:[1,19,12,13,3,15,10,20,16],tag_cloud_step:20,match:[2,20],piec:15,ayant:4,python2:[21,17],insert:2,resid:[2,16],like:[1,20,12,13,7,3,21,16],success:13,page:[18,5,11,19,12,13,2,22,3,15,9,10,20,16],twitter:[5,20,19],"export":7,home:[2,21,17],b3a7c807:20,librari:[20,16,3],tmp:[21,17],vraiment:18,est:[18,22,6,11,14,8,9,4,16,17],avoir:[8,9,11,17,14],encourag:20,ident:16,usag:[7,12,21,20,19],symlink:[21,17],host:[15,5,20],"test\u00e9":8,slug:[18,20,6,2,4,16],stage:13,about:[5,13,19,1,12,21,15,10,20,16],actual:16,less_gener:20,column:[21,17],constructor:20,fals:20,disabl:[5,12,20,19],compil:[5,20,6],own:[5,13,20,12,2,3,15,16],ametaireau:20,easy_instal:[12,16],automat:[16,19],rectifi:12,pictur:[15,20],"var":11,"function":[13,19,1,2,15,16],pdf_gener:20,subscrib:3,alexi:[5,20,21,15,9,16,17],yeah:[16,20],bodi:2,"compl\u00e8tement":9,eas:1,inlin:2,bug:[8,1,19],count:20,made:[7,1,13,19],temp:17,whether:20,wish:16,displai:[2,12,20],record:13,below:[16,20],guillaum:[22,11,6],problem:[15,5,12],dure:16,nouvel:9,mtime:[11,16,20],pip:[12,20,1,7,8,10,16],mutual:21,courant:0,detail:[15,5,12,21,20],virtual:[1,16],other:[5,13,20,12,2,7,15,16],bool:13,futur:[20,19],branch:[10,1,12],lc_all:1,"arr\u00eat\u00e9":8,retrouvon:22,foir:[9,14],navigateur:22,debian:[19,0],stai:12,sass:20,niveau:6,reliabl:20,rule:3,original:18,decemb:15},objtypes:{},titles:["Conventions","How to contribute?","How to create themes for Pelican","Plugins","Trucs et astuces pour Pelican","Pelican","Les param\u00e8tres des articles dans Pelican","Import from other blog software","Installation et mise \u00e0 jour de Pelican","Pelican","Tips","Fichier de configuration","Frequently Asked Questions (FAQ)","Pelican internals","Foire aux questions (FAQ)","Some history about Pelican","Getting started","pelican-themes","Comment cr\u00e9er des th\u00e8mes pour Pelican","Release history","Settings","pelican-themes","Les bases de Pelican"],objnames:{},filenames:["fr/conventions","contribute","themes","plugins","fr/astuces","index","fr/parametres_article","importer","fr/installation","fr/index","tips","fr/configuration","faq","internals","fr/faq","report","getting_started","fr/pelican-themes","fr/themes","changelog","settings","pelican-themes","fr/bases"]})PK†½tAíÕÁ5; ; pelican-3.0/tips.html Tips — Pelican 3 documentation

Tips¶

Here are some tips about Pelican that you might find useful.

Publishing to GitHub¶

GitHub comes with an interesting “pages” feature: you can upload things there and it will be available directly from their servers. As Pelican is a static file generator, we can take advantage of this.

User Pages¶

GitHub allows you to create user pages in the form of username.github.com. Whatever is created in the master branch will be published. For this purpose, just the output generated by Pelican needs to pushed to GitHub.

So given a repository containing your articles, just run Pelican over the posts and deploy the master branch to GitHub:

$ pelican -s pelican.conf.py ./path/to/posts -o /path/to/output

Now add all the files in the output directory generated by Pelican:

$ git add /path/to/output/*
$ git commit -am "Your Message"
$ git push origin master

Project Pages¶

For creating Project pages, a branch called gh-pages is used for publishing. The excellent ghp-import makes this really easy, which can be installed via:

$ pip install ghp-import

Then, given a repository containing your articles, you would simply run Pelican and upload the output to GitHub:

$ pelican -s pelican.conf.py .
$ ghp-import output
$ git push origin gh-pages

And that’s it.

If you want, you can put that directly into a post-commit hook, so each time you commit, your blog is up-to-date on GitHub!

Put the following into .git/hooks/post-commit:

pelican -s pelican.conf.py . && ghp-import output && git push origin gh-pages
Fork me on GitHub


PK†½tAÙL˜ææpelican-3.0/.buildinfo# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: 523f631dbee25c333267a3f207fee83f tags: fbb0d17656682115ca4d033fb2f83ba1 PK†½tAÇ¢2Ø&Ø&pelican-3.0/importer.html Import from other blog software — Pelican 3 documentation

Import from other blog software¶

Description¶

pelican-import is a command line tool for converting articles from other software to ReStructuredText. The supported formats are:

  • WordPress XML export
  • Dotclear export
  • RSS/Atom feed

The conversion from HTML to reStructuredText relies on pandoc. For Dotclear, if the source posts are written with Markdown syntax, they will not be converted (as Pelican also supports Markdown).

Dependencies¶

pelican-import has two dependencies not required by the rest of pelican:

  • BeautifulSoup
  • pandoc

BeatifulSoup can be installed like any other Python package:

$ pip install BeautifulSoup

For pandoc, install a package for your operating system from the pandoc site.

Usage¶

pelican-import [-h] [–wpfile] [–dotclear] [–feed] [-o OUTPUT]
[-m MARKUP][–dir-cat]
input

Optional arguments¶

-h, --help show this help message and exit
--wpfile Wordpress XML export
--dotclear Dotclear export
--feed Feed to parse
-o OUTPUT, --output OUTPUT
 Output path
-m MARKUP Output markup
--dir-cat Put files in directories with categories name

Examples¶

for WordPress:

$ pelican-import --wpfile -o ~/output ~/posts.xml

for Dotclear:

$ pelican-import --dotclear -o ~/output ~/backup.txt

Tests¶

To test the module, one can use sample files:

Fork me on GitHub


PK†½tAv?jô·#·#pelican-3.0/contribute.html How to contribute? — Pelican 3 documentation

How to contribute?¶

There are many ways to contribute to Pelican. You can enhance the documentation, add missing features, and fix bugs (or just report them).

Don’t hesitate to fork and make a pull request on GitHub. When doing so, please create a new feature branch as opposed to making your commits in the master branch.

Setting up the development environment¶

You’re free to set up your development environment any way you like. Here is a way using the virtualenv and virtualenvwrapper tools. If you don’t have them, you can install these both of these packages via:

$ pip install virtualenvwrapper

Virtual environments allow you to work on Python projects which are isolated from one another so you can use different packages (and package versions) with different projects.

To create a virtual environment, use the following syntax:

$ mkvirtualenv pelican

To clone the Pelican source:

$ git clone https://github.com/getpelican/pelican.git src/pelican

To install the development dependencies:

$ cd src/pelican
$ pip install -r dev_requirements.txt

To install Pelican and its dependencies:

$ python setup.py develop

Running the test suite¶

Each time you add a feature, there are two things to do regarding tests: checking that the existing tests pass, and adding tests for the new feature or bugfix.

The tests live in “pelican/tests” and you can run them using the “discover” feature of unittest2:

$ unit2 discover

If you have made changes that affect the output of a Pelican-generated weblog, then you should update the output used by functional tests. To do so, you can use the following two commands:

$ LC_ALL="C" pelican -o tests/output/custom/ -s samples/pelican.conf.py \
    samples/content/
$ LC_ALL="C" USER="Dummy Author" pelican -o tests/output/basic/ samples/content/

Coding standards¶

Try to respect what is described in the PEP8 specification when providing patches. This can be eased via the pep8 or flake8 tools, the latter of which in particular will give you some useful hints about ways in which the code/formatting can be improved.

Fork me on GitHub


PK†½tAÛr€†0†0pelican-3.0/plugins.html Plugins — Pelican 3 documentation

Plugins¶

Since version 3.0, Pelican manages plugins. Plugins are a way to add features to Pelican without having to directly hack Pelican code.

Pelican is shipped with a set of core plugins, but you can easily implement your own (and this page describes how).

How to use plugins¶

To load plugins, you have to specify them in your settings file. You have two ways to do so. Either by specifying strings with the path to the callables:

PLUGINS = ['pelican.plugins.gravatar',]

Or by importing them and adding them to the list:

from pelican.plugins import gravatar
PLUGINS = [gravatar, ]

If your plugins are not in an importable path, you can specify a PLUGIN_PATH in the settings:

PLUGIN_PATH = "plugins"
PLUGINS = ["list", "of", "plugins"]

How to create plugins¶

Plugins are based on the concept of signals. Pelican sends signals, and plugins subscribe to those signals. The list of signals are defined in a following section.

The only rule to follow for plugins is to define a register callable, in which you map the signals to your plugin logic. Let’s take a simple example:

from pelican import signals

def test(sender):
    print "%s initialized !!" % sender

def register():
    signals.initialized.connect(test)

List of signals¶

Here is the list of currently implemented signals:

Signal Arguments Description
initialized pelican object  
article_generate_context article_generator, metadata  
article_generator_init article_generator invoked in the ArticlesGenerator.__init__
pages_generate_context pages_generator, metadata  
pages_generator_init pages_generator invoked in the PagesGenerator.__init__

The list is currently small, don’t hesitate to add signals and make a pull request if you need them!

List of plugins¶

Not all the list are described here, but a few of them have been extracted from the Pelican core and provided in pelican.plugins. They are described here:

Tag cloud¶

Translation¶

GitHub activity¶

This plugin makes use of the feedparser library that you’ll need to install.

Set the GITHUB_ACTIVITY_FEED parameter to your GitHub activity feed. For example, my setting would look like:

GITHUB_ACTIVITY_FEED = 'https://github.com/kpanic.atom'

On the templates side, you just have to iterate over the github_activity variable, as in the example:

{% if GITHUB_ACTIVITY_FEED %}
   <div class="social">
           <h2>Github Activity</h2>
           <ul>

           {% for entry in github_activity %}
               <li><b>{{ entry[0] }}</b><br /> {{ entry[1] }}</li>
           {% endfor %}
           </ul>
   </div><!-- /.github_activity -->
{% endif %}

github_activity is a list of lists. The first element is the title and the second element is the raw HTML from GitHub.

Fork me on GitHub


PK†½tAtï^ˆóópelican-3.0/search.html Search — Pelican 3 documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

Fork me on GitHub


PK†½tAöÃÔcThThpelican-3.0/themes.html How to create themes for Pelican — Pelican 3 documentation

How to create themes for Pelican¶

Pelican uses the great Jinja2 templating engine to generate its HTML output. Jinja2 syntax is really simple. If you want to create your own theme, feel free to take inspiration from the “simple” theme.

Structure¶

To make your own theme, you must follow the following structure:

├── static
│   ├── css
│   └── images
└── templates
    ├── archives.html    // to display archives
    ├── article.html     // processed for each article
    ├── author.html      // processed for each author
    ├── authors.html     // must list all the authors
    ├── categories.html  // must list all the categories
    ├── category.html    // processed for each category
    ├── index.html       // the index. List all the articles
    ├── page.html        // processed for each page
    ├── tag.html         // processed for each tag
    └── tags.html        // must list all the tags. Can be a tag cloud.
  • static contains all the static assets, which will be copied to the output theme/static folder. I’ve put the CSS and image folders here, but they are just examples. Put what you need here.
  • templates contains all the templates that will be used to generate the content. I’ve just put the mandatory templates here; you can define your own if it helps you keep things organized while creating your theme.

Templates and variables¶

The idea is to use a simple syntax that you can embed into your HTML pages. This document describes which templates should exist in a theme, and which variables will be passed to each template at generation time.

All templates will receive the variables defined in your settings file, if they are in all-caps. You can access them directly.

Common variables¶

All of these settings will be available to all templates.

Variable Description
articles The list of articles, ordered descending by date All the elements are Article objects, so you can access their attributes (e.g. title, summary, author etc.)
dates The same list of articles, but ordered by date, ascending
tags A key-value dict containing the tags (the keys) and the list of respective articles (the values)
categories A key-value dict containing the categories (keys) and the list of respective articles (values)
pages The list of pages

index.html¶

This is the home page of your blog, generated at output/index.html.

If pagination is active, subsequent pages will reside in output/index`n`.html.

Variable Description
articles_paginator A paginator object for the list of articles
articles_page The current page of articles
dates_paginator A paginator object for the article list, ordered by date, ascending.
dates_page The current page of articles, ordered by date, ascending.
page_name ‘index’ – useful for pagination links

author.html¶

This template will be processed for each of the existing authors, with output generated at output/author/author_name.html.

If pagination is active, subsequent pages will reside at output/author/author_name``n.html.

Variable Description
author The name of the author being processed
articles Articles by this author
dates Articles by this author, but ordered by date, ascending
articles_paginator A paginator object for the list of articles
articles_page The current page of articles
dates_paginator A paginator object for the article list, ordered by date, ascending.
dates_page The current page of articles, ordered by date, ascending.
page_name ‘author/author_name‘ – useful for pagination links

category.html¶

This template will be processed for each of the existing categories, with output generated at output/category/category_name.html.

If pagination is active, subsequent pages will reside at output/category/category_name``n.html.

Variable Description
category The name of the category being processed
articles Articles for this category
dates Articles for this category, but ordered by date, ascending
articles_paginator A paginator object for the list of articles
articles_page The current page of articles
dates_paginator A paginator object for the list of articles, ordered by date, ascending
dates_page The current page of articles, ordered by date, ascending
page_name ‘category/category_name‘ – useful for pagination links

article.html¶

This template will be processed for each article, with .html files saved as output/article_name.html. Here are the specific variables it gets.

Variable Description
article The article object to be displayed
category The name of the category for the current article

page.html¶

This template will be processed for each page, with corresponding .html files saved as output/page_name.html.

Variable Description
page The page object to be displayed. You can access its title, slug, and content.

tag.html¶

This template will be processed for each tag, with corresponding .html files saved as output/tag/tag_name.html.

If pagination is active, subsequent pages will reside at output/tag/tag_name``n.html.

Variable Description
tag The name of the tag being processed
articles Articles related to this tag
dates Articles related to this tag, but ordered by date, ascending
articles_paginator A paginator object for the list of articles
articles_page The current page of articles
dates_paginator A paginator object for the list of articles, ordered by date, ascending
dates_page The current page of articles, ordered by date, ascending
page_name ‘tag/tag_name‘ – useful for pagination links

Feeds¶

The feed variables changed in 3.0. Each variable now explicitly lists ATOM or RSS in the name. ATOM is still the default. Old themes will need to be updated. Here is a complete list of the feed variables:

FEED_ATOM
FEED_RSS
CATEGORY_FEED_ATOM
CATEGORY_FEED_RSS
TAG_FEED_ATOM
TAG_FEED_RSS
TRANSLATION_FEED

Inheritance¶

Since version 3.0, Pelican supports inheritance from the simple theme, so you can re-use the simple theme templates in your own themes.

If one of the mandatory files in the templates/ directory of your theme is missing, it will be replaced by the matching template from the simple theme. So if the HTML structure of a template in the simple theme is right for you, you don’t have to write a new template from scratch.

You can also extend templates from the simple themes in your own themes by using the {% extends %} directive as in the following example:

{% extends "!simple/index.html" %}   <!-- extends the ``index.html`` template from the ``simple`` theme -->

{% extends "index.html" %}   <!-- "regular" extending -->

Example¶

With this system, it is possible to create a theme with just two files.

base.html¶

The first file is the templates/base.html template:

{% extends "!simple/base.html" %}

{% block head %}
{{ super() }}
   <link rel="stylesheet" type="text/css" href="{{ SITEURL }}/theme/css/style.css" />
{% endblock %}
  1. On the first line, we extend the base.html template from the simple theme, so we don’t have to rewrite the entire file.
  2. On the third line, we open the head block which has already been defined in the simple theme.
  3. On the fourth line, the function super() keeps the content previously inserted in the head block.
  4. On the fifth line, we append a stylesheet to the page.
  5. On the last line, we close the head block.

This file will be extended by all the other templates, so the stylesheet will be linked from all pages.

style.css¶

The second file is the static/css/style.css CSS stylesheet:

body {
    font-family : monospace ;
    font-size : 100% ;
    background-color : white ;
    color : #111 ;
    width : 80% ;
    min-width : 400px ;
    min-height : 200px ;
    padding : 1em ;
    margin : 5% 10% ;
    border : thin solid gray ;
    border-radius : 5px ;
    display : block ;
}

a:link    { color : blue ; text-decoration : none ;      }
a:hover   { color : blue ; text-decoration : underline ; }
a:visited { color : blue ;                               }

h1 a { color : inherit !important }
h2 a { color : inherit !important }
h3 a { color : inherit !important }
h4 a { color : inherit !important }
h5 a { color : inherit !important }
h6 a { color : inherit !important }

pre {
    margin : 2em 1em 2em 4em ;
}

#menu li {
    display : inline ;
}

#post-list {
    margin-bottom : 1em ;
    margin-top : 1em ;
}

Download¶

You can download this example theme here.

Fork me on GitHub


PK†½tAÒÃQ 2»2»pelican-3.0/settings.html Settings — Pelican 3 documentation

Settings¶

Pelican is configurable thanks to a configuration file you can pass to the command line:

$ pelican -s path/to/your/settingsfile.py path

Settings are configured in the form of a Python module (a file). You can see an example by looking at /samples/pelican.conf.py

All the setting identifiers must be set in all-caps, otherwise they will not be processed. Setting values that are numbers (5, 20, etc.), booleans (True, False, None, etc.), dictionaries, or tuples should not be enclosed in quotation marks. All other values (i.e., strings) must be enclosed in quotation marks.

The settings you define in the configuration file will be passed to the templates, which allows you to use your settings to add site-wide content.

Here is a list of settings for Pelican:

Basic settings¶

Setting name (default value) What does it do?
AUTHOR Default author (put your name)
DATE_FORMATS ({}) If you do manage multiple languages, you can set the date formatting here. See “Date format and locales” section below for details.
DEFAULT_CATEGORY ('misc') The default category to fall back on.
DEFAULT_DATE_FORMAT ('%a %d %B %Y') The default date format you want to use.
DISPLAY_PAGES_ON_MENU (True) Whether to display pages on the menu of the template. Templates may or not honor this setting.
DEFAULT_DATE (fs) The default date you want to use. If ‘fs’, Pelican will use the file system timestamp information (mtime) if it can’t get date information from the metadata. If tuple object, it will instead generate the default datetime object by passing the tuple to the datetime.datetime constructor.
JINJA_EXTENSIONS ([]) A list of any Jinja2 extensions you want to use.
DELETE_OUTPUT_DIRECTORY (False) Delete the content of the output directory before generating new files.
LOCALE (‘’[1]) Change the locale. A list of locales can be provided here or a single string representing one locale. When providing a list, all the locales will be tried until one works.
MARKUP (('rst', 'md')) A list of available markup languages you want to use. For the moment, the only available values are rst and md.
MD_EXTENSIONS (['codehilite','extra']) A list of the extensions that the Markdown processor will use. Refer to the extensions chapter in the Python-Markdown documentation for a complete list of supported extensions.
OUTPUT_PATH ('output/') Where to output the generated files.
PATH (None) Path to look at for input files.
PAGE_DIR ('pages') Directory to look at for pages.
PAGE_EXCLUDES (()) A list of directories to exclude when looking for pages.
ARTICLE_DIR ('') Directory to look at for articles.
ARTICLE_EXCLUDES: (('pages',)) A list of directories to exclude when looking for articles.
PDF_GENERATOR (False) Set to True if you want to have PDF versions of your documents. You will need to install rst2pdf.
RELATIVE_URLS (True) Defines whether Pelican should use document-relative URLs or not. If set to False, Pelican will use the SITEURL setting to construct absolute URLs.
PLUGINS ([]) The list of plugins to load. See Plugins.
SITENAME ('A Pelican Blog') Your site name
SITEURL Base URL of your website. Not defined by default, so it is best to specify your SITEURL; if you do not, feeds will not be generated with properly-formed URLs. You should include http:// and your domain, with no trailing slash at the end. Example: SITEURL = 'http://mydomain.com'
STATIC_PATHS (['images']) The static paths you want to have accessible on the output path “static”. By default, Pelican will copy the ‘images’ folder to the output folder.
TIMEZONE The timezone used in the date information, to generate Atom and RSS feeds. See the “timezone” section below for more info.
TYPOGRIFY (False) If set to True, several typographical improvements will be incorporated into the generated HTML via the Typogrify library, which can be installed via: pip install typogrify
LESS_GENERATOR (FALSE) Set to True or complete path to lessc (if not found in system PATH) to enable compiling less css files. Requires installation of less css.
DIRECT_TEMPLATES (('index', 'tags', 'categories', 'archives')) List of templates that are used directly to render content. Typically direct templates are used to generate index pages for collections of content e.g. tags and category index pages.
PAGINATED_DIRECT_TEMPLATES (('index',)) Provides the direct templates that should be paginated.
SUMMARY_MAX_LENGTH (50) When creating a short summary of an article, this will be the default length in words of the text created. This only applies if your content does not otherwise specify a summary. Setting to None will cause the summary to be a copy of the original content.
[1]Default is the system locale.

URL settings¶

The first thing to understand is that there are currently two supported methods for URL formation: relative and absolute. Document-relative URLs are useful when testing locally, and absolute URLs are reliable and most useful when publishing. One method of supporting both is to have one Pelican configuration file for local development and another for publishing. To see an example of this type of setup, use the pelican-quickstart script as described at the top of the Getting Started page, which will produce two separate configuration files for local development and publishing, respectively.

You can customize the URLs and locations where files will be saved. The URLs and SAVE_AS variables use Python’s format strings. These variables allow you to place your articles in a location such as ‘{slug}/index.html’ and link to them as ‘{slug}’ for clean URLs. These settings give you the flexibility to place your articles and pages anywhere you want.

Note

If you specify a datetime directive, it will be substituted using the input files’ date metadata attribute. If the date is not specified for a particular file, Pelican will rely on the file’s mtime timestamp.

Check the Python datetime documentation at http://bit.ly/cNcJUC for more information.

Also, you can use other file metadata attributes as well:

  • slug
  • date
  • lang
  • author
  • category

Example usage:

  • ARTICLE_URL = ‘posts/{date:%Y}/{date:%b}/{date:%d}/{slug}/’
  • ARTICLE_SAVE_AS = ‘posts/{date:%Y}/{date:%b}/{date:%d}/{slug}/index.html’

This would save your articles in something like ‘/posts/2011/Aug/07/sample-post/index.html’, and the URL to this would be ‘/posts/2011/Aug/07/sample-post/’.

Setting name (default value) what does it do?
ARTICLE_URL (‘{slug}.html’) The URL to refer to an ARTICLE.
ARTICLE_SAVE_AS (‘{slug}.html’) The place where we will save an article.
ARTICLE_LANG_URL (‘{slug}-{lang}.html’) The URL to refer to an ARTICLE which doesn’t use the default language.
ARTICLE_LANG_SAVE_AS (‘{slug}-{lang}.html’ The place where we will save an article which doesn’t use the default language.
PAGE_URL (‘pages/{slug}.html’) The URL we will use to link to a page.
PAGE_SAVE_AS (‘pages/{slug}.html’) The location we will save the page.
PAGE_LANG_URL (‘pages/{slug}-{lang}.html’) The URL we will use to link to a page which doesn’t use the default language.
PAGE_LANG_SAVE_AS (‘pages/{slug}-{lang}.html’) The location we will save the page which doesn’t use the default language.
AUTHOR_URL (‘author/{name}.html’) The URL to use for an author.
AUTHOR_SAVE_AS (‘author/{name}.html’) The location to save an author.
CATEGORY_URL (‘category/{name}.html’) The URL to use for a category.
CATEGORY_SAVE_AS (‘category/{name}.html’) The location to save a category.
TAG_URL (‘tag/{name}.html’) The URL to use for a tag.
TAG_SAVE_AS (‘tag/{name}.html’) The location to save the tag page.
<DIRECT_TEMPLATE_NAME>_SAVE_AS The location to save content generated from direct templates. Where <DIRECT_TEMPLATE_NAME> is the upper case template name.

Note

When any of *_SAVE_AS is set to False, files will not be created.

Timezone¶

If no timezone is defined, UTC is assumed. This means that the generated Atom and RSS feeds will contain incorrect date information if your locale is not UTC.

Pelican issues a warning in case this setting is not defined, as it was not mandatory in previous versions.

Have a look at the wikipedia page to get a list of valid timezone values.

Date format and locale¶

If no DATE_FORMAT is set, fall back to DEFAULT_DATE_FORMAT. If you need to maintain multiple languages with different date formats, you can set this dict using language name (lang in your posts) as key. Regarding available format codes, see strftime document of python :

DATE_FORMAT = {
    'en': '%a, %d %b %Y',
    'jp': '%Y-%m-%d(%a)',
}

You can set locale to further control date format:

LOCALE = ('usa', 'jpn',  # On Windows
    'en_US', 'ja_JP'     # On Unix/Linux
    )

Also, it is possible to set different locale settings for each language. If you put (locale, format) tuples in the dict, this will override the LOCALE setting above:

# On Unix/Linux
DATE_FORMAT = {
    'en': ('en_US','%a, %d %b %Y'),
    'jp': ('ja_JP','%Y-%m-%d(%a)'),
}

# On Windows
DATE_FORMAT = {
    'en': ('usa','%a, %d %b %Y'),
    'jp': ('jpn','%Y-%m-%d(%a)'),
}

This is a list of available locales on Windows . On Unix/Linux, usually you can get a list of available locales via the locale -a command; see manpage locale(1) for more information.

Feed settings¶

By default, Pelican uses Atom feeds. However, it is also possible to use RSS feeds if you prefer.

Pelican generates category feeds as well as feeds for all your articles. It does not generate feeds for tags by default, but it is possible to do so using the TAG_FEED_ATOM and TAG_FEED_RSS settings:

Setting name (default value) What does it do?
FEED_DOMAIN (None, i.e. base URL is “/”) The domain prepended to feed URLs. Since feed URLs should always be absolute, it is highly recommended to define this (e.g., “http://feeds.example.com”). If you have already explicitly defined SITEURL (see above) and want to use the same domain for your feeds, you can just set: FEED_DOMAIN = SITEURL
FEED_ATOM ('feeds/all.atom.xml') Relative URL to output the Atom feed.
FEED_RSS (None, i.e. no RSS) Relative URL to output the RSS feed.
CATEGORY_FEED_ATOM (‘feeds/%s.atom.xml’[2]) Where to put the category Atom feeds.
CATEGORY_FEED_RSS (None, i.e. no RSS) Where to put the category RSS feeds.
TAG_FEED_ATOM (None, i.e. no tag feed) Relative URL to output the tag Atom feed. It should be defined using a “%s” match in the tag name.
TAG_FEED_RSS (None, ie no RSS tag feed) Relative URL to output the tag RSS feed
FEED_MAX_ITEMS Maximum number of items allowed in a feed. Feed item quantity is unrestricted by default.

If you don’t want to generate some of these feeds, set None to the variables above. If you don’t want to generate any feeds set both FEED_ATOM and FEED_RSS to none.

[2]%s is the name of the category.

FeedBurner¶

If you want to use FeedBurner for your feed, you will likely need to decide upon a unique identifier. For example, if your site were called “Thyme” and hosted on the www.example.com domain, you might use “thymefeeds” as your unique identifier, which we’ll use throughout this section for illustrative purposes. In your Pelican settings, set the FEED_ATOM attribute to “thymefeeds/main.xml” to create an Atom feed with an original address of http://www.example.com/thymefeeds/main.xml. Set the FEED_DOMAIN attribute to http://feeds.feedburner.com, or http://feeds.example.com if you are using a CNAME on your own domain (i.e., FeedBurner’s “MyBrand” feature).

There are two fields to configure in the FeedBurner interface: “Original Feed” and “Feed Address”. In this example, the “Original Feed” would be http://www.example.com/thymefeeds/main.xml and the “Feed Address” suffix would be thymefeeds/main.xml.

Tag cloud¶

If you want to generate a tag cloud with all your tags, you can do so using the following settings.

Setting name (default value) What does it do?
TAG_CLOUD_STEPS (4) Count of different font sizes in the tag cloud.
TAG_CLOUD_MAX_ITEMS (100) Maximum number of tags in the cloud.

The default theme does not support tag clouds, but it is pretty easy to add:

<ul>
    {% for tag in tag_cloud %}
        <li class="tag-{{ tag.1 }}"><a href="/tag/{{ tag.0 }}/">{{ tag.0 }}</a></li>
    {% endfor %}
</ul>

You should then also define a CSS style with the appropriate classes (tag-0 to tag-N, where N matches TAG_CLOUD_STEPS -1).

Translations¶

Pelican offers a way to translate articles. See the Getting Started section for more information.

Setting name (default value) What does it do?
DEFAULT_LANG ('en') The default language to use.
TRANSLATION_FEED (‘feeds/all-%s.atom.xml’[3]) Where to put the feed for translations.
[3]%s is the language

Ordering content¶

Setting name (default value) What does it do?
NEWEST_FIRST_ARCHIVES (True) Order archives by newest first by date. (False: orders by date with older articles first.)
REVERSE_CATEGORY_ORDER (False) Reverse the category order. (True: lists by reverse alphabetical order; default lists alphabetically.)

Theming¶

Theming is addressed in a dedicated section (see How to create themes for Pelican). However, here are the settings that are related to theming.

Setting name (default value) What does it do?
THEME Theme to use to produce the output. Can be the complete static path to a theme folder, or chosen between the list of default themes (see below)
THEME_STATIC_PATHS (['static']) Static theme paths you want to copy. Default value is static, but if your theme has other static paths, you can put them here.
CSS_FILE ('main.css') Specify the CSS file you want to load.
WEBASSETS (False) Asset management with webassets (see below)

By default, two themes are available. You can specify them using the -t option:

  • notmyidea
  • simple (a synonym for “full text” :)

You can define your own theme too, and specify its placement in the same manner. (Be sure to specify the full absolute path to it.)

Here is a guide on how to create your theme

You can find a list of themes at http://github.com/getpelican/pelican-themes.

Pelican comes with pelican-themes, a small script for managing themes.

The notmyidea theme can make good use of the following settings. I recommend using them in your themes as well.

Setting name What does it do ?
DISQUS_SITENAME Pelican can handle Disqus comments. Specify the Disqus sitename identifier here.
GITHUB_URL Your GitHub URL (if you have one). It will then use this information to create a GitHub ribbon.
GOOGLE_ANALYTICS ‘UA-XXXX-YYYY’ to activate Google Analytics.
GOSQUARED_SITENAME ‘XXX-YYYYYY-X’ to activate GoSquared.
MENUITEMS A list of tuples (Title, URL) for additional menu items to appear at the beginning of the main menu.
PIWIK_URL URL to your Piwik server - without ‘http://‘ at the beginning.
PIWIK_SSL_URL If the SSL-URL differs from the normal Piwik-URL you have to include this setting too. (optional)
PIWIK_SITE_ID ID for the monitored website. You can find the ID in the Piwik admin interface > settings > websites.
LINKS A list of tuples (Title, URL) for links to appear on the header.
SOCIAL A list of tuples (Title, URL) to appear in the “social” section.
TWITTER_USERNAME Allows for adding a button to articles to encourage others to tweet about them. Add your Twitter username if you want this button to appear.

In addition, you can use the “wide” version of the notmyidea theme by adding the following to your configuration:

CSS_FILE = "wide.css"

Asset management¶

The WEBASSETS setting allows to use the webassets module to manage assets (css, js). The module must first be installed:

pip install webassets

webassets allows to concatenate your assets and to use almost all of the hype tools of the moment (see the documentation):

  • css minifier (cssmin, yuicompressor, ...)
  • css compiler (less, sass, ...)
  • js minifier (uglifyjs, yuicompressor, closure, ...)

Others filters include gzip compression, integration of images in css with datauri and more. Webassets also append a version identifier to your asset url to convince browsers to download new versions of your assets when you use far future expires headers.

When using it with Pelican, webassets is configured to process assets in the OUTPUT_PATH/theme directory. You can use it in your templates with a template tag, for example:

{% assets filters="cssmin", output="css/style.min.css", "css/inuit.css", "css/pygment-monokai.css", "css/main.css" %}
    <link rel="stylesheet" href="{{ ASSETS_URL }}">
{% endassets %}

will produce a minified css file with the version identifier:

<link href="http://{SITEURL}/theme/css/style.min.css?b3a7c807" rel="stylesheet">

Another example for javascript:

{% assets filters="uglifyjs,gzip", output="js/packed.js", "js/jquery.js", "js/base.js", "js/widgets.js" %}
    <script src="{{ ASSETS_URL }}"></script>
{% endassets %}

will produce a minified and gzipped js file:

<script src="http://{SITEURL}/theme/js/packed.js?00703b9d"></script>

Example settings¶

# -*- coding: utf-8 -*-
AUTHOR = u'Alexis Métaireau'
SITENAME = u"Alexis' log"
SITEURL = 'http://blog.notmyidea.org'
TIMEZONE = "Europe/Paris"

GITHUB_URL = 'http://github.com/ametaireau/'
DISQUS_SITENAME = "blog-notmyidea"
PDF_GENERATOR = False
REVERSE_CATEGORY_ORDER = True
LOCALE = "C"
DEFAULT_PAGINATION = 4
DEFAULT_DATE = (2012, 03, 02, 14, 01, 01)

FEED_RSS = 'feeds/all.rss.xml'
CATEGORY_FEED_RSS = 'feeds/%s.rss.xml'

LINKS = (('Biologeek', 'http://biologeek.org'),
         ('Filyb', "http://filyb.info/"),
         ('Libert-fr', "http://www.libert-fr.com"),
         ('N1k0', "http://prendreuncafe.com/blog/"),
         (u'Tarek Ziadé', "http://ziade.org/blog"),
         ('Zubin Mithra', "http://zubin71.wordpress.com/"),)

SOCIAL = (('twitter', 'http://twitter.com/ametaireau'),
          ('lastfm', 'http://lastfm.com/user/akounet'),
          ('github', 'http://github.com/ametaireau'),)

# global metadata to all the contents
DEFAULT_METADATA = (('yeah', 'it is'),)

# static paths will be copied under the same name
STATIC_PATHS = ["pictures", ]

# A list of files to copy from the source to the destination
FILES_TO_COPY = (('extra/robots.txt', 'robots.txt'),)

# foobar will not be used, because it's not in caps. All configuration keys
# have to be in caps
foobar = "barbaz"
Fork me on GitHub


PK\½tAb`“-B-Bpelican-3.0/_static/pelican.gifGIF89a´Ø÷  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,´Øÿÿ H° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœIrß¿~ùöñóG³§Ï‚ùðñÓ§/ß2[Í‚i‹·n<|ûêåûIõ%>gŪ‰›§,—©B™,ѦlÛ«[âò½‡¯ª[”ùœeJ•VÜ7k•Âhq´l+AÂœí2l›4e¬Âé{Ë$6\ÌÀi»oš(8[ !UÊP?DÉREJ˜9q£"…kÌZ£½V¸Æé›Çž2[­fzôéP›1oÖX¡2'—¸\¾¢Éwnqëçï ¥‹S/|ð†M²µ,P#_”Íÿ!dI>xÁjÏ8c¦ZQƒNßa?[„®˜é3-iôø“ 5óÓÈ)t$cL(¬”  érÎ,—$"$6Õ§!BäÈ↠§("­üc8ÅhC #Â˜Ò ;äèâŒ:Ÿð!Gs„r‡g"K;I5Ï(2Çj(C*¥ÔŽ4Ó”Cˆ1í”’ <åÈ<¼¬r O 2 iÂ:B YÍ/ÖÆ ]C &¨¨>÷ cÍ?ÚpB0žp³Ì0©LK#gdH$‘òŠ8<¥YŸ4°À³‰8¥w L BÍ\s/¿ô’Í4ÀœrM4¡€Š%®ØòÈ$m²EˆLÒIShÇ(Ï|cN=å²öL "DQktˆ‚ %ÆÁs/R³Ë$¼2I)­¤× %¢¤J(—h(Ñ0ã>öDÌØ.=,A&Ä,\\aI3ÒüóÌ%Ù ³M* ¤"†"mrò2¨¨âŠ.uüÁFÑrÏ8ñè\?•Àà&nÑÆ ‹ê’‰tÊ.ÎìãÌo8ÿ’Dl°ñI"½(£Š(¯Ñ"{¸Q 3èÀÓ šfû¤O+X14(A$ HÒÆ \PBŠDM2†Ä1„!œôA0"ÔxSI"„ðË'—°J5ê`óŒ8•÷¤Ï'ô€ÄHxÃŽ"Á E0Á+0B¢8mÿCʆ7´r@ƒÐ0‰Q‚Ô`Ç4€ fSì³àÅ# L0ã–HVÁ{T:âùƲ°‰aˆÚO…&Ø°„&ä Ö^hBð°B¬!IÐÂ&jd,„ŸÅ'6áŒoä‚'hÃê  Y¬BˆCÛ hPÂzΠÔ+’‹"¨á¦˜ÅL0^\B 3BpÀ-,Á†DÄp"‘(èÐGØa—(E-–ñ†| n8C\‡Z¾A ¬çÁF¡ Y€#g‹H?&q‚0Ü"‚@ à I@á1@¾à'8¢]È‚ÿÎ …3 ‚ [XƒÜó;È᧠E0°dA DàC.ŠÁŠLØ J€Xp »° (”|‘0Í cÐ90 Ñp ÐZ`q€y°:y000yÀ-ptœ€_pEðÍ0ÃP/ðc`¾ Ë äÐâ w0 ™—Åð È•Œðy |@X° Bw&€R“J±¢„ |RÐ :@‹NcÐ$Q 'à%)m` ã@ À{ Ë;ˆ ŠðÆ B’iëÐI £P ÎP Y°.pI à‡Kÿv˜@ dPV:PPðFpŽ€ ŠG@6 €pð    P " а « @™°œ`OÉŒÏðKÀ “`'P¸02 ÐyÐ{À@à p@tP½“UÀ:pI´ är¡ qîÖwp£  ½° ¸ O¶ P ð ˸ ‹ç§ ° ˆÀG ’p/P)°ppz°Ú’€Žzð~®° Õ /š·°:à| \€˜ ˜ “p†àè±  ›P6a¤7v@‡à wÀ g+ð?ÿVà @t ~Ðfpip Ë 6A € t Õ· ‰° Ç  ‰Àt œ@¸ðœ‘Xp£à qp’€ P<@0pSà’ptÐ Y_¦@ñ S0cÀxðpp ÒÙ@ œÀ‹`h„­ÀO´úì@R ª°…ºà:0-€;€H`ŒÓn0X€P¦LÐY``d›r ¹  ‡0XPl° ¤ àœçjcП 8ภ(À%p8@J}àaÀMÀpè@óà-]ÿ°Nð™ ²  ©™àc¹#¤°€±´šbЭ C ÐÐ%°;VpdâK°ª€1 càüºX` ½ ¥P…0J_`gÀx@ s®ÿ0 h 0p° ¡`‘!@#´…THÐw  H;¨àñXcàs Êð « œc€µV`v x+±0‹` b` ²@ PQ0>pV»   Á q@uÐZP Œ0 ЋÀ µ”V n `{®œ°’0 Æ4° 4p6€SðŸÿp ‡Œ`žð²`Š‚ Éð‹Àˆàk:ª°a£{ M0—— h°@p9àƒ 1Ûë ž€ \  ‰Pd\ Ðð ©€ fPvP0º! R ’ÐÉÐð!ЛÀ ap÷ –` ˜  qàp°}0f€eP’t®þ R3ùÖ ° C` õ šP¯ ®”à~À½ „@T@E0oÐ £«ƒ`~°· HP²"p“°± s  È@ ¬° ` €0oP •`OC°™0º¾ÿÐ~`t° ‘0d³°Œ#1…  ³0†0 ` ˆ°n`hŒP/›€·Ö ;0¢0``E` ¸IÍ°À“ P Õ5QOði`UÕ ´ºð<œw°8€Ž  ¦Uþðo Y‚0 ‚€V„e0@ð•8ªw •©Õj@ ™àc0 ô©Þ€v3„Spsphð~dI0¡@«öp|Ð i@S*Ñ `pœPnà‰QpM`>à „ Lð¼p®¬ @€Ãàõ€wPj`”œ+a`hÿ ;@ŽE7€ x›ñà§#A~+]Ðe`aà.@eÀ]P#`#@ÎàÁ0q uÐ[ ±Ž¼b°; E€³7À!n`Õ/A FàBàftp,ÐGàE [6ð-Å Ö,Ñ ° ‹Ð> ÐTÐOP "08àH0n®I#Ø)ùPÎð ‚`<€[pLJM d0hràŸt° C¬Ù"±æ ÞP£øP ‹=À¡#Ún˜ —Wà?à@0׈²íó Þà ñÐ æ`òÛÓÐ¥Ê;WðWÿ ${ DRŸË¨ÛÌû ïò€ê`®š=àö0Ð õ°%óÐåð€ IMP@&Ð5€Ÿ@ ­° ¶°Žp o@w#t€À ÙðóÀO¥‚ ¿Ð Ù€ µ€ °à¬²½×` è¸` ñ÷Àæpóûð0<D<ht Ë ÄP jÀ7°Gðfàx€ML°r~0} « – 'ÙP ¤ × lnߣ»)þ ø hßAÞö@Ù@É€-À7ÐWp ¯ vÿZ0~€€HÍ y°{p”Þ]Éw€²/É¢à ³` Æ ×àïà Â}®¼€ è@Û€ ú  ­p ë æ€êû@å ËÀ#sz°¢0 ‚ð‚Hb …€¨ ‰P, t0‘À #|Nà^°` ê`×` ¾@ œù Œ·èÐ Ù ×° æ` ®À ó ûÐí°ãóàß³p**Ë\ 0öhLP“0ƒp ™ P‹@ j° ™P €SWsÐk ‰ ³0 é ­Ú@N‡·ºð îð ¾@VØ ôÿ0 ÊPÝ âø^ãà N ­a ]ð¥pP u€lv g°azP ¾P sЗð ^“SŽð\ tð×ÐôÍ èPSñœÃ€îÀ°·`pÜ@ ÚÀ ŽP Ø0 Þ`ø° ª0 òÂÀßKxP¥ bаgзÐ[ÐT{ ºpéW  ‚Pn ¡Àˈ…pOp—ªàÞð È Ï©P@ í` w ÚÀ‚ ¢0 ’°¢Òý ðé º` Ðzà(¸Ð ÀaP ± wðBÀRÀ§`!ÿ[yÀŸ` l“ •à ÀÀ ‡pœjà ÌÐ ½À§Ì M  Ê€”èò¶+Ö®MÕ‘‹·îÚ¹u¸Zë…JJHº¼Éáã§1lìø CÇ—>jxqª²i &XÓòœ¹$ªW¢)œBºC§%?`u[7k¿I•.eÚÔéS¨Q¥N¥*UßAǼ4Á .dÂ@âgNš¹lõî-®U,Y_º¼ÚV+‹Y—B]ëTÆΓ!.Ô éÒ'@†ýbÄŠˆ¦VJMºqåQ(ELf$:ô+¾yð ¡«ZÚôiÔ©“#ÒªO‹;o°Œ æÍÿ'o¾jùÂ…Í_6wúæ¥ÓÖìÔ’I±dα£ê '^Íéq‚ Ž4[ÜpÃdD›Zq<ÁêOQ ¨¹CIš(j0…Ó·í]¼`ìTïçß¿ª!?6Iã 8ŠD˜atÁ¤tŠå{È1qÎagœSŽ™•e\Ä”ObYå…T¼éG”Gê˜ÂvhÂW:¡¢‹(þä @äSd(☤ ¬°CškJqmà9Ç}ÊAÊ?(£äŸ>4‰DB¶„TTáäŒF´áÖ¹¥_¬Ùyæ1Ç–Z†Ñ¤“W:iÆ29K$™# VÔ𡈉âŒdæ°¢#A"Sú`DŒD¤b -¾£—lþH$I´Pežê™æŸpb¹gT©KòTú°æ”A®á¤ 3J¹#•Bªå \¸‰Æ›nzqóœwÐy'i²Yç›Ee_ðÉew,‘âŠhôØ"‰ i#RB¡å;y @²b b¾ae–s ™d{à)fu„9fŸyô5}ÿÔ¨ùhAÑ‚ Á Ux¡í )ŒáŒu$ãð¸‡2ı‹y¨ãêPÇ2‘ÿˆ>¼¢Ïh‡&bñ/x¹èƒÎð9l‚ª€"lÁDA°¨à„qhÃòÇ&€‘ p”ã…èÄ(˜A rðOŠ§±Æ šÁ‰,Ðã$€)Ú/´BžÐ+”VŒƒê˜2æUXí… ê‹[ðCyxÇ%®°…ÜOˆÃ¸ Cœ¢`ÐC'ÆÀ†Áˆ8Äò [XC·6ÞAŽkH#°¨E0¾±)¦r*Ä‚,ÞÐ x!ÊøˆOØ¢•°F,<‘fУÞ Ç<¬tìÔ¨EÈ  lУµ ( ÿÂE0’0< BGÂ'á…< ¡ n D`Ð/8aÝÃ)ìAx,££8F5àUô)º@5‘Œa$è`…M²HÇ'¤A[¸Ÿ‹F2n±qƒ“C~ÁzÌÂX‚+~FôâCЂìÀ†^<" "&âЈ>œ#{ÁqH£  Æ?ôa n C ø†?ô'P¬òb ȸD,BˆUÐoDÑ2¨â¦ÐÇ4rŽv¼ƒÎ †8ÜÑaØ‚3H€Æ?ˆ†9"¦Ø¡ %œÀ qàBhŠJaÿm8„'ŽÑˆI0"Að&TñdÔ §¨†;Ò!olB‚V]›e\¢oˆ…* ÁDèÁ qh‚'&1S¬ÃóhE5þ!ŽlhÃã€G5V \œ"TÑðàˆh8æhƒzÑ„@L88! @A­¸D xA ^,ÂM(„7TQ ~ Bm0;ú!9a"W}m*Ç¡Œ*dApxD2¡:|Á •¸D˜a‹fôÃÑØ#À¡Fq@cµˆÆ.Úe†=H ‡ „þPE2¨¡†2C"pÁ–°ƒÚ „`ñNà€;¨Â˜à‡h¬còðG4î?l£Ñð9ª‘-t·@Ã%8±‹<@à øà à@‡%ðaœ F4Œ±gœ‚óà1,q }œ£á€G0±ŠqÐañ€D/†qdg"2BÕ‚@L¤ã@¨Â6˜Q)pÁ ?HE"P¡Ža¤Ãø¸f(" ƒ×hÿ¬S©‹1"a–Æþ Jr€ „-¦Á cb¥`E=òŒcãÙ0„8þ±Ž=œ¢—@4Èà‰dP‚º™ â@ =ø n¸8UHã m Ä)j°äÂXG9p‘ŠS Ö@7öAo<•ñ¨C!1ŠMƒXD-¸ƒ!ÌÁÇ`6à0Œ\4‚ä€5Œ¡j¨áÿØ"J1QÜa¥ D)¬`ŠKœ‚ÜlÀBLÿ± iä w:¨áŒs|ã®`Â¥ãˆITƒÚЃnAKhá‚xA ¡ˆBXa“ ƒ†A \x !h„1b±„Vè°ÀÆ5š hð &0Br8n˜`Ø…L¨g€‡g …JÈ:ø„YX„sh+O8à‚DØH€NX‡g@„!˜r¸E¨hÈŸsàð‚Y„ø‚<Àcȃ^ìAˆSÀ…P@†AØ(AÈ„éw@1ð€5(†b‚AØ…a˜†ppBx†R8WF‡Y`…>sP…M(M©©‡+€ƒE(…(P?p‚(°4X ]H†;¨L°„|P- „yø…@Xƒ@¸‘78„* 3¨>èM8†c°F`‚+0„+‰}p†h4 b¨#€ƒU…z¤Fp…[€ƒ6(>p‡jø…Cø„VøZÈû”šVX„Dðêêƒ%¸#8:PAp¬T ;0„N‡ z†0˜±ª„1€1¨H ÿFH‚N0†a ‚P0@ „NЃtÐXè&(;…ˆK°¸Z€>Ø…fh5°†0ðv˜;¨Wà‡b@†$sp…:P0à„2 ‚8X§HPIXƒWp…*X?¬5(‚mÐb˜‚>H„^8ƒIÀ†H]:x=(iP`HƒO„u‡?/Ø@Ø…i8ƒ€ƒL8mЂ4(…iØ]Ðȃtx0ÒqlÈÔ¨á‡5¸ƒ8€ø‚B;€…X6ø‚G1X¸ž98{p…+HŸ\…D…bB`P'P'Øÿq/8+¨„FPo؃0Ø‚›º…`ø-¸MYh8ð‚Lp…qèl€ˆ…Dh‚„”†(…~`W~éíÁ-°‚EHÐQ ‚?Àƒ(6˜‚L˜ƒ?8uˆ.P]P©H8ZH‡?8…að, ΠWø¨…Vx_¨;8ƒ;Ø5c0‡JÐR@^¨ƒ|U„lðdpÀƒ&èI0„I˜A žÝ›4ƒ"Øh‚Ì‚KØ–= %À–5p„=˜XäJ¨…nÈ8^0„Õa†U¨F˜É)ØlP‚#Ш„eP‡D(‚9À(È7ø…ÿbx÷y…Hp;pSàH@0ƒ‚a¨„/;{XÜT±‡Nø$X…&‚Jp3† = ˜ƒ4¨„ ˆUy¨‡KÀC¸ÈWH/He¸Ø.K8„1ЄmX‚$Ø‚H‚wè:àø,‚,€…[8"¨„=xIЄ#m¨¸?ø%`‚Vè'à„XÈCëEYÈ=z¥-(9pCƒˆ@ã€VØEp*dà„-Xƒo˜jˆ„+Pa@6¸|€M : †$ë€DP…?€ƒ$ø#Àƒ3ˆ„Xð‚,0‚49°ÿ/À„u؆¨G0&èCr°GÀ…(ZáSÙ‡N¸aP8Z€Q¨ƒxƒ=XG`„?¨rP;Øs(V@3H\¸†@¸ƒ'˜pƒQȇL`1`‚q¸‚˜3èX‚R(-@ @ƒQH„VÈ5H…4P+@…;Hp ‡;(BX.`Õy ƒC =F•a€ƒY˜=Hd¸WÀ XKˆ6x8p‚x„0€‡yÀ†4 0cx…7H0ˆV8t…d ‚Ð:ð€)˜È€ÈDÈð€À6„¨6LƒèM¸‚`¢hÿY GГV †shæSY>À„@/ †1H(X•¹K¨2X†90d˜‡e %à‚O°@8ƒO–S.ø»[€"Àgp>¸ øWȃH(èbñƒ/f‡@À?Ø…3ðð†/8@†Ixjh…F(†¬ãè(‡3(E …90†.…"Hƒ/ Pe;†:Ð=0<ð+h_‚<0-¸]Pƒµ:P‚°Y`[ °‚Y°ƒL¸ƒ+p‚+H<@ÒUÐ&ðTˆr`L$x„Qà[06X†r@k).0ƒ\8Z(ÿAØD˜0ˆ) 'Dø…HX+P‡8˜#¸ƒs(0…sƒd°0pz¸kЀ0øe…ë€+ƒ:˜„8(fø†x°…20…F íQˆ… ØT†¹ƒnpÛ–EÈR°P0>胜ƒ=Ø!F˜‡[p)8€D (†f8m…6 …~°… €t¨‚ ø€)8„Ih‚Hèƒ X„?˜G€„b°h‡Zp' ƒ^xG ‡) K@h1Ȇxð(‘$hPèY`?p…4ˆHøØ€KøWÿƒˆ‚SHÀ0PUPƒ[ðAÈ…mø h$Ðp  (¸Jð‚È…J¨xƒ[ЄF@‡\X ˆ"HN@„B؇;x,`s0†6‡q ò(¹CЄ)90\hTðÌØIøM ‚#€èO-˜ps@MèJ°„`ƒ!ª¥ièh ð"8‚AÀ†N€ h„QØP°€=0$ˆRÈ?ˆ‚&@…lp†9À†Ö2uÿèKˆ&à„TS¸Y06P 8„¸"pA†7ð(xrð„ÿfà?@lh‚ HWƒ…=øà€ 0‚>àY-x!„C@,@…:À‚Dèrh^˜rz÷th9ƒ\øJȃ_0^.HK؇Yø6˜ƒ%È„aƒøƒmÀSÀ^pƒ`À†!¨9¨€?È!÷€0‚?x‚ UÐ6 À ‚- €œ X$ÅDðv0MH†‚zþè‡JH…& @1@b¸‚8ˆ1èƒt†@°…8h0LØð]†3˜¶ZÃMøƒW„ 0C(‚ð0° èÿA¨Ã-ИF˜ Pˆa{@†C®O…TpÒpüþØ…Yè‚&†/°„^À‚?`AX\g…A°„D¸ƒps{Ó†lh‡)ˆ"ˆfˆƒ /ˆ8<6ˆáanl}Ú4 !?6ø ‚¬FqÎÕ“åÈUž”‹÷ï$Ê”*W²léò%̘2c†£¤hH°3£Be±D“(¼P „'–Eàð©:dÌ zÎ~IsÊ›N´°ð 6Œˆ$l&=ŽôèÐpáJW,1ëoKÙÜô‹—¾™‚.lX%«BmLÿ9¥&Ï3A™dÝèACY—’`˦lЮnV,õ‹%¤L£nÌÚìøà (Pè Á-j– Zd%ć c49)Ý kŠLࡆM%e¾î®nýzavk½:s ‹¨i€ûc¢…;ÌùÊfL˜kŸ¬2§ªM YîPÅiÔAÄhÁpÀ ®Ø²Ë(„ôáÄW! -=T‘Ë*ËaÚ$"D&ʈ2v%šx"J­LñJÃàqÌ'XRO)I0Å.Ò ‚Ì8±<H8ˆøñ*˜hr 4ï¸67d€PAm”ÐÊ7ÑtÉ0¬€Bw˜rÿ (!d /8ÜÀÆ4ŽLqˆ(Ѓ"u #ˆ@ÓÆ5¯ˆ:²¤†âhÊ4µ„2/Ë,‘L4_Ø‹(éìÒBà 1#XAmx  =¨B ,ÌЉð’†.}„ ‡,àqˆ,’„‘ ,—¼c'°Á¾” ŠXƒ-¶„Á‡.ÛD2FäxÃÎ-ˆl2–„!ÎL 3L1íÜá¨BLpàx #öœRDðÐA°áË"YXƒÄkp(«ˆ±E+É”BŽ° ;üO?£0r v@S†&t¬s K€C+RˆK Ôìñ -è¡Í7çd#ÿE F€r"(V€`îøB5ì„á,_´òHðQ)w¼p…+Ìè²ÎÃY»J,Ì° D9Ä$³E8¹„1Å5´(á ;¬ ‚L(²$‚$ДãŽ(l…3hp‚#ü—`„8ÉhÇ 4P …0¢È®Œˆ¡42‰ ~|¢‹8Ôi=ú‰œ¨ñŠ,°²N0?ôG$MEÌÄCÈ(ÁãH @€bÎ=Ã’IT£…|àA&Ä ‚V$„’ 0f¬°*€QJ#ÕxAG#[ØQJ¶¸a‡&®ÈÓéícç‹ PQÂìL“C 3HÂÿo$Á 7á qØ‚N(/ÞÑŒ¼´GÀÅ4‚y 8€8€‚RÀ"@ÁPÀ áˆÀÆ+þ‹(‚H Ä/Î`‰OàÃ}6¬Ž0¦pƒ´‹ÈÆô0L°"kˆ„6†qIÈ4@C'àÁ4¸ÜШ1 „ HA ¦0ƒ €ÀÄ (n@)„ h= E!öPŒ] ¿˜…`ŒJ%07üã`–Á„!0 "þà ,äaª˜3¶ ,Ô¡)`‚¨!ŽRàÀêSFªQƒ/ªÀ,ÀÁzм€ðØD’à ÿ<˜…+¤0ˆoÜá‘xG( ˆi("ì$2cÒ (A Lhf°f¨ Ã`9¶¡ŽM@á<5XÄ3ÞQ +Ü ¶ø‡3ÆpŒ``PH\`…+  *ÈD?\±†+„ C Ádá?$!z Á"üц tÁk˜D2#ú’|€gXB ° ƒ;Üã_È+ð‘t`b3X´Qc\ÁtІ#Ú1 /DC¨RÐPÁ 4(ð V,â l@ÃJЄp CR˜‚°‹~ÂNx¤!Ñ­²„+pb †&Lá‰èÁ ¤‘x8&ÿÀÂŽñV¡"}°G/Ρ‡:°â5>ˆB>À‚"aI ÁäaŠ3ŒA^€Á†ÐŒp¨ãEÐ@~aW$¢Š—WCûI¸ L¸Á¨‚Z¸‚k€G=´ &D!Á Ç.FRXðˆ=ÞЉ8x€IÂ@ðœ OxA –Œ&ìÁU Áv0 h˜ÃC¨€$Ìi^T É-zwá!ø nЂÂP ô`í0‡n ˆZä£;€A@ÑD CÙ1„p‚ \¡F A’[…/À€ƒø° 6¼@@Æ)`Q ! áß8†ÿvÁ 'ð½¢½"Ä¡ ,°#–0ƒeüc 0Ò! ÁeÁ}è+ì1YŒ&€Á˜ ”¨M°‚:°†wôÁâ°ƒJ0Zà‚ã0XÑ ]àáEÀƒ‹EK* Á LPv@,, äˆÀraDh@CpÃ)êp„[lCtÈ+V€.8¡*)8CNÀ„ 0At ‡"òàŒ8„Á˜D8¦¡ |s™èD/p 8‹¶5(v ‡œáø‚=p1\„c(Aº_äá ·x>´`ˆMÐ pØÂð07 EèAbÿ sø ÁðÃTpGtÉP"ŒIè‚ Ÿ µhÅqƒ-Á?A# @=˜#°FX hÁ¬p…'Ê` {œÃ «ÀÃÞÐ3˜aÈÃŒ{„)´à÷Å”± 7…(Ç-t`6|‚µ öïÐ⃠A8 Np„HŽÐÅ*žñì PøB –‘ Td¸(B&hp…> " m(„à ,!^ØAÌA (ô"{ð 0/°ʈ3QŽ‹ö.ÀÁ dðˆ9y`Ã~@#Ð` Z`C+81½D#[øB€ÿF$ Uø Æ0 -¤ TXBÚ 6Ž€Â VÑŒ°Êáô¨/tÎ÷Ðz£"`Á$la&€¯qƒ! ì†2BoÆ#TÑkè@ B`!L¡‰5hFC(è ‡)L! w0Ç8&¡ƒWXcèÅ­! HÐã~Ü}h)1‚(Ðbª¨ „A-¨ôVˆ‚! Â343¼ƒ,°@ìÁ'8FBpŠ½dÁð2øC-ØÀÂ"Ä‚#d2”‚4pƒ7Ðþ¡W?ˆA ‚6 BlA TLxAø(ìˆÃ'ÌB:üÃ#ðÿ€ì@0Â#¤Â8Á'¨ÁœB-ÀìÃ?@ƒAü@Ѐ ì‚1ðB:ÃÞÍ hM pÃ8°$PÁ1‚7¸<(h$;Â2ÌÃ;€èA $,(‚"TŒÂ*PSBô!ÈÃ5ì0ÏtÀB؃"À!z­XC4((lÁ €€dC/ðA#X1¸@4Ã'øB9¨‚¼øÆ PA&dÁ0ìBÁ#„ 0„C&œÁ,Oˆ@ Ì‚ hA6 ¢h!ƒLAÄ,° t@ hÃ5ƒ+ìTÀÄÂ1ðÿ‚*$AìA•åA"èˆ,ÄéCÔ€"x ÔÀˆ‚+… œt@ƒ8Š–;ÈàT€ÌlB À'ÄARt@DB1¯Ý‚Ø@!`Âä@A,TB.ðA% Á LA ¨Á |@€@ ôPp(Áf$WéÃô@‡]¸Ã9¨€Àn@öp€ÐÀô H0Â$‚$ôÀàÁÔÀ/4Ã2(Ã@Á%àÀ |IÑ ØŒÕ@'8%WåÃ@Á 5äÃ?ðÃl À xÀº€€ |À¸€´@)|BpB$¬@,ÿJÀ;‚/0( lÁ&ÀXÀ`€ Hæx@ü@èž`&?\Á!¤D&ˆ€ €ÀPÀA`€¸@ À@È@tPÁ¸Â(€xƒ'$C!ŒAôÀÀÁ“äK¡m@lÂÀ¨C'(ä @A\  Â1X)@ifm_×É>¤‚,ÁDñÀ5Xˆ- :Â'€ÁTB,Á&Lˆ- ƒÐÀ(ŒC/,Büƒ<ÃäÁ&ìÀ¨Á)Ô@ˆ‚:ÐIvC=Üv°ÐÃ< 8¸C<ÔC4àì1LC*Ђ(ÂèqMÃ-ÜpC5Ôÿƒ¨A5AtÁ8”l)¸=@Ã.7 xÖ¼+€C"Ã!0ƒ(h¨Bƒpƒ*d‚8à ˆÁ>àø€0°ô2ØÃ6\7\´8@h9(ÂP1@ê?èhi¹Ã˜ƒ44\ƒ%`C`ƒÄÂ+0:B.˜4È$ü:ø€6¼;ðÃ-8Ã;ˆƒ‚0C-È0ðB±"úèðÃ6Ì7¬Â54B2XA'„B2´Ã$Þ!‚)è<A"ð0ŒB‹1/øC.H‚4´Á"´Á-L-ÈÂäÚú 1C†LB4€‡'ÀÃ:\‚9`Ã7XCœC<`ÿA,ÈÃ,Ä÷?ÄÃ+¨ƒ3p>dÂB=,Ã&œB•‚;é0C"-8ƒ"¬B(èƒ89(ðC4Ð8´$6PCJC.ÌÃ%”(¬.üÃ=äÂ"4¯”B!´ÃIÈÃ(¨Bð쉣D?ô$ü=Ü_Ñ#“>ÈB üÂIxCÏ£Ä-´(lvK„ƒtC×oU?t1ôñJP¸A.ÐýJ|á¿=2©|JìÃ-ÀB9p½ßg$Ѿâ/>ã7¾ã?>äG¾äO>åW¾å_>æg¾æo>çw¾ç>臾è>éÿQ@;PKd½tAØuîê¬ ¬ &pelican-3.0/_static/comment-bright.png‰PNG  IHDRóÿa OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6Ž¶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yn…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛbKGDÿÿÿ ½§“ pHYs  šœtIMEÚ 6 B©\<ÞIDAT8Ë…’Kh]e…¿½ÿs1mAÛÄÚ`j‚Ïh[-ˆE(FEŠÁaAœ! bI« àÈ*–BX‘"Ø4)NŠõUR‚Zˆ¹­!’×Mhj“›ssÎùÿíà–¨àãmØ‹Å^‹-\ggßÏ ÷ßì]o|ÑÑÒ¬[3±¶4§Á§6»”û©òèø¯×>zd‘¿ ]½#Œ»î8ÙþüáÇOݺ±t{5·uIÍXN!I=@Vf¾®Ÿ=v×ÀÞþ1ûº}e>;ØÉö×fvìénøvËÍÅxaÉHrÏʪJ’¦Fȹ`œÈðDò¹WZ®]ÀžSíýŸø%S)ÌWAÌœb¹ |0K=âSo7D†~\~qâÍ-ïÀËŸ\ùaóMÅ“Z,S'*æô™‘È} óF`—†ÎNnzæ674¸öËUÈç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6Ž¶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yn…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛbKGDÿÿÿ ½§“ pHYs  šœtIMEÚ 1;ïV·¿§IDAT8Ëu‘ËkÜUÇ?ßsgœ4ÔØøhª‚`µ©ÖG1 RQ‚”îܸp%èBªø”n"‚bРXJ ‹.4V iZð##T;m£µ!4™üæžãbâP­~7÷rîù>ιbwïý†cû†; m;‡oª”ÓAÜàΆ ζZ^«/®þôä£Ãç¸|îs¯ÝÉø{Óý;†¯y¿»Rº¥ð¸Â=È9(rÉt¦Vo¼¾û¡­ûG÷Í1±wíÞÿ#_àÓ©¹›{»¿ìî*•›E&ç å!€€ˆÀƒ(—Lç–VŸßuïÀ«oœéêûÁᲵ‘DŽÀ€ P„‡²G”“4ÿçÊ Ü:&€¯ç~™êî*ݳÖreˆuá: ‚ááS­-,ßUšœ©^Ÿ’ú›E&·™JY[ÃPà!RˆìB ŖޞʖR@_ÎôÈ€dBfó”€NvHfÂ"è2ØTÊî]­ˆR‘’ ³ö j§'BàÖ1‰ddAak…/DIJD… ’D2‘ÌH&L`&L† $Ex,6‹|Ö~_\©¿Pœ‘ $™ýMH`I˜©=Ÿ @¨±Z|õÈÎÁ|ttv´gcåЕ—WTZ'¤õ3rŽÈîje"ܵx¾9ÿö›¯°W> ¹mb©Ñ|by¥ˆ•fFRx{wí%Dúõå¹Z½±€áCíÿÞüô$õwdüÀôðÖ«ÞH¦mW÷nètaµ(ŠM<~;9¿ôáž]C/ñ_¸ãåŸ;÷ÉãÕ«§æã‹Õ#Ÿ}ûÀáÉïoÿ`zS§áÚ·ù_>:;x컓§?Ÿ©yóÝ©ÿ|}æ’~ûwam-/ž®7ž=¾0úìS÷5è»ØíRç¿š¾P"*Ö¯ IEND®B`‚PKd½tA[{Ñgtt"pelican-3.0/_static/up-pressed.png‰PNG  IHDRóÿasRGB®ÎébKGDùC» pHYs × ×B(›xtIMEÚ ,ˆ±ZeôIDAT8ËÍ“¿jAÆ—»*ÿW¥KkåØÙ-,ÓÙBòy‘@Ò- ÛÙˆ/`cáXYh!6jÎf GrOlXvØùvæûf¸k2±!ûóp!GOOÔ² &z·®f 6|M ©~¥%‘Ï`]*ð äΛM]K Õ‰úËZĆ1Eé¹rÅ%èȶÀc…¼ØmçÍ1Æ`¡¡#pelican-3.0/_static/ajax-loader.gifGIF89aòÿÿÿU|ÆÖßN€U|l–®Š«¾™¶Æ!þCreated with ajaxload.info!ù !ÿ NETSCAPE2.0,3ºÜþ0ÊIkc:œN˜f E±1º™Á¶.`ÄÂqÐ-[9ݦ9 JkçH!ù ,4ºÜþNŒ! „ »°æŠDqBQT`1 `LE[¨|µußía€ ×â†C²%$*!ù ,6º2#+ÊAÈÌ”V/…côNñIBa˜«pð ̳½ƨ+YíüƒÃ2©dŸ¿!ù ,3ºb%+Ê2†‘ìœV_…‹¦ …! 1D‡aªF‚°ÑbR]ó=08,Ȥr9L!ù ,2ºr'+JçdðóL &vÃ`\bT”…„¹hYB)ÏÊ@é<Ã&,ȤR’!ù ,3º Â9ãtç¼Úž0Çà!.B¶ÊW¬¢1  sa»°5÷•0° ‰»Ÿm)J!ù ,2ºÜþð ÙœU]šîÚqp•`ˆÝaœÝ4–…AFÅ0`›¶ Â@›1€ÂÖΑ!ù ,2ºÜþ0ÊI«eBÔœ)×à ŽÇq10©Ê°®PÂaVÚ¥ ub‚ž[;PK†½tA@kh«œœpelican-3.0/_static/pelican.css/* * pelican.css_t * ~~~~~~~~~~~~ * * Sphinx stylesheet -- pelican theme, based on the nature theme * * :copyright: Copyright 2011 by Alexis Metaireau. */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: Arial, sans-serif; font-size: 100%; background-color: white; color: #555; margin: 0; padding: 0; } div.documentwrapper { width: 70%; margin: auto; } div.bodywrapper { margin: 0 0 0 230px; } hr { border: 1px solid #B1B4B6; } div.document { } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 30px 30px; font-size: 0.9em; } div.footer { color: #555; width: 100%; padding: 13px 0; text-align: center; font-size: 75%; } div.footer a { color: #444; text-decoration: underline; } div.related { background-color: #6BA81E; line-height: 32px; color: #fff; text-shadow: 0px 1px 0 #444; font-size: 0.9em; } div.related a { color: #E2F3CC; } div.sphinxsidebar { font-size: 0.75em; line-height: 1.5em; } div.sphinxsidebarwrapper{ padding: 20px 0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: Arial, sans-serif; color: #222; font-size: 1.2em; font-weight: normal; margin: 0; padding: 5px 10px; background-color: #ddd; text-shadow: 1px 1px 0 white } div.sphinxsidebar h4{ font-size: 1.1em; } div.sphinxsidebar h3 a { color: #444; } div.sphinxsidebar p { color: #888; padding: 5px 20px; } div.sphinxsidebar p.topless { } div.sphinxsidebar ul { margin: 10px 20px; padding: 0; color: #000; } div.sphinxsidebar a { color: #444; } div.sphinxsidebar input { border: 1px solid #ccc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar input[type=text]{ margin-left: 20px; } /* -- body styles ----------------------------------------------------------- */ a { color: #005B81; text-decoration: none; } a:hover { color: #E32E00; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: Arial, sans-serif; font-weight: normal; color: #212224; margin: 30px 0px 10px 0px; padding: 5px 0 5px 10px; text-shadow: 0px 1px 0 white } div.indexwrapper h1 { text-indent: -999999px; background: url(pelican.png) no-repeat center center; height: 120px; } div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 250%; text-align: center; } div.body h2 { font-size: 150%; background-color: #C8D5E3; } div.body h3 { font-size: 120%; background-color: #D8DEE3; } div.body h4 { font-size: 110%; background-color: #D8DEE3; } div.body h5 { font-size: 100%; background-color: #D8DEE3; } div.body h6 { font-size: 100%; background-color: #D8DEE3; } a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #c60f0f; color: white; } div.body p, div.body dd, div.body li { line-height: 1.5em; } div.admonition p.admonition-title + p { display: inline; } div.highlight{ background-color: #111; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 10px; background-color: #111; color: #fff; line-height: 1.2em; border: 1px solid #C6C9CB; font-size: 1.1em; margin: 1.5em 0 1.5em 0; -webkit-box-shadow: 1px 1px 1px #d8d8d8; -moz-box-shadow: 1px 1px 1px #d8d8d8; } tt { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ font-size: 1.1em; font-family: monospace; } .viewcode-back { font-family: Arial, sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; }PK†½tA:>«>«>"pelican-3.0/_static/searchtools.js/* * searchtools.js_t * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * helper function to return a node containing the * search summary for a given text. keywords is a list * of stemmed words, hlwords is the list of normal, unstemmed * words. the first one is used to find the occurance, the * latter for highlighting it. */ jQuery.makeSearchSummary = function(text, keywords, hlwords) { var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { var i = textLower.indexOf(this.toLowerCase()); if (i > -1) start = i; }); start = Math.max(start - 120, 0); var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); var rv = $('
').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); return rv; } /** * Porter Stemmer */ var Stemmer = function() { var step2list = { ational: 'ate', tional: 'tion', enci: 'ence', anci: 'ance', izer: 'ize', bli: 'ble', alli: 'al', entli: 'ent', eli: 'e', ousli: 'ous', ization: 'ize', ation: 'ate', ator: 'ate', alism: 'al', iveness: 'ive', fulness: 'ful', ousness: 'ous', aliti: 'al', iviti: 'ive', biliti: 'ble', logi: 'log' }; var step3list = { icate: 'ic', ative: '', alize: 'al', iciti: 'ic', ical: 'ic', ful: '', ness: '' }; var c = "[^aeiou]"; // consonant var v = "[aeiouy]"; // vowel var C = c + "[^aeiouy]*"; // consonant sequence var V = v + "[aeiou]*"; // vowel sequence var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 var s_v = "^(" + C + ")?" + v; // vowel in stem this.stemWord = function (w) { var stem; var suffix; var firstch; var origword = w; if (w.length < 3) return w; var re; var re2; var re3; var re4; firstch = w.substr(0,1); if (firstch == "y") w = firstch.toUpperCase() + w.substr(1); // Step 1a re = /^(.+?)(ss|i)es$/; re2 = /^(.+?)([^s])s$/; if (re.test(w)) w = w.replace(re,"$1$2"); else if (re2.test(w)) w = w.replace(re2,"$1$2"); // Step 1b re = /^(.+?)eed$/; re2 = /^(.+?)(ed|ing)$/; if (re.test(w)) { var fp = re.exec(w); re = new RegExp(mgr0); if (re.test(fp[1])) { re = /.$/; w = w.replace(re,""); } } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1]; re2 = new RegExp(s_v); if (re2.test(stem)) { w = stem; re2 = /(at|bl|iz)$/; re3 = new RegExp("([^aeiouylsz])\\1$"); re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re2.test(w)) w = w + "e"; else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); } else if (re4.test(w)) w = w + "e"; } } // Step 1c re = /^(.+?)y$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(s_v); if (re.test(stem)) w = stem + "i"; } // Step 2 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step2list[suffix]; } // Step 3 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step3list[suffix]; } // Step 4 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; re2 = /^(.+?)(s|t)(ion)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); if (re.test(stem)) w = stem; } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1] + fp[2]; re2 = new RegExp(mgr1); if (re2.test(stem)) w = stem; } // Step 5 re = /^(.+?)e$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); re2 = new RegExp(meq1); re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) w = stem; } re = /ll$/; re2 = new RegExp(mgr1); if (re.test(w) && re2.test(w)) { re = /.$/; w = w.replace(re,""); } // and turn initial Y back to y if (firstch == "y") w = firstch.toLowerCase() + w.substr(1); return w; } } /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } }, loadIndex : function(url) { $.ajax({type: "GET", url: url, data: null, success: null, dataType: "script", cache: true}); }, setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); } }, hasIndex : function() { return this._index !== null; }, deferQuery : function(query) { this._queued_query = query; }, stopPulse : function() { this._pulse_status = 0; }, startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (var i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); }; pulse(); }, /** * perform a search for something */ performSearch : function(query) { // create the required interface elements this.out = $('#search-results'); this.title = $('

' + _('Searching') + '

').appendTo(this.out); this.dots = $('').appendTo(this.title); this.status = $('

').appendTo(this.out); this.output = $('