massive dump
@@ -0,0 +1,130 @@
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/osxpython.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/osxpython.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/osxpython"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/osxpython"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
make -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
@@ -0,0 +1,4 @@
|
||||
# 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: f9ca5d98ba72140a2e4abd39df74c871
|
||||
tags: fbb0d17656682115ca4d033fb2f83ba1
|
||||
@@ -0,0 +1,25 @@
|
||||
krTheme Sphinx Style
|
||||
====================
|
||||
|
||||
This repository contains sphinx styles Kenneth Reitz uses in most of
|
||||
his projects. It is a drivative of Mitsuhiko's themes for Flask and Flask related
|
||||
projects. To use this style in your Sphinx documentation, follow
|
||||
this guide:
|
||||
|
||||
1. put this folder as _themes into your docs folder. Alternatively
|
||||
you can also use git submodules to check out the contents there.
|
||||
|
||||
2. add this to your conf.py: ::
|
||||
|
||||
sys.path.append(os.path.abspath('_themes'))
|
||||
html_theme_path = ['_themes']
|
||||
html_theme = 'flask'
|
||||
|
||||
The following themes exist:
|
||||
|
||||
**kr**
|
||||
the standard flask documentation theme for large projects
|
||||
|
||||
**kr_small**
|
||||
small one-page theme. Intended to be used by very small addon libraries.
|
||||
|
||||
@@ -0,0 +1,241 @@
|
||||
Your Development Environment
|
||||
============================
|
||||
|
||||
|
||||
Text Editors
|
||||
::::::::::::
|
||||
|
||||
Just about anything which can edit plain text will work for writing Python code,
|
||||
however, using a more powerful editor may make your life a bit easier.
|
||||
|
||||
|
||||
VIM
|
||||
---
|
||||
|
||||
|
||||
There exist a couple of plugins and settings for the VIM editor to aid python
|
||||
development. If you only develop in Python, a good start is to set the default
|
||||
settings for indentation and linewrapping to values compliant with PEP8::
|
||||
|
||||
set textwidth=79
|
||||
set shiftwidth=4
|
||||
set tabstop=4
|
||||
set expandtab
|
||||
set softtabstop=4
|
||||
set shiftround
|
||||
|
||||
With these settings newlines are inserted after 79 characters and indentation
|
||||
is set to 4 spaces per tab. If you also use VIM for other languages, there is a
|
||||
handy plugin at indent_, which handles indentation settings for python source
|
||||
files.
|
||||
Additionally there is also a handy syntax plugin at syntax_ featuring some
|
||||
improvements over the syntax file included in VIM 6.1.
|
||||
|
||||
These plugins supply you with a basic environment for developing in Python.
|
||||
However in order to improve the programming flow we also want to continually
|
||||
check for PEP8 compliance and check syntax. Luckily there exist PEP8_ and
|
||||
Pyflakes_ to do this for you. If your VIM is compiled with `+python` you can
|
||||
also utilize some very handy plugins to do these checks from within the editor.
|
||||
For PEP8 checking install vim-pep8_. Now you can map the vim function
|
||||
`Pep8()` to any hotkey or action you want. Similarly for pyflakes you can
|
||||
install vim-pyflakes_. Now you can map `Pyflakes()` like the PEP8 function and
|
||||
have it called quickly. Both plugins will display errors in a quickfix list and
|
||||
provide an easy way to jump to the corresponding line. A very handy setting is
|
||||
calling these functions whenever a buffer is saved. In order to do this, enter
|
||||
the following lines into your vimrc::
|
||||
|
||||
autocmd BufWritePost *.py call Pyflakes()
|
||||
autocmd BufWritePost *.py call Pep8()
|
||||
|
||||
|
||||
.. _indent: http://www.vim.org/scripts/script.php?script_id=974
|
||||
.. _syntax: http://www.vim.org/scripts/script.php?script_id=790
|
||||
.. _Pyflakes: http://pypi.python.org/pypi/pyflakes/
|
||||
.. _vim-pyflakes: https://github.com/nvie/vim-pyflakes
|
||||
.. _PEP8: http://pypi.python.org/pypi/pep8/
|
||||
.. _vim-pep8: https://github.com/nvie/vim-pep8
|
||||
|
||||
.. todo:: add supertab notes
|
||||
|
||||
TextMate
|
||||
--------
|
||||
|
||||
"`TextMate <http://macromates.com/>`_ brings Apple's approach to operating systems into the world of text editors. By bridging UNIX underpinnings and GUI, TextMate cherry-picks the best of both worlds to the benefit of expert scripters and novice users alike."
|
||||
|
||||
Sublime Text
|
||||
------------
|
||||
|
||||
"`Sublime Text <http://www.sublimetext.com/>`_ is a sophisticated text editor
|
||||
for code, html and prose. You'll love the slick user interface and
|
||||
extraordinary features."
|
||||
|
||||
Sublime Text has excellent support for editing Python code and uses Python for
|
||||
its plugin API.
|
||||
|
||||
`Sublime Text 2 <http://www.sublimetext.com/blog/articles/sublime-text-2-beta>`_ is currently in beta.
|
||||
|
||||
IDEs
|
||||
::::
|
||||
|
||||
PyCharm / IntelliJ IDEA
|
||||
-----------------------
|
||||
|
||||
`PyCharm <http://www.jetbrains.com/pycharm/>`_ is developed by JetBrains, also known for IntelliJ IDEA. Both share the same code base and most of PyCharm's features can be brought to IntelliJ with the free `Python Plug-In <http://plugins.intellij.net/plugin/?id=631/>`_.
|
||||
|
||||
Eclipse
|
||||
-------
|
||||
|
||||
The most popular Eclipse plugin for Python development is Aptana's
|
||||
`PyDev <http://pydev.org>`_.
|
||||
|
||||
|
||||
Komodo IDE
|
||||
-----------
|
||||
`Komodo IDE <http://www.activestate.com/komodo-ide>`_ is developed by ActiveState and is a commerical IDE for Windows, Mac
|
||||
and Linux.
|
||||
|
||||
Spyder
|
||||
------
|
||||
|
||||
`Spyder <http://code.google.com/p/spyderlib/>`_ an IDE specifically geared toward working with scientific python libraries (namely `Scipy <http://www.scipy.org/>`_).
|
||||
Includes integration with pyflakes_, `pylint <http://www.logilab.org/857>`_,
|
||||
and `rope <http://rope.sourceforge.net/>`_.
|
||||
|
||||
Spyder is open-source (free), offers code completion, syntax highlighting, class and function browser, and object inspection.
|
||||
|
||||
|
||||
|
||||
Interpreter Tools
|
||||
:::::::::::::::::
|
||||
|
||||
|
||||
virtualenv
|
||||
----------
|
||||
|
||||
Virtualenv is a tool to keep the dependencies required by different projects in separate places, by creating virtual Python environments for them.
|
||||
It solves the "Project X depends on version 1.x but, Project Y needs 4.x" dilemma and keeps your global site-packages directory clean and manageable.
|
||||
|
||||
`virtualenv <http://www.virtualenv.org/en/latest/index.html>`_ creates
|
||||
a folder which contains all the necessary executables to contain the
|
||||
packages that a Python project would need. An example workflow is given.
|
||||
|
||||
Install virtualenv::
|
||||
|
||||
$ pip install virtualenv
|
||||
|
||||
|
||||
Create a virtual environment for a project::
|
||||
|
||||
$ cd my_project
|
||||
$ virtualenv venv
|
||||
|
||||
``virtualenv venv`` will create a folder in the currect directory
|
||||
which will contain the Python executable files, and a copy of the ``pip``
|
||||
library which you can use to install other packages. The name of the
|
||||
virtual environment (in this case, it was ``venv``) can be anything;
|
||||
omitting the name will place the files in the current directory instead.
|
||||
|
||||
In order the start using the virtual environment, run::
|
||||
|
||||
$ source venv/bin/activate
|
||||
|
||||
|
||||
The name of the current virtual environment will now appear on the left
|
||||
of the prompt (e.g. ``(venv)Your-Computer:your_project UserName$``) to
|
||||
let you know that it's active. From now on, any package that you install
|
||||
using ``pip`` will be placed in the venv folder, isolated from the global
|
||||
Python installation. Install packages as usual::
|
||||
|
||||
$ pip install requests
|
||||
|
||||
To stop using an environment simply type ``deactivate``. To remove the
|
||||
environment, just remove the directory it was installed into. (In this
|
||||
case, it would be ``rm -rf venv``).
|
||||
|
||||
Other Notes
|
||||
~~~~~~~~~~~
|
||||
|
||||
Running ``virtualenv`` with the option ``--no-site-packages`` will not
|
||||
include the packages that are installed globally. This can be useful
|
||||
for keeping the package list clean in case it needs to be accessed later.
|
||||
|
||||
In order to keep your environment consistent, it's a good idea to "freeze"
|
||||
the current state of the environment packages. To do this, run
|
||||
|
||||
::
|
||||
|
||||
$ pip freeze > requirements.txt
|
||||
|
||||
This will create a ``requirements.txt`` file, which contains a simple
|
||||
list of all the packages in the current environment, and their respective
|
||||
versions. Later, when a different developer (or you, if you need to re-
|
||||
create the environment) can install the same packages, with the same
|
||||
versions by running
|
||||
|
||||
::
|
||||
|
||||
$ pip install -r requirements.txt
|
||||
|
||||
This can help ensure consistency across installations, across deployments,
|
||||
and across developers.
|
||||
|
||||
Lastly, remember to exclude the virtual environment folder from source
|
||||
control by adding it to the ignore list.
|
||||
|
||||
virtualenvwrapper
|
||||
-----------------
|
||||
|
||||
`Virtualenvwrapper <http://pypi.python.org/pypi/virtualenvwrapper>`_ makes virtualenv a pleasure to use by wrapping the command line API with a nicer CLI.
|
||||
|
||||
::
|
||||
|
||||
$ pip install virtualenvwrapper
|
||||
|
||||
|
||||
Put this into your `~/.bash_profile` (Linux/Mac) file:
|
||||
|
||||
::
|
||||
|
||||
$ export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'
|
||||
|
||||
This will prevent your virtualenvs from relying on your (global) site packages directory, so that they are completely separate..
|
||||
|
||||
Other Tools
|
||||
:::::::::::
|
||||
|
||||
IPython
|
||||
-------
|
||||
|
||||
`IPython <http://ipython.org/>`_ provides a rich toolkit to help you make the most out of using Python interactively. Its main components are:
|
||||
|
||||
* Powerful Python shells (terminal- and Qt-based).
|
||||
* A web-based notebook with the same core features but support for rich media, text, code, mathematical expressions and inline plots.
|
||||
* Support for interactive data visualization and use of GUI toolkits.
|
||||
* Flexible, embeddable interpreters to load into your own projects.
|
||||
* Tools for high level and interactive parallel computing.
|
||||
|
||||
::
|
||||
|
||||
$ pip install ipython
|
||||
|
||||
|
||||
|
||||
BPython
|
||||
-------
|
||||
|
||||
`bpython <http://bpython-interpreter.org/>`_ is an alternative interface to the Python interpreter for Unix-like operating systems. It has the following features:
|
||||
|
||||
* In-line syntax highlighting.
|
||||
* Readline-like autocomplete with suggestions displayed as you type.
|
||||
* Expected parameter list for any Python function.
|
||||
* "Rewind" function to pop the last line of code from memory and re-evaluate.
|
||||
* Send entered code off to a pastebin.
|
||||
* Save entered code to a file.
|
||||
* Auto-indentation.
|
||||
* Python 3 support.
|
||||
|
||||
::
|
||||
|
||||
$ pip install bpython
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
Virtual Environments
|
||||
====================
|
||||
|
||||
A Virtual Environment, put simply, is an isolated working copy of Python which
|
||||
allows you to work on a specific project without worry of affecting other
|
||||
projects.
|
||||
|
||||
For example, you can work on a project which requires Django 1.3 while also
|
||||
maintaining a project which requires Django 1.0.
|
||||
|
||||
virtualenv
|
||||
----------
|
||||
|
||||
`virtualenv <http://pypi.python.org/pypi/virtualenv>`_ is a tool to create
|
||||
isolated Python environments.
|
||||
|
||||
Install it via pip:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip install virtualenv
|
||||
|
||||
Basic Usage
|
||||
~~~~~~~~~~~
|
||||
|
||||
1. Create a virtual environment:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ virtualenv venv
|
||||
|
||||
This creates a copy of Python in whichever directory you ran the command in,
|
||||
placing it in a folder named ``venv``.
|
||||
|
||||
2. To begin using the virtual environment, it needs to be activated:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ source venv/bin/activate
|
||||
|
||||
You can then begin installing any new modules without affecting the system
|
||||
default Python or other virtual environments.
|
||||
|
||||
3. If you are done working in the virtual environment for the moment, you can
|
||||
deactivate it:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ deactivate
|
||||
|
||||
This puts you back to the system's default Python interpreter with all its
|
||||
installed libraries.
|
||||
|
||||
To delete a virtual environment, just delete its folder.
|
||||
|
||||
After a while, though, you might end up with a lot of virtual environments
|
||||
littered across your system, and its possible you'll forget their names or
|
||||
where they were placed.
|
||||
|
||||
virtualenvwrapper
|
||||
-----------------
|
||||
|
||||
`virtualenvwrapper <http://www.doughellmann.com/projects/virtualenvwrapper/>`_
|
||||
provides a set of commands which makes working with virtual environments much
|
||||
more pleasant. It also places all your virtual environments in one place.
|
||||
|
||||
To install (make sure **virtualenv** is already installed):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip install virtualenvwrapper
|
||||
$ export WORKON_HOME=~/Envs
|
||||
$ source /usr/local/bin/virtualenvwrapper.sh
|
||||
|
||||
(`Full virtualenvwrapper install instructions <http://www.doughellmann.com/docs/virtualenvwrapper/#introduction>`_.)
|
||||
|
||||
Basic Usage
|
||||
~~~~~~~~~~~
|
||||
|
||||
1. Create a virtual environment:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ mkvirtualenv venv
|
||||
|
||||
This creates the ``venv`` folder inside ``~/Envs``.
|
||||
|
||||
2. Work on a virtual environment:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ workon venv
|
||||
|
||||
**virtualenvwrapper** provides tab-completion on environment names. It really
|
||||
helps when you have a lot of environments and have trouble remembering their
|
||||
names.
|
||||
``workon`` also deactivates whatever environment you are currently in, so you
|
||||
can quickly switch between environments.
|
||||
|
||||
3. Deactivating is still the same:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ deactivate
|
||||
|
||||
4. To delete:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ rmvirtualenv venv
|
||||
|
||||
Other useful commands
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
``lsvirtualenv``
|
||||
List all of the environments.
|
||||
|
||||
``cdvirtualenv``
|
||||
Navigate into the directory of the currently activated virtual environment,
|
||||
so you can browse its ``site-packages``, for example.
|
||||
|
||||
``cdsitepackages``
|
||||
Like the above, but directly into ``site-packages`` directory.
|
||||
|
||||
``lssitepackages``
|
||||
Shows contents of ``site-packages`` directory.
|
||||
|
||||
`Full list of virtualenvwrapper commands <http://www.doughellmann.com/docs/virtualenvwrapper/command_ref.html#managing-environments>`_.
|
||||
@@ -0,0 +1,15 @@
|
||||
.. osxpython documentation master file, created by
|
||||
sphinx-quickstart on Wed Aug 4 22:51:11 2010.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
The Hitchhiker's Guide to Python!
|
||||
=================================
|
||||
|
||||
Welcome to The Hitchhiker's Guide to Python. **DON'T PANIC!**
|
||||
|
||||
**This guide is currently under heavy development, and is mostly a skeleton at the moment.** If you'd like to help, `fork us on GitHub <https://github.com/kennethreitz/python-guide>`_!
|
||||
|
||||
This *opinionated* guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
|
||||
.. include:: contents.rst.inc
|
||||
@@ -0,0 +1,73 @@
|
||||
The Community
|
||||
=============
|
||||
|
||||
BDFL
|
||||
----
|
||||
|
||||
Guido van Rossum, the creator of Python, is often referred to as the BDFL — the Benevolent Dictator For Life.
|
||||
|
||||
|
||||
|
||||
Python Software Foundation
|
||||
--------------------------
|
||||
|
||||
The mission of the Python Software Foundation is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers.
|
||||
|
||||
`Learn More about the PSF <http://www.python.org/psf/>`_.
|
||||
|
||||
|
||||
PEPs
|
||||
----
|
||||
|
||||
PEPs are *Python Enhancement Proposals*. They describe changes to Python itself, or the standards around it.
|
||||
|
||||
There are three different types of PEPs (as defined by `PEP1 <http://www.python.org/dev/peps/pep-0001/>`_):
|
||||
|
||||
**Standards**
|
||||
Describes a new feature or implementation.
|
||||
|
||||
**Informational**
|
||||
Describes a design issue, general guidelines, or information to the community.
|
||||
|
||||
**Process**
|
||||
Describes a process related to Python.
|
||||
|
||||
|
||||
Notable PEPs
|
||||
~~~~~~~~~~~~
|
||||
|
||||
There are a few PEPs that could be considered required reading:
|
||||
|
||||
- `PEP8 <http://www.python.org/dev/peps/pep-0008/>`_: The Python Style Guide.
|
||||
Read this. All of it. Follow it.
|
||||
|
||||
- `PEP20 <http://www.python.org/dev/peps/pep-0020/>`_: The Zen of Python.
|
||||
A list of 19 statements that briefly explain the philosophy behind Python.
|
||||
|
||||
- `PEP257 <http://www.python.org/dev/peps/pep-0257/>`_: Docstring Conventions.
|
||||
Gives guidelines for semantics and conventions associated with Python docstrings.
|
||||
|
||||
You can read more at `The PEP Index <http://www.python.org/dev/peps/>`_.
|
||||
|
||||
Submitting a PEP
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
PEPs are peer-reviewed and accepted/rejected after much discussion. Anyone can write and submit a PEP for review.
|
||||
|
||||
Here's an overview of the PEP acceptance workflow:
|
||||
|
||||
.. image:: http://www.python.org/dev/peps/pep-0001/pep-0001-1.png
|
||||
|
||||
|
||||
Python Conferences
|
||||
--------------------------
|
||||
|
||||
The major events for the Python community are developer conferences. The two most notable conferences are PyCon, which is held in the US, and its European sibling, EuroPython.
|
||||
|
||||
A comprehensive list of conferences is maintained `at pycon.org <http://www.pycon.org/>`_.
|
||||
|
||||
|
||||
Python User Groups
|
||||
--------------------------
|
||||
|
||||
User Groups are where a bunch of Python developers meet to present or talk about Python topics of interest. A list of local user groups is maintained at the `Python Software Foundation Wiki <http://wiki.python.org/moin/LocalUserGroups>`_.
|
||||
@@ -0,0 +1,20 @@
|
||||
Documentation
|
||||
=============
|
||||
|
||||
Official Documentation
|
||||
----------------------
|
||||
|
||||
The official Python Language and Library documentation can be found here:
|
||||
|
||||
- `Python 2.x <http://docs.python.org/>`_
|
||||
- `Python 3.x <http://docs.python.org/py3k/>`_
|
||||
|
||||
|
||||
Read the Docs
|
||||
-------------
|
||||
|
||||
Read the Docs is a popular community project, providing a single location for all documentation of popular and even more exotic Python modules.
|
||||
|
||||
`Read the Docs <http://readthedocs.org/>`_
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
.. todo:: write a general blurb introducing the Python language
|
||||
|
||||
.. _about-ref:
|
||||
|
||||
About This Guide
|
||||
----------------
|
||||
|
||||
Purpose
|
||||
~~~~~~~
|
||||
|
||||
The Hitchhiker's Guide to Python exists to provide both novice and expert
|
||||
Python developers a best-practice handbook to the installation, configuration,
|
||||
and usage of Python on a daily basis.
|
||||
|
||||
|
||||
By the Community
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
This guide is architected and maintained by `Kenneth Reitz
|
||||
<https://github.com/kennethreitz>`_ in an open fashion. This is a
|
||||
community-driven effort that serves one purpose: to serve the community.
|
||||
|
||||
For the Community
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
All contributions to the Guide are welcome, from Pythonistas of all levels.
|
||||
If you think there's a gap in what the Guide covers, fork the Guide on
|
||||
GitHub and submit a pull request. Contributions are welcome from everyone,
|
||||
whether they're an old hand or a first-time Pythonista, and the authors to
|
||||
the Guide will gladly help if you have any questions about the
|
||||
appropriateness, completeness, or accuracy of a contribution.
|
||||
|
||||
To get started working on The Hitchhiker's Guide, see
|
||||
the :doc:`/notes/contribute` page.
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
Learning Python
|
||||
===============
|
||||
|
||||
Beginner
|
||||
--------
|
||||
|
||||
Learn Python Interactive Tutorial
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Learnpython.org is an easy non-intimidating way to get introduced to python. The website takes the same approach used on the popular `Try Ruby <http://tryruby.org/>`_ website, it has an interactive python interpreter built into the site that allows you to go through the lessons without having to install Python locally.
|
||||
|
||||
`Learn Python <http://www.learnpython.org/>`_
|
||||
|
||||
Learn Python the Hard Way
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is an excellent beginner programmer's guide to Python. It covers "hello world" from the console to the web.
|
||||
|
||||
`Learn Python the Hard Way <http://learnpythonthehardway.org/book/>`_
|
||||
|
||||
|
||||
Crash into Python
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Also known as *Python for Programmers with 3 Hours*, this guide gives experienced developers from other languages a crash course on Python.
|
||||
|
||||
`Crash into Python <http://stephensugden.com/crash_into_python/>`_
|
||||
|
||||
|
||||
Dive Into Python 3
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Dive Into Python 3 is a good book for those ready to jump in to Python 3. It's a
|
||||
good read if you are moving from Python 2 to 3 or if you already have some
|
||||
experience programming in another language.
|
||||
|
||||
`Dive Into Python 3 <http://diveintopython3.ep.io/>`_
|
||||
|
||||
Think Python: How to Think Like a Computer Scientist
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Think Python attempts to give an introduction to basic concepts in computer science through the
|
||||
use of the python language. The focus was to create a book with plenty of exercises, minimal jargon and
|
||||
a section in each chapter devoted to the subject of debugging.
|
||||
|
||||
While exploring the various features available in the python language the author weaves in various design
|
||||
patterns and best practices.
|
||||
|
||||
The book also includes several case studies which have the reader explore the topics discussed in the book
|
||||
in greater detail by applying those topics to real-world examples. Case studies include assignments in GUI
|
||||
and Markov Analysis.
|
||||
|
||||
`Think Python <http://greenteapress.com/thinkpython/html/index.html>`_
|
||||
|
||||
|
||||
Advanced
|
||||
--------
|
||||
|
||||
Pro Python
|
||||
~~~~~~~~~~
|
||||
|
||||
.. todo:: Write about `Pro Python <http://propython.com/>`_
|
||||
|
||||
Expert Python Programming
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. todo:: Write about `Expert Python Programming <http://www.packtpub.com/expert-python-programming/book>`_
|
||||
@@ -0,0 +1,25 @@
|
||||
News
|
||||
====
|
||||
|
||||
Planet Python
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
This is an aggregate of Python news from a growing number of developers.
|
||||
|
||||
`Planet Python <http://planet.python.org>`_
|
||||
|
||||
/r/python
|
||||
~~~~~~~~~
|
||||
|
||||
/r/python is the Reddit Python community where users contribute and vote on
|
||||
Python-related news.
|
||||
|
||||
`/r/python <http://reddit.com/r/python>`_
|
||||
|
||||
Python Weekly
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Python Weekly is a free weekly newsletter featuring curated news, articles,
|
||||
new releases, jobs, etc. related to Python.
|
||||
|
||||
`Python Weekly <http://www.pythonweekly.com/>`_
|
||||
@@ -0,0 +1,27 @@
|
||||
Contribute
|
||||
~~~~~~~~~~
|
||||
|
||||
Python-guide is under active development, and contributors are welcome.
|
||||
|
||||
If you have a feature request, suggestion, or bug report, please open a new
|
||||
issue on GitHub_. To submit patches, please send a pull request on GitHub_.
|
||||
Once your changes get merged back in, you'll automatically be added to the
|
||||
`Contributors List <https://github.com/kennethreitz/python-guide/contributors>`_.
|
||||
|
||||
Style Guide
|
||||
-----------
|
||||
|
||||
For all contributions, please follow the :ref:`guide-style-guide`.
|
||||
|
||||
.. _todo-list-ref:
|
||||
|
||||
Todo List
|
||||
---------
|
||||
|
||||
If you'd like to contribute, there's plenty to do. Here's a short todo_ list.
|
||||
|
||||
.. include:: ../../TODO.rst
|
||||
|
||||
|
||||
.. _GitHub: http://github.com/kennethreitz/python-guide/
|
||||
.. _todo: https://github.com/kennethreitz/python-guide/blob/master/TODO.rst
|
||||
@@ -0,0 +1,4 @@
|
||||
License
|
||||
-------
|
||||
|
||||
.. todo:: Determine License
|
||||
@@ -0,0 +1,164 @@
|
||||
.. _guide-style-guide:
|
||||
|
||||
=====================
|
||||
The Guide Style Guide
|
||||
=====================
|
||||
|
||||
As with all documentation, having a consistent formating helps make the
|
||||
document more understandable. In order to make The Guide easier to digest,
|
||||
all contributions should fit within the rules of this style guide where
|
||||
approriate.
|
||||
|
||||
The Guide is written as :ref:`restructuredtext-ref`.
|
||||
|
||||
.. note:: Parts of The Guide may not yet match this style guide. Feel free
|
||||
to update those parts to by in sync with The Guide Style Guide
|
||||
|
||||
.. note:: On any page of the rendered HTML you can click "Show Source" to
|
||||
see how authors have styled the page.
|
||||
|
||||
Relevancy
|
||||
---------
|
||||
|
||||
Stride to keep any contributions relevant to the :ref:`purpose of The Guide
|
||||
<about-ref>`.
|
||||
|
||||
* Avoid including too much information on subjects that don't directly
|
||||
relate to Python development.
|
||||
* Prefer to link to other sources if the information is already out there.
|
||||
Be sure to describe what and why you are linking.
|
||||
* `Cite <http://sphinx.pocoo.org/rest.html?highlight=citations#citations>`_
|
||||
references where needed.
|
||||
* If a subject isn't directly relevant to Python, but useful in conjuction
|
||||
with Python (ex: Git, Github, Databases), reference by linking to useful
|
||||
resouces and describe why it's useful to Python.
|
||||
* When in doubt, ask.
|
||||
|
||||
Headings
|
||||
--------
|
||||
|
||||
Use the following styles for headings.
|
||||
|
||||
Chapter title::
|
||||
|
||||
#########
|
||||
Chapter 1
|
||||
#########
|
||||
|
||||
Page title::
|
||||
|
||||
===================
|
||||
Time is an Illusion
|
||||
===================
|
||||
|
||||
Section headings::
|
||||
|
||||
Lunchtime Doubly So
|
||||
-------------------
|
||||
|
||||
Sub section headings::
|
||||
|
||||
Very Deep
|
||||
~~~~~~~~~
|
||||
|
||||
Prose
|
||||
-----
|
||||
|
||||
Wrap text lines at 78 characters. Where necessary, lines may exceed 78
|
||||
characters, especially if wrapping would make the source text more difficult
|
||||
to read.
|
||||
|
||||
|
||||
Code Examples
|
||||
-------------
|
||||
|
||||
Wrap all code examples at 70 characters to avoid horizontal scrollbars.
|
||||
|
||||
Command line examples::
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ run command --help
|
||||
$ ls ..
|
||||
|
||||
Be sure to include the ``$`` prefix before each line.
|
||||
|
||||
Python interpreter examples::
|
||||
|
||||
Label the example::
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> import this
|
||||
|
||||
Python examples::
|
||||
|
||||
Descriptive title::
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def get_answer():
|
||||
return 42
|
||||
|
||||
Externally Linking
|
||||
------------------
|
||||
|
||||
* Prefer labels for well known subjects (ex: proper nouns) when linking::
|
||||
|
||||
Sphinx_ is used to document Python.
|
||||
|
||||
.. _Sphinx: http://sphinx.pocoo.org
|
||||
|
||||
* Prefer to use descriptive labels with inline links instead of leaving bare
|
||||
links::
|
||||
|
||||
Read the `Sphinx Tutorial <http://sphinx.pocoo.org/tutorial.html>`_
|
||||
|
||||
* Avoid using labels such as "click here", "this", etc. preferring
|
||||
decriptive labels (SEO worthy) instead.
|
||||
|
||||
Linking to Sections in The Guide
|
||||
--------------------------------
|
||||
|
||||
To cross-reference other parts of this documentation, use the `:ref:
|
||||
<http://sphinx.pocoo.org/markup/inline.html#cross-referencing-arbitrary-locations>`_
|
||||
keyword and labels.
|
||||
|
||||
To make reference labels more clear and unique, always add a ``-ref`` suffix::
|
||||
|
||||
.. _some-section-ref:
|
||||
|
||||
Some Section
|
||||
------------
|
||||
|
||||
Notes and Warnings
|
||||
------------------
|
||||
|
||||
Make use of the appropriate `admonitions directives
|
||||
<http://sphinx.pocoo.org/rest.html#directives>`_ when making notes.
|
||||
|
||||
Notes::
|
||||
|
||||
.. note::
|
||||
The Hitchhiker’s Guide to the Galaxy has a few things to say
|
||||
on the subject of towels. A towel, it says, is about the most
|
||||
massively useful thing an interstellar hitch hiker can have.
|
||||
|
||||
Warnings::
|
||||
|
||||
.. warning:: DON'T PANIC
|
||||
|
||||
TODOs
|
||||
-----
|
||||
|
||||
Please mark any incomplete areas of The Guide with a `todo directive
|
||||
<http://sphinx.pocoo.org/ext/todo.html?highlight=todo#directive-todo>`_. To
|
||||
avoid cluttering the :ref:`todo-list-ref`, use a single ``todo`` for stub
|
||||
documents or large incomplete sections.
|
||||
|
||||
::
|
||||
|
||||
.. todo::
|
||||
Learn the Ultimate Answer to the Ultimate Question
|
||||
of Life, The Universe, and Everything
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
Systems Administration
|
||||
======================
|
||||
|
||||
Fabric
|
||||
------
|
||||
|
||||
Fabric is a library for simplifying system administration tasks. While Chef
|
||||
and Puppet tend to focus on managing servers and system libraries,
|
||||
fabric is more focused on application level tasks such as deployment.
|
||||
|
||||
Install Fabric:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ pip install fabric
|
||||
|
||||
The following code will create two tasks that we can use: ``memory_usage`` and
|
||||
``deploy``. The former will output the memory usage on each machine. The
|
||||
latter will ssh into each server, cd to our project directory, activate the
|
||||
virtual environment, pull the newest codebase, and restart the application
|
||||
server.
|
||||
|
||||
::
|
||||
|
||||
from fabric.api import cd, env, prefix, run, task
|
||||
|
||||
env.hosts = ['my_server1', 'my_server2']
|
||||
|
||||
@task
|
||||
def memory_usage():
|
||||
run('free -m')
|
||||
|
||||
@task
|
||||
def deploy():
|
||||
with cd('/var/www/project-env/project'):
|
||||
with prefix('. ../bin/activate'):
|
||||
run('git pull')
|
||||
run('touch app.wsgi')
|
||||
|
||||
With the previous code saved in a file named fabfile.py, we can check memory
|
||||
usage with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ fab memory_usage
|
||||
[my_server1] Executing task 'memory'
|
||||
[my_server1] run: free -m
|
||||
[my_server1] out: total used free shared buffers cached
|
||||
[my_server1] out: Mem: 6964 1897 5067 0 166 222
|
||||
[my_server1] out: -/+ buffers/cache: 1509 5455
|
||||
[my_server1] out: Swap: 0 0 0
|
||||
|
||||
[my_server2] Executing task 'memory'
|
||||
[my_server2] run: free -m
|
||||
[my_server2] out: total used free shared buffers cached
|
||||
[my_server2] out: Mem: 1666 902 764 0 180 572
|
||||
[my_server2] out: -/+ buffers/cache: 148 1517
|
||||
[my_server2] out: Swap: 895 1 894
|
||||
|
||||
and we can deploy with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ fab deploy
|
||||
|
||||
Additional features include parallel execution, interaction with remote
|
||||
programs, and host grouping.
|
||||
|
||||
Chef
|
||||
----
|
||||
|
||||
.. todo:: Write about Chef
|
||||
|
||||
Puppet
|
||||
------
|
||||
|
||||
.. todo:: Write about Puppet
|
||||
|
||||
Blueprint
|
||||
---------
|
||||
|
||||
.. todo:: Write about Blueprint
|
||||
|
||||
Buildout
|
||||
--------
|
||||
|
||||
.. todo:: Write about Buildout
|
||||
@@ -0,0 +1,37 @@
|
||||
Continuous Integration
|
||||
======================
|
||||
|
||||
|
||||
Why?
|
||||
----
|
||||
|
||||
Martin Fowler, who first wrote about `Continuous Integration <http://martinfowler.com/articles/continuousIntegration.html>`_ (short: CI) together with Kent Beck, describes the CI as follows:
|
||||
|
||||
Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.
|
||||
|
||||
Jenkins
|
||||
-------
|
||||
|
||||
`Jenkins CI <http://jenkins-ci.org>`_ is an extensible continuous integration engine. Use it.
|
||||
|
||||
|
||||
|
||||
Buildbot
|
||||
--------
|
||||
`Buildbot <http://buildbot.net/buildbot/docs/current>`_ is a Python system to automate the compile/test cycle to validate code changes.
|
||||
|
||||
|
||||
Mule?
|
||||
-----
|
||||
|
||||
.. todo:: Write about Mule
|
||||
|
||||
Tox
|
||||
---
|
||||
|
||||
`tox <https://bitbucket.org/hpk42/tox>`_ is an automation tool providing packaging, testing and deployment of Python software right from the console or CI server.
|
||||
It is a generic virtualenv management and test command line tool which provides the following features:
|
||||
|
||||
* Checking that packages install correctly with different Python versions and interpreters
|
||||
* Running tests in each of the environments, configuring your test tool of choice
|
||||
* Acting as a frontend to Continuous Integration servers, reducing boilerplate and merging CI and shell-based testing.
|
||||
@@ -0,0 +1,9 @@
|
||||
Command Line Applications
|
||||
=========================
|
||||
|
||||
.. todo:: Explain "Command Line Applications"
|
||||
|
||||
Clint
|
||||
-----
|
||||
|
||||
.. todo:: Write about Clint
|
||||
@@ -0,0 +1,28 @@
|
||||
Databases
|
||||
=========
|
||||
|
||||
DB-API
|
||||
------
|
||||
|
||||
The Python Database API (DB-API) defines a standard interface for Python
|
||||
database access modules. It's documented in `PEP 249 <http://www.python.org/dev/peps/pep-0249/>`_.
|
||||
Nearly all Python database modules such as `sqlite3`, `psycopg` and
|
||||
`mysql-python` conform to this interface.
|
||||
|
||||
|
||||
|
||||
SQLAlchemy
|
||||
----------
|
||||
|
||||
`SQLAlchemy <http://www.sqlalchemy.org/>`_ is a commonly used database toolkit. Unlike many database libraries
|
||||
it not only provides an ORM layer but also a generalized API for writing
|
||||
database-agnostic code without SQL.
|
||||
|
||||
::
|
||||
|
||||
pip install sqlalchemy
|
||||
|
||||
Django ORM
|
||||
----------
|
||||
|
||||
.. todo:: Explain Django ORM
|
||||
@@ -0,0 +1,55 @@
|
||||
GUI Applications
|
||||
================
|
||||
|
||||
|
||||
Qt
|
||||
::
|
||||
Qt is a cross-platform application framework that is widely used for developing software with a GUI but can also be used for non-GUI applications.
|
||||
|
||||
PySide
|
||||
------
|
||||
http://developer.qt.nokia.com/wiki/PySideDownloads/
|
||||
|
||||
PyQt
|
||||
----
|
||||
.. note:: If your software does not fully comply with the GPL you will need a commercial license!
|
||||
|
||||
http://www.riverbankcomputing.co.uk/software/pyqt/download
|
||||
|
||||
Cocoa
|
||||
:::::
|
||||
.. note:: The Cocoa framework is only available on Mac OSX. Don't pick this if you're writing a cross-platform application!
|
||||
|
||||
PyObjC
|
||||
------
|
||||
.. note:: Only available on Mac OSX. Don't pick this if you're writing a cross-platform application.
|
||||
|
||||
WXPython
|
||||
::::::::
|
||||
|
||||
|
||||
Install (Stable)
|
||||
----------------
|
||||
*Go to http://www.wxpython.org/download.php#stable and download the appropriate package for your OS.*
|
||||
|
||||
Gtk
|
||||
:::
|
||||
PyGTK provides Python bindings for the GTK+ toolkit. Like the GTK+ library
|
||||
itself, it is currently licensed under the GNU LGPL. It is worth noting that
|
||||
PyGTK only currenty supports the Gtk-2.X API (NOT Gtk-3.0). It is currently
|
||||
recommended that PyGTK is not used for new projects and existing applications be
|
||||
ported from PyGTK to PyGObject.
|
||||
|
||||
Tk
|
||||
::
|
||||
Tkinter is a thin object-oriented layer on top of Tcl/Tk. It has the advantage
|
||||
of being included with the Python standard library, making it the most
|
||||
convenient and compatible toolkit to program with.
|
||||
|
||||
Both Tk and Tkinter are available on most Unix platforms, as well as on Windows
|
||||
and Macintosh systems. Starting with the 8.0 release, Tk offers native look and
|
||||
feel on all platforms.
|
||||
|
||||
There's a good multi-language Tk tutorial with Python examples at
|
||||
`TkDocs <http://www.tkdocs.com/tutorial/index.html>`_. There's more information
|
||||
available on the `Python Wiki <http://wiki.python.org/moin/TkInter>`_.
|
||||
@@ -0,0 +1,50 @@
|
||||
=======================
|
||||
Scientific Applications
|
||||
=======================
|
||||
|
||||
Context
|
||||
:::::::
|
||||
|
||||
Python is frequently used for high-performance scientific applications. Python is widely used in academia
|
||||
and scientific projects because it is easy to write, and it performs really well.
|
||||
|
||||
Due to its high performance nature, scientific computing in python often refers to external libraries, typically
|
||||
written in faster languages (like C, or FORTRAN for matrix operations). The main libraries used are NumPy and SciPy
|
||||
|
||||
Libraries
|
||||
:::::::::
|
||||
|
||||
Numpy
|
||||
-----
|
||||
`NumPy <http://numpy.scipy.org/>`_ is a low level library written in C (and FORTRAN) for high level mathematical functions.
|
||||
NumPy cleverly overcomes the problem of running slower algorithms on Python by using multidimensional arrays and functions that operate on arrays.
|
||||
Any algorithm can then be expressed as a function on arrays, allowing the algorithms to be run quickly.
|
||||
|
||||
|
||||
NumPy is part of the SciPy project, and is released as a separate library so people who only need the basic requirements can just use NumPy.
|
||||
|
||||
NumPy is compatible with Python versions 2.4 through to 2.7.2 and 3.1+.
|
||||
|
||||
SciPy
|
||||
-----
|
||||
`SciPy <http://scipy.org/>`_ is a library that uses Numpy for more mathematical function. SciPy uses NumPy arrays as its basic data structure.
|
||||
SciPy comes with modules for various commonly used tasks in scientific programing like linear algebra, integration (calculus),
|
||||
ordinary differential equation solvers and signal processing.
|
||||
|
||||
Enthought
|
||||
---------
|
||||
|
||||
Installing NumPy and SciPy can be a daunting task. Which is why the `Enthought Python distribution <http://enthought.com/>`_ was created. With Enthought,
|
||||
scientific python has never been easier (one click to install about 100 scientific python packages). User beware: Enthought is not free.
|
||||
|
||||
Matplotlib
|
||||
----------
|
||||
|
||||
.. todo:: write about matplotlib.
|
||||
|
||||
Resources
|
||||
:::::::::
|
||||
|
||||
Many people who do scientific computing are on Windows. And yet many of the scientific computing packages are notoriously difficult to build and install.
|
||||
`Christoph Gohlke <http://www.lfd.uci.edu/~gohlke/pythonlibs/>`_ however, has compiled a list of Windows binaries for many useful Python packages.
|
||||
The list of packages has grown from a mainly scientific python resource to a more general list. It might be a good idea to check it out if you're on Windows.
|
||||
@@ -0,0 +1,96 @@
|
||||
Speed
|
||||
=====
|
||||
|
||||
CPython, the most commonly used implementation of Python, is slow for CPU bound tasks. `PyPy`_ is fast.
|
||||
|
||||
Using a slightly modified version of `David Beazleys`_ CPU bound test code(added loop for multiple tests), you can see the difference between CPython and PyPy's processing.
|
||||
|
||||
::
|
||||
|
||||
PyPy
|
||||
$ ./pypy -V
|
||||
Python 2.7.1 (7773f8fc4223, Nov 18 2011, 18:47:10)
|
||||
[PyPy 1.7.0 with GCC 4.4.3]
|
||||
$ ./pypy measure2.py
|
||||
0.0683999061584
|
||||
0.0483210086823
|
||||
0.0388588905334
|
||||
0.0440690517426
|
||||
0.0695300102234
|
||||
|
||||
::
|
||||
|
||||
CPython
|
||||
$ ./python -V
|
||||
Python 2.7.1
|
||||
$ ./python measure2.py
|
||||
1.06774401665
|
||||
1.45412397385
|
||||
1.51485204697
|
||||
1.54693889618
|
||||
1.60109114647
|
||||
|
||||
Context
|
||||
:::::::
|
||||
|
||||
|
||||
The GIL
|
||||
-------
|
||||
|
||||
`The GIL`_ (Global Interpreter Lock) is how Python allows multiple threads to operate at the same time. Python's
|
||||
memory management isn't entirely thread-safe, so the GIL is requried to prevents multiple threads from running
|
||||
the same Python code at once.
|
||||
|
||||
David Beazley has a great `guide`_ on how the GIL operates. He also covers the `new GIL`_ in Python 3.2. His
|
||||
results show that maximizing performance in a Python application requires a strong understanding of the GIL,
|
||||
how it affects your specific application, how many cores you have, and where your application bottlenecks are.
|
||||
|
||||
C Extentions
|
||||
------------
|
||||
|
||||
|
||||
The GIL
|
||||
-------
|
||||
|
||||
`Special care`_ must be taken when writing C extensions to make sure you register your threads
|
||||
with the interpreter.
|
||||
|
||||
C Extentions
|
||||
::::::::::::
|
||||
|
||||
|
||||
Cython
|
||||
------
|
||||
|
||||
|
||||
Pyrex
|
||||
-----
|
||||
|
||||
|
||||
Shedskin?
|
||||
---------
|
||||
|
||||
|
||||
|
||||
Threading
|
||||
:::::::::
|
||||
|
||||
|
||||
Threading
|
||||
---------
|
||||
|
||||
|
||||
Spanwing Processes
|
||||
------------------
|
||||
|
||||
|
||||
Multiprocessing
|
||||
---------------
|
||||
|
||||
|
||||
.. _`PyPy`: http://pypy.org
|
||||
.. _`The GIL`: http://wiki.python.org/moin/GlobalInterpreterLock
|
||||
.. _`guide`: http://www.dabeaz.com/python/UnderstandingGIL.pdf
|
||||
.. _`New GIL`: http://www.dabeaz.com/python/NewGIL.pdf
|
||||
.. _`Special care`: http://docs.python.org/c-api/init.html#threads
|
||||
.. _`David Beazleys`: http://www.dabeaz.com/GIL/gilvis/measure2.py
|
||||
@@ -0,0 +1,228 @@
|
||||
================
|
||||
Web Applications
|
||||
================
|
||||
|
||||
|
||||
Context
|
||||
:::::::
|
||||
|
||||
|
||||
WSGI
|
||||
----
|
||||
|
||||
The Web Server Gateway Interface (or "WSGI" for short) is a standard
|
||||
interface between web servers and Python web application frameworks. By
|
||||
standardizing behavior and communication between web servers and Python web
|
||||
frameworks, WSGI makes it possible to write portable Python web code that
|
||||
can be deployed in any :ref:`WSGI-compliant web server <wsgi-servers-ref>`. WSGI is
|
||||
documented in `PEP-3333 <http://www.python.org/dev/peps/pep-3333/>`_.
|
||||
|
||||
|
||||
Frameworks
|
||||
::::::::::
|
||||
|
||||
Broadly speaking, a web framework is a set of libraries upon which you can
|
||||
build custom code to implement a web application (i.e. an interactive web
|
||||
site). Most web frameworks include patterns and utilities to accomplish at
|
||||
least the following:
|
||||
|
||||
URL Routing
|
||||
Matches an incoming HTTP request to a particular piece of Python code to
|
||||
be invoked
|
||||
|
||||
Request and Response Objects
|
||||
Encapsulate the information received from or sent to a user's browser
|
||||
|
||||
Template Engine
|
||||
Allows for separating Python code implementing an application's logic from
|
||||
the HTML (or other) output that it produces
|
||||
|
||||
Development Web Server
|
||||
Runs an HTTP server on development machines to enable rapid development;
|
||||
often automatically reloads server-side code when files are updated
|
||||
|
||||
|
||||
Django
|
||||
------
|
||||
|
||||
`Django <http://www.djangoproject.com>`_ is a "batteries included" web
|
||||
application framework. By providing many utilities and patterns out of the
|
||||
box, Django aims to make it possible to build complex, database-backed web
|
||||
applications quickly, while encouraging best practices in code written using
|
||||
it.
|
||||
|
||||
Django has a large and active community, and many pre-built `re-usable
|
||||
modules <http://djangopackages.com/>`_ that can be incorporated into a new
|
||||
project as-is, or customized to fit your needs.
|
||||
|
||||
There are annual Django conferences `in the United States
|
||||
<http://djangocon.us>`_ and `in Europe <http://djangocon.eu>`_.
|
||||
|
||||
|
||||
Flask
|
||||
-----
|
||||
|
||||
`Flask <http://flask.pocoo.org/>`_ is a "microframework" for Python. Rather
|
||||
than aiming to provide everything you could possibly need, Flask implements
|
||||
the most commonly-used core components of a web application framework, like
|
||||
URL routing, request and response objects, and templates. As a user of
|
||||
Flask, it is therefore up to you to choose and integrate other components
|
||||
you may need, such as database access or form generation and validation. For
|
||||
many popular modules, `Extensions <http://flask.pocoo.org/extensions/>`_ may
|
||||
already exist to suit your needs.
|
||||
|
||||
**Support** for flask can best be found in its mailing list. Just shoot an email to
|
||||
flask@librelist.com and reply to the confirmation email.
|
||||
|
||||
|
||||
.. todo:: Explain Pyramid
|
||||
|
||||
|
||||
Web Servers
|
||||
:::::::::::
|
||||
|
||||
.. _nginx-ref:
|
||||
|
||||
Nginx
|
||||
-----
|
||||
|
||||
`Nginx <http://nginx.org/>`_ (pronounced "engine-x") is a web server and
|
||||
reverse-proxy for HTTP, SMTP and other protocols. It is known for its
|
||||
high performance, relative simplicity, and compatibility with many
|
||||
application servers (like WSGI servers). It also includes handy features
|
||||
like load-balancing, basic authentication, streaming, and others. Designed
|
||||
to serve high-load websites, Nginx is gradually becoming quite popular.
|
||||
|
||||
|
||||
.. _wsgi-servers-ref:
|
||||
|
||||
WSGI Servers
|
||||
::::::::::::
|
||||
|
||||
Stand-alone WSGI servers typically use less resources than traditional web
|
||||
servers and provide top performance [3]_.
|
||||
|
||||
.. _gunicorn-ref:
|
||||
|
||||
Gunicorn
|
||||
--------
|
||||
|
||||
`Gunicorn <http://gunicorn.org/>`_ (Green Unicorn) is a WSGI server used
|
||||
to serve Python applications. It is a Python interpretation of the Ruby
|
||||
`Unicorn <http://unicorn.bogomips.org/>`_ server. Unicorn is designed to be
|
||||
lightweight, easy to use, and uses many UNIX idioms. Gunicorn is not designed
|
||||
to face the internet, in fact it was designed to run behind Nginx which buffers
|
||||
slow requests, and takes care of other important considerations. A sample
|
||||
setup for Nginx + gUnicorn can be found in the
|
||||
`Gunicorn help <http://gunicorn.org/deploy.html>`_.
|
||||
|
||||
.. _uwsgi-ref:
|
||||
|
||||
|
||||
Server Best Practices
|
||||
:::::::::::::::::::::
|
||||
|
||||
The majority of self hosted Python applications today are hosted with a WSGI
|
||||
server such as :ref:`gUnicorn <gunicorn-ref>`, either directly or behind a
|
||||
lightweight web server such as :ref:`nginx <nginx-ref>`.
|
||||
|
||||
The WSGI servers serve the Python applications while the web server handles tasks
|
||||
better suited for it such as static file serving, request routing, DDoS
|
||||
protection, and basic authentication.
|
||||
|
||||
Hosting
|
||||
:::::::
|
||||
|
||||
Platform-as-a-Service
|
||||
---------------------
|
||||
|
||||
Platform-as-a-Service (PaaS) is a type of cloud computing infrastructure
|
||||
which abstracts and manages infrastructure, routing, and scaling of web
|
||||
applications. When using PaaS, application developers can focus on writing
|
||||
application code rather than needing to be concerned with deployment
|
||||
details.
|
||||
|
||||
Most PaaS services offer a command-line interface that developers can use to
|
||||
set up and interrogate configuration, and to deploy new releases of an
|
||||
application to the service.
|
||||
|
||||
PaaS services and their partners offer add-on functionality which is well
|
||||
integrated into the platform, such as database hosting, email services,
|
||||
logging, scheduled and background tasks, billing and payment, etc.
|
||||
|
||||
|
||||
Heroku
|
||||
~~~~~~
|
||||
|
||||
`Heroku <http://www.heroku.com/>`_'s
|
||||
`Cedar stack <http://devcenter.heroku.com/articles/cedar>`_ offers first class
|
||||
support for Python 2.7 applications.
|
||||
|
||||
Heroku allows you to run as many Python web applications as you like, 24/7 and free
|
||||
of charge. Heroku is best described as a horizontal scaling platform. They start
|
||||
to charge you once you "scale" you application to run on more than one Dyno
|
||||
(abstacted servers) at a time.
|
||||
|
||||
Heroku publishes `step-by-step instructions
|
||||
<http://devcenter.heroku.com/articles/python>`_ on how to set up your first
|
||||
application for use in Heroku, and maintains a list of `example applications
|
||||
<http://python.herokuapp.com/>`_.
|
||||
|
||||
|
||||
DotCloud
|
||||
~~~~~~~~
|
||||
|
||||
`DotCloud <http://www.dotcloud.com/>`_ supports WSGI applications and
|
||||
background/worker tasks natively on their platform. Web applications running
|
||||
Python version 2.6, and uses :ref:`nginx <nginx-ref>` and :ref:`uWSGI
|
||||
<uwsgi-ref>`, and allows custom configuration of both
|
||||
for advanced users.
|
||||
|
||||
DotCloud uses a custom command-line API client which can work with
|
||||
applications managed in git repositories or any other version control
|
||||
system.
|
||||
|
||||
DotCloud has a free plan with limited database size, and without extra
|
||||
services (caching…).
|
||||
|
||||
See the `DotCloud documentation on Python
|
||||
<http://docs.dotcloud.com/services/python/>`_ for more information and help
|
||||
getting started.
|
||||
|
||||
|
||||
ep.io
|
||||
~~~~~
|
||||
|
||||
`ep.io <https://www.ep.io/>`_ is a PaaS designed specifically for Python web
|
||||
applications. It supports Python versions 2.6 and 2.7, and has Pythonic
|
||||
integrations with a variety of services.
|
||||
|
||||
ep.io has a free plan with bandwidth and disk space limitations. Also, in the
|
||||
free plan, the web process is only loaded when needed. This means that the
|
||||
first request after some inactivity may take up to 15 seconds.
|
||||
|
||||
ep.io publishes `step-by-step instructions
|
||||
<https://www.ep.io/docs/quickstart/>`_ on how to get started with their
|
||||
platform and how to deploy Django, Flask, or generic WSGI applications.
|
||||
|
||||
ep.io is currently in invite-only beta.
|
||||
|
||||
|
||||
Gondor
|
||||
~~~~~~
|
||||
|
||||
`Gondor <https://gondor.io/>`_ is a PaaS specailized for deploying Django
|
||||
and Pinax applications. Gondor supports Django versions 1.2 and 1.3 on
|
||||
Python version 2.7, and can automatically configure your Django site if you
|
||||
use ``local_settings.py`` for site-specific configuration information.
|
||||
|
||||
Gondor publishes guides to deploying `Django projects
|
||||
<https://gondor.io/support/setting-up-django/>`_ and `Pinax projects
|
||||
<https://gondor.io/support/setting-up-pinax/>`_ on their platform.
|
||||
|
||||
|
||||
.. rubric:: References
|
||||
|
||||
.. [1] `The mod_python project is now officially dead <http://blog.dscpl.com.au/2010/06/modpython-project-is-now-officially.html>`_
|
||||
.. [2] `mod_wsgi vs mod_python <http://www.modpython.org/pipermail/mod_python/2007-July/024080.html>`_
|
||||
.. [3] `Benchmark of Python WSGI Servers <http://nichol.as/benchmark-of-python-web-servers>`_
|
||||
@@ -0,0 +1,49 @@
|
||||
Freezing Your Code
|
||||
==================
|
||||
|
||||
An alternative to shipping your code is freezing it — shipping it as an
|
||||
executable with a bundled Python interpreter.
|
||||
|
||||
Many applications you use every day do this:
|
||||
|
||||
- Dropbox
|
||||
- BitTorrent
|
||||
-
|
||||
|
||||
|
||||
.. todo:: Fill in "Freezing Your Code" stub
|
||||
|
||||
Windows
|
||||
:::::::
|
||||
|
||||
|
||||
py2exe
|
||||
------
|
||||
|
||||
|
||||
|
||||
OSX
|
||||
:::
|
||||
|
||||
|
||||
py2app
|
||||
------
|
||||
|
||||
|
||||
|
||||
|
||||
PyInstaller
|
||||
-----------
|
||||
|
||||
|
||||
|
||||
|
||||
Linux
|
||||
:::::
|
||||
|
||||
|
||||
bbFreeze
|
||||
--------
|
||||
|
||||
PyInstaller
|
||||
-----------
|
||||
@@ -0,0 +1,69 @@
|
||||
Packaging Your Code
|
||||
===================
|
||||
|
||||
Packaging your code is important.
|
||||
|
||||
.. todo:: Write introduction for "Packaging Your Code"
|
||||
|
||||
For Python Developers
|
||||
:::::::::::::::::::::
|
||||
|
||||
If you're writing an open source Python module, `PyPI <http://pypi.python.org>`_, more properly known as *The Cheeseshop*, is the place to host it.
|
||||
|
||||
|
||||
|
||||
Pip vs. easy_install
|
||||
--------------------
|
||||
|
||||
Use `pip <http://pypi.python.org/pypi/pip>`_. More details `here <http://stackoverflow.com/questions/3220404/why-use-pip-over-easy-install>`_
|
||||
|
||||
|
||||
Personal PyPI
|
||||
-------------
|
||||
|
||||
If you want to install packages from a source different from PyPI, (say, if
|
||||
your packages are *proprietary*), you can do it by hosting a simple http server,
|
||||
running from the directory which holds those packages which need to be installed.
|
||||
|
||||
**Showing an example is always beneficial**
|
||||
|
||||
Say if you are after installing a package called MyPackage.tar.gz, and assuming this is your directory structure
|
||||
|
||||
|
||||
- archive
|
||||
- MyPackage
|
||||
- MyPackage.tar.gz
|
||||
|
||||
Go to your command prompt and type:
|
||||
::
|
||||
|
||||
$ cd archive
|
||||
$ python -m SimpleHTTPServer 9000
|
||||
|
||||
This runs a simple http server running on port 9000 and will list all packages (like **MyPackage**). Now you can install **MyPackage** using any python package installer. Using Pip, you would do it like:
|
||||
::
|
||||
|
||||
$ pip install --extra-index-url=http://127.0.0.1:9000/ MyPackage
|
||||
|
||||
Having a folder with the same name as the package name is **crucial** here.
|
||||
I got fooled by that, one time. But if you feel that creating a folder called
|
||||
**MyPackage** and keeping **MyPackage.tar.gz** inside that, is *redundant*, you can still install MyPackage using:
|
||||
::
|
||||
|
||||
$ pip install http://127.0.0.1:9000/MyPackage.tar.gz
|
||||
|
||||
Chishop
|
||||
+++++++
|
||||
|
||||
`Chishop <https://github.com/benliles/djangopypi>`_ is a simple PyPI server written in django which allows you to register/upload with distutils and install with easy_install/pip.
|
||||
|
||||
For Linux Distributions
|
||||
::::::::::::::::::::::::
|
||||
|
||||
.. todo:: Fill in "For Linux Distributions" packaging stub
|
||||
|
||||
Useful Tools
|
||||
------------
|
||||
|
||||
- epm
|
||||
- alien
|
||||
@@ -0,0 +1,137 @@
|
||||
Your Development Environment
|
||||
============================
|
||||
|
||||
|
||||
Text Editors
|
||||
::::::::::::
|
||||
|
||||
|
||||
VIM
|
||||
---
|
||||
|
||||
|
||||
There exist a couple of plugins and settings for the VIM editor to aid python
|
||||
development. If you only develop in Python, a good start is to set the default
|
||||
settings for indentation and linewrapping to values compliant with PEP8::
|
||||
|
||||
set textwidth=79
|
||||
set shiftwidth=4
|
||||
set tabstop=4
|
||||
set expandtab
|
||||
set softtabstop=4
|
||||
set shiftround
|
||||
|
||||
With these settings newlines are inserted after 79 characters and indentation
|
||||
is set to 4 spaces per tab. If you also use VIM for other languages, there is a
|
||||
handy plugin at indent_, which handles indentation settings for python source
|
||||
files.
|
||||
Additionally there is also a handy syntax plugin at syntax_ featuring some
|
||||
improvements over the syntax file included in VIM 6.1.
|
||||
|
||||
These plugins supply you with a basic environment for developing in Python.
|
||||
However in order to improve the programming flow we also want to continually
|
||||
check for PEP8 compliance and check syntax. Luckily there exist PEP8_ and
|
||||
Pyflakes_ to do this for you. If your VIM is compiled with `+python` you can
|
||||
also utilize some very handy plugins to do these checks from within the editor.
|
||||
For PEP8 checking install vim-pep8_. Now you can map the vim function
|
||||
`Pep8()` to any hotkey or action you want. Similarly for pyflakes you can
|
||||
install vim-pyflakes_. Now you can map `Pyflakes()` like the PEP8 function and
|
||||
have it called quickly. Both plugins will display errors in a quickfix list and
|
||||
provide an easy way to jump to the corresponding line. A very handy setting is
|
||||
calling these functions whenever a buffer is saved. In order to do this, enter
|
||||
the following lines into your vimrc::
|
||||
|
||||
autocmd BufWritePost *.py call Pyflakes()
|
||||
autocmd BufWritePost *.py call Pep8()
|
||||
|
||||
|
||||
.. _indent: http://www.vim.org/scripts/script.php?script_id=974
|
||||
.. _syntax: http://www.vim.org/scripts/script.php?script_id=790
|
||||
.. _Pyflakes: http://pypi.python.org/pypi/pyflakes/
|
||||
.. _vim-pyflakes: https://github.com/nvie/vim-pyflakes
|
||||
.. _PEP8: http://pypi.python.org/pypi/pep8/
|
||||
.. _vim-pep8: https://github.com/nvie/vim-pep8
|
||||
|
||||
.. todo:: add supertab notes
|
||||
|
||||
|
||||
IDEs
|
||||
::::
|
||||
|
||||
PyCharm / IntelliJ IDEA
|
||||
-----------------------
|
||||
|
||||
PyCharm is developed by JetBrains, also known for IntelliJ IDEA. Both share the same code base and most of PyCharm's features can be brought to IntelliJ with the free `Python Plug-In <http://plugins.intellij.net/plugin/?id=631/>`_..
|
||||
|
||||
Eclipse
|
||||
-------
|
||||
|
||||
The most popular Eclipse plugin for Python development is Aptana's
|
||||
`PyDev <http://pydev.org>`_.
|
||||
|
||||
|
||||
Komodo IDE
|
||||
-----------
|
||||
`Komodo IDE <http://www.activestate.com/komodo-ide>`_ is developed by ActiveState and is a commerical IDE for Windows, Mac
|
||||
and Linux.
|
||||
|
||||
Spyder
|
||||
------
|
||||
|
||||
`Spyder <http://code.google.com/p/spyderlib/>`_ an IDE specifically geared toward working with scientific python libraries (namely `Scipy <http://www.scipy.org/>`_).
|
||||
Includes integration with `pyflakes <http://pypi.python.org/pypi/pyflakes>`_, `pylint <http://www.logilab.org/857>`_,
|
||||
and `rope <http://rope.sourceforge.net/>`_.
|
||||
|
||||
Spyder is open-source (free), offers code completion, syntax highlighting, class and function browser, and object
|
||||
inspection
|
||||
|
||||
|
||||
|
||||
Interpreter Tools
|
||||
:::::::::::::::::
|
||||
|
||||
|
||||
virtualenv
|
||||
----------
|
||||
|
||||
Virtualenv is a tool to keep the dependencies required by different projects in separate places, by creating virtual Python environments for them.
|
||||
It solves the "Project X depends on version 1.x but, Project Y needs 4.x" dilemma and keeps your global site-packages directory clean and manageable.
|
||||
|
||||
virtualenvwrapper
|
||||
-----------------
|
||||
|
||||
Virtualenvwrapper makes virtualenv a pleasure to use by wrapping the command line API with a nicer CLI.
|
||||
|
||||
::
|
||||
|
||||
pip install virtualenvwrapper
|
||||
|
||||
|
||||
Put this into your `~/.bash_profile` (Linux/Mac) file:
|
||||
|
||||
::
|
||||
|
||||
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'
|
||||
|
||||
This will prevent your virtualenvs from relying on your (global) site packages directory, so that they are completely separate..
|
||||
|
||||
Other Tools
|
||||
:::::::::::
|
||||
|
||||
IPython
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
$ pip install ipython
|
||||
|
||||
|
||||
|
||||
BPython
|
||||
-------
|
||||
|
||||
::
|
||||
|
||||
$ pip install bpython
|
||||
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
Properly Installing Python
|
||||
==========================
|
||||
|
||||
Mac OS X
|
||||
::::::::
|
||||
|
||||
*Or, "Installing Python 2.7 via Homebrew".*
|
||||
|
||||
Package Manager
|
||||
---------------
|
||||
|
||||
While Snow Leopard comes with a large number of UNIX utilities, those
|
||||
familiar with Linux systems will notice one key component missing: a
|
||||
package manager. Mxcl's *Homebrew* is the answer.
|
||||
|
||||
To install Homebrew, simply run: ::
|
||||
|
||||
$ ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)"
|
||||
|
||||
|
||||
It's basic commands are **update**, **install**, and **remove**.
|
||||
|
||||
.. man brew
|
||||
|
||||
|
||||
And we can now install Python 2.7: ::
|
||||
|
||||
$ brew install python --framework
|
||||
|
||||
|
||||
The ``--framework`` option tells Homebrew to compile a Framework-style Python build, rather than a UNIX-style build. The outdated version of Python that Snow Leopard comes packaged with
|
||||
is built as a Framework, so this helps avoid some future module installation
|
||||
bugs.
|
||||
|
||||
*Don't forget to update your environment PATH.*
|
||||
|
||||
|
||||
Building From Source
|
||||
--------------------
|
||||
|
||||
|
||||
|
||||
|
||||
Distribute & Pip
|
||||
----------------
|
||||
|
||||
*Distribute* is a fantastic drop-in replacement for *easy_install* and
|
||||
*setuptools*. It allows you to install and manage python packages from
|
||||
pypi.python.org, amongst a few other sources. It also plays well with
|
||||
*virtualenv* and user-enviornments.
|
||||
|
||||
**easy_install** is considered by many to be a deprecated system, so we
|
||||
will install it's replacement: **pip**. Pip allows for uninstallation
|
||||
of packages, and is actively maintained, unlike setuptool's easy_install.
|
||||
|
||||
To install *pip* and Distribute's *easy_install*:
|
||||
|
||||
If you have homebrew: ::
|
||||
|
||||
$ brew install pip
|
||||
|
||||
...And, if you're a masochist: ::
|
||||
|
||||
$ curl -O http://python-distribute.org/distribute_setup.py
|
||||
$ python distribute_setup.py
|
||||
|
||||
$ easy_install pip
|
||||
|
||||
|
||||
|
||||
To install ``pip``: ::
|
||||
|
||||
Hopefully you'll never have to use **easy_install** again.
|
||||
|
||||
|
||||
Updating Python
|
||||
---------------
|
||||
|
||||
Homebrew makes it simple. ::
|
||||
|
||||
$ brew update
|
||||
$ brew install --force python
|
||||
|
||||
|
||||
Windows
|
||||
:::::::
|
||||
|
||||
|
||||
|
||||
Prerequisites:
|
||||
--------------
|
||||
|
||||
* Python2.7 (x86) from Python.org
|
||||
* Microsoft Visual Studio
|
||||
|
||||
|
||||
Step 1: Install Distribute & Pip
|
||||
--------------------------------
|
||||
|
||||
**Distribute** is a fantastic drop-in replacement for **easy_install** and **setuptools**. It allows you to install and manage python packages from PyPi, amongst a few other sources.
|
||||
|
||||
To install it, run the python script available here:
|
||||
<http://python-distribute.org/distribute_setup.py>
|
||||
|
||||
Make sure that ```C:\Python27\```, and ```C:\Python27\Scripts``` are in your PATH.
|
||||
|
||||
**easy_install** is considered by many to be a deprecated system, so we will install it's replacement: **pip**. Pip allows for uninstallation of packages, and is actively maintained, unlike setuptool's easy_install.
|
||||
|
||||
To install pip, simply run: ::
|
||||
|
||||
$ easy_install pip
|
||||
|
||||
|
||||
Linux (Ubuntu)
|
||||
::::::::::::::
|
||||
|
||||
Oneiric Ocelot, the latest version of Ubuntu, **comes with Python 2.7 out of the box**. Python 3.2 can be installed and run with the following commands::
|
||||
|
||||
$ sudo apt-get install python3-minimal
|
||||
$ python3
|
||||
|
||||
Older versions of Python aren't available from the official repository. However, if it's needed (for example to support legacy code), we can add an unsupported repository and install an older version of Python (2.5 in the example below)::
|
||||
|
||||
$ sudo apt-get install python-software-properties
|
||||
$ sudo add-apt-repository ppa:fkrull/deadsnakes
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install python2.5
|
||||
|
||||
Installing setuptools and pip
|
||||
-----------------------------
|
||||
|
||||
While Python has an extensive standard library, the set of packages available from the Internet is even more extensive. In order to install them easily, we'll install the ``setuptools`` package and ``pip`` installer::
|
||||
|
||||
.. XXX: sudo?
|
||||
|
||||
$ wget http://python-distribute.org/distribute_setup.py
|
||||
$ python distribute_setup.py
|
||||
$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
|
||||
$ python get-pip.py
|
||||
$ rm get-pip.py distribute_setup.py
|
||||
|
||||
Now, most Python packages can be installed using the ``pip`` command. For example, if we wanted to install Django::
|
||||
|
||||
$ sudo pip install django
|
||||
|
||||
A full list of ``pip``'s capabilities is available by typing ``pip --help``.
|
||||
|
||||
Linux (Manual)
|
||||
--------------
|
||||
|
||||
While your system will quite likely already have Python installation, you might wish to install a different version. This is done in the typical Linux software source install procedure::
|
||||
|
||||
$ wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
|
||||
$ tar -xvf Python-2.7.2.tgz
|
||||
$ cd Python-2.7.2
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make install
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
Picking an Interpreter
|
||||
======================
|
||||
|
||||
Which Python to use?
|
||||
|
||||
|
||||
2.x vs 3.x
|
||||
~~~~~~~~~~
|
||||
|
||||
**tl;dr**: Python 2.x is the status quo, Python 3.x is the shiny new thing.
|
||||
|
||||
|
||||
`Further Reading <http://wiki.python.org/moin/Python2orPython3>`_
|
||||
|
||||
|
||||
Today
|
||||
-----
|
||||
|
||||
If you're choosing a Python interpreter to use, I *highly* recommend you Use Python 2.7.x, unless you have a strong reason not to.
|
||||
|
||||
|
||||
The Future
|
||||
----------
|
||||
|
||||
As more and more modules get ported over to Python3, the easier it will be for
|
||||
others to use it.
|
||||
|
||||
|
||||
Which Python to Support?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you're starting work on a new Python module, I recommend you write it for
|
||||
Python 2.5 or 2.6, and add support for Python3 in a later iteration.
|
||||
|
||||
Implementations
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
There are several popular implementations of the Python programming language on
|
||||
different back-ends.
|
||||
|
||||
CPython
|
||||
-------
|
||||
|
||||
`CPython <http://www.python.org>`_ is the reference implementation of Python,
|
||||
written in C. It compiles Python code to intermediate bytecode which is then
|
||||
interpreted by a virtual machine. When people speak of *Python* they often mean
|
||||
not just the language but also this implementation. It provides the highest
|
||||
level of compatibility with Python packages and C extension modules.
|
||||
|
||||
If you are writing open-source Python code and want to reach the widest possible
|
||||
audience, targeting CPython is your best bet. If you need to use any packages
|
||||
that are rely on C extensions for their functionality (eg: numpy) then CPython
|
||||
is your only choice.
|
||||
|
||||
Being the reference implementation, all versions of the Python language are
|
||||
available as CPython. Python 3 is only available in a CPython implementation.
|
||||
|
||||
PyPy
|
||||
----
|
||||
|
||||
`PyPy <http://pypy.org/>`_ is a Python interpreter implemented in a restricted
|
||||
statically-typed subset of the Python language called RPython. The interpreter
|
||||
features a just-in-time compiler and supports multiple back-ends (C, CLI, JVM).
|
||||
|
||||
PyPy aims for maximum compatibility with the reference CPython implementation
|
||||
while improving performance.
|
||||
|
||||
If you are looking to squeeze more performance out of your Python code, it's
|
||||
worth giving PyPy a try.
|
||||
|
||||
Currently PyPy supports Python 2.7.
|
||||
|
||||
Jython
|
||||
------
|
||||
|
||||
`Jython <http://www.jython.org/>`_ is a Python implementation that compiles
|
||||
Python code to Java byte code that then executes on a JVM. It has the additional
|
||||
advantage of being able to import and use any Java class the same as a Python
|
||||
module.
|
||||
|
||||
If you need to interface with an existing Java codebase or have other reasons to
|
||||
need to write Python code for the JVM, Jython is the best choice.
|
||||
|
||||
Currently Jython supports up to Python 2.5.
|
||||
|
||||
IronPython
|
||||
----------
|
||||
|
||||
`IronPython <http://ironpython.net/>`_ is an implementation of Python for .NET
|
||||
framework. It can use both Python and .NET framework libraries, and can also
|
||||
expose Python code to other .NET languages.
|
||||
|
||||
`Python Tools for Visual Studio <http://ironpython.net/tools/>`_ integrate
|
||||
IronPython directly in to the Visual Studio development environment, making it
|
||||
an ideal choice for Windows developers.
|
||||
|
||||
IronPython supports Python 2.7.
|
||||
@@ -0,0 +1,76 @@
|
||||
Documenting Your Code
|
||||
=====================
|
||||
|
||||
Documenting your code is extremely important. It is debatebly even
|
||||
more important than testing.
|
||||
|
||||
|
||||
The Basics
|
||||
::::::::::
|
||||
|
||||
|
||||
Code Comments
|
||||
-------------
|
||||
Information regarding code comments is taken from PEP 008 (http://www.python.org/dev/peps/pep-0008/).
|
||||
Block comment styling should be used when commenting out multiple lines of code.: ::
|
||||
|
||||
Block comments generally apply to some (or all) code that follows them,
|
||||
and are indented to the same level as that code. Each line of a block
|
||||
comment starts with a # and a single space (unless it is indented text
|
||||
inside the comment).
|
||||
Paragraphs inside a block comment are separated by a line containing a
|
||||
single #.
|
||||
|
||||
Inline comments are used for individual lines and should be used sparingly.: ::
|
||||
|
||||
An inline comment is a comment on the same line as a statement. Inline
|
||||
comments should be separated by at least two spaces from the statement.
|
||||
They should start with a # and a single space.
|
||||
Inline comments are unnecessary and in fact distracting if they state
|
||||
the obvious. Don't do this:
|
||||
x = x + 1 # Increment x
|
||||
But sometimes, this is useful: ::
|
||||
x = x + 1 # Compensate for border
|
||||
|
||||
Doc Strings
|
||||
-----------
|
||||
PEP 257 is the primary reference for docstrings. (http://www.python.org/dev/peps/pep-0257/)
|
||||
|There are two types of docstrings, one-line and multi-line. Their names should be fairly self explanatory.
|
||||
|One-line docstrings: ::
|
||||
|
||||
def kos_root():
|
||||
"""Return the pathname of the KOS root directory."""
|
||||
global _kos_root
|
||||
if _kos_root: return _kos_root
|
||||
...
|
||||
|
||||
Multi-line docstrings: ::
|
||||
|
||||
def complex(real=0.0, imag=0.0):
|
||||
"""Form a complex number.
|
||||
|
||||
Keyword arguments:
|
||||
real -- the real part (default 0.0)
|
||||
imag -- the imaginary part (default 0.0)
|
||||
|
||||
"""
|
||||
if imag == 0.0 and real == 0.0: return complex_zero
|
||||
...
|
||||
|
||||
Sphinx
|
||||
------
|
||||
Sphinx (http://sphinx.pocoo.org) is a tool which converts documentation in the reStructured text markup language into a range of output formats including HTML, LaTeX (for printable PDF versions), manual pages and plain text.
|
||||
|
||||
|
||||
|
||||
Other Tools
|
||||
:::::::::::
|
||||
|
||||
that old thing
|
||||
--------------
|
||||
|
||||
pocco / docco / shocco
|
||||
----------------------
|
||||
|
||||
Ronn
|
||||
----
|
||||
@@ -0,0 +1,54 @@
|
||||
Choosing a License
|
||||
==================
|
||||
|
||||
Open source.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Non-Restrictive
|
||||
:::::::::::::::
|
||||
|
||||
PSFL
|
||||
----
|
||||
|
||||
|
||||
MIT / BSD / ISC
|
||||
---------------
|
||||
|
||||
|
||||
MIT (X11)
|
||||
`````````
|
||||
|
||||
New BSD
|
||||
```````
|
||||
|
||||
ISC
|
||||
```
|
||||
|
||||
Apache
|
||||
------
|
||||
|
||||
|
||||
Restrictive
|
||||
:::::::::::
|
||||
|
||||
|
||||
LGPL
|
||||
----
|
||||
|
||||
|
||||
|
||||
GPL
|
||||
---
|
||||
|
||||
|
||||
GPLv2
|
||||
`````
|
||||
|
||||
|
||||
GPLv3
|
||||
`````
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
Structuring Your Project
|
||||
========================
|
||||
|
||||
Structuring your project properly is extremely important.
|
||||
|
||||
|
||||
Structure is Key
|
||||
----------------
|
||||
|
||||
|
||||
|
||||
Vendorizing Dependencies
|
||||
------------------------
|
||||
|
||||
|
||||
|
||||
Runners
|
||||
-------
|
||||
|
||||
|
||||
Further Reading
|
||||
---------------
|
||||
@@ -0,0 +1,54 @@
|
||||
Code Style
|
||||
==========
|
||||
|
||||
|
||||
Idioms
|
||||
::::::
|
||||
|
||||
Idiomatic Python code is often referred to as being *pythonic*.
|
||||
|
||||
|
||||
Zen of Python
|
||||
-------------
|
||||
|
||||
Also known as PEP 20, the guiding principles for Python's design.
|
||||
|
||||
::
|
||||
|
||||
>>> import this
|
||||
|
||||
See `<http://stackoverflow.com/questions/228181/the-zen-of-python>`_ for some
|
||||
examples.
|
||||
|
||||
PEP 8
|
||||
-----
|
||||
|
||||
PEP 8 is the de-facto code style guide for Python.
|
||||
|
||||
`PEP 8 <http://www.python.org/dev/peps/pep-0008/>`_
|
||||
|
||||
There exists a command-line program, `pep8` that can check your code for
|
||||
conformance.
|
||||
|
||||
::
|
||||
|
||||
pip install pep8
|
||||
|
||||
|
||||
Simply run it on a file or series of files and get a report of any
|
||||
violations
|
||||
|
||||
::
|
||||
|
||||
$ pep8 optparse.py
|
||||
optparse.py:69:11: E401 multiple imports on one line
|
||||
optparse.py:77:1: E302 expected 2 blank lines, found 1
|
||||
optparse.py:88:5: E301 expected 1 blank line, found 0
|
||||
optparse.py:222:34: W602 deprecated form of raising exception
|
||||
optparse.py:347:31: E211 whitespace before '('
|
||||
optparse.py:357:17: E201 whitespace after '{'
|
||||
optparse.py:472:29: E221 multiple spaces before operator
|
||||
optparse.py:544:21: W601 .has_key() is deprecated, use 'in'
|
||||
|
||||
Conforming your style to PEP 8 is generally a good idea and helps make code a lot
|
||||
more consistent when working on projects with other developers.
|
||||
@@ -0,0 +1,158 @@
|
||||
Testing Your Code
|
||||
=====================
|
||||
|
||||
Testing your code is very important.
|
||||
|
||||
|
||||
The Basics
|
||||
::::::::::
|
||||
|
||||
|
||||
Unittest
|
||||
--------
|
||||
|
||||
Unittest is the batteries-included test module in the Python standard library.
|
||||
Its API will be familiar to anyone who has used any of the JUnit/nUnit/CppUnit
|
||||
series of tools.
|
||||
|
||||
Creating testcases is accomplished by subclassing a TestCase base class
|
||||
|
||||
::
|
||||
|
||||
import unittest
|
||||
|
||||
def fun(x):
|
||||
return x + 1
|
||||
|
||||
class MyTest(unittest.TestCase):
|
||||
def test(self):
|
||||
self.assertEqual(fun(3), 4)
|
||||
|
||||
As of Python 2.7 unittest also includes its own test discovery mechanisms.
|
||||
|
||||
`unittest in the standard library documentation <http://docs.python.org/library/unittest.html>`_
|
||||
|
||||
|
||||
Doctest
|
||||
-------
|
||||
|
||||
The doctest module searches for pieces of text that look like interactive Python
|
||||
sessions, and then executes those sessions to verify that they work exactly as
|
||||
shown.
|
||||
|
||||
|
||||
Tools
|
||||
:::::
|
||||
|
||||
|
||||
py.test
|
||||
-------
|
||||
|
||||
py.test is a no-boilerplate alternative to Python's standard unittest module.
|
||||
|
||||
::
|
||||
|
||||
$ pip install pytest
|
||||
|
||||
Despite being a fully-featured and extensible test tool it boasts a simple
|
||||
syntax. Creating a test suite is as easy as writing a module with a couple of
|
||||
functions
|
||||
|
||||
::
|
||||
|
||||
# content of test_sample.py
|
||||
def func(x):
|
||||
return x + 1
|
||||
|
||||
def test_answer():
|
||||
assert func(3) == 5
|
||||
|
||||
and then running the `py.test` command
|
||||
|
||||
::
|
||||
|
||||
$ py.test
|
||||
=========================== test session starts ============================
|
||||
platform darwin -- Python 2.7.1 -- pytest-2.2.1
|
||||
collecting ... collected 1 items
|
||||
|
||||
test_sample.py F
|
||||
|
||||
================================= FAILURES =================================
|
||||
_______________________________ test_answer ________________________________
|
||||
|
||||
def test_answer():
|
||||
> assert func(3) == 5
|
||||
E assert 4 == 5
|
||||
E + where 4 = func(3)
|
||||
|
||||
test_sample.py:5: AssertionError
|
||||
========================= 1 failed in 0.02 seconds =========================
|
||||
|
||||
far less work than would be required for the equivalent functionality with the
|
||||
unittest module!
|
||||
|
||||
`py.test <http://pytest.org/latest/>`_
|
||||
|
||||
|
||||
Nose
|
||||
----
|
||||
|
||||
nose extends unittest to make testing easier.
|
||||
|
||||
|
||||
::
|
||||
|
||||
$ pip install nose
|
||||
|
||||
nose provides automatic test discovery to save you the hassle of manually
|
||||
creating test suites. It also provides numerous plugins for features such as
|
||||
xUnit-compatible test output, coverage reporting, and test selection.
|
||||
|
||||
`nose <http://readthedocs.org/docs/nose/en/latest/>`_
|
||||
|
||||
|
||||
tox
|
||||
---
|
||||
|
||||
tox is a tool for automating test environment management and testing against multiple
|
||||
interpreter configurations
|
||||
|
||||
::
|
||||
|
||||
$ pip install tox
|
||||
|
||||
tox allows you to configure complicatated multi-parameter test matrices via a
|
||||
simple ini-style configuration file.
|
||||
|
||||
`tox <http://tox.testrun.org/latest/>`_
|
||||
|
||||
Unittest2
|
||||
---------
|
||||
|
||||
unittest2 is a a backport of Python 2.7's unittest module which has an improved
|
||||
API and better assertions over the one available in previous versions of Python.
|
||||
|
||||
If you're using Python 2.6 or below, you can install it with pip
|
||||
|
||||
::
|
||||
|
||||
$ pip install unittest2
|
||||
|
||||
You may want to import the module under the name unittest to make porting code
|
||||
to newer versions of the module easier in the future
|
||||
|
||||
::
|
||||
|
||||
import unittest2 as unittest
|
||||
|
||||
class MyTest(unittest.TestCase):
|
||||
...
|
||||
|
||||
This way if you ever switch to a newer python version and no longer need the
|
||||
unittest2 module, you can simply change the import in your test module without
|
||||
the need to change any other code.
|
||||
|
||||
`unittest2 <http://pypi.python.org/pypi/unittest2>`_
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 673 B |
@@ -0,0 +1,540 @@
|
||||
/*
|
||||
* basic.css
|
||||
* ~~~~~~~~~
|
||||
*
|
||||
* Sphinx stylesheet -- basic theme.
|
||||
*
|
||||
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
|
||||
/* -- main layout ----------------------------------------------------------- */
|
||||
|
||||
div.clearer {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
/* -- relbar ---------------------------------------------------------------- */
|
||||
|
||||
div.related {
|
||||
width: 100%;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
div.related h3 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.related ul {
|
||||
margin: 0;
|
||||
padding: 0 0 0 10px;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div.related li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
div.related li.right {
|
||||
float: right;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
/* -- sidebar --------------------------------------------------------------- */
|
||||
|
||||
div.sphinxsidebarwrapper {
|
||||
padding: 10px 5px 0 10px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
float: left;
|
||||
width: 230px;
|
||||
margin-left: -100%;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul ul,
|
||||
div.sphinxsidebar ul.want-points {
|
||||
margin-left: 20px;
|
||||
list-style: square;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul ul {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
div.sphinxsidebar form {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input {
|
||||
border: 1px solid #98dbcc;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type="text"] {
|
||||
width: 170px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type="submit"] {
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* -- search page ----------------------------------------------------------- */
|
||||
|
||||
ul.search {
|
||||
margin: 10px 0 0 20px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul.search li {
|
||||
padding: 5px 0 5px 20px;
|
||||
background-image: url(file.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 7px;
|
||||
}
|
||||
|
||||
ul.search li a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
ul.search li div.context {
|
||||
color: #888;
|
||||
margin: 2px 0 0 30px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
ul.keywordmatches li.goodmatch a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* -- index page ------------------------------------------------------------ */
|
||||
|
||||
table.contentstable {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
table.contentstable p.biglink {
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
a.biglink {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
span.linkdescr {
|
||||
font-style: italic;
|
||||
padding-top: 5px;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
/* -- general index --------------------------------------------------------- */
|
||||
|
||||
table.indextable {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
table.indextable td {
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.indextable dl, table.indextable dd {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
table.indextable tr.pcap {
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
table.indextable tr.cap {
|
||||
margin-top: 10px;
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
img.toggler {
|
||||
margin-right: 3px;
|
||||
margin-top: 3px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
div.modindex-jumpbox {
|
||||
border-top: 1px solid #ddd;
|
||||
border-bottom: 1px solid #ddd;
|
||||
margin: 1em 0 1em 0;
|
||||
padding: 0.4em;
|
||||
}
|
||||
|
||||
div.genindex-jumpbox {
|
||||
border-top: 1px solid #ddd;
|
||||
border-bottom: 1px solid #ddd;
|
||||
margin: 1em 0 1em 0;
|
||||
padding: 0.4em;
|
||||
}
|
||||
|
||||
/* -- general body styles --------------------------------------------------- */
|
||||
|
||||
a.headerlink {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
h1:hover > a.headerlink,
|
||||
h2:hover > a.headerlink,
|
||||
h3:hover > a.headerlink,
|
||||
h4:hover > a.headerlink,
|
||||
h5:hover > a.headerlink,
|
||||
h6:hover > a.headerlink,
|
||||
dt:hover > a.headerlink {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
div.body p.caption {
|
||||
text-align: inherit;
|
||||
}
|
||||
|
||||
div.body td {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.field-list ul {
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
.first {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
p.rubric {
|
||||
margin-top: 30px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left {
|
||||
clear: left;
|
||||
float: left;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right {
|
||||
clear: right;
|
||||
float: right;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.align-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* -- sidebars -------------------------------------------------------------- */
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em;
|
||||
border: 1px solid #ddb;
|
||||
padding: 7px 7px 0 7px;
|
||||
background-color: #ffe;
|
||||
width: 40%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
p.sidebar-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* -- topics ---------------------------------------------------------------- */
|
||||
|
||||
div.topic {
|
||||
border: 1px solid #ccc;
|
||||
padding: 7px 7px 0 7px;
|
||||
margin: 10px 0 10px 0;
|
||||
}
|
||||
|
||||
p.topic-title {
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
/* -- admonitions ----------------------------------------------------------- */
|
||||
|
||||
div.admonition {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
padding: 7px;
|
||||
}
|
||||
|
||||
div.admonition dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.admonition dl {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
margin: 0px 10px 5px 0px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.body p.centered {
|
||||
text-align: center;
|
||||
margin-top: 25px;
|
||||
}
|
||||
|
||||
/* -- tables ---------------------------------------------------------------- */
|
||||
|
||||
table.docutils {
|
||||
border: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
table.docutils td, table.docutils th {
|
||||
padding: 1px 8px 1px 5px;
|
||||
border-top: 0;
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
border-bottom: 1px solid #aaa;
|
||||
}
|
||||
|
||||
table.field-list td, table.field-list th {
|
||||
border: 0 !important;
|
||||
}
|
||||
|
||||
table.footnote td, table.footnote th {
|
||||
border: 0 !important;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
table.citation td {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* -- other body styles ----------------------------------------------------- */
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha;
|
||||
}
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha;
|
||||
}
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman;
|
||||
}
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman;
|
||||
}
|
||||
|
||||
dl {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
dd p {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
dd ul, dd table {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-top: 3px;
|
||||
margin-bottom: 10px;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
dt:target, .highlighted {
|
||||
background-color: #fbe54e;
|
||||
}
|
||||
|
||||
dl.glossary dt {
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.field-list ul {
|
||||
margin: 0;
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
.field-list p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.refcount {
|
||||
color: #060;
|
||||
}
|
||||
|
||||
.optional {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
.versionmodified {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.system-message {
|
||||
background-color: #fda;
|
||||
padding: 5px;
|
||||
border: 3px solid red;
|
||||
}
|
||||
|
||||
.footnote:target {
|
||||
background-color: #ffa;
|
||||
}
|
||||
|
||||
.line-block {
|
||||
display: block;
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.line-block .line-block {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
margin-left: 1.5em;
|
||||
}
|
||||
|
||||
.guilabel, .menuselection {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.accelerator {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.classifier {
|
||||
font-style: oblique;
|
||||
}
|
||||
|
||||
abbr, acronym {
|
||||
border-bottom: dotted 1px;
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
/* -- code displays --------------------------------------------------------- */
|
||||
|
||||
pre {
|
||||
overflow: auto;
|
||||
overflow-y: hidden; /* fixes display issues on Chrome browsers */
|
||||
}
|
||||
|
||||
td.linenos pre {
|
||||
padding: 5px 0px;
|
||||
border: 0;
|
||||
background-color: transparent;
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
table.highlighttable {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
|
||||
table.highlighttable td {
|
||||
padding: 0 0.5em 0 0.5em;
|
||||
}
|
||||
|
||||
tt.descname {
|
||||
background-color: transparent;
|
||||
font-weight: bold;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
tt.descclassname {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
tt.xref, a tt {
|
||||
background-color: transparent;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.viewcode-link {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.viewcode-back {
|
||||
float: right;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
div.viewcode-block:target {
|
||||
margin: -1px -10px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
/* -- math display ---------------------------------------------------------- */
|
||||
|
||||
img.math {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
div.body div.math p {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
span.eqno {
|
||||
float: right;
|
||||
}
|
||||
|
||||
/* -- printout stylesheet --------------------------------------------------- */
|
||||
|
||||
@media print {
|
||||
div.document,
|
||||
div.documentwrapper,
|
||||
div.bodywrapper {
|
||||
margin: 0 !important;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.sphinxsidebar,
|
||||
div.related,
|
||||
div.footer,
|
||||
#top-link {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
@@ -0,0 +1,247 @@
|
||||
/*
|
||||
* doctools.js
|
||||
* ~~~~~~~~~~~
|
||||
*
|
||||
* Sphinx JavaScript utilties for all documentation.
|
||||
*
|
||||
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* select a different prefix for underscore
|
||||
*/
|
||||
$u = _.noConflict();
|
||||
|
||||
/**
|
||||
* make the code below compatible with browsers without
|
||||
* an installed firebug like debugger
|
||||
if (!window.console || !console.firebug) {
|
||||
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
|
||||
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
|
||||
"profile", "profileEnd"];
|
||||
window.console = {};
|
||||
for (var i = 0; i < names.length; ++i)
|
||||
window.console[names[i]] = function() {};
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* small helper function to urldecode strings
|
||||
*/
|
||||
jQuery.urldecode = function(x) {
|
||||
return decodeURIComponent(x).replace(/\+/g, ' ');
|
||||
}
|
||||
|
||||
/**
|
||||
* small helper function to urlencode strings
|
||||
*/
|
||||
jQuery.urlencode = encodeURIComponent;
|
||||
|
||||
/**
|
||||
* This function returns the parsed url parameters of the
|
||||
* current request. Multiple values per key are supported,
|
||||
* it will always return arrays of strings for the value parts.
|
||||
*/
|
||||
jQuery.getQueryParameters = function(s) {
|
||||
if (typeof s == 'undefined')
|
||||
s = document.location.search;
|
||||
var parts = s.substr(s.indexOf('?') + 1).split('&');
|
||||
var result = {};
|
||||
for (var i = 0; i < parts.length; i++) {
|
||||
var tmp = parts[i].split('=', 2);
|
||||
var key = jQuery.urldecode(tmp[0]);
|
||||
var value = jQuery.urldecode(tmp[1]);
|
||||
if (key in result)
|
||||
result[key].push(value);
|
||||
else
|
||||
result[key] = [value];
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* small function to check if an array contains
|
||||
* a given item.
|
||||
*/
|
||||
jQuery.contains = function(arr, item) {
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
if (arr[i] == item)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* highlight a given string on a jquery object by wrapping it in
|
||||
* span elements with the given class name.
|
||||
*/
|
||||
jQuery.fn.highlightText = function(text, className) {
|
||||
function highlight(node) {
|
||||
if (node.nodeType == 3) {
|
||||
var val = node.nodeValue;
|
||||
var pos = val.toLowerCase().indexOf(text);
|
||||
if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
|
||||
var span = document.createElement("span");
|
||||
span.className = className;
|
||||
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
|
||||
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
|
||||
document.createTextNode(val.substr(pos + text.length)),
|
||||
node.nextSibling));
|
||||
node.nodeValue = val.substr(0, pos);
|
||||
}
|
||||
}
|
||||
else if (!jQuery(node).is("button, select, textarea")) {
|
||||
jQuery.each(node.childNodes, function() {
|
||||
highlight(this);
|
||||
});
|
||||
}
|
||||
}
|
||||
return this.each(function() {
|
||||
highlight(this);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Small JavaScript module for the documentation.
|
||||
*/
|
||||
var Documentation = {
|
||||
|
||||
init : function() {
|
||||
this.fixFirefoxAnchorBug();
|
||||
this.highlightSearchWords();
|
||||
this.initIndexTable();
|
||||
},
|
||||
|
||||
/**
|
||||
* i18n support
|
||||
*/
|
||||
TRANSLATIONS : {},
|
||||
PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
|
||||
LOCALE : 'unknown',
|
||||
|
||||
// gettext and ngettext don't access this so that the functions
|
||||
// can safely bound to a different name (_ = Documentation.gettext)
|
||||
gettext : function(string) {
|
||||
var translated = Documentation.TRANSLATIONS[string];
|
||||
if (typeof translated == 'undefined')
|
||||
return string;
|
||||
return (typeof translated == 'string') ? translated : translated[0];
|
||||
},
|
||||
|
||||
ngettext : function(singular, plural, n) {
|
||||
var translated = Documentation.TRANSLATIONS[singular];
|
||||
if (typeof translated == 'undefined')
|
||||
return (n == 1) ? singular : plural;
|
||||
return translated[Documentation.PLURALEXPR(n)];
|
||||
},
|
||||
|
||||
addTranslations : function(catalog) {
|
||||
for (var key in catalog.messages)
|
||||
this.TRANSLATIONS[key] = catalog.messages[key];
|
||||
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
|
||||
this.LOCALE = catalog.locale;
|
||||
},
|
||||
|
||||
/**
|
||||
* add context elements like header anchor links
|
||||
*/
|
||||
addContextElements : function() {
|
||||
$('div[id] > :header:first').each(function() {
|
||||
$('<a class="headerlink">\u00B6</a>').
|
||||
attr('href', '#' + this.id).
|
||||
attr('title', _('Permalink to this headline')).
|
||||
appendTo(this);
|
||||
});
|
||||
$('dt[id]').each(function() {
|
||||
$('<a class="headerlink">\u00B6</a>').
|
||||
attr('href', '#' + this.id).
|
||||
attr('title', _('Permalink to this definition')).
|
||||
appendTo(this);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* workaround a firefox stupidity
|
||||
*/
|
||||
fixFirefoxAnchorBug : function() {
|
||||
if (document.location.hash && $.browser.mozilla)
|
||||
window.setTimeout(function() {
|
||||
document.location.href += '';
|
||||
}, 10);
|
||||
},
|
||||
|
||||
/**
|
||||
* highlight the search words provided in the url in the text
|
||||
*/
|
||||
highlightSearchWords : function() {
|
||||
var params = $.getQueryParameters();
|
||||
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
|
||||
if (terms.length) {
|
||||
var body = $('div.body');
|
||||
window.setTimeout(function() {
|
||||
$.each(terms, function() {
|
||||
body.highlightText(this.toLowerCase(), 'highlighted');
|
||||
});
|
||||
}, 10);
|
||||
$('<p class="highlight-link"><a href="javascript:Documentation.' +
|
||||
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
|
||||
.appendTo($('#searchbox'));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* init the domain index toggle buttons
|
||||
*/
|
||||
initIndexTable : function() {
|
||||
var togglers = $('img.toggler').click(function() {
|
||||
var src = $(this).attr('src');
|
||||
var idnum = $(this).attr('id').substr(7);
|
||||
$('tr.cg-' + idnum).toggle();
|
||||
if (src.substr(-9) == 'minus.png')
|
||||
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
|
||||
else
|
||||
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
|
||||
}).css('display', '');
|
||||
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
|
||||
togglers.click();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* helper function to hide the search marks again
|
||||
*/
|
||||
hideSearchWords : function() {
|
||||
$('#searchbox .highlight-link').fadeOut(300);
|
||||
$('span.highlighted').removeClass('highlighted');
|
||||
},
|
||||
|
||||
/**
|
||||
* make the url absolute
|
||||
*/
|
||||
makeURL : function(relativeURL) {
|
||||
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
|
||||
},
|
||||
|
||||
/**
|
||||
* get the current relative url
|
||||
*/
|
||||
getCurrentURL : function() {
|
||||
var path = document.location.pathname;
|
||||
var parts = path.split(/\//);
|
||||
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
|
||||
if (this == '..')
|
||||
parts.pop();
|
||||
});
|
||||
var url = parts.join('/');
|
||||
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
|
||||
}
|
||||
};
|
||||
|
||||
// quick alias for translations
|
||||
_ = Documentation.gettext;
|
||||
|
||||
$(document).ready(function() {
|
||||
Documentation.init();
|
||||
});
|
||||
|
After Width: | Height: | Size: 368 B |
|
After Width: | Height: | Size: 363 B |
|
After Width: | Height: | Size: 392 B |
@@ -0,0 +1,570 @@
|
||||
/*
|
||||
* flasky.css_t
|
||||
* ~~~~~~~~~~~~
|
||||
*
|
||||
* :copyright: Copyright 2010 by Armin Ronacher. Modifications by Kenneth Reitz.
|
||||
* :license: Flask Design License, see LICENSE for details.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
@import url("basic.css");
|
||||
|
||||
/* -- page layout ----------------------------------------------------------- */
|
||||
|
||||
body {
|
||||
font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro';
|
||||
font-size: 17px;
|
||||
background-color: white;
|
||||
color: #000;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.document {
|
||||
width: 940px;
|
||||
margin: 30px auto 0 auto;
|
||||
}
|
||||
|
||||
div.documentwrapper {
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.bodywrapper {
|
||||
margin: 0 0 0 220px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
width: 220px;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 1px solid #B1B4B6;
|
||||
}
|
||||
|
||||
div.body {
|
||||
background-color: #ffffff;
|
||||
color: #3E4349;
|
||||
padding: 0 30px 0 30px;
|
||||
}
|
||||
|
||||
img.floatingflask {
|
||||
padding: 0 0 10px 10px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
div.footer {
|
||||
width: 940px;
|
||||
margin: 20px auto 30px auto;
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.footer a {
|
||||
color: #888;
|
||||
}
|
||||
|
||||
div.related {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.sphinxsidebar a {
|
||||
color: #444;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted #999;
|
||||
}
|
||||
|
||||
div.sphinxsidebar a:hover {
|
||||
border-bottom: 1px solid #999;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
font-size: 14px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
div.sphinxsidebarwrapper {
|
||||
padding: 18px 10px;
|
||||
}
|
||||
|
||||
div.sphinxsidebarwrapper p.logo {
|
||||
padding: 0;
|
||||
margin: -10px 0 0 -20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3,
|
||||
div.sphinxsidebar h4 {
|
||||
font-family: 'Garamond', 'Georgia', serif;
|
||||
color: #444;
|
||||
font-size: 24px;
|
||||
font-weight: normal;
|
||||
margin: 0 0 5px 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h4 {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3 a {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
div.sphinxsidebar p.logo a,
|
||||
div.sphinxsidebar h3 a,
|
||||
div.sphinxsidebar p.logo a:hover,
|
||||
div.sphinxsidebar h3 a:hover {
|
||||
border: none;
|
||||
}
|
||||
|
||||
div.sphinxsidebar p {
|
||||
color: #555;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul {
|
||||
margin: 10px 0;
|
||||
padding: 0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input {
|
||||
border: 1px solid #ccc;
|
||||
font-family: 'Georgia', serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
/* -- body styles ----------------------------------------------------------- */
|
||||
|
||||
a {
|
||||
color: #004B6B;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #6D4100;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div.body h1,
|
||||
div.body h2,
|
||||
div.body h3,
|
||||
div.body h4,
|
||||
div.body h5,
|
||||
div.body h6 {
|
||||
font-family: 'Garamond', 'Georgia', serif;
|
||||
font-weight: normal;
|
||||
margin: 30px 0px 10px 0px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
|
||||
div.body h2 { font-size: 180%; }
|
||||
div.body h3 { font-size: 150%; }
|
||||
div.body h4 { font-size: 130%; }
|
||||
div.body h5 { font-size: 100%; }
|
||||
div.body h6 { font-size: 100%; }
|
||||
|
||||
a.headerlink {
|
||||
color: #ddd;
|
||||
padding: 0 4px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.headerlink:hover {
|
||||
color: #444;
|
||||
background: #eaeaea;
|
||||
}
|
||||
|
||||
div.body p, div.body dd, div.body li {
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
div.admonition {
|
||||
background: #fafafa;
|
||||
margin: 20px -30px;
|
||||
padding: 10px 30px;
|
||||
border-top: 1px solid #ccc;
|
||||
border-bottom: 1px solid #ccc;
|
||||
}
|
||||
|
||||
div.admonition tt.xref, div.admonition a tt {
|
||||
border-bottom: 1px solid #fafafa;
|
||||
}
|
||||
|
||||
dd div.admonition {
|
||||
margin-left: -60px;
|
||||
padding-left: 60px;
|
||||
}
|
||||
|
||||
div.admonition p.admonition-title {
|
||||
font-family: 'Garamond', 'Georgia', serif;
|
||||
font-weight: normal;
|
||||
font-size: 24px;
|
||||
margin: 0 0 10px 0;
|
||||
padding: 0;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
div.admonition p.last {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
div.highlight {
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
dt:target, .highlight {
|
||||
background: #FAF3E8;
|
||||
}
|
||||
|
||||
div.note {
|
||||
background-color: #eee;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
div.seealso {
|
||||
background-color: #ffc;
|
||||
border: 1px solid #ff6;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
p.admonition-title:after {
|
||||
content: ":";
|
||||
}
|
||||
|
||||
pre, tt {
|
||||
font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
img.screenshot {
|
||||
}
|
||||
|
||||
tt.descname, tt.descclassname {
|
||||
font-size: 0.95em;
|
||||
}
|
||||
|
||||
tt.descname {
|
||||
padding-right: 0.08em;
|
||||
}
|
||||
|
||||
img.screenshot {
|
||||
-moz-box-shadow: 2px 2px 4px #eee;
|
||||
-webkit-box-shadow: 2px 2px 4px #eee;
|
||||
box-shadow: 2px 2px 4px #eee;
|
||||
}
|
||||
|
||||
table.docutils {
|
||||
border: 1px solid #888;
|
||||
-moz-box-shadow: 2px 2px 4px #eee;
|
||||
-webkit-box-shadow: 2px 2px 4px #eee;
|
||||
box-shadow: 2px 2px 4px #eee;
|
||||
}
|
||||
|
||||
table.docutils td, table.docutils th {
|
||||
border: 1px solid #888;
|
||||
padding: 0.25em 0.7em;
|
||||
}
|
||||
|
||||
table.field-list, table.footnote {
|
||||
border: none;
|
||||
-moz-box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
table.footnote {
|
||||
margin: 15px 0;
|
||||
width: 100%;
|
||||
border: 1px solid #eee;
|
||||
background: #fdfdfd;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
table.footnote + table.footnote {
|
||||
margin-top: -15px;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
table.field-list th {
|
||||
padding: 0 0.8em 0 0;
|
||||
}
|
||||
|
||||
table.field-list td {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
table.footnote td.label {
|
||||
width: 0px;
|
||||
padding: 0.3em 0 0.3em 0.5em;
|
||||
}
|
||||
|
||||
table.footnote td {
|
||||
padding: 0.3em 0.5em;
|
||||
}
|
||||
|
||||
dl {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
dl dd {
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 0 30px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
margin: 10px 0 10px 30px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: #eee;
|
||||
padding: 7px 30px;
|
||||
margin: 15px -30px;
|
||||
line-height: 1.3em;
|
||||
}
|
||||
|
||||
dl pre, blockquote pre, li pre {
|
||||
margin-left: -60px;
|
||||
padding-left: 60px;
|
||||
}
|
||||
|
||||
dl dl pre {
|
||||
margin-left: -90px;
|
||||
padding-left: 90px;
|
||||
}
|
||||
|
||||
tt {
|
||||
background-color: #ecf0f3;
|
||||
color: #222;
|
||||
/* padding: 1px 2px; */
|
||||
}
|
||||
|
||||
tt.xref, a tt {
|
||||
background-color: #FBFBFB;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
|
||||
a.reference {
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted #004B6B;
|
||||
}
|
||||
|
||||
a.reference:hover {
|
||||
border-bottom: 1px solid #6D4100;
|
||||
}
|
||||
|
||||
a.footnote-reference {
|
||||
text-decoration: none;
|
||||
font-size: 0.7em;
|
||||
vertical-align: top;
|
||||
border-bottom: 1px dotted #004B6B;
|
||||
}
|
||||
|
||||
a.footnote-reference:hover {
|
||||
border-bottom: 1px solid #6D4100;
|
||||
}
|
||||
|
||||
a:hover tt {
|
||||
background: #EEE;
|
||||
}
|
||||
|
||||
|
||||
@media screen and (max-width: 870px) {
|
||||
|
||||
div.sphinxsidebar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.document {
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
|
||||
div.documentwrapper {
|
||||
margin-left: 0;
|
||||
margin-top: 0;
|
||||
margin-right: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
div.bodywrapper {
|
||||
margin-top: 0;
|
||||
margin-right: 0;
|
||||
margin-bottom: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.document {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.footer {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.bodywrapper {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.footer {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.github {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@media screen and (max-width: 875px) {
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 20px 30px;
|
||||
}
|
||||
|
||||
div.documentwrapper {
|
||||
float: none;
|
||||
background: white;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
display: block;
|
||||
float: none;
|
||||
width: 102.5%;
|
||||
margin: 50px -30px -20px -30px;
|
||||
padding: 10px 20px;
|
||||
background: #333;
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
|
||||
div.sphinxsidebar h3 a {
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.sphinxsidebar a {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
div.sphinxsidebar p.logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.document {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
div.related {
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 10px 0 20px 0;
|
||||
}
|
||||
|
||||
div.related ul,
|
||||
div.related ul li {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.footer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.bodywrapper {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
div.body {
|
||||
min-height: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.rtd_doc_footer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.document {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.footer {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.footer {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.github {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* scrollbars */
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-button:start:decrement,
|
||||
::-webkit-scrollbar-button:end:increment {
|
||||
display: block;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-button:vertical:increment {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track-piece {
|
||||
background-color: #eee;
|
||||
-webkit-border-radius: 3px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:vertical {
|
||||
height: 50px;
|
||||
background-color: #ccc;
|
||||
-webkit-border-radius: 3px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:horizontal {
|
||||
width: 50px;
|
||||
background-color: #ccc;
|
||||
-webkit-border-radius: 3px;
|
||||
}
|
||||
|
||||
/* misc. */
|
||||
|
||||
.revsys-inline {
|
||||
display: none!important;
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
/*!
|
||||
* jQuery JavaScript Library v1.4.2
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://jquery.org/license
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
* Copyright 2010, The Dojo Foundation
|
||||
* Released under the MIT, BSD, and GPL Licenses.
|
||||
*
|
||||
* Date: Sat Feb 13 22:33:48 2010 -0500
|
||||
*/
|
||||
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
|
||||
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
|
||||
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
|
||||
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
|
||||
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
|
||||
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
|
||||
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
|
||||
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
|
||||
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
|
||||
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
|
||||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
|
||||
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
|
||||
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
|
||||
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
|
||||
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
|
||||
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
|
||||
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
|
||||
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
|
||||
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
|
||||
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
|
||||
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
|
||||
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
|
||||
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
|
||||
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
|
||||
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
|
||||
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
|
||||
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
|
||||
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
|
||||
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
|
||||
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
|
||||
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
|
||||
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
|
||||
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
|
||||
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
|
||||
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
|
||||
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
|
||||
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
|
||||
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
|
||||
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
|
||||
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
|
||||
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
|
||||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
|
||||
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
|
||||
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
|
||||
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
|
||||
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
|
||||
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
|
||||
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
|
||||
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
|
||||
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
|
||||
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
|
||||
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
|
||||
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
|
||||
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
|
||||
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
||||
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
|
||||
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
|
||||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
|
||||
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
|
||||
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
|
||||
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
|
||||
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
|
||||
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
|
||||
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
|
||||
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
|
||||
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
|
||||
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
|
||||
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
|
||||
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
|
||||
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
|
||||
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
|
||||
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
|
||||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
|
||||
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
|
||||
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
|
||||
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
|
||||
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
|
||||
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
|
||||
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
|
||||
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
|
||||
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
|
||||
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
|
||||
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
|
||||
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
|
||||
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
|
||||
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
|
||||
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
|
||||
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
|
||||
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
|
||||
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
|
||||
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
|
||||
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
|
||||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
|
||||
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
|
||||
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
|
||||
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
|
||||
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
|
||||
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
|
||||
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
|
||||
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
|
||||
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
|
||||
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
|
||||
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
|
||||
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
|
||||
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
|
||||
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
|
||||
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
|
||||
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
|
||||
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
|
||||
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
|
||||
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
|
||||
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
|
||||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
|
||||
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
|
||||
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
|
||||
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
|
||||
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
|
||||
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
|
||||
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
|
||||
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
|
||||
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
|
||||
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
|
||||
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
|
||||
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
|
||||
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
|
||||
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
|
||||
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
|
||||
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
|
||||
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
|
||||
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
|
||||
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
|
||||
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
|
||||
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
|
||||
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
|
||||
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
|
||||
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
|
||||
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
|
||||
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
|
||||
|
After Width: | Height: | Size: 199 B |
|
After Width: | Height: | Size: 199 B |
@@ -0,0 +1,70 @@
|
||||
.highlight .hll { background-color: #ffffcc }
|
||||
.highlight { background: #f8f8f8; }
|
||||
.highlight .c { color: #8f5902; font-style: italic } /* Comment */
|
||||
.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
|
||||
.highlight .g { color: #000000 } /* Generic */
|
||||
.highlight .k { color: #004461; font-weight: bold } /* Keyword */
|
||||
.highlight .l { color: #000000 } /* Literal */
|
||||
.highlight .n { color: #000000 } /* Name */
|
||||
.highlight .o { color: #582800 } /* Operator */
|
||||
.highlight .x { color: #000000 } /* Other */
|
||||
.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
|
||||
.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
|
||||
.highlight .cp { color: #8f5902 } /* Comment.Preproc */
|
||||
.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
|
||||
.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
|
||||
.highlight .gd { color: #a40000 } /* Generic.Deleted */
|
||||
.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
|
||||
.highlight .gr { color: #ef2929 } /* Generic.Error */
|
||||
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
|
||||
.highlight .gi { color: #00A000 } /* Generic.Inserted */
|
||||
.highlight .go { color: #808080 } /* Generic.Output */
|
||||
.highlight .gp { color: #745334 } /* Generic.Prompt */
|
||||
.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
|
||||
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
|
||||
.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
|
||||
.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */
|
||||
.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */
|
||||
.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */
|
||||
.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */
|
||||
.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */
|
||||
.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */
|
||||
.highlight .ld { color: #000000 } /* Literal.Date */
|
||||
.highlight .m { color: #990000 } /* Literal.Number */
|
||||
.highlight .s { color: #4e9a06 } /* Literal.String */
|
||||
.highlight .na { color: #c4a000 } /* Name.Attribute */
|
||||
.highlight .nb { color: #004461 } /* Name.Builtin */
|
||||
.highlight .nc { color: #000000 } /* Name.Class */
|
||||
.highlight .no { color: #000000 } /* Name.Constant */
|
||||
.highlight .nd { color: #808080 } /* Name.Decorator */
|
||||
.highlight .ni { color: #ce5c00 } /* Name.Entity */
|
||||
.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
|
||||
.highlight .nf { color: #000000 } /* Name.Function */
|
||||
.highlight .nl { color: #f57900 } /* Name.Label */
|
||||
.highlight .nn { color: #000000 } /* Name.Namespace */
|
||||
.highlight .nx { color: #000000 } /* Name.Other */
|
||||
.highlight .py { color: #000000 } /* Name.Property */
|
||||
.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */
|
||||
.highlight .nv { color: #000000 } /* Name.Variable */
|
||||
.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */
|
||||
.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */
|
||||
.highlight .mf { color: #990000 } /* Literal.Number.Float */
|
||||
.highlight .mh { color: #990000 } /* Literal.Number.Hex */
|
||||
.highlight .mi { color: #990000 } /* Literal.Number.Integer */
|
||||
.highlight .mo { color: #990000 } /* Literal.Number.Oct */
|
||||
.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
|
||||
.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
|
||||
.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
|
||||
.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
|
||||
.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
|
||||
.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
|
||||
.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
|
||||
.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
|
||||
.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
|
||||
.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
|
||||
.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
|
||||
.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
|
||||
.highlight .vc { color: #000000 } /* Name.Variable.Class */
|
||||
.highlight .vg { color: #000000 } /* Name.Variable.Global */
|
||||
.highlight .vi { color: #000000 } /* Name.Variable.Instance */
|
||||
.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */
|
||||
@@ -0,0 +1,560 @@
|
||||
/*
|
||||
* 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 = $('<div class="context"></div>').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 = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
|
||||
this.dots = $('<span></span>').appendTo(this.title);
|
||||
this.status = $('<p style="display: none"></p>').appendTo(this.out);
|
||||
this.output = $('<ul class="search"/>').appendTo(this.out);
|
||||
|
||||
$('#search-progress').text(_('Preparing search...'));
|
||||
this.startPulse();
|
||||
|
||||
// index already loaded, the browser was quick!
|
||||
if (this.hasIndex())
|
||||
this.query(query);
|
||||
else
|
||||
this.deferQuery(query);
|
||||
},
|
||||
|
||||
query : function(query) {
|
||||
var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"];
|
||||
|
||||
// Stem the searchterms and add them to the correct list
|
||||
var stemmer = new Stemmer();
|
||||
var searchterms = [];
|
||||
var excluded = [];
|
||||
var hlterms = [];
|
||||
var tmp = query.split(/\s+/);
|
||||
var objectterms = [];
|
||||
for (var i = 0; i < tmp.length; i++) {
|
||||
if (tmp[i] != "") {
|
||||
objectterms.push(tmp[i].toLowerCase());
|
||||
}
|
||||
|
||||
if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
|
||||
tmp[i] == "") {
|
||||
// skip this "word"
|
||||
continue;
|
||||
}
|
||||
// stem the word
|
||||
var word = stemmer.stemWord(tmp[i]).toLowerCase();
|
||||
// select the correct list
|
||||
if (word[0] == '-') {
|
||||
var toAppend = excluded;
|
||||
word = word.substr(1);
|
||||
}
|
||||
else {
|
||||
var toAppend = searchterms;
|
||||
hlterms.push(tmp[i].toLowerCase());
|
||||
}
|
||||
// only add if not already in the list
|
||||
if (!$.contains(toAppend, word))
|
||||
toAppend.push(word);
|
||||
};
|
||||
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
|
||||
|
||||
// console.debug('SEARCH: searching for:');
|
||||
// console.info('required: ', searchterms);
|
||||
// console.info('excluded: ', excluded);
|
||||
|
||||
// prepare search
|
||||
var filenames = this._index.filenames;
|
||||
var titles = this._index.titles;
|
||||
var terms = this._index.terms;
|
||||
var fileMap = {};
|
||||
var files = null;
|
||||
// different result priorities
|
||||
var importantResults = [];
|
||||
var objectResults = [];
|
||||
var regularResults = [];
|
||||
var unimportantResults = [];
|
||||
$('#search-progress').empty();
|
||||
|
||||
// lookup as object
|
||||
for (var i = 0; i < objectterms.length; i++) {
|
||||
var others = [].concat(objectterms.slice(0,i),
|
||||
objectterms.slice(i+1, objectterms.length))
|
||||
var results = this.performObjectSearch(objectterms[i], others);
|
||||
// Assume first word is most likely to be the object,
|
||||
// other words more likely to be in description.
|
||||
// Therefore put matches for earlier words first.
|
||||
// (Results are eventually used in reverse order).
|
||||
objectResults = results[0].concat(objectResults);
|
||||
importantResults = results[1].concat(importantResults);
|
||||
unimportantResults = results[2].concat(unimportantResults);
|
||||
}
|
||||
|
||||
// perform the search on the required terms
|
||||
for (var i = 0; i < searchterms.length; i++) {
|
||||
var word = searchterms[i];
|
||||
// no match but word was a required one
|
||||
if ((files = terms[word]) == null)
|
||||
break;
|
||||
if (files.length == undefined) {
|
||||
files = [files];
|
||||
}
|
||||
// create the mapping
|
||||
for (var j = 0; j < files.length; j++) {
|
||||
var file = files[j];
|
||||
if (file in fileMap)
|
||||
fileMap[file].push(word);
|
||||
else
|
||||
fileMap[file] = [word];
|
||||
}
|
||||
}
|
||||
|
||||
// now check if the files don't contain excluded terms
|
||||
for (var file in fileMap) {
|
||||
var valid = true;
|
||||
|
||||
// check if all requirements are matched
|
||||
if (fileMap[file].length != searchterms.length)
|
||||
continue;
|
||||
|
||||
// ensure that none of the excluded terms is in the
|
||||
// search result.
|
||||
for (var i = 0; i < excluded.length; i++) {
|
||||
if (terms[excluded[i]] == file ||
|
||||
$.contains(terms[excluded[i]] || [], file)) {
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if we have still a valid result we can add it
|
||||
// to the result list
|
||||
if (valid)
|
||||
regularResults.push([filenames[file], titles[file], '', null]);
|
||||
}
|
||||
|
||||
// delete unused variables in order to not waste
|
||||
// memory until list is retrieved completely
|
||||
delete filenames, titles, terms;
|
||||
|
||||
// now sort the regular results descending by title
|
||||
regularResults.sort(function(a, b) {
|
||||
var left = a[1].toLowerCase();
|
||||
var right = b[1].toLowerCase();
|
||||
return (left > right) ? -1 : ((left < right) ? 1 : 0);
|
||||
});
|
||||
|
||||
// combine all results
|
||||
var results = unimportantResults.concat(regularResults)
|
||||
.concat(objectResults).concat(importantResults);
|
||||
|
||||
// print the results
|
||||
var resultCount = results.length;
|
||||
function displayNextItem() {
|
||||
// results left, load the summary and display it
|
||||
if (results.length) {
|
||||
var item = results.pop();
|
||||
var listItem = $('<li style="display:none"></li>');
|
||||
if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') {
|
||||
// dirhtml builder
|
||||
var dirname = item[0] + '/';
|
||||
if (dirname.match(/\/index\/$/)) {
|
||||
dirname = dirname.substring(0, dirname.length-6);
|
||||
} else if (dirname == 'index/') {
|
||||
dirname = '';
|
||||
}
|
||||
listItem.append($('<a/>').attr('href',
|
||||
DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
|
||||
highlightstring + item[2]).html(item[1]));
|
||||
} else {
|
||||
// normal html builders
|
||||
listItem.append($('<a/>').attr('href',
|
||||
item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
|
||||
highlightstring + item[2]).html(item[1]));
|
||||
}
|
||||
if (item[3]) {
|
||||
listItem.append($('<span> (' + item[3] + ')</span>'));
|
||||
Search.output.append(listItem);
|
||||
listItem.slideDown(5, function() {
|
||||
displayNextItem();
|
||||
});
|
||||
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
|
||||
$.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' +
|
||||
item[0] + '.txt', function(data) {
|
||||
if (data != '') {
|
||||
listItem.append($.makeSearchSummary(data, searchterms, hlterms));
|
||||
Search.output.append(listItem);
|
||||
}
|
||||
listItem.slideDown(5, function() {
|
||||
displayNextItem();
|
||||
});
|
||||
}, "text");
|
||||
} else {
|
||||
// no source available, just display title
|
||||
Search.output.append(listItem);
|
||||
listItem.slideDown(5, function() {
|
||||
displayNextItem();
|
||||
});
|
||||
}
|
||||
}
|
||||
// search finished, update title and status message
|
||||
else {
|
||||
Search.stopPulse();
|
||||
Search.title.text(_('Search Results'));
|
||||
if (!resultCount)
|
||||
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
|
||||
else
|
||||
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
|
||||
Search.status.fadeIn(500);
|
||||
}
|
||||
}
|
||||
displayNextItem();
|
||||
},
|
||||
|
||||
performObjectSearch : function(object, otherterms) {
|
||||
var filenames = this._index.filenames;
|
||||
var objects = this._index.objects;
|
||||
var objnames = this._index.objnames;
|
||||
var titles = this._index.titles;
|
||||
|
||||
var importantResults = [];
|
||||
var objectResults = [];
|
||||
var unimportantResults = [];
|
||||
|
||||
for (var prefix in objects) {
|
||||
for (var name in objects[prefix]) {
|
||||
var fullname = (prefix ? prefix + '.' : '') + name;
|
||||
if (fullname.toLowerCase().indexOf(object) > -1) {
|
||||
var match = objects[prefix][name];
|
||||
var objname = objnames[match[1]][2];
|
||||
var title = titles[match[0]];
|
||||
// If more than one term searched for, we require other words to be
|
||||
// found in the name/title/description
|
||||
if (otherterms.length > 0) {
|
||||
var haystack = (prefix + ' ' + name + ' ' +
|
||||
objname + ' ' + title).toLowerCase();
|
||||
var allfound = true;
|
||||
for (var i = 0; i < otherterms.length; i++) {
|
||||
if (haystack.indexOf(otherterms[i]) == -1) {
|
||||
allfound = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!allfound) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
var descr = objname + _(', in ') + title;
|
||||
anchor = match[3];
|
||||
if (anchor == '')
|
||||
anchor = fullname;
|
||||
else if (anchor == '-')
|
||||
anchor = objnames[match[1]][1] + '-' + fullname;
|
||||
result = [filenames[match[0]], fullname, '#'+anchor, descr];
|
||||
switch (match[2]) {
|
||||
case 1: objectResults.push(result); break;
|
||||
case 0: importantResults.push(result); break;
|
||||
case 2: unimportantResults.push(result); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// sort results descending
|
||||
objectResults.sort(function(a, b) {
|
||||
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
|
||||
});
|
||||
|
||||
importantResults.sort(function(a, b) {
|
||||
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
|
||||
});
|
||||
|
||||
unimportantResults.sort(function(a, b) {
|
||||
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
|
||||
});
|
||||
|
||||
return [importantResults, objectResults, unimportantResults]
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
Search.init();
|
||||
});
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* small_flask.css_t
|
||||
* ~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* :copyright: Copyright 2010 by Armin Ronacher.
|
||||
* :license: Flask Design License, see LICENSE for details.
|
||||
*/
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 20px 30px;
|
||||
}
|
||||
|
||||
div.documentwrapper {
|
||||
float: none;
|
||||
background: white;
|
||||
}
|
||||
|
||||
div.sphinxsidebar {
|
||||
display: block;
|
||||
float: none;
|
||||
width: 102.5%;
|
||||
margin: 50px -30px -20px -30px;
|
||||
padding: 10px 20px;
|
||||
background: #333;
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
|
||||
div.sphinxsidebar h3 a {
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.sphinxsidebar a {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
div.sphinxsidebar p.logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.document {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
div.related {
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 10px 0 20px 0;
|
||||
}
|
||||
|
||||
div.related ul,
|
||||
div.related ul li {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.footer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.bodywrapper {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
div.body {
|
||||
min-height: 0;
|
||||
padding: 0;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
// Underscore.js 0.5.5
|
||||
// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
|
||||
// Underscore is freely distributable under the terms of the MIT license.
|
||||
// Portions of Underscore are inspired by or borrowed from Prototype.js,
|
||||
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
||||
// For all details and documentation:
|
||||
// http://documentcloud.github.com/underscore/
|
||||
(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
|
||||
a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
|
||||
var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,
|
||||
d);var e=true;b.each(a,function(f,g,h){(e=e&&c.call(d,f,g,h))||b.breakLoop()});return e};b.any=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.some))return a.some(c,d);var e=false;b.each(a,function(f,g,h){if(e=c.call(d,f,g,h))b.breakLoop()});return e};b.include=function(a,c){if(b.isArray(a))return b.indexOf(a,c)!=-1;var d=false;b.each(a,function(e){if(d=e===c)b.breakLoop()});return d};b.invoke=function(a,c){var d=b.rest(arguments,2);return b.map(a,function(e){return(c?e[c]:e).apply(e,d)})};b.pluck=
|
||||
function(a,c){return b.map(a,function(d){return d[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,
|
||||
function(e,f,g){return{value:e,criteria:c.call(d,e,f,g)}}).sort(function(e,f){e=e.criteria;f=f.criteria;return e<f?-1:e>f?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?(e=g+1):(f=g)}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return k.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=function(a,c,d){return c&&!d?k.call(a,
|
||||
0,c):a[0]};b.rest=function(a,c,d){return k.call(a,b.isUndefined(c)||d?1:c)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.select(a,function(c){return!!c})};b.flatten=function(a){return b.reduce(a,[],function(c,d){if(b.isArray(d))return c.concat(b.flatten(d));c.push(d);return c})};b.without=function(a){var c=b.rest(arguments);return b.select(a,function(d){return!b.include(c,d)})};b.uniq=function(a,c){return b.reduce(a,[],function(d,e,f){if(0==f||(c===true?b.last(d)!=e:!b.include(d,
|
||||
e)))d.push(e);return d})};b.intersect=function(a){var c=b.rest(arguments);return b.select(b.uniq(a),function(d){return b.all(c,function(e){return b.indexOf(e,d)>=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e<c;e++)d[e]=b.pluck(a,String(e));return d};b.indexOf=function(a,c){if(a.indexOf)return a.indexOf(c);for(var d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,c){if(a.lastIndexOf)return a.lastIndexOf(c);for(var d=
|
||||
a.length;d--;)if(a[d]===c)return d;return-1};b.range=function(a,c,d){var e=b.toArray(arguments),f=e.length<=1;a=f?0:e[0];c=f?e[0]:e[1];d=e[2]||1;e=Math.ceil((c-a)/d);if(e<=0)return[];e=new Array(e);f=a;for(var g=0;1;f+=d){if((d>0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)});
|
||||
return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length);
|
||||
var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false;
|
||||
if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length==
|
||||
0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&&
|
||||
a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
|
||||
" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments);
|
||||
o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})();
|
||||
|
After Width: | Height: | Size: 372 B |
|
After Width: | Height: | Size: 363 B |
@@ -0,0 +1,808 @@
|
||||
/*
|
||||
* websupport.js
|
||||
* ~~~~~~~~~~~~~
|
||||
*
|
||||
* sphinx.websupport utilties for all documentation.
|
||||
*
|
||||
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
|
||||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
$.fn.autogrow = function() {
|
||||
return this.each(function() {
|
||||
var textarea = this;
|
||||
|
||||
$.fn.autogrow.resize(textarea);
|
||||
|
||||
$(textarea)
|
||||
.focus(function() {
|
||||
textarea.interval = setInterval(function() {
|
||||
$.fn.autogrow.resize(textarea);
|
||||
}, 500);
|
||||
})
|
||||
.blur(function() {
|
||||
clearInterval(textarea.interval);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.autogrow.resize = function(textarea) {
|
||||
var lineHeight = parseInt($(textarea).css('line-height'), 10);
|
||||
var lines = textarea.value.split('\n');
|
||||
var columns = textarea.cols;
|
||||
var lineCount = 0;
|
||||
$.each(lines, function() {
|
||||
lineCount += Math.ceil(this.length / columns) || 1;
|
||||
});
|
||||
var height = lineHeight * (lineCount + 1);
|
||||
$(textarea).css('height', height);
|
||||
};
|
||||
})(jQuery);
|
||||
|
||||
(function($) {
|
||||
var comp, by;
|
||||
|
||||
function init() {
|
||||
initEvents();
|
||||
initComparator();
|
||||
}
|
||||
|
||||
function initEvents() {
|
||||
$('a.comment-close').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
hide($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.vote').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
handleVote($(this));
|
||||
});
|
||||
$('a.reply').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
openReply($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.close-reply').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
closeReply($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.sort-option').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
handleReSort($(this));
|
||||
});
|
||||
$('a.show-proposal').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
showProposal($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.hide-proposal').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
hideProposal($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.show-propose-change').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
showProposeChange($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.hide-propose-change').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
hideProposeChange($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.accept-comment').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
acceptComment($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.delete-comment').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
deleteComment($(this).attr('id').substring(2));
|
||||
});
|
||||
$('a.comment-markup').live("click", function(event) {
|
||||
event.preventDefault();
|
||||
toggleCommentMarkupBox($(this).attr('id').substring(2));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set comp, which is a comparator function used for sorting and
|
||||
* inserting comments into the list.
|
||||
*/
|
||||
function setComparator() {
|
||||
// If the first three letters are "asc", sort in ascending order
|
||||
// and remove the prefix.
|
||||
if (by.substring(0,3) == 'asc') {
|
||||
var i = by.substring(3);
|
||||
comp = function(a, b) { return a[i] - b[i]; };
|
||||
} else {
|
||||
// Otherwise sort in descending order.
|
||||
comp = function(a, b) { return b[by] - a[by]; };
|
||||
}
|
||||
|
||||
// Reset link styles and format the selected sort option.
|
||||
$('a.sel').attr('href', '#').removeClass('sel');
|
||||
$('a.by' + by).removeAttr('href').addClass('sel');
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a comp function. If the user has preferences stored in
|
||||
* the sortBy cookie, use those, otherwise use the default.
|
||||
*/
|
||||
function initComparator() {
|
||||
by = 'rating'; // Default to sort by rating.
|
||||
// If the sortBy cookie is set, use that instead.
|
||||
if (document.cookie.length > 0) {
|
||||
var start = document.cookie.indexOf('sortBy=');
|
||||
if (start != -1) {
|
||||
start = start + 7;
|
||||
var end = document.cookie.indexOf(";", start);
|
||||
if (end == -1) {
|
||||
end = document.cookie.length;
|
||||
by = unescape(document.cookie.substring(start, end));
|
||||
}
|
||||
}
|
||||
}
|
||||
setComparator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a comment div.
|
||||
*/
|
||||
function show(id) {
|
||||
$('#ao' + id).hide();
|
||||
$('#ah' + id).show();
|
||||
var context = $.extend({id: id}, opts);
|
||||
var popup = $(renderTemplate(popupTemplate, context)).hide();
|
||||
popup.find('textarea[name="proposal"]').hide();
|
||||
popup.find('a.by' + by).addClass('sel');
|
||||
var form = popup.find('#cf' + id);
|
||||
form.submit(function(event) {
|
||||
event.preventDefault();
|
||||
addComment(form);
|
||||
});
|
||||
$('#s' + id).after(popup);
|
||||
popup.slideDown('fast', function() {
|
||||
getComments(id);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide a comment div.
|
||||
*/
|
||||
function hide(id) {
|
||||
$('#ah' + id).hide();
|
||||
$('#ao' + id).show();
|
||||
var div = $('#sc' + id);
|
||||
div.slideUp('fast', function() {
|
||||
div.remove();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform an ajax request to get comments for a node
|
||||
* and insert the comments into the comments tree.
|
||||
*/
|
||||
function getComments(id) {
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: opts.getCommentsURL,
|
||||
data: {node: id},
|
||||
success: function(data, textStatus, request) {
|
||||
var ul = $('#cl' + id);
|
||||
var speed = 100;
|
||||
$('#cf' + id)
|
||||
.find('textarea[name="proposal"]')
|
||||
.data('source', data.source);
|
||||
|
||||
if (data.comments.length === 0) {
|
||||
ul.html('<li>No comments yet.</li>');
|
||||
ul.data('empty', true);
|
||||
} else {
|
||||
// If there are comments, sort them and put them in the list.
|
||||
var comments = sortComments(data.comments);
|
||||
speed = data.comments.length * 100;
|
||||
appendComments(comments, ul);
|
||||
ul.data('empty', false);
|
||||
}
|
||||
$('#cn' + id).slideUp(speed + 200);
|
||||
ul.slideDown(speed);
|
||||
},
|
||||
error: function(request, textStatus, error) {
|
||||
showError('Oops, there was a problem retrieving the comments.');
|
||||
},
|
||||
dataType: 'json'
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a comment via ajax and insert the comment into the comment tree.
|
||||
*/
|
||||
function addComment(form) {
|
||||
var node_id = form.find('input[name="node"]').val();
|
||||
var parent_id = form.find('input[name="parent"]').val();
|
||||
var text = form.find('textarea[name="comment"]').val();
|
||||
var proposal = form.find('textarea[name="proposal"]').val();
|
||||
|
||||
if (text == '') {
|
||||
showError('Please enter a comment.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable the form that is being submitted.
|
||||
form.find('textarea,input').attr('disabled', 'disabled');
|
||||
|
||||
// Send the comment to the server.
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: opts.addCommentURL,
|
||||
dataType: 'json',
|
||||
data: {
|
||||
node: node_id,
|
||||
parent: parent_id,
|
||||
text: text,
|
||||
proposal: proposal
|
||||
},
|
||||
success: function(data, textStatus, error) {
|
||||
// Reset the form.
|
||||
if (node_id) {
|
||||
hideProposeChange(node_id);
|
||||
}
|
||||
form.find('textarea')
|
||||
.val('')
|
||||
.add(form.find('input'))
|
||||
.removeAttr('disabled');
|
||||
var ul = $('#cl' + (node_id || parent_id));
|
||||
if (ul.data('empty')) {
|
||||
$(ul).empty();
|
||||
ul.data('empty', false);
|
||||
}
|
||||
insertComment(data.comment);
|
||||
var ao = $('#ao' + node_id);
|
||||
ao.find('img').attr({'src': opts.commentBrightImage});
|
||||
if (node_id) {
|
||||
// if this was a "root" comment, remove the commenting box
|
||||
// (the user can get it back by reopening the comment popup)
|
||||
$('#ca' + node_id).slideUp();
|
||||
}
|
||||
},
|
||||
error: function(request, textStatus, error) {
|
||||
form.find('textarea,input').removeAttr('disabled');
|
||||
showError('Oops, there was a problem adding the comment.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively append comments to the main comment list and children
|
||||
* lists, creating the comment tree.
|
||||
*/
|
||||
function appendComments(comments, ul) {
|
||||
$.each(comments, function() {
|
||||
var div = createCommentDiv(this);
|
||||
ul.append($(document.createElement('li')).html(div));
|
||||
appendComments(this.children, div.find('ul.comment-children'));
|
||||
// To avoid stagnating data, don't store the comments children in data.
|
||||
this.children = null;
|
||||
div.data('comment', this);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* After adding a new comment, it must be inserted in the correct
|
||||
* location in the comment tree.
|
||||
*/
|
||||
function insertComment(comment) {
|
||||
var div = createCommentDiv(comment);
|
||||
|
||||
// To avoid stagnating data, don't store the comments children in data.
|
||||
comment.children = null;
|
||||
div.data('comment', comment);
|
||||
|
||||
var ul = $('#cl' + (comment.node || comment.parent));
|
||||
var siblings = getChildren(ul);
|
||||
|
||||
var li = $(document.createElement('li'));
|
||||
li.hide();
|
||||
|
||||
// Determine where in the parents children list to insert this comment.
|
||||
for(i=0; i < siblings.length; i++) {
|
||||
if (comp(comment, siblings[i]) <= 0) {
|
||||
$('#cd' + siblings[i].id)
|
||||
.parent()
|
||||
.before(li.html(div));
|
||||
li.slideDown('fast');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If we get here, this comment rates lower than all the others,
|
||||
// or it is the only comment in the list.
|
||||
ul.append(li.html(div));
|
||||
li.slideDown('fast');
|
||||
}
|
||||
|
||||
function acceptComment(id) {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: opts.acceptCommentURL,
|
||||
data: {id: id},
|
||||
success: function(data, textStatus, request) {
|
||||
$('#cm' + id).fadeOut('fast');
|
||||
$('#cd' + id).removeClass('moderate');
|
||||
},
|
||||
error: function(request, textStatus, error) {
|
||||
showError('Oops, there was a problem accepting the comment.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function deleteComment(id) {
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: opts.deleteCommentURL,
|
||||
data: {id: id},
|
||||
success: function(data, textStatus, request) {
|
||||
var div = $('#cd' + id);
|
||||
if (data == 'delete') {
|
||||
// Moderator mode: remove the comment and all children immediately
|
||||
div.slideUp('fast', function() {
|
||||
div.remove();
|
||||
});
|
||||
return;
|
||||
}
|
||||
// User mode: only mark the comment as deleted
|
||||
div
|
||||
.find('span.user-id:first')
|
||||
.text('[deleted]').end()
|
||||
.find('div.comment-text:first')
|
||||
.text('[deleted]').end()
|
||||
.find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
|
||||
', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
|
||||
.remove();
|
||||
var comment = div.data('comment');
|
||||
comment.username = '[deleted]';
|
||||
comment.text = '[deleted]';
|
||||
div.data('comment', comment);
|
||||
},
|
||||
error: function(request, textStatus, error) {
|
||||
showError('Oops, there was a problem deleting the comment.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function showProposal(id) {
|
||||
$('#sp' + id).hide();
|
||||
$('#hp' + id).show();
|
||||
$('#pr' + id).slideDown('fast');
|
||||
}
|
||||
|
||||
function hideProposal(id) {
|
||||
$('#hp' + id).hide();
|
||||
$('#sp' + id).show();
|
||||
$('#pr' + id).slideUp('fast');
|
||||
}
|
||||
|
||||
function showProposeChange(id) {
|
||||
$('#pc' + id).hide();
|
||||
$('#hc' + id).show();
|
||||
var textarea = $('#pt' + id);
|
||||
textarea.val(textarea.data('source'));
|
||||
$.fn.autogrow.resize(textarea[0]);
|
||||
textarea.slideDown('fast');
|
||||
}
|
||||
|
||||
function hideProposeChange(id) {
|
||||
$('#hc' + id).hide();
|
||||
$('#pc' + id).show();
|
||||
var textarea = $('#pt' + id);
|
||||
textarea.val('').removeAttr('disabled');
|
||||
textarea.slideUp('fast');
|
||||
}
|
||||
|
||||
function toggleCommentMarkupBox(id) {
|
||||
$('#mb' + id).toggle();
|
||||
}
|
||||
|
||||
/** Handle when the user clicks on a sort by link. */
|
||||
function handleReSort(link) {
|
||||
var classes = link.attr('class').split(/\s+/);
|
||||
for (var i=0; i<classes.length; i++) {
|
||||
if (classes[i] != 'sort-option') {
|
||||
by = classes[i].substring(2);
|
||||
}
|
||||
}
|
||||
setComparator();
|
||||
// Save/update the sortBy cookie.
|
||||
var expiration = new Date();
|
||||
expiration.setDate(expiration.getDate() + 365);
|
||||
document.cookie= 'sortBy=' + escape(by) +
|
||||
';expires=' + expiration.toUTCString();
|
||||
$('ul.comment-ul').each(function(index, ul) {
|
||||
var comments = getChildren($(ul), true);
|
||||
comments = sortComments(comments);
|
||||
appendComments(comments, $(ul).empty());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to process a vote when a user clicks an arrow.
|
||||
*/
|
||||
function handleVote(link) {
|
||||
if (!opts.voting) {
|
||||
showError("You'll need to login to vote.");
|
||||
return;
|
||||
}
|
||||
|
||||
var id = link.attr('id');
|
||||
if (!id) {
|
||||
// Didn't click on one of the voting arrows.
|
||||
return;
|
||||
}
|
||||
// If it is an unvote, the new vote value is 0,
|
||||
// Otherwise it's 1 for an upvote, or -1 for a downvote.
|
||||
var value = 0;
|
||||
if (id.charAt(1) != 'u') {
|
||||
value = id.charAt(0) == 'u' ? 1 : -1;
|
||||
}
|
||||
// The data to be sent to the server.
|
||||
var d = {
|
||||
comment_id: id.substring(2),
|
||||
value: value
|
||||
};
|
||||
|
||||
// Swap the vote and unvote links.
|
||||
link.hide();
|
||||
$('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
|
||||
.show();
|
||||
|
||||
// The div the comment is displayed in.
|
||||
var div = $('div#cd' + d.comment_id);
|
||||
var data = div.data('comment');
|
||||
|
||||
// If this is not an unvote, and the other vote arrow has
|
||||
// already been pressed, unpress it.
|
||||
if ((d.value !== 0) && (data.vote === d.value * -1)) {
|
||||
$('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
|
||||
$('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
|
||||
}
|
||||
|
||||
// Update the comments rating in the local data.
|
||||
data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
|
||||
data.vote = d.value;
|
||||
div.data('comment', data);
|
||||
|
||||
// Change the rating text.
|
||||
div.find('.rating:first')
|
||||
.text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
|
||||
|
||||
// Send the vote information to the server.
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: opts.processVoteURL,
|
||||
data: d,
|
||||
error: function(request, textStatus, error) {
|
||||
showError('Oops, there was a problem casting that vote.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Open a reply form used to reply to an existing comment.
|
||||
*/
|
||||
function openReply(id) {
|
||||
// Swap out the reply link for the hide link
|
||||
$('#rl' + id).hide();
|
||||
$('#cr' + id).show();
|
||||
|
||||
// Add the reply li to the children ul.
|
||||
var div = $(renderTemplate(replyTemplate, {id: id})).hide();
|
||||
$('#cl' + id)
|
||||
.prepend(div)
|
||||
// Setup the submit handler for the reply form.
|
||||
.find('#rf' + id)
|
||||
.submit(function(event) {
|
||||
event.preventDefault();
|
||||
addComment($('#rf' + id));
|
||||
closeReply(id);
|
||||
})
|
||||
.find('input[type=button]')
|
||||
.click(function() {
|
||||
closeReply(id);
|
||||
});
|
||||
div.slideDown('fast', function() {
|
||||
$('#rf' + id).find('textarea').focus();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the reply form opened with openReply.
|
||||
*/
|
||||
function closeReply(id) {
|
||||
// Remove the reply div from the DOM.
|
||||
$('#rd' + id).slideUp('fast', function() {
|
||||
$(this).remove();
|
||||
});
|
||||
|
||||
// Swap out the hide link for the reply link
|
||||
$('#cr' + id).hide();
|
||||
$('#rl' + id).show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively sort a tree of comments using the comp comparator.
|
||||
*/
|
||||
function sortComments(comments) {
|
||||
comments.sort(comp);
|
||||
$.each(comments, function() {
|
||||
this.children = sortComments(this.children);
|
||||
});
|
||||
return comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the children comments from a ul. If recursive is true,
|
||||
* recursively include childrens' children.
|
||||
*/
|
||||
function getChildren(ul, recursive) {
|
||||
var children = [];
|
||||
ul.children().children("[id^='cd']")
|
||||
.each(function() {
|
||||
var comment = $(this).data('comment');
|
||||
if (recursive)
|
||||
comment.children = getChildren($(this).find('#cl' + comment.id), true);
|
||||
children.push(comment);
|
||||
});
|
||||
return children;
|
||||
}
|
||||
|
||||
/** Create a div to display a comment in. */
|
||||
function createCommentDiv(comment) {
|
||||
if (!comment.displayed && !opts.moderator) {
|
||||
return $('<div class="moderate">Thank you! Your comment will show up '
|
||||
+ 'once it is has been approved by a moderator.</div>');
|
||||
}
|
||||
// Prettify the comment rating.
|
||||
comment.pretty_rating = comment.rating + ' point' +
|
||||
(comment.rating == 1 ? '' : 's');
|
||||
// Make a class (for displaying not yet moderated comments differently)
|
||||
comment.css_class = comment.displayed ? '' : ' moderate';
|
||||
// Create a div for this comment.
|
||||
var context = $.extend({}, opts, comment);
|
||||
var div = $(renderTemplate(commentTemplate, context));
|
||||
|
||||
// If the user has voted on this comment, highlight the correct arrow.
|
||||
if (comment.vote) {
|
||||
var direction = (comment.vote == 1) ? 'u' : 'd';
|
||||
div.find('#' + direction + 'v' + comment.id).hide();
|
||||
div.find('#' + direction + 'u' + comment.id).show();
|
||||
}
|
||||
|
||||
if (opts.moderator || comment.text != '[deleted]') {
|
||||
div.find('a.reply').show();
|
||||
if (comment.proposal_diff)
|
||||
div.find('#sp' + comment.id).show();
|
||||
if (opts.moderator && !comment.displayed)
|
||||
div.find('#cm' + comment.id).show();
|
||||
if (opts.moderator || (opts.username == comment.username))
|
||||
div.find('#dc' + comment.id).show();
|
||||
}
|
||||
return div;
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple template renderer. Placeholders such as <%id%> are replaced
|
||||
* by context['id'] with items being escaped. Placeholders such as <#id#>
|
||||
* are not escaped.
|
||||
*/
|
||||
function renderTemplate(template, context) {
|
||||
var esc = $(document.createElement('div'));
|
||||
|
||||
function handle(ph, escape) {
|
||||
var cur = context;
|
||||
$.each(ph.split('.'), function() {
|
||||
cur = cur[this];
|
||||
});
|
||||
return escape ? esc.text(cur || "").html() : cur;
|
||||
}
|
||||
|
||||
return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
|
||||
return handle(arguments[2], arguments[1] == '%' ? true : false);
|
||||
});
|
||||
}
|
||||
|
||||
/** Flash an error message briefly. */
|
||||
function showError(message) {
|
||||
$(document.createElement('div')).attr({'class': 'popup-error'})
|
||||
.append($(document.createElement('div'))
|
||||
.attr({'class': 'error-message'}).text(message))
|
||||
.appendTo('body')
|
||||
.fadeIn("slow")
|
||||
.delay(2000)
|
||||
.fadeOut("slow");
|
||||
}
|
||||
|
||||
/** Add a link the user uses to open the comments popup. */
|
||||
$.fn.comment = function() {
|
||||
return this.each(function() {
|
||||
var id = $(this).attr('id').substring(1);
|
||||
var count = COMMENT_METADATA[id];
|
||||
var title = count + ' comment' + (count == 1 ? '' : 's');
|
||||
var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
|
||||
var addcls = count == 0 ? ' nocomment' : '';
|
||||
$(this)
|
||||
.append(
|
||||
$(document.createElement('a')).attr({
|
||||
href: '#',
|
||||
'class': 'sphinx-comment-open' + addcls,
|
||||
id: 'ao' + id
|
||||
})
|
||||
.append($(document.createElement('img')).attr({
|
||||
src: image,
|
||||
alt: 'comment',
|
||||
title: title
|
||||
}))
|
||||
.click(function(event) {
|
||||
event.preventDefault();
|
||||
show($(this).attr('id').substring(2));
|
||||
})
|
||||
)
|
||||
.append(
|
||||
$(document.createElement('a')).attr({
|
||||
href: '#',
|
||||
'class': 'sphinx-comment-close hidden',
|
||||
id: 'ah' + id
|
||||
})
|
||||
.append($(document.createElement('img')).attr({
|
||||
src: opts.closeCommentImage,
|
||||
alt: 'close',
|
||||
title: 'close'
|
||||
}))
|
||||
.click(function(event) {
|
||||
event.preventDefault();
|
||||
hide($(this).attr('id').substring(2));
|
||||
})
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
var opts = {
|
||||
processVoteURL: '/_process_vote',
|
||||
addCommentURL: '/_add_comment',
|
||||
getCommentsURL: '/_get_comments',
|
||||
acceptCommentURL: '/_accept_comment',
|
||||
deleteCommentURL: '/_delete_comment',
|
||||
commentImage: '/static/_static/comment.png',
|
||||
closeCommentImage: '/static/_static/comment-close.png',
|
||||
loadingImage: '/static/_static/ajax-loader.gif',
|
||||
commentBrightImage: '/static/_static/comment-bright.png',
|
||||
upArrow: '/static/_static/up.png',
|
||||
downArrow: '/static/_static/down.png',
|
||||
upArrowPressed: '/static/_static/up-pressed.png',
|
||||
downArrowPressed: '/static/_static/down-pressed.png',
|
||||
voting: false,
|
||||
moderator: false
|
||||
};
|
||||
|
||||
if (typeof COMMENT_OPTIONS != "undefined") {
|
||||
opts = jQuery.extend(opts, COMMENT_OPTIONS);
|
||||
}
|
||||
|
||||
var popupTemplate = '\
|
||||
<div class="sphinx-comments" id="sc<%id%>">\
|
||||
<p class="sort-options">\
|
||||
Sort by:\
|
||||
<a href="#" class="sort-option byrating">best rated</a>\
|
||||
<a href="#" class="sort-option byascage">newest</a>\
|
||||
<a href="#" class="sort-option byage">oldest</a>\
|
||||
</p>\
|
||||
<div class="comment-header">Comments</div>\
|
||||
<div class="comment-loading" id="cn<%id%>">\
|
||||
loading comments... <img src="<%loadingImage%>" alt="" /></div>\
|
||||
<ul id="cl<%id%>" class="comment-ul"></ul>\
|
||||
<div id="ca<%id%>">\
|
||||
<p class="add-a-comment">Add a comment\
|
||||
(<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
|
||||
<div class="comment-markup-box" id="mb<%id%>">\
|
||||
reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
|
||||
<tt>``code``</tt>, \
|
||||
code blocks: <tt>::</tt> and an indented block after blank line</div>\
|
||||
<form method="post" id="cf<%id%>" class="comment-form" action="">\
|
||||
<textarea name="comment" cols="80"></textarea>\
|
||||
<p class="propose-button">\
|
||||
<a href="#" id="pc<%id%>" class="show-propose-change">\
|
||||
Propose a change ▹\
|
||||
</a>\
|
||||
<a href="#" id="hc<%id%>" class="hide-propose-change">\
|
||||
Propose a change ▿\
|
||||
</a>\
|
||||
</p>\
|
||||
<textarea name="proposal" id="pt<%id%>" cols="80"\
|
||||
spellcheck="false"></textarea>\
|
||||
<input type="submit" value="Add comment" />\
|
||||
<input type="hidden" name="node" value="<%id%>" />\
|
||||
<input type="hidden" name="parent" value="" />\
|
||||
</form>\
|
||||
</div>\
|
||||
</div>';
|
||||
|
||||
var commentTemplate = '\
|
||||
<div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
|
||||
<div class="vote">\
|
||||
<div class="arrow">\
|
||||
<a href="#" id="uv<%id%>" class="vote" title="vote up">\
|
||||
<img src="<%upArrow%>" />\
|
||||
</a>\
|
||||
<a href="#" id="uu<%id%>" class="un vote" title="vote up">\
|
||||
<img src="<%upArrowPressed%>" />\
|
||||
</a>\
|
||||
</div>\
|
||||
<div class="arrow">\
|
||||
<a href="#" id="dv<%id%>" class="vote" title="vote down">\
|
||||
<img src="<%downArrow%>" id="da<%id%>" />\
|
||||
</a>\
|
||||
<a href="#" id="du<%id%>" class="un vote" title="vote down">\
|
||||
<img src="<%downArrowPressed%>" />\
|
||||
</a>\
|
||||
</div>\
|
||||
</div>\
|
||||
<div class="comment-content">\
|
||||
<p class="tagline comment">\
|
||||
<span class="user-id"><%username%></span>\
|
||||
<span class="rating"><%pretty_rating%></span>\
|
||||
<span class="delta"><%time.delta%></span>\
|
||||
</p>\
|
||||
<div class="comment-text comment"><#text#></div>\
|
||||
<p class="comment-opts comment">\
|
||||
<a href="#" class="reply hidden" id="rl<%id%>">reply ▹</a>\
|
||||
<a href="#" class="close-reply" id="cr<%id%>">reply ▿</a>\
|
||||
<a href="#" id="sp<%id%>" class="show-proposal">proposal ▹</a>\
|
||||
<a href="#" id="hp<%id%>" class="hide-proposal">proposal ▿</a>\
|
||||
<a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
|
||||
<span id="cm<%id%>" class="moderation hidden">\
|
||||
<a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
|
||||
</span>\
|
||||
</p>\
|
||||
<pre class="proposal" id="pr<%id%>">\
|
||||
<#proposal_diff#>\
|
||||
</pre>\
|
||||
<ul class="comment-children" id="cl<%id%>"></ul>\
|
||||
</div>\
|
||||
<div class="clearleft"></div>\
|
||||
</div>\
|
||||
</div>';
|
||||
|
||||
var replyTemplate = '\
|
||||
<li>\
|
||||
<div class="reply-div" id="rd<%id%>">\
|
||||
<form id="rf<%id%>">\
|
||||
<textarea name="comment" cols="80"></textarea>\
|
||||
<input type="submit" value="Add reply" />\
|
||||
<input type="button" value="Cancel" />\
|
||||
<input type="hidden" name="parent" value="<%id%>" />\
|
||||
<input type="hidden" name="node" value="" />\
|
||||
</form>\
|
||||
</div>\
|
||||
</li>';
|
||||
|
||||
$(document).ready(function() {
|
||||
init();
|
||||
});
|
||||
})(jQuery);
|
||||
|
||||
$(document).ready(function() {
|
||||
// add comment anchors for all paragraphs that are commentable
|
||||
$('.sphinx-has-comment').comment();
|
||||
|
||||
// highlight search words in search results
|
||||
$("div.context").each(function() {
|
||||
var params = $.getQueryParameters();
|
||||
var terms = (params.q) ? params.q[0].split(/\s+/) : [];
|
||||
var result = $(this);
|
||||
$.each(terms, function() {
|
||||
result.highlightText(this.toLowerCase(), 'highlighted');
|
||||
});
|
||||
});
|
||||
|
||||
// directly open comment window if requested
|
||||
var anchor = document.location.hash;
|
||||
if (anchor.substring(0, 9) == '#comment-') {
|
||||
$('#ao' + anchor.substring(9)).click();
|
||||
document.location.hash = '#s' + anchor.substring(9);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,153 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>krTheme Sphinx Style — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="krtheme-sphinx-style">
|
||||
<h1>krTheme Sphinx Style<a class="headerlink" href="#krtheme-sphinx-style" title="Permalink to this headline">¶</a></h1>
|
||||
<p>This repository contains sphinx styles Kenneth Reitz uses in most of
|
||||
his projects. It is a drivative of Mitsuhiko’s themes for Flask and Flask related
|
||||
projects. To use this style in your Sphinx documentation, follow
|
||||
this guide:</p>
|
||||
<ol class="arabic">
|
||||
<li><p class="first">put this folder as _themes into your docs folder. Alternatively
|
||||
you can also use git submodules to check out the contents there.</p>
|
||||
</li>
|
||||
<li><p class="first">add this to your conf.py:</p>
|
||||
<div class="highlight-python"><div class="highlight"><pre><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="s">'_themes'</span><span class="p">))</span>
|
||||
<span class="n">html_theme_path</span> <span class="o">=</span> <span class="p">[</span><span class="s">'_themes'</span><span class="p">]</span>
|
||||
<span class="n">html_theme</span> <span class="o">=</span> <span class="s">'flask'</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
<p>The following themes exist:</p>
|
||||
<dl class="docutils">
|
||||
<dt><strong>kr</strong></dt>
|
||||
<dd>the standard flask documentation theme for large projects</dd>
|
||||
<dt><strong>kr_small</strong></dt>
|
||||
<dd>small one-page theme. Intended to be used by very small addon libraries.</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p><h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/_themes/README.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,352 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Your Development Environment — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
<link rel="next" title="Virtual Environments" href="virtualenvs.html" />
|
||||
<link rel="prev" title="Linux" href="../starting/install/linux.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="virtualenvs.html" title="Virtual Environments"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="../starting/install/linux.html" title="Linux"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="your-development-environment">
|
||||
<h1>Your Development Environment<a class="headerlink" href="#your-development-environment" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="text-editors">
|
||||
<h2>Text Editors<a class="headerlink" href="#text-editors" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Just about anything which can edit plain text will work for writing Python code,
|
||||
however, using a more powerful editor may make your life a bit easier.</p>
|
||||
<div class="section" id="vim">
|
||||
<h3>VIM<a class="headerlink" href="#vim" title="Permalink to this headline">¶</a></h3>
|
||||
<p>There exist a couple of plugins and settings for the VIM editor to aid python
|
||||
development. If you only develop in Python, a good start is to set the default
|
||||
settings for indentation and linewrapping to values compliant with PEP8:</p>
|
||||
<div class="highlight-python"><pre>set textwidth=79
|
||||
set shiftwidth=4
|
||||
set tabstop=4
|
||||
set expandtab
|
||||
set softtabstop=4
|
||||
set shiftround</pre>
|
||||
</div>
|
||||
<p>With these settings newlines are inserted after 79 characters and indentation
|
||||
is set to 4 spaces per tab. If you also use VIM for other languages, there is a
|
||||
handy plugin at <a class="reference external" href="http://www.vim.org/scripts/script.php?script_id=974">indent</a>, which handles indentation settings for python source
|
||||
files.
|
||||
Additionally there is also a handy syntax plugin at <a class="reference external" href="http://www.vim.org/scripts/script.php?script_id=790">syntax</a> featuring some
|
||||
improvements over the syntax file included in VIM 6.1.</p>
|
||||
<p>These plugins supply you with a basic environment for developing in Python.
|
||||
However in order to improve the programming flow we also want to continually
|
||||
check for PEP8 compliance and check syntax. Luckily there exist <a class="reference external" href="http://pypi.python.org/pypi/pep8/">PEP8</a> and
|
||||
<a class="reference external" href="http://pypi.python.org/pypi/pyflakes/">Pyflakes</a> to do this for you. If your VIM is compiled with <cite>+python</cite> you can
|
||||
also utilize some very handy plugins to do these checks from within the editor.
|
||||
For PEP8 checking install <a class="reference external" href="https://github.com/nvie/vim-pep8">vim-pep8</a>. Now you can map the vim function
|
||||
<cite>Pep8()</cite> to any hotkey or action you want. Similarly for pyflakes you can
|
||||
install <a class="reference external" href="https://github.com/nvie/vim-pyflakes">vim-pyflakes</a>. Now you can map <cite>Pyflakes()</cite> like the PEP8 function and
|
||||
have it called quickly. Both plugins will display errors in a quickfix list and
|
||||
provide an easy way to jump to the corresponding line. A very handy setting is
|
||||
calling these functions whenever a buffer is saved. In order to do this, enter
|
||||
the following lines into your vimrc:</p>
|
||||
<div class="highlight-python"><pre>autocmd BufWritePost *.py call Pyflakes()
|
||||
autocmd BufWritePost *.py call Pep8()</pre>
|
||||
</div>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">add supertab notes</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="textmate">
|
||||
<h3>TextMate<a class="headerlink" href="#textmate" title="Permalink to this headline">¶</a></h3>
|
||||
<p>“<a class="reference external" href="http://macromates.com/">TextMate</a> brings Apple’s approach to operating systems into the world of text editors. By bridging UNIX underpinnings and GUI, TextMate cherry-picks the best of both worlds to the benefit of expert scripters and novice users alike.”</p>
|
||||
</div>
|
||||
<div class="section" id="sublime-text">
|
||||
<h3>Sublime Text<a class="headerlink" href="#sublime-text" title="Permalink to this headline">¶</a></h3>
|
||||
<p>“<a class="reference external" href="http://www.sublimetext.com/">Sublime Text</a> is a sophisticated text editor
|
||||
for code, html and prose. You’ll love the slick user interface and
|
||||
extraordinary features.”</p>
|
||||
<p>Sublime Text has excellent support for editing Python code and uses Python for
|
||||
its plugin API.</p>
|
||||
<p><a class="reference external" href="http://www.sublimetext.com/blog/articles/sublime-text-2-beta">Sublime Text 2</a> is currently in beta.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="ides">
|
||||
<h2>IDEs<a class="headerlink" href="#ides" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="pycharm-intellij-idea">
|
||||
<h3>PyCharm / IntelliJ IDEA<a class="headerlink" href="#pycharm-intellij-idea" title="Permalink to this headline">¶</a></h3>
|
||||
<p><a class="reference external" href="http://www.jetbrains.com/pycharm/">PyCharm</a> is developed by JetBrains, also known for IntelliJ IDEA. Both share the same code base and most of PyCharm’s features can be brought to IntelliJ with the free <a class="reference external" href="http://plugins.intellij.net/plugin/?id=631/">Python Plug-In</a>.</p>
|
||||
</div>
|
||||
<div class="section" id="eclipse">
|
||||
<h3>Eclipse<a class="headerlink" href="#eclipse" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The most popular Eclipse plugin for Python development is Aptana’s
|
||||
<a class="reference external" href="http://pydev.org">PyDev</a>.</p>
|
||||
</div>
|
||||
<div class="section" id="komodo-ide">
|
||||
<h3>Komodo IDE<a class="headerlink" href="#komodo-ide" title="Permalink to this headline">¶</a></h3>
|
||||
<p><a class="reference external" href="http://www.activestate.com/komodo-ide">Komodo IDE</a> is developed by ActiveState and is a commerical IDE for Windows, Mac
|
||||
and Linux.</p>
|
||||
</div>
|
||||
<div class="section" id="spyder">
|
||||
<h3>Spyder<a class="headerlink" href="#spyder" title="Permalink to this headline">¶</a></h3>
|
||||
<p><a class="reference external" href="http://code.google.com/p/spyderlib/">Spyder</a> an IDE specifically geared toward working with scientific python libraries (namely <a class="reference external" href="http://www.scipy.org/">Scipy</a>).
|
||||
Includes integration with <a class="reference external" href="http://pypi.python.org/pypi/pyflakes/">pyflakes</a>, <a class="reference external" href="http://www.logilab.org/857">pylint</a>,
|
||||
and <a class="reference external" href="http://rope.sourceforge.net/">rope</a>.</p>
|
||||
<p>Spyder is open-source (free), offers code completion, syntax highlighting, class and function browser, and object inspection.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="interpreter-tools">
|
||||
<h2>Interpreter Tools<a class="headerlink" href="#interpreter-tools" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="virtualenv">
|
||||
<h3>virtualenv<a class="headerlink" href="#virtualenv" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Virtualenv is a tool to keep the dependencies required by different projects in separate places, by creating virtual Python environments for them.
|
||||
It solves the “Project X depends on version 1.x but, Project Y needs 4.x” dilemma and keeps your global site-packages directory clean and manageable.</p>
|
||||
<p><a class="reference external" href="http://www.virtualenv.org/en/latest/index.html">virtualenv</a> creates
|
||||
a folder which contains all the necessary executables to contain the
|
||||
packages that a Python project would need. An example workflow is given.</p>
|
||||
<p>Install virtualenv:</p>
|
||||
<div class="highlight-python"><pre>$ pip install virtualenv</pre>
|
||||
</div>
|
||||
<p>Create a virtual environment for a project:</p>
|
||||
<div class="highlight-python"><pre>$ cd my_project
|
||||
$ virtualenv venv</pre>
|
||||
</div>
|
||||
<p><tt class="docutils literal"><span class="pre">virtualenv</span> <span class="pre">venv</span></tt> will create a folder in the currect directory
|
||||
which will contain the Python executable files, and a copy of the <tt class="docutils literal"><span class="pre">pip</span></tt>
|
||||
library which you can use to install other packages. The name of the
|
||||
virtual environment (in this case, it was <tt class="docutils literal"><span class="pre">venv</span></tt>) can be anything;
|
||||
omitting the name will place the files in the current directory instead.</p>
|
||||
<p>In order the start using the virtual environment, run:</p>
|
||||
<div class="highlight-python"><pre>$ source venv/bin/activate</pre>
|
||||
</div>
|
||||
<p>The name of the current virtual environment will now appear on the left
|
||||
of the prompt (e.g. <tt class="docutils literal"><span class="pre">(venv)Your-Computer:your_project</span> <span class="pre">UserName$</span></tt>) to
|
||||
let you know that it’s active. From now on, any package that you install
|
||||
using <tt class="docutils literal"><span class="pre">pip</span></tt> will be placed in the venv folder, isolated from the global
|
||||
Python installation. Install packages as usual:</p>
|
||||
<div class="highlight-python"><pre>$ pip install requests</pre>
|
||||
</div>
|
||||
<p>To stop using an environment simply type <tt class="docutils literal"><span class="pre">deactivate</span></tt>. To remove the
|
||||
environment, just remove the directory it was installed into. (In this
|
||||
case, it would be <tt class="docutils literal"><span class="pre">rm</span> <span class="pre">-rf</span> <span class="pre">venv</span></tt>).</p>
|
||||
<div class="section" id="other-notes">
|
||||
<h4>Other Notes<a class="headerlink" href="#other-notes" title="Permalink to this headline">¶</a></h4>
|
||||
<p>Running <tt class="docutils literal"><span class="pre">virtualenv</span></tt> with the option <tt class="docutils literal"><span class="pre">--no-site-packages</span></tt> will not
|
||||
include the packages that are installed globally. This can be useful
|
||||
for keeping the package list clean in case it needs to be accessed later.</p>
|
||||
<p>In order to keep your environment consistent, it’s a good idea to “freeze”
|
||||
the current state of the environment packages. To do this, run</p>
|
||||
<div class="highlight-python"><pre>$ pip freeze > requirements.txt</pre>
|
||||
</div>
|
||||
<p>This will create a <tt class="docutils literal"><span class="pre">requirements.txt</span></tt> file, which contains a simple
|
||||
list of all the packages in the current environment, and their respective
|
||||
versions. Later, when a different developer (or you, if you need to re-
|
||||
create the environment) can install the same packages, with the same
|
||||
versions by running</p>
|
||||
<div class="highlight-python"><pre>$ pip install -r requirements.txt</pre>
|
||||
</div>
|
||||
<p>This can help ensure consistency across installations, across deployments,
|
||||
and across developers.</p>
|
||||
<p>Lastly, remember to exclude the virtual environment folder from source
|
||||
control by adding it to the ignore list.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="virtualenvwrapper">
|
||||
<h3>virtualenvwrapper<a class="headerlink" href="#virtualenvwrapper" title="Permalink to this headline">¶</a></h3>
|
||||
<p><a class="reference external" href="http://pypi.python.org/pypi/virtualenvwrapper">Virtualenvwrapper</a> makes virtualenv a pleasure to use by wrapping the command line API with a nicer CLI.</p>
|
||||
<div class="highlight-python"><pre>$ pip install virtualenvwrapper</pre>
|
||||
</div>
|
||||
<p>Put this into your <cite>~/.bash_profile</cite> (Linux/Mac) file:</p>
|
||||
<div class="highlight-python"><pre>$ export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'</pre>
|
||||
</div>
|
||||
<p>This will prevent your virtualenvs from relying on your (global) site packages directory, so that they are completely separate..</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="other-tools">
|
||||
<h2>Other Tools<a class="headerlink" href="#other-tools" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="ipython">
|
||||
<h3>IPython<a class="headerlink" href="#ipython" title="Permalink to this headline">¶</a></h3>
|
||||
<p><a class="reference external" href="http://ipython.org/">IPython</a> provides a rich toolkit to help you make the most out of using Python interactively. Its main components are:</p>
|
||||
<ul class="simple">
|
||||
<li>Powerful Python shells (terminal- and Qt-based).</li>
|
||||
<li>A web-based notebook with the same core features but support for rich media, text, code, mathematical expressions and inline plots.</li>
|
||||
<li>Support for interactive data visualization and use of GUI toolkits.</li>
|
||||
<li>Flexible, embeddable interpreters to load into your own projects.</li>
|
||||
<li>Tools for high level and interactive parallel computing.</li>
|
||||
</ul>
|
||||
<div class="highlight-python"><pre>$ pip install ipython</pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="bpython">
|
||||
<h3>BPython<a class="headerlink" href="#bpython" title="Permalink to this headline">¶</a></h3>
|
||||
<p><a class="reference external" href="http://bpython-interpreter.org/">bpython</a> is an alternative interface to the Python interpreter for Unix-like operating systems. It has the following features:</p>
|
||||
<ul class="simple">
|
||||
<li>In-line syntax highlighting.</li>
|
||||
<li>Readline-like autocomplete with suggestions displayed as you type.</li>
|
||||
<li>Expected parameter list for any Python function.</li>
|
||||
<li>“Rewind” function to pop the last line of code from memory and re-evaluate.</li>
|
||||
<li>Send entered code off to a pastebin.</li>
|
||||
<li>Save entered code to a file.</li>
|
||||
<li>Auto-indentation.</li>
|
||||
<li>Python 3 support.</li>
|
||||
</ul>
|
||||
<div class="highlight-python"><pre>$ pip install bpython</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">Your Development Environment</a><ul>
|
||||
<li><a class="reference internal" href="#text-editors">Text Editors</a><ul>
|
||||
<li><a class="reference internal" href="#vim">VIM</a></li>
|
||||
<li><a class="reference internal" href="#textmate">TextMate</a></li>
|
||||
<li><a class="reference internal" href="#sublime-text">Sublime Text</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#ides">IDEs</a><ul>
|
||||
<li><a class="reference internal" href="#pycharm-intellij-idea">PyCharm / IntelliJ IDEA</a></li>
|
||||
<li><a class="reference internal" href="#eclipse">Eclipse</a></li>
|
||||
<li><a class="reference internal" href="#komodo-ide">Komodo IDE</a></li>
|
||||
<li><a class="reference internal" href="#spyder">Spyder</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#interpreter-tools">Interpreter Tools</a><ul>
|
||||
<li><a class="reference internal" href="#virtualenv">virtualenv</a><ul>
|
||||
<li><a class="reference internal" href="#other-notes">Other Notes</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#virtualenvwrapper">virtualenvwrapper</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#other-tools">Other Tools</a><ul>
|
||||
<li><a class="reference internal" href="#ipython">IPython</a></li>
|
||||
<li><a class="reference internal" href="#bpython">BPython</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="../starting/install/linux.html" title="previous chapter">Linux</a></li>
|
||||
<li>Next: <a href="virtualenvs.html" title="next chapter">Virtual Environments</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/dev/env.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,263 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Virtual Environments — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
<link rel="next" title="Structuring Your Project" href="../writing/structure.html" />
|
||||
<link rel="prev" title="Your Development Environment" href="env.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="../writing/structure.html" title="Structuring Your Project"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="env.html" title="Your Development Environment"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="virtual-environments">
|
||||
<h1>Virtual Environments<a class="headerlink" href="#virtual-environments" title="Permalink to this headline">¶</a></h1>
|
||||
<p>A Virtual Environment, put simply, is an isolated working copy of Python which
|
||||
allows you to work on a specific project without worry of affecting other
|
||||
projects.</p>
|
||||
<p>For example, you can work on a project which requires Django 1.3 while also
|
||||
maintaining a project which requires Django 1.0.</p>
|
||||
<div class="section" id="virtualenv">
|
||||
<h2>virtualenv<a class="headerlink" href="#virtualenv" title="Permalink to this headline">¶</a></h2>
|
||||
<p><a class="reference external" href="http://pypi.python.org/pypi/virtualenv">virtualenv</a> is a tool to create
|
||||
isolated Python environments.</p>
|
||||
<p>Install it via pip:</p>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> pip install virtualenv
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="section" id="basic-usage">
|
||||
<h3>Basic Usage<a class="headerlink" href="#basic-usage" title="Permalink to this headline">¶</a></h3>
|
||||
<ol class="arabic simple">
|
||||
<li>Create a virtual environment:</li>
|
||||
</ol>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> virtualenv venv
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This creates a copy of Python in whichever directory you ran the command in,
|
||||
placing it in a folder named <tt class="docutils literal"><span class="pre">venv</span></tt>.</p>
|
||||
<ol class="arabic simple" start="2">
|
||||
<li>To begin using the virtual environment, it needs to be activated:</li>
|
||||
</ol>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> <span class="nb">source </span>venv/bin/activate
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>You can then begin installing any new modules without affecting the system
|
||||
default Python or other virtual environments.</p>
|
||||
<ol class="arabic simple" start="3">
|
||||
<li>If you are done working in the virtual environment for the moment, you can
|
||||
deactivate it:</li>
|
||||
</ol>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> deactivate
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This puts you back to the system’s default Python interpreter with all its
|
||||
installed libraries.</p>
|
||||
<p>To delete a virtual environment, just delete its folder.</p>
|
||||
<p>After a while, though, you might end up with a lot of virtual environments
|
||||
littered across your system, and its possible you’ll forget their names or
|
||||
where they were placed.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="virtualenvwrapper">
|
||||
<h2>virtualenvwrapper<a class="headerlink" href="#virtualenvwrapper" title="Permalink to this headline">¶</a></h2>
|
||||
<p><a class="reference external" href="http://www.doughellmann.com/projects/virtualenvwrapper/">virtualenvwrapper</a>
|
||||
provides a set of commands which makes working with virtual environments much
|
||||
more pleasant. It also places all your virtual environments in one place.</p>
|
||||
<p>To install (make sure <strong>virtualenv</strong> is already installed):</p>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> pip install virtualenvwrapper
|
||||
<span class="gp">$</span> <span class="nb">export </span><span class="nv">WORKON_HOME</span><span class="o">=</span>~/Envs
|
||||
<span class="gp">$</span> <span class="nb">source</span> /usr/local/bin/virtualenvwrapper.sh
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>(<a class="reference external" href="http://www.doughellmann.com/docs/virtualenvwrapper/#introduction">Full virtualenvwrapper install instructions</a>.)</p>
|
||||
<div class="section" id="id3">
|
||||
<h3>Basic Usage<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h3>
|
||||
<ol class="arabic simple">
|
||||
<li>Create a virtual environment:</li>
|
||||
</ol>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> mkvirtualenv venv
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>This creates the <tt class="docutils literal"><span class="pre">venv</span></tt> folder inside <tt class="docutils literal"><span class="pre">~/Envs</span></tt>.</p>
|
||||
<ol class="arabic simple" start="2">
|
||||
<li>Work on a virtual environment:</li>
|
||||
</ol>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> workon venv
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><strong>virtualenvwrapper</strong> provides tab-completion on environment names. It really
|
||||
helps when you have a lot of environments and have trouble remembering their
|
||||
names.
|
||||
<tt class="docutils literal"><span class="pre">workon</span></tt> also deactivates whatever environment you are currently in, so you
|
||||
can quickly switch between environments.</p>
|
||||
<ol class="arabic simple" start="3">
|
||||
<li>Deactivating is still the same:</li>
|
||||
</ol>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> deactivate
|
||||
</pre></div>
|
||||
</div>
|
||||
<ol class="arabic simple" start="4">
|
||||
<li>To delete:</li>
|
||||
</ol>
|
||||
<div class="highlight-console"><div class="highlight"><pre><span class="gp">$</span> rmvirtualenv venv
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="other-useful-commands">
|
||||
<h3>Other useful commands<a class="headerlink" href="#other-useful-commands" title="Permalink to this headline">¶</a></h3>
|
||||
<dl class="docutils">
|
||||
<dt><tt class="docutils literal"><span class="pre">lsvirtualenv</span></tt></dt>
|
||||
<dd>List all of the environments.</dd>
|
||||
<dt><tt class="docutils literal"><span class="pre">cdvirtualenv</span></tt></dt>
|
||||
<dd>Navigate into the directory of the currently activated virtual environment,
|
||||
so you can browse its <tt class="docutils literal"><span class="pre">site-packages</span></tt>, for example.</dd>
|
||||
<dt><tt class="docutils literal"><span class="pre">cdsitepackages</span></tt></dt>
|
||||
<dd>Like the above, but directly into <tt class="docutils literal"><span class="pre">site-packages</span></tt> directory.</dd>
|
||||
<dt><tt class="docutils literal"><span class="pre">lssitepackages</span></tt></dt>
|
||||
<dd>Shows contents of <tt class="docutils literal"><span class="pre">site-packages</span></tt> directory.</dd>
|
||||
</dl>
|
||||
<p><a class="reference external" href="http://www.doughellmann.com/docs/virtualenvwrapper/command_ref.html#managing-environments">Full list of virtualenvwrapper commands</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">Virtual Environments</a><ul>
|
||||
<li><a class="reference internal" href="#virtualenv">virtualenv</a><ul>
|
||||
<li><a class="reference internal" href="#basic-usage">Basic Usage</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#virtualenvwrapper">virtualenvwrapper</a><ul>
|
||||
<li><a class="reference internal" href="#id3">Basic Usage</a></li>
|
||||
<li><a class="reference internal" href="#other-useful-commands">Other useful commands</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="env.html" title="previous chapter">Your Development Environment</a></li>
|
||||
<li>Next: <a href="../writing/structure.html" title="next chapter">Structuring Your Project</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/dev/virtualenvs.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,125 @@
|
||||
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Index — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="index.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="#" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li><a href="index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
|
||||
<h1 id="index">Index</h1>
|
||||
|
||||
<div class="genindex-jumpbox">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">About This Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p><h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="index.html">Documentation overview</a><ul>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2011. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project.
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,370 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>The Hitchhiker’s Guide to Python! — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="#" />
|
||||
<link rel="next" title="Picking an Interpreter" href="starting/which-python.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="starting/which-python.html" title="Picking an Interpreter"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li><a href="#">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="the-hitchhiker-s-guide-to-python">
|
||||
<h1>The Hitchhiker’s Guide to Python!<a class="headerlink" href="#the-hitchhiker-s-guide-to-python" title="Permalink to this headline">¶</a></h1>
|
||||
<p>Welcome to The Hitchhiker’s Guide to Python. <strong>DON’T PANIC!</strong></p>
|
||||
<p><strong>This guide is currently under heavy development, and is mostly a skeleton at the moment.</strong> If you’d like to help, <a class="reference external" href="https://github.com/kennethreitz/python-guide">fork us on GitHub</a>!</p>
|
||||
<p>This <em>opinionated</em> guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.</p>
|
||||
<div class="section" id="getting-started">
|
||||
<h2>Getting Started<a class="headerlink" href="#getting-started" title="Permalink to this headline">¶</a></h2>
|
||||
<p>This part of the guide focuses on setting up your Python environment.</p>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="starting/which-python.html">Picking an Interpreter</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="starting/which-python.html#x-vs-3-x">2.x vs 3.x</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="starting/which-python.html#which-python-to-support">Which Python to Support?</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="starting/which-python.html#implementations">Implementations</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<ul class="simple">
|
||||
<li>Properly Install Python</li>
|
||||
</ul>
|
||||
<blockquote>
|
||||
<div><div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="starting/install/osx.html">Mac OS X</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="starting/install/win.html">Windows</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="starting/install/linux.html">Linux</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div></blockquote>
|
||||
</div>
|
||||
<div class="section" id="development-environment">
|
||||
<h2>Development Environment<a class="headerlink" href="#development-environment" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="dev/env.html">Your Development Environment</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="dev/env.html#text-editors">Text Editors</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="dev/env.html#ides">IDEs</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="dev/env.html#interpreter-tools">Interpreter Tools</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="dev/env.html#other-tools">Other Tools</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="dev/virtualenvs.html">Virtual Environments</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="dev/virtualenvs.html#virtualenv">virtualenv</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="dev/virtualenvs.html#virtualenvwrapper">virtualenvwrapper</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="writing-great-code">
|
||||
<h2>Writing Great Code<a class="headerlink" href="#writing-great-code" title="Permalink to this headline">¶</a></h2>
|
||||
<p>This part of the guide focuses on best practices for writing Python code.</p>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="writing/structure.html">Structuring Your Project</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/structure.html#structure-is-key">Structure is Key</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/structure.html#vendorizing-dependencies">Vendorizing Dependencies</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/structure.html#runners">Runners</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/structure.html#further-reading">Further Reading</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="writing/style.html">Code Style</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/style.html#idioms">Idioms</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="writing/documentation.html">Documenting Your Code</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/documentation.html#the-basics">The Basics</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/documentation.html#other-tools">Other Tools</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="writing/tests.html">Testing Your Code</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/tests.html#the-basics">The Basics</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/tests.html#tools">Tools</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="writing/license.html">Choosing a License</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/license.html#non-restrictive">Non-Restrictive</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="writing/license.html#restrictive">Restrictive</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="scenario-guide">
|
||||
<h2>Scenario Guide<a class="headerlink" href="#scenario-guide" title="Permalink to this headline">¶</a></h2>
|
||||
<p>This part of the guide focuses on tool and module advice based on
|
||||
different scenarios.</p>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="scenarios/web.html">Web Applications</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/web.html#context">Context</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/web.html#frameworks">Frameworks</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/web.html#web-servers">Web Servers</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/web.html#wsgi-servers">WSGI Servers</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/web.html#server-best-practices">Server Best Practices</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/web.html#hosting">Hosting</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="scenarios/cli.html">Command Line Applications</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/cli.html#clint">Clint</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="scenarios/gui.html">GUI Applications</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/gui.html#qt">Qt</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/gui.html#cocoa">Cocoa</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/gui.html#wxpython">WXPython</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/gui.html#gtk">Gtk</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/gui.html#tk">Tk</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="scenarios/db.html">Databases</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/db.html#db-api">DB-API</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/db.html#sqlalchemy">SQLAlchemy</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/db.html#django-orm">Django ORM</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="scenarios/admin.html">Systems Administration</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/admin.html#fabric">Fabric</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/admin.html#chef">Chef</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/admin.html#puppet">Puppet</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/admin.html#blueprint">Blueprint</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/admin.html#buildout">Buildout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="scenarios/ci.html">Continuous Integration</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/ci.html#why">Why?</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/ci.html#jenkins">Jenkins</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/ci.html#buildbot">Buildbot</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/ci.html#mule">Mule?</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/ci.html#tox">Tox</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="scenarios/speed.html">Speed</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/speed.html#context">Context</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/speed.html#id2">C Extentions</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/speed.html#threading">Threading</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="scenarios/scientific.html">Scientific Applications</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/scientific.html#context">Context</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/scientific.html#libraries">Libraries</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="scenarios/scientific.html#resources">Resources</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="shipping-great-code">
|
||||
<h2>Shipping Great Code<a class="headerlink" href="#shipping-great-code" title="Permalink to this headline">¶</a></h2>
|
||||
<p>This part of the guide focuses on deploying your Python code.</p>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="shipping/packaging.html">Packaging Your Code</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="shipping/packaging.html#for-python-developers">For Python Developers</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="shipping/packaging.html#for-linux-distributions">For Linux Distributions</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="shipping/freezing.html">Freezing Your Code</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="shipping/freezing.html#windows">Windows</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="shipping/freezing.html#osx">OSX</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="shipping/freezing.html#linux">Linux</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="additional-notes">
|
||||
<h2>Additional Notes<a class="headerlink" href="#additional-notes" title="Permalink to this headline">¶</a></h2>
|
||||
<p>This part of the guide, which is mostly prose, begins with some
|
||||
background information about Python, then focuses on next steps.</p>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="intro/duction.html">Introduction</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/duction.html#about-this-guide">About This Guide</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="intro/community.html">The Community</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/community.html#bdfl">BDFL</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/community.html#python-software-foundation">Python Software Foundation</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/community.html#peps">PEPs</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/community.html#python-conferences">Python Conferences</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/community.html#python-user-groups">Python User Groups</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="intro/learning.html">Learning Python</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/learning.html#beginner">Beginner</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/learning.html#advanced">Advanced</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="intro/documentation.html">Documentation</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/documentation.html#official-documentation">Official Documentation</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/documentation.html#read-the-docs">Read the Docs</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="intro/news.html">News</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/news.html#planet-python">Planet Python</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/news.html#r-python">/r/python</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro/news.html#python-weekly">Python Weekly</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<hr class="docutils" />
|
||||
<p>Contibution notes and legal information are here (for those interested).</p>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="notes/contribute.html">Contribute</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/contribute.html#style-guide">Style Guide</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/contribute.html#todo-list">Todo List</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="notes/license.html">License</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="notes/styleguide.html">The Guide Style Guide</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/styleguide.html#relevancy">Relevancy</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/styleguide.html#headings">Headings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/styleguide.html#prose">Prose</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/styleguide.html#code-examples">Code Examples</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/styleguide.html#externally-linking">Externally Linking</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/styleguide.html#linking-to-sections-in-the-guide">Linking to Sections in The Guide</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/styleguide.html#notes-and-warnings">Notes and Warnings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="notes/styleguide.html#todos">TODOs</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3>Python Guide</h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
|
||||
<h3>Feedback</h3>
|
||||
<p>
|
||||
Feedback is greatly appreciated. If you have any questions, comments,
|
||||
random praise, or anonymous threats, <a href="mailto:me@kennethreitz.com">
|
||||
shoot me an email</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<h3>Useful Links</h3>
|
||||
<ul>
|
||||
<li><a href="http://python-guide.org/">The Guide Website</a></li>
|
||||
<li><a href="http://github.com/kennethreitz/python-guide">The Guide @ GitHub</a></li>
|
||||
<li><a href="http://github.com/kennethreitz/python-guide/issues">Issue Tracker</a></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="_sources/index.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,222 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>The Community — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
<link rel="next" title="Learning Python" href="learning.html" />
|
||||
<link rel="prev" title="Introduction" href="duction.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="learning.html" title="Learning Python"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="duction.html" title="Introduction"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="the-community">
|
||||
<h1>The Community<a class="headerlink" href="#the-community" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="bdfl">
|
||||
<h2>BDFL<a class="headerlink" href="#bdfl" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Guido van Rossum, the creator of Python, is often referred to as the BDFL — the Benevolent Dictator For Life.</p>
|
||||
</div>
|
||||
<div class="section" id="python-software-foundation">
|
||||
<h2>Python Software Foundation<a class="headerlink" href="#python-software-foundation" title="Permalink to this headline">¶</a></h2>
|
||||
<p>The mission of the Python Software Foundation is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers.</p>
|
||||
<p><a class="reference external" href="http://www.python.org/psf/">Learn More about the PSF</a>.</p>
|
||||
</div>
|
||||
<div class="section" id="peps">
|
||||
<h2>PEPs<a class="headerlink" href="#peps" title="Permalink to this headline">¶</a></h2>
|
||||
<p>PEPs are <em>Python Enhancement Proposals</em>. They describe changes to Python itself, or the standards around it.</p>
|
||||
<p>There are three different types of PEPs (as defined by <a class="reference external" href="http://www.python.org/dev/peps/pep-0001/">PEP1</a>):</p>
|
||||
<blockquote>
|
||||
<div><dl class="docutils">
|
||||
<dt><strong>Standards</strong></dt>
|
||||
<dd>Describes a new feature or implementation.</dd>
|
||||
<dt><strong>Informational</strong></dt>
|
||||
<dd>Describes a design issue, general guidelines, or information to the community.</dd>
|
||||
<dt><strong>Process</strong></dt>
|
||||
<dd>Describes a process related to Python.</dd>
|
||||
</dl>
|
||||
</div></blockquote>
|
||||
<div class="section" id="notable-peps">
|
||||
<h3>Notable PEPs<a class="headerlink" href="#notable-peps" title="Permalink to this headline">¶</a></h3>
|
||||
<p>There are a few PEPs that could be considered required reading:</p>
|
||||
<ul>
|
||||
<li><dl class="first docutils">
|
||||
<dt><a class="reference external" href="http://www.python.org/dev/peps/pep-0008/">PEP8</a>: The Python Style Guide.</dt>
|
||||
<dd><p class="first last">Read this. All of it. Follow it.</p>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li><dl class="first docutils">
|
||||
<dt><a class="reference external" href="http://www.python.org/dev/peps/pep-0020/">PEP20</a>: The Zen of Python.</dt>
|
||||
<dd><p class="first last">A list of 19 statements that briefly explain the philosophy behind Python.</p>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<li><dl class="first docutils">
|
||||
<dt><a class="reference external" href="http://www.python.org/dev/peps/pep-0257/">PEP257</a>: Docstring Conventions.</dt>
|
||||
<dd><p class="first last">Gives guidelines for semantics and conventions associated with Python docstrings.</p>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<p>You can read more at <a class="reference external" href="http://www.python.org/dev/peps/">The PEP Index</a>.</p>
|
||||
</div>
|
||||
<div class="section" id="submitting-a-pep">
|
||||
<h3>Submitting a PEP<a class="headerlink" href="#submitting-a-pep" title="Permalink to this headline">¶</a></h3>
|
||||
<blockquote>
|
||||
<div><p>PEPs are peer-reviewed and accepted/rejected after much discussion. Anyone can write and submit a PEP for review.</p>
|
||||
<p>Here’s an overview of the PEP acceptance workflow:</p>
|
||||
<img alt="http://www.python.org/dev/peps/pep-0001/pep-0001-1.png" src="http://www.python.org/dev/peps/pep-0001/pep-0001-1.png" />
|
||||
</div></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="python-conferences">
|
||||
<h2>Python Conferences<a class="headerlink" href="#python-conferences" title="Permalink to this headline">¶</a></h2>
|
||||
<p>The major events for the Python community are developer conferences. The two most notable conferences are PyCon, which is held in the US, and its European sibling, EuroPython.</p>
|
||||
<p>A comprehensive list of conferences is maintained <a class="reference external" href="http://www.pycon.org/">at pycon.org</a>.</p>
|
||||
</div>
|
||||
<div class="section" id="python-user-groups">
|
||||
<h2>Python User Groups<a class="headerlink" href="#python-user-groups" title="Permalink to this headline">¶</a></h2>
|
||||
<p>User Groups are where a bunch of Python developers meet to present or talk about Python topics of interest. A list of local user groups is maintained at the <a class="reference external" href="http://wiki.python.org/moin/LocalUserGroups">Python Software Foundation Wiki</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">The Community</a><ul>
|
||||
<li><a class="reference internal" href="#bdfl">BDFL</a></li>
|
||||
<li><a class="reference internal" href="#python-software-foundation">Python Software Foundation</a></li>
|
||||
<li><a class="reference internal" href="#peps">PEPs</a><ul>
|
||||
<li><a class="reference internal" href="#notable-peps">Notable PEPs</a></li>
|
||||
<li><a class="reference internal" href="#submitting-a-pep">Submitting a PEP</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#python-conferences">Python Conferences</a></li>
|
||||
<li><a class="reference internal" href="#python-user-groups">Python User Groups</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="duction.html" title="previous chapter">Introduction</a></li>
|
||||
<li>Next: <a href="learning.html" title="next chapter">Learning Python</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/intro/community.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,165 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Documentation — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
<link rel="next" title="News" href="news.html" />
|
||||
<link rel="prev" title="Learning Python" href="learning.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="news.html" title="News"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="learning.html" title="Learning Python"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="documentation">
|
||||
<h1>Documentation<a class="headerlink" href="#documentation" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="official-documentation">
|
||||
<h2>Official Documentation<a class="headerlink" href="#official-documentation" title="Permalink to this headline">¶</a></h2>
|
||||
<p>The official Python Language and Library documentation can be found here:</p>
|
||||
<blockquote>
|
||||
<div><ul class="simple">
|
||||
<li><a class="reference external" href="http://docs.python.org/">Python 2.x</a></li>
|
||||
<li><a class="reference external" href="http://docs.python.org/py3k/">Python 3.x</a></li>
|
||||
</ul>
|
||||
</div></blockquote>
|
||||
</div>
|
||||
<div class="section" id="read-the-docs">
|
||||
<h2>Read the Docs<a class="headerlink" href="#read-the-docs" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Read the Docs is a popular community project, providing a single location for all documentation of popular and even more exotic Python modules.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://readthedocs.org/">Read the Docs</a></div></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">Documentation</a><ul>
|
||||
<li><a class="reference internal" href="#official-documentation">Official Documentation</a></li>
|
||||
<li><a class="reference internal" href="#read-the-docs">Read the Docs</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="learning.html" title="previous chapter">Learning Python</a></li>
|
||||
<li>Next: <a href="news.html" title="next chapter">News</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/intro/documentation.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,182 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Introduction — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
<link rel="next" title="The Community" href="community.html" />
|
||||
<link rel="prev" title="Freezing Your Code" href="../shipping/freezing.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="community.html" title="The Community"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="../shipping/freezing.html" title="Freezing Your Code"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="introduction">
|
||||
<h1>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">write a general blurb introducing the Python language</p>
|
||||
</div>
|
||||
<div class="section" id="about-this-guide">
|
||||
<span id="about-ref"></span><h2>About This Guide<a class="headerlink" href="#about-this-guide" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="purpose">
|
||||
<h3>Purpose<a class="headerlink" href="#purpose" title="Permalink to this headline">¶</a></h3>
|
||||
<p>The Hitchhiker’s Guide to Python exists to provide both novice and expert
|
||||
Python developers a best-practice handbook to the installation, configuration,
|
||||
and usage of Python on a daily basis.</p>
|
||||
</div>
|
||||
<div class="section" id="by-the-community">
|
||||
<h3>By the Community<a class="headerlink" href="#by-the-community" title="Permalink to this headline">¶</a></h3>
|
||||
<p>This guide is architected and maintained by <a class="reference external" href="https://github.com/kennethreitz">Kenneth Reitz</a> in an open fashion. This is a
|
||||
community-driven effort that serves one purpose: to serve the community.</p>
|
||||
</div>
|
||||
<div class="section" id="for-the-community">
|
||||
<h3>For the Community<a class="headerlink" href="#for-the-community" title="Permalink to this headline">¶</a></h3>
|
||||
<p>All contributions to the Guide are welcome, from Pythonistas of all levels.
|
||||
If you think there’s a gap in what the Guide covers, fork the Guide on
|
||||
GitHub and submit a pull request. Contributions are welcome from everyone,
|
||||
whether they’re an old hand or a first-time Pythonista, and the authors to
|
||||
the Guide will gladly help if you have any questions about the
|
||||
appropriateness, completeness, or accuracy of a contribution.</p>
|
||||
<p>To get started working on The Hitchhiker’s Guide, see
|
||||
the <a class="reference internal" href="../notes/contribute.html"><em>Contribute</em></a> page.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">Introduction</a><ul>
|
||||
<li><a class="reference internal" href="#about-this-guide">About This Guide</a><ul>
|
||||
<li><a class="reference internal" href="#purpose">Purpose</a></li>
|
||||
<li><a class="reference internal" href="#by-the-community">By the Community</a></li>
|
||||
<li><a class="reference internal" href="#for-the-community">For the Community</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="../shipping/freezing.html" title="previous chapter">Freezing Your Code</a></li>
|
||||
<li>Next: <a href="community.html" title="next chapter">The Community</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/intro/duction.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,219 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Learning Python — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
<link rel="next" title="Documentation" href="documentation.html" />
|
||||
<link rel="prev" title="The Community" href="community.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="documentation.html" title="Documentation"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="community.html" title="The Community"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="learning-python">
|
||||
<h1>Learning Python<a class="headerlink" href="#learning-python" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="beginner">
|
||||
<h2>Beginner<a class="headerlink" href="#beginner" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="learn-python-interactive-tutorial">
|
||||
<h3>Learn Python Interactive Tutorial<a class="headerlink" href="#learn-python-interactive-tutorial" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Learnpython.org is an easy non-intimidating way to get introduced to python. The website takes the same approach used on the popular <a class="reference external" href="http://tryruby.org/">Try Ruby</a> website, it has an interactive python interpreter built into the site that allows you to go through the lessons without having to install Python locally.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://www.learnpython.org/">Learn Python</a></div></blockquote>
|
||||
</div>
|
||||
<div class="section" id="learn-python-the-hard-way">
|
||||
<h3>Learn Python the Hard Way<a class="headerlink" href="#learn-python-the-hard-way" title="Permalink to this headline">¶</a></h3>
|
||||
<p>This is an excellent beginner programmer’s guide to Python. It covers “hello world” from the console to the web.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://learnpythonthehardway.org/book/">Learn Python the Hard Way</a></div></blockquote>
|
||||
</div>
|
||||
<div class="section" id="crash-into-python">
|
||||
<h3>Crash into Python<a class="headerlink" href="#crash-into-python" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Also known as <em>Python for Programmers with 3 Hours</em>, this guide gives experienced developers from other languages a crash course on Python.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://stephensugden.com/crash_into_python/">Crash into Python</a></div></blockquote>
|
||||
</div>
|
||||
<div class="section" id="dive-into-python-3">
|
||||
<h3>Dive Into Python 3<a class="headerlink" href="#dive-into-python-3" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Dive Into Python 3 is a good book for those ready to jump in to Python 3. It’s a
|
||||
good read if you are moving from Python 2 to 3 or if you already have some
|
||||
experience programming in another language.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://diveintopython3.ep.io/">Dive Into Python 3</a></div></blockquote>
|
||||
</div>
|
||||
<div class="section" id="think-python-how-to-think-like-a-computer-scientist">
|
||||
<h3>Think Python: How to Think Like a Computer Scientist<a class="headerlink" href="#think-python-how-to-think-like-a-computer-scientist" title="Permalink to this headline">¶</a></h3>
|
||||
<p>Think Python attempts to give an introduction to basic concepts in computer science through the
|
||||
use of the python language. The focus was to create a book with plenty of exercises, minimal jargon and
|
||||
a section in each chapter devoted to the subject of debugging.</p>
|
||||
<p>While exploring the various features available in the python language the author weaves in various design
|
||||
patterns and best practices.</p>
|
||||
<p>The book also includes several case studies which have the reader explore the topics discussed in the book
|
||||
in greater detail by applying those topics to real-world examples. Case studies include assignments in GUI
|
||||
and Markov Analysis.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://greenteapress.com/thinkpython/html/index.html">Think Python</a></div></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="advanced">
|
||||
<h2>Advanced<a class="headerlink" href="#advanced" title="Permalink to this headline">¶</a></h2>
|
||||
<div class="section" id="pro-python">
|
||||
<h3>Pro Python<a class="headerlink" href="#pro-python" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about <a class="reference external" href="http://propython.com/">Pro Python</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="expert-python-programming">
|
||||
<h3>Expert Python Programming<a class="headerlink" href="#expert-python-programming" title="Permalink to this headline">¶</a></h3>
|
||||
<div class="admonition-todo admonition" id="index-1">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about <a class="reference external" href="http://www.packtpub.com/expert-python-programming/book">Expert Python Programming</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">Learning Python</a><ul>
|
||||
<li><a class="reference internal" href="#beginner">Beginner</a><ul>
|
||||
<li><a class="reference internal" href="#learn-python-interactive-tutorial">Learn Python Interactive Tutorial</a></li>
|
||||
<li><a class="reference internal" href="#learn-python-the-hard-way">Learn Python the Hard Way</a></li>
|
||||
<li><a class="reference internal" href="#crash-into-python">Crash into Python</a></li>
|
||||
<li><a class="reference internal" href="#dive-into-python-3">Dive Into Python 3</a></li>
|
||||
<li><a class="reference internal" href="#think-python-how-to-think-like-a-computer-scientist">Think Python: How to Think Like a Computer Scientist</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#advanced">Advanced</a><ul>
|
||||
<li><a class="reference internal" href="#pro-python">Pro Python</a></li>
|
||||
<li><a class="reference internal" href="#expert-python-programming">Expert Python Programming</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="community.html" title="previous chapter">The Community</a></li>
|
||||
<li>Next: <a href="documentation.html" title="next chapter">Documentation</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/intro/learning.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,170 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>News — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
<link rel="next" title="Contribute" href="../notes/contribute.html" />
|
||||
<link rel="prev" title="Documentation" href="documentation.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="../notes/contribute.html" title="Contribute"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="documentation.html" title="Documentation"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="news">
|
||||
<h1>News<a class="headerlink" href="#news" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="planet-python">
|
||||
<h2>Planet Python<a class="headerlink" href="#planet-python" title="Permalink to this headline">¶</a></h2>
|
||||
<p>This is an aggregate of Python news from a growing number of developers.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://planet.python.org">Planet Python</a></div></blockquote>
|
||||
</div>
|
||||
<div class="section" id="r-python">
|
||||
<h2>/r/python<a class="headerlink" href="#r-python" title="Permalink to this headline">¶</a></h2>
|
||||
<p>/r/python is the Reddit Python community where users contribute and vote on
|
||||
Python-related news.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://reddit.com/r/python">/r/python</a></div></blockquote>
|
||||
</div>
|
||||
<div class="section" id="python-weekly">
|
||||
<h2>Python Weekly<a class="headerlink" href="#python-weekly" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Python Weekly is a free weekly newsletter featuring curated news, articles,
|
||||
new releases, jobs, etc. related to Python.</p>
|
||||
<blockquote>
|
||||
<div><a class="reference external" href="http://www.pythonweekly.com/">Python Weekly</a></div></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">News</a><ul>
|
||||
<li><a class="reference internal" href="#planet-python">Planet Python</a></li>
|
||||
<li><a class="reference internal" href="#r-python">/r/python</a></li>
|
||||
<li><a class="reference internal" href="#python-weekly">Python Weekly</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="documentation.html" title="previous chapter">Documentation</a></li>
|
||||
<li>Next: <a href="../notes/contribute.html" title="next chapter">Contribute</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/intro/news.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,272 @@
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Contribute — pythonguide 0.0.1 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="../_static/flasky.css" type="text/css" />
|
||||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '../',
|
||||
VERSION: '0.0.1',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="../_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="../_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="../_static/doctools.js"></script>
|
||||
<link rel="top" title="pythonguide 0.0.1 documentation" href="../index.html" />
|
||||
<link rel="next" title="License" href="license.html" />
|
||||
<link rel="prev" title="News" href="../intro/news.html" />
|
||||
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="related">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="../genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="license.html" title="License"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="right" >
|
||||
<a href="../intro/news.html" title="News"
|
||||
accesskey="P">previous</a> |</li>
|
||||
<li><a href="../index.html">pythonguide 0.0.1 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body">
|
||||
|
||||
<div class="section" id="contribute">
|
||||
<h1>Contribute<a class="headerlink" href="#contribute" title="Permalink to this headline">¶</a></h1>
|
||||
<p>Python-guide is under active development, and contributors are welcome.</p>
|
||||
<p>If you have a feature request, suggestion, or bug report, please open a new
|
||||
issue on <a class="reference external" href="http://github.com/kennethreitz/python-guide/">GitHub</a>. To submit patches, please send a pull request on <a class="reference external" href="http://github.com/kennethreitz/python-guide/">GitHub</a>.
|
||||
Once your changes get merged back in, you’ll automatically be added to the
|
||||
<a class="reference external" href="https://github.com/kennethreitz/python-guide/contributors">Contributors List</a>.</p>
|
||||
<div class="section" id="style-guide">
|
||||
<h2>Style Guide<a class="headerlink" href="#style-guide" title="Permalink to this headline">¶</a></h2>
|
||||
<p>For all contributions, please follow the <a class="reference internal" href="styleguide.html#guide-style-guide"><em>The Guide Style Guide</em></a>.</p>
|
||||
</div>
|
||||
<div class="section" id="todo-list">
|
||||
<span id="todo-list-ref"></span><h2>Todo List<a class="headerlink" href="#todo-list" title="Permalink to this headline">¶</a></h2>
|
||||
<p>If you’d like to contribute, there’s plenty to do. Here’s a short <a class="reference external" href="https://github.com/kennethreitz/python-guide/blob/master/TODO.rst">todo</a> list.</p>
|
||||
<blockquote>
|
||||
<div><ul class="simple">
|
||||
<li>Establish “use this” vs “alternatives are....” recommendations</li>
|
||||
</ul>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">add supertab notes</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../dev/env.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/dev/env.rst, line 58.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">write a general blurb introducing the Python language</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../intro/duction.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/intro/duction.rst, line 4.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about <a class="reference external" href="http://propython.com/">Pro Python</a></p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../intro/learning.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/intro/learning.rst, line 62.)</p>
|
||||
<div class="admonition-todo admonition" id="index-1">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about <a class="reference external" href="http://www.packtpub.com/expert-python-programming/book">Expert Python Programming</a></p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../intro/learning.html#index-1"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/intro/learning.rst, line 67.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Determine License</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="license.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/notes/license.rst, line 4.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about Chef</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/admin.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/admin.rst, line 72.)</p>
|
||||
<div class="admonition-todo admonition" id="index-1">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about Puppet</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/admin.html#index-1"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/admin.rst, line 77.)</p>
|
||||
<div class="admonition-todo admonition" id="index-2">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about Blueprint</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/admin.html#index-2"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/admin.rst, line 82.)</p>
|
||||
<div class="admonition-todo admonition" id="index-3">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about Buildout</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/admin.html#index-3"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/admin.rst, line 87.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about Mule</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/ci.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/ci.rst, line 27.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Explain “Command Line Applications”</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/cli.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/cli.rst, line 4.)</p>
|
||||
<div class="admonition-todo admonition" id="index-1">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write about Clint</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/cli.html#index-1"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/cli.rst, line 9.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Explain Django ORM</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/db.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/db.rst, line 28.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">write about matplotlib.</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/scientific.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/scientific.rst, line 43.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Explain Pyramid</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../scenarios/web.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/scenarios/web.rst, line 78.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Fill in “Freezing Your Code” stub</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../shipping/freezing.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/shipping/freezing.rst, line 14.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write introduction for “Packaging Your Code”</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../shipping/packaging.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/shipping/packaging.rst, line 6.)</p>
|
||||
<div class="admonition-todo admonition" id="index-1">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Fill in “For Linux Distributions” packaging stub</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../shipping/packaging.html#index-1"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/shipping/packaging.rst, line 63.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Write “Building From Source”</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../starting/installation.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/starting/installation.rst, line 40.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Fill in License stub</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../writing/license.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/writing/license.rst, line 7.)</p>
|
||||
<div class="admonition-todo admonition" id="index-0">
|
||||
<p class="first admonition-title">Todo</p>
|
||||
<p class="last">Fill in “Structuring Your Project” stub</p>
|
||||
</div>
|
||||
<p class="todo-source">(The <a class="reference internal" href="../writing/structure.html#index-0"><em>original entry</em></a> is located in /Users/kreitz/repos/public/python-guide/docs/writing/structure.rst, line 6.)</p>
|
||||
</div></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar">
|
||||
<div class="sphinxsidebarwrapper"><h3><a href="http://python-guide.org">Python Guide</a></h3>
|
||||
<p>
|
||||
This opinionated guide exists to provide both novice and expert Python developers a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.
|
||||
</p>
|
||||
<h3><a href="../index.html">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">Contribute</a><ul>
|
||||
<li><a class="reference internal" href="#style-guide">Style Guide</a></li>
|
||||
<li><a class="reference internal" href="#todo-list">Todo List</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Related Topics</h3>
|
||||
<ul>
|
||||
<li><a href="../index.html">Documentation overview</a><ul>
|
||||
<li>Previous: <a href="../intro/news.html" title="previous chapter">News</a></li>
|
||||
<li>Next: <a href="license.html" title="next chapter">License</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="../_sources/notes/contribute.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
<div id="searchbox" style="display: none">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="../search.html" method="get">
|
||||
<input type="text" name="q" />
|
||||
<input type="submit" value="Go" />
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
<p class="searchtip" style="font-size: 90%">
|
||||
Enter search terms or a module, class or function name.
|
||||
</p>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
© Copyright 2012. A <a href="http://kennethreitz.com/pages/open-projects.html">Kenneth Reitz</a> Project. <a href="http://creativecommons.org/licenses/by-sa/3.0/"> Creative Commons Share-Alike 3.0</a>..
|
||||
</div>
|
||||
<a href="https://github.com/kennethreitz/python-guide" class="github">
|
||||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
|
||||
</a>
|
||||
|
||||
<script type="text/javascript" src="//www.hellobar.com/hellobar.js"></script>
|
||||
<script type="text/javascript">
|
||||
new HelloBar(36402,48802);
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq2 = _gaq2 || [];
|
||||
_gaq2.push(['_setAccount', 'UA-8742933-10']);
|
||||
_gaq2.push(['_setDomainName', 'none']);
|
||||
_gaq2.push(['_setAllowLinker', true]);
|
||||
_gaq2.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga2 = document.createElement('script'); ga.type = 'text/javascript'; ga2.async = true;
|
||||
ga2.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga2, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var t = document.createElement('script');
|
||||
t.type = 'text/javascript';
|
||||
t.async = true;
|
||||
t.id = 'gauges-tracker';
|
||||
t.setAttribute('data-site-id',
|
||||
'4ddc1cfaf5a1f50fcc000001');
|
||||
t.src = '//secure.gaug.es/track.js';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(t, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||