use string find() instead of index().  Fixes #880.

We're expecting a non-match to return -1, which is what find() does,
but index() instead throws a ValueError.
Ensure that markup is a tuple.

`self.markup` is a list when using the `-m|--markup` cli option, but testing the
extension with `endswith` works only with tuples.
utils: Add some ISO 8601 forms to get_date()

Support the forms listed by the W3C [1].  I also removed the
'%Y-%d-%m' form, which can be confused with the '%Y-%m-%d' ISO form.
The new ISO forms can use 'Z' to designate UTC or '[+-]HHMM' to
specify offsets from UTC.  Other time zone designators are not
supported.

The '%z' directive has only been supported since Python 3.2 [2], so if
you're running Pelican on Python 2.7, you're stuck with 'Z' for UTC.
Conveniently, we get ValueErrors for both invalid directives and
data/format missmatches, so we don't need special handling for the 2.7
case inside get_date().

[1]: http://www.w3.org/TR/NOTE-datetime
[2]: http://bugs.python.org/issue6641
utils: Use pytz instead of datetime.timezone for timezones

datetime.timezone is new in Python 3.2 [1], so pytz allows us to keep
support for Python 2.7.

[1]: http://docs.python.org/dev/library/datetime.html#datetime.timezone
tests: Avoid hidden logic with better .assert*() method choices

We'll get better failure messages if we use an assertion method that
understands the comparison we're trying to make.  If you make the
comparison by hand and assertTrue(), you don't get much constructive
feedback ;).
Merge pull request #930 from wking/specific-assertions

tests: Avoid hidden logic with better .assert*() method choices
readers: Instrument read_file to return Content objects

The assorted generators all use read_file() to read in the file
contents and metadata.  Previously, they sometimes parse additional
metadata, fire off signals, and initialize a pelican.contents.Content
subclass on their own.  We can reduce duplicated code and increase
consistency by shifting all that stuff into read_file() itself, and
this commit is a step in that direction.
readers: Add debugging logging to read_file
readers: Log signal sending for read_file()
signals: Sort signals into categories
signals: Add missing signals

Note that the `pages_*` names are plural , while the `article_*` names
are singular.  I'll fix this once I update the PagesGenerator.
signals: Fix *_generate_* signals -> *_generator_*

For example, article_generate_preread is now article_generator_preread
for consistency with the other preread and context signals.
Move Article metadata extraction from generators to readers

There's no reason why this information should be Article-specific.

This commit breaks the other generators for the moment.  I'll fix them
shortly.
generators: Update PagesGenerator to use new read_file

Also standardize signal names.  If `article_generator_*` is singular,
`page_generator_*` should be as well.  Fix it from the older
`pages_generator_*`.
generators: Convert StaticGenerator to use the new read_file
Remove the FILES_TO_COPY setting

We no longer instantiate the Static object in the StaticGenerator, so
we can't set the save_as argument anymore.  If you want to adjust the
output path, use the upcoming EXTRA_PATH_METADATA setting.
Add the EXTRA_PATH_METADATA setting

Useful for altering static output paths when you don't want to encode
extra metadata in the static file's source path.
Update sample configurations from FILES_TO_COPY to EXTRA_PATH_METADATA
test_readers: Update to new readers.read_file
test_generators: Replace CUR_DIR with CONTENT_DIR for subdir cat. detection

In situations where I've cleared ARTICLE_DIR, I've done so to ensure
that there are no directories that will override the DEFAULT_CATEGORY
due to USE_FOLDER_AS_CATEGORY.