cloud_sptheme-1.8.0/0000755000175000017500000000000013014372770015505 5ustar biscuitbiscuit00000000000000cloud_sptheme-1.8.0/docs/0000755000175000017500000000000013014372770016435 5ustar biscuitbiscuit00000000000000cloud_sptheme-1.8.0/docs/index.rst0000644000175000017500000000624613014230254020274 0ustar biscuitbiscuit00000000000000=============================================== The Cloud Sphinx Theme =============================================== This is release |release| of a small Python package named :mod:`!cloud_sptheme`. It contains a `Sphinx `_ theme named "Cloud", and some related Sphinx extensions. Cloud and its extensions are primarily oriented towards generating html documentation for Python libraries. It provides numerous small enhancements to make the html documentation html more interactive, improve the layout on mobile devices, and other enhancements. Contents ======== .. rst-class:: floater .. seealso:: :ref:`What's new in v1.7 ` Themes ------ :doc:`Cloud Sphinx Theme ` the main Sphinx theme provided by this package, and used by this documentation. Extensions ---------- The following Sphinx extensions provide features used by the Cloud theme, and should be enabled for most documentation that uses it: :mod:`cloud_sptheme.ext.index_styling` Adds additional css styling classes to the index page. :mod:`cloud_sptheme.ext.relbar_toc` Adds a TOC link to the top navigation controls. Generic Extensions ------------------ This package also provides a few extra Sphinx extensions which may be useful when documenting Python projects; and should be theme-agnostic: :mod:`cloud_sptheme.ext.autodoc_sections` Patches the :mod:`sphinx.ext.autodoc` to handle RST section headers inside docstrings. :mod:`cloud_sptheme.ext.autoattribute_search_bases` Patches :mod:`sphinx.ext.autodoc` so that ``.. autoattribute::`` will also search parent classes for attribute docstrings. :mod:`cloud_sptheme.ext.docfield_markup` Patches Sphinx to permit tilde-prefixes markup such as ``:raises ~myapp.MyException:`` :mod:`cloud_sptheme.ext.issue_tracker` Adds a special ``:issue:`` role for quickly linking to your project's issue tracker. :mod:`cloud_sptheme.ext.escaped_samp_literals` Patches Sphinx to permit escaped ``{}`` characters within a ``:samp:`` role. :mod:`cloud_sptheme.ext.page_only` Directive that allows entire pages to be conditionally omitted from a build, similar to ``.. only::``. :mod:`cloud_sptheme.ext.role_index` Generates a "roleindex.json" of all document and cross-references, to help integrate sphinx documentation into a web application's context-aware help. :mod:`cloud_sptheme.ext.table_styling` Enhances ``.. table`` directive to support per-column text alignment and other layout features. Reference --------- :doc:`install` requirements and installations instructions :doc:`history` history of current and past releases Online Resources ================ .. rst-class:: html-plain-table ====================== =================================================== Homepage: ``_ Online Docs: ``_ Download & PyPI: ``_ ====================== =================================================== cloud_sptheme-1.8.0/docs/history.rst0000644000175000017500000000006512214647251020671 0ustar biscuitbiscuit00000000000000.. index:: cloud; changelog .. include:: ../CHANGES cloud_sptheme-1.8.0/docs/copyright.rst0000644000175000017500000000006312214647251021176 0ustar biscuitbiscuit00000000000000.. index:: cloud; license .. include:: ../LICENSE cloud_sptheme-1.8.0/docs/conf.py0000644000175000017500000002202313014222170017717 0ustar biscuitbiscuit00000000000000# -*- coding: utf-8 -*- """ Sphinx configuration file for the cloud_sptheme documentation. This file is execfile()d with the current directory set to its containing dir. Note that not all possible configuration values are present in this autogenerated file. All configuration values have a default; values that are commented out serve to show the default. """ #============================================================================= # environment setup #============================================================================= import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. ##sys.path.insert(0, os.path.abspath('.')) # make sure root of source dir in sys.path sys.path.insert(0, os.path.abspath(os.pardir)) #============================================================================= # imports #============================================================================= # import cloud_sptheme for themes, etc import cloud_sptheme as csp #============================================================================= # General configuration #============================================================================= # If your documentation needs a minimal Sphinx version, state it here. needs_sphinx = '1.4' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ # standard sphinx extensions 'sphinx.ext.autodoc', 'sphinx.ext.todo', # cloud's extensions 'cloud_sptheme.ext.autodoc_sections', 'cloud_sptheme.ext.relbar_toc', 'cloud_sptheme.ext.escaped_samp_literals', 'cloud_sptheme.ext.issue_tracker', 'cloud_sptheme.ext.table_styling', 'cloud_sptheme.ext.role_index', # NOTE: used only to provide example role index ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. source_encoding = 'utf-8' # The master toctree document. master_doc = 'contents' # The frontpage document. index_doc = 'index' # General information about the project. project = "Cloud Sphinx Theme" author = "Assurance Technologies, LLC" copyright = "2010-2012, " + author # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # release: The full version, including alpha/beta/rc tags. # version: The short X.Y version. from cloud_sptheme import __version__ as release version = csp.get_version(release) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. ##language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: ##today = '' # Else, today_fmt is used as the format for a strftime call. ##today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [ # may revise/remove this "lib/cloud_sptheme.make_helper.rst", ] # The reST default role (used for this markup: `text`) to use for all documents. ##default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). ##add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. ##show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. modindex_common_prefix = [ "cloud_sptheme." ] #============================================================================= # Options for all output #============================================================================= todo_include_todos = True keep_warnings = True issue_tracker_url = "bb:ecollins/cloud_sptheme" #============================================================================= # Options for HTML output #============================================================================= # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = os.environ.get("SPHINX_THEME") or 'cloud' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = {} if csp.is_cloud_theme(html_theme): html_theme_options.update( roottarget=index_doc, borderless_decor=True, ) # Add any paths that contain custom themes here, relative to this directory. html_theme_path = [csp.get_theme_dir()] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". html_title = "%s v%s Documentation" % (project, release) # A shorter title for the navigation bar. Default is the same as html_title. html_short_title = "%s %s Documentation" % (project, version) # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = os.path.join("_static", "masthead.png") # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. ##html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. ##html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. html_use_smartypants = True # Custom sidebar templates, maps document names to template names. ##html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. ##html_additional_pages = {} # If false, no module index is generated. ##html_domain_indices = True # If false, no index is generated. ##html_use_index = True # If true, the index is split into individual pages for each letter. ##html_split_index = False # If true, links to the reST sources are added to the pages. ##html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. ##html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. ##html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. ##html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). ##html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = project + 'Doc' #============================================================================= # Options for LaTeX output #============================================================================= # The paper size ('letter' or 'a4'). ##latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). ##latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ (index_doc, project + '.tex', project + ' Documentation', author, 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. ##latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. ##latex_use_parts = False # If true, show page references after internal links. ##latex_show_pagerefs = False # If true, show URL addresses after external links. ##latex_show_urls = False # Additional stuff for the LaTeX preamble. ##latex_preamble = '' # Documents to append as an appendix to all manuals. ##latex_appendices = [] # If false, no module index is generated. ##latex_domain_indices = True #============================================================================= # Options for manual page output #============================================================================= # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (index_doc, project, project + ' Documentation', [author], 1) ] #============================================================================= # EOF #============================================================================= cloud_sptheme-1.8.0/docs/lib/0000755000175000017500000000000013014372770017203 5ustar biscuitbiscuit00000000000000cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.relbar_toc.rst0000644000175000017500000000127212444410521025475 0ustar biscuitbiscuit00000000000000================================================================= :mod:`cloud_sptheme.ext.relbar_toc` - adds TOC entry to relbar ================================================================= .. module:: cloud_sptheme.ext.relbar_toc :synopsis: adds TOC entry to right side of relbar Overview ======== This Sphinx extension automatically inserts a Table Of Contents entry into the navigation bar (``relbar``) at the top and bottom of all pages; similar to the old python documentation format. This is mainly useful when the title link in the navigation bar has been redirected to page other than Table Of Contents (such as allowed by the ``roottarget`` option of the :doc:`/cloud_theme`). cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.index_styling.rst0000644000175000017500000000222312701773040026242 0ustar biscuitbiscuit00000000000000========================================================================== :mod:`cloud_sptheme.ext.index_styling` - improves css styling for genindex ========================================================================== .. module:: cloud_sptheme.ext.index_styling :synopsis: adds additional css styling to general index Overview ======== This Sphinx extension intercepts & modifies the general index data before it is rendered to html, adding some additional css classes to help Sphinx themes (e.g. :doc:`/cloud_theme`) provide additional per-type styling for index entries. Internals ========= This extension adds the following css classes to ``genindex.html``: * For all entries referencing an ``attribute``, ``method``, ``class``, ``function``, or ``module``: - The text containing the type of the entry (e.g. ``attribute`` or ``method``) is wrapped in a :samp:`...` tag. - If the entry contains a location (e.g. ``myclass in module myapp``), the ``myapp`` portion is wrapped in a ``...`` tag. * Entries which don't fit into one of the above categories are not modified. cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.rst0000644000175000017500000000063312447601466022600 0ustar biscuitbiscuit00000000000000=================================================================================== :mod:`cloud_sptheme` - helper functions =================================================================================== .. module:: cloud_sptheme :synopsis: helper functions The main :mod:`!cloud_sptheme` module contains the following helper functions: .. autofunction:: get_theme_dir .. autofunction:: get_version cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.docfield_markup.rst0000644000175000017500000000134213014230271026503 0ustar biscuitbiscuit00000000000000===================================================================================== :mod:`cloud_sptheme.ext.docfield_markup` - support ``~mod.class`` markup in docfields ===================================================================================== .. module:: cloud_sptheme.ext.docfield_markup :synopsis: support ``~mod.class`` markup in docfields .. versionadded:: 1.7 Overview ======== Currently, Sphinx docfields only allow full type references (e.g. ``:raises myapp.MyException:``). This extension monkeypatches Sphinx so that the tilde prefix can be used (e.g. ``:raises ~myapp.MyException:``), resulting in a proper crosslink, with only the final class name being displayed; much like the various reference roles. cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.escaped_samp_literals.rst0000644000175000017500000000232312444410521027702 0ustar biscuitbiscuit00000000000000================================================================================================== :mod:`cloud_sptheme.ext.escaped_samp_literals` - permits escaped bracket characters in *samp* role ================================================================================================== .. module:: cloud_sptheme.ext.escaped_samp_literals :synopsis: support escaped bracket characters in SAMP role Overview ======== This extension modifies how ``:samp:`` literals are parsed, replacing the default Sphinx parser with an alternate one that allows embedding literal ``{`` and ``}`` characters within the content, as well providing stricter input validation. To embed a literal ``{``, just use a double-backslash, e.g:: :samp:`this is a {variable}, these are a literal \\{ and \\}` ... and it will be rendered as: :samp:`this is a {variable}, these are a literal \\{ and \\}` Internals ========= .. note:: This feature has been submitted to the Sphinx `issue tracker `_. If and when the patch is accepted (or an alternative is added to Sphinx), this extension will be deprecated and eventually removed. cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.issue_tracker.rst0000644000175000017500000000407012444572160026233 0ustar biscuitbiscuit00000000000000=================================================================================== :mod:`cloud_sptheme.ext.issue_tracker` - support for `issue` text role =================================================================================== .. module:: cloud_sptheme.ext.issue_tracker :synopsis: quickly create links to project's issue tracker with ``:issue:`` role Overview ======== This Sphinx extension adds a new text role, ``:issue:``, which will automatically be converted into links to your project's issue tracker. Issue roles should have the format ``:issue:`5``` or ``:issue:`Custom Title <5>```. They will be converted into external references to the appropriate issue number in your project's issue tracker. Configuration ============= This extension reads the following ``conf.py`` options: ``issue_tracker_url`` This should provide a path to the project's issue tracker. It should have one of the following formats: * :samp:`bb:{user}/{project}` -- link to BitBucket issue tracker for specified project * :samp:`gh:{user}/{project}` -- link to GitHub issue tracker for specified project * :samp:`gc:{project}` -- link to Google Code issue tracker for specified project * string containing arbitrary url, the substring ``{issue}`` will be replaced with the relevant issue number, and ``{title}`` with the link title. If this option is not specified, all issue references will be converted into labels instead of links. ``issue_tracker_title`` Template for generating default title for references that only specify the issue number (e.g. ``:issue:`5```). This defaults to ``Issue {issue}``. ``conf.py`` Usage Example:: # add to list of extensions: extensions = [ ... 'cloud_sptheme.ext.issue_tracker', ] ... # set path to issue tracker: issue_tracker_url = "https://example.org/tracker/{issue}" Internals ========= .. note:: For themeing purposes, the generated ```` tag will have an ``issue`` CSS class added to it. cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.table_styling.rst0000644000175000017500000001443512444572160026236 0ustar biscuitbiscuit00000000000000=========================================================================== :mod:`cloud_sptheme.ext.table_styling` - adds directives for styling tables =========================================================================== .. module:: cloud_sptheme.ext.table_styling :synopsis: adds directives for styling tables Overview ======== This Sphinx extension replaces the default ``.. table::`` directive with a custom one, that supports a number of extra options for controlling table layout on a per-column basis. For example, the following snippet specifies relative widths for the three columns, changes the text alignment for each column, disables text-wrapping for the third column, and inserts dividers between the columns:: .. table:: Optional Caption :widths: 3 2 1 :column-alignment: left center right :column-wrapping: true true false :column-dividers: none single double single =========== =========== =========== Width 50% Width 33% Width 16% =========== =========== =========== Line 1 This text This text should wrap will always onto be one line. multiple lines. Line 2 Centered. Right-Aligned. Line 3 Centered Right-Aligned Again. Again. =========== =========== =========== This will then result in the following table: .. table:: Optional Caption :widths: 3 2 1 :column-alignment: left center right :column-wrapping: yes yes no :column-dividers: none single double single =========== =========== =========== Width 50% Width 33% Width 16% =========== =========== =========== Line 1 This text This text should wrap will always onto be one line. multiple lines. Line 2 Centered. Right-Aligned. Line 3 Centered Right-Aligned Again. Again. =========== =========== =========== Directive Options ================= The enhanced ``.. table::`` directive supports the following options: ``:widths:`` Sets proportional column widths This should be a space-separated list of positive integers, one for every column. The columns widths will be allocated proportionally (e.g. ``1 2 3`` for a 3-column table means the columns will use 16%, 33%, and 50% of the total width, respectively). ``:column-alignment:`` Sets per-column text alignment This should be a comma/space-separated list of the following strings: ``left``, ``right``, ``center``, ``justify``. These are interpreted one per column. Extra values are ignored; if not enough values are provided, the remaining columns will default to ``left``. Alternately this can be a single word containing just the first letters: e.g. ``lrcj`` would be interpreted the same as ``left right center justify``. ``:column-wrapping:`` Sets per-column text wrapping This should be a comma/space-separated list of either ``yes``/``true`` or ``no``/``false``. If ``yes`` (the default), words will wrap around if there is not enough horizontal space. If ``no``, whitespace-wrapping will be disabled for that column. Extra values are ignored; if not enough values are provided, the remaining columns will default to ``true``. Alternately this can be a single word containing just the first letters: e.g. ``ttf`` is the same as ``true true false``. ``:column-dividers:`` Add dividers between columns This lets you specify custom vertical dividers between columns (ala what ``.. tabularcolumns::`` allows under latex). This should be a comma/space-separated list of ``none``, ``single``, or ``double``; based on the type of divider you want. There should be one of these for the left side of the table, for between each column, and for the right side of the table (e.g. a 4 entries for a 3-column table). Extra values are ignored; if not enough values are provided, the remaining columns will default to ``none``. Alternately this can be a single word containing just the number: e.g. ``0121`` is the same as ``none single double single``. ``:column-classes:`` Add per-column css classes. This lets you specify css classes that will be assigned to each column, much like ``.. rst-class::``. This should either be a space-separated list containing one class per column, or a comma-separated list containing multiple classes for each column, separated by spaces. Extra values are ignored; if there are not enough values, or there are blank entries, those columns will not be assigned any custom classes. For example, ``a b, c , , d`` would assign the classes ``a b`` to column 1, ``c`` to column 2, no custom classes for column 3, and ``d`` to column 4. ``:header-columns:`` Specify number of "stub" columns Should be a non-negative integer specifying the number of columns (starting with the left side) that should be treated as "stub" or "header" columns, and should be styled accordingly. Configuration ============= This extension reads the following ``conf.py`` options: ``table_styling_embed_css`` Controls whether or not the custom css file should be included. Set to ``True`` to enable, ``False`` to disable. By default (``None``), enabled for all Sphinx themes which aren't part of this package. ``table_styling_class`` By default, all HTML tables styled by this extension will have the css class ``"styled-table"`` added, to help with themeing support. Use this option to override with your own theme's preferred css class. Internals ========= .. note:: This extension gets the job done by adding custom css classes to every cell in the generated html table. It then inserts a custom css file which provides styling implementing relevant parts of the above directives. While this extension is primarily tested with :mod:`!cloud_sptheme`, it should work with most Sphinx themes, any conflicts that occur are probably bugs. .. todo:: make this autogenerate a matching ``.. tabularcolumns`` directive for latex. .. todo:: allow ``:widths:`` to support ``em``, ``in``, ``%`` cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.autoattribute_search_bases.rst0000644000175000017500000000117712447577553031011 0ustar biscuitbiscuit00000000000000=================================================== :mod:`cloud_sptheme.ext.autoattribute_search_bases` =================================================== .. module:: cloud_sptheme.ext.autoattribute_search_bases :synopsis: make ``autoattribute`` search for docstrings in parent classes .. versionadded:: 1.7 Overview ======== Currently, :mod:`sphinx.ext.autodoc`'s ``autoattribute`` only checks the current class for an attribute docstring. This extension patches Sphinx so that if one isn't found, autodoc will then search through the parent classes, in case the attribute is defined there, but being documented in the subclass. cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.make_helper.rst0000644000175000017500000000456312214647251025053 0ustar biscuitbiscuit00000000000000==================================================================== :mod:`cloud_sptheme.make_helper` - sphinx-build Makefile replacement ==================================================================== .. module:: cloud_sptheme.make_helper :synopsis: sphinx-build Makefile replacement This module was written to solve one specific task: to provide an alternative to the ``Makefile`` and ``make.bat`` scripts found in many Sphinx projects. Most sphinx projects rely on the presence of :command:`make`, do not frequently need documentation built on windows, and don't find the need to update the makefile once set up. However, for the small subset of projects this doesn't include, this class provides an easy pure-python way to make a cross-platform build script. Usage ===== In order to use this script, go to your documentation's source directory, and include the following fragment as the file ``make.py``:: "Makefile for Sphinx documentation, adapted to python" import os from cloud_sptheme.make_helper import SphinxMaker if __name__ == "__main__": SphinxMaker.execute(root_dir=os.path.join(__file__,os.pardir)) Once done, this script can be invoked via :samp:`python docs/make.py {options}`, in the same manner as the Sphinx Makefile and make.bat script. Any new features added to SphinxMaker via cloud_sptheme will automatically become available to all packages using this stub. Interface ========= .. class:: SphinxMaker(root_dir=None) :param root_dir: absolute path pointing to documentation source directory. The following are class attributes, but they may be overridden via subclass, constructor, or environment variable (in increasing order of precedence). .. attribute:: BUILD the build directory. this defaults to ``_build``, .. attribute:: SPHINXBUILD path to sphinx-build script, defaults to ``sphinx-build``. .. attribute:: PAPER paper size for latex, defaults to ``letter``. .. attribute:: SERVEHTML_PORT port for ``servehtml`` to launch a webserver on, defaults to 8000. .. todo:: SphinxMaker does not currently include all the build targets that sphinx-quickstart's Makefile contains, this should be fixed. SphinxMaker may currently contain some assumptions which don't apply to some sphinx project layouts, these should be identified and made configurable. cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.role_index.rst0000644000175000017500000000005512674256174025530 0ustar biscuitbiscuit00000000000000.. automodule:: cloud_sptheme.ext.role_index cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.page_only.rst0000644000175000017500000000005512675107441025346 0ustar biscuitbiscuit00000000000000.. automodule:: cloud_sptheme.ext.page_only cloud_sptheme-1.8.0/docs/lib/cloud_sptheme.ext.autodoc_sections.rst0000644000175000017500000000335212447577640026752 0ustar biscuitbiscuit00000000000000=================================================================================== :mod:`cloud_sptheme.ext.autodoc_sections` - support for ReST sections in docstrings =================================================================================== .. module:: cloud_sptheme.ext.autodoc_sections :synopsis: support for ReST sections in docstrings .. versionchanged:: 1.7 Drastically revamped how extension works, as well as the DOM / css styles it generates. Themes relying on the previous output structure may need to be updated (the css classes were changed, to allow simulatenous styling of both old and new versions). Overview ======== This Sphinx extension should be used in conjunction with the Autodoc extension. This extension allows docstrings (module, class, function, etc) to include ReST-style section headers (which normally cause problems if integrated into Sphinx documentation via Autodoc). Internals ========= This extension does an *extensive* amount of monkeypatching within Sphinx and Docutils. While this allows it to leverage Docutil's native RST parser, (rather than implement it's own), this does mean it may be more fragile if any of the internals change. Please report any bugs. In order for Sphinx themes (like Cloud) to distinguish these special object-description-level sections from the document-level ones, the section elements are assigned two extra css classes: ``desc-section`` and :samp:`desc-section-{level}`. Additionally, the header element of each section is assigned the css class ``section-header``. Depending on the theme, these may require additional styling rules. .. todo:: This extension has a few things which could be improved: * Subsections should be included in Sphinx's indexing. cloud_sptheme-1.8.0/docs/cloud_theme.rst0000644000175000017500000001777512744467506021513 0ustar biscuitbiscuit00000000000000.. index:: cloud; sphinx theme, sphinx theme; cloud ==================== "Cloud" sphinx theme ==================== Features ======== This package provides a theme called "Cloud", used to generate this documentation. Aside from being just another Sphinx theme, it has a few special features: *Toggleable sections* You can mark sections with ``.. rst-class:: html-toggle``, which will make the section default to being collapsed under html, with a "show section" toggle link to the right of the title. *Additional CSS classes* It provides a couple of simple styling directives for adding variety to long Python library documentation: * You can mark tables with ``.. rst-class:: html-plain-table`` to remove separating lines between rows. * You can mark ``

`` sections with ``.. rst-class:: emphasize-children`` to provide addition visual dividers between large numbers of sub-sub-sections. *Navigation enhancements* It provides options (``roottarget``, ``logotarget``) which allow the table of contents to be a distinct from the front page (``index.html``) of the document. This allows a master table of contents to be maintained, while still allowing the front page to be fully customized to welcome readers. *Additional styling options* It also provides a number of styling options controlling small details such as external links, document sizing, etc. See below. It also uses an adaptive layout to work well on all screen sizes from mobile phones to widescreen desktops. *Google Analytics Integration* By enabling two theme options with ``conf.py``, Cloud will automatically insert a Google Analytics tracker to the bottom of each page, along with a polite link allowing users to set a cookie which opts them out. List of Options =============== Structure --------- ``roottarget`` Sets which page which the title link in the navigation bar should point to (defaults to the special value ``""``, which uses the table of contents). ``logotarget`` Sets the page which the sidebar logo (if any) should point to (defaults to the special value ````, which just mirrors ``roottarget``). Document Layout --------------- ``max_width`` Sets the maximum document width, so the documentation does not stretch too far on wide monitors (defaults to ``11in``). ``minimal_width`` Sets the maximum width where the "mobile" layout will be used. This layout omits the sidebar and everything else that can be trimmed, and is designed to (hopefully) be more usuable on mobile devices. (defaults to ``700px``). ``min_height`` sets the minimum height of the page body (defaults to ``6in``). .. versionchanged:: 1.7 ``compact_width`` option has been removed, and will be ignored. (it previously provided an intermediate level of padding between ``minimal_width`` and ``max_width``). .. _font-options: Font Sizing ----------- ``default_layout_text_size`` Sets the default font size for the whole document (defaults to ``87.5%`` of browser default). ``minimal_layout_text_size`` Sets the default font size for the whole document when the "mobile" layout is being used (defaults to ``75%`` of browser default). Sidebar Layout & Styling ------------------------ ``rightsidebar`` whether the sidebar is on the right side instead of the left (defaults to ``false``). ``defaultcollapsed`` whether the sidebar should start collapsed (defaults to ``false``). ``stickysidebar`` whether the sidebar should "stick" in the current window (defaults to ``true``), otherwise it will scroll along with the page. ``highlighttoc`` whether sidebar should highlight the sections which are currently being viewed (defaults to ``true``). Sidebar Labels -------------- ``sidebar_localtoc_title`` Override title of per-page table of contents (in ``localtoc.html`` sidebar). defaults to ``Page contents``. ``sidebar_prev_title`` Override title of link to previous page (in ``relations.html`` sidebar). defaults to ``Previous page``. ``sidebar_next_title`` Override title of link to next page (in ``relations.html`` sidebar). defaults to ``Next page``. ``sidebar_master_title`` Override title of the front-page document link (in ``quicklinks.html`` sidebar). ``sidebar_root_title`` Override title of the root document link (in ``quicklinks.html`` sidebar). .. _decor-options: Document Styling ---------------- ``lighter_header_decor`` Optional boolean flag which render headers in a lighter underlined style, rather than with a solid background. Also enables other related stylistic changes. ``shaded_decor`` Optional boolean flag which adds a slight amount of shading to sidebar, navbars, and section headers. ``borderless_decor`` Optional boolean flag which makes page background match document background. Also enables other related stylistic changes. Styling ------- ``externalrefs`` Boolean flag that controls whether references should be displayed with an icon. (defaults to ``True``). ``externalicon`` Optional image or string to prefix before any external links (defaults to ``⇗``, ignored if ``externalrefs=False``). ``issueicon`` Optional image or string to prefix before any issue tracker links generated by :mod:`cloud_sptheme.ext.issue_tracker` (defaults to ``✧``, ignored if ``externalrefs=False``). .. note:: There are a number of options for changing the various colors and fonts used by this theme, which are still undocumented. A complete list can be found in the theme's configuration file (``/cloud_sptheme/themes/cloud/theme.conf``). Other ----- ``googleanalytics_id`` Setting this via ``html_theme_options`` to your GA id (e.g. ``UA-XXXXXXXX-X``) will enable a `Google Analytics `_ tracker for all pages in the document, as well insert a link in the footer allowing users to opt out of tracking. ``googleanalytics_path`` Setting this allows limiting the tracker to a subpath, useful for shared documentation hosting (e.g. PyPI or ReadTheDocs). .. _cloud-theme-usage: Usage ===== Using the theme --------------- To use the cloud theme, open your documentation's Sphinx ``conf.py`` file, make the following changes:: # import Cloud import cloud_sptheme as csp # ... some contents omitted ... # set the html theme html_theme = "cloud" # NOTE: there is also a red-colored version named "redcloud" # ... some contents omitted ... # set the theme path to point to cloud's theme data html_theme_path = [csp.get_theme_dir()] # [optional] set some of the options listed above... html_theme_options = { "roottarget": "index" } .. rst-class:: floater .. seealso:: See the next page (:doc:`cloud_theme_test`) for examples of these options in action. Section Styles -------------- Emphasized Children ................... Adding ``.. rst-class:: emphasize-children`` to a 2nd-level section header will cause the headers of all of it's child sections to be emphasized with a solid background. This is mainly useful for very long sections, where there needs to be a visual divide between 3rd-level sections. Toggleable Sections ................... By adding ``.. rst-class:: html-toggle`` before any section header, it can be made toggleable:: .. rst-class:: html-toggle Toggleable Section ------------------ This section is collapsed by default. While toggleable sections start out collapsed by default, you can use ``.. rst-class:: html-toggle expanded`` to override this. Table Styles ------------ * Adding ``.. rst-class:: plain`` can be used to remove the row shading and other styling from a table. * Adding ``.. rst-class:: centered`` can be used to center a table. * Adding ``.. rst-class:: fullwidth`` can be used to expand a table to the full width of the page. .. seealso:: The :mod:`~cloud_sptheme.ext.table_styling` extension for additional table styling abilities, e.g. per-column text alignment. cloud_sptheme-1.8.0/docs/install.rst0000644000175000017500000000325313014222202020620 0ustar biscuitbiscuit00000000000000.. index:: cloud; installation ========================= Installation Instructions ========================= Requirements ============ * Python >= 2.6 or Python 3 * `Sphinx `_ 1.4 or newer. Installing ========== * To install from pypi using pip:: pip install cloud_sptheme * To install from pypi using easy_install:: easy_install cloud_sptheme * To install from source using ``setup.py``:: python setup.py build sudo python setup.py install .. index:: readthedocs.org; installation on ReadTheDocs =========== To use this theme on ``_: 1. If it doesn't already exist, add a pip ``requirments.txt`` file to your documentation (e.g. alongside ``conf.py``). It should contain a minimum of the following lines:: sphinx cloud_sptheme ... as well as any other build requirements for your project's documentation. 2. When setting up your project on ReadTheDocs, enter the path to ``requirements.txt`` in the *requirements file* field on the project configuration page. 3. ReadTheDocs will now automatically download the latest version of :mod:`!cloud_sptheme` when building your documentation. Documentation ============= The latest copy of this documentation should always be available at: ``_ If you wish to generate your own copy of the documentation, you will need to: 1. Install `Sphinx `_ (1.4 or better) 2. Download the :mod:`!cloud_sptheme` source. 3. From the source directory, run ``python setup.py build_sphinx -E``. 4. Once Sphinx is finished, point a web browser to the file :samp:`{SOURCE}/build/sphinx/html/index.html`. cloud_sptheme-1.8.0/docs/_static/0000755000175000017500000000000013014372770020063 5ustar biscuitbiscuit00000000000000cloud_sptheme-1.8.0/docs/_static/masthead.svg0000644000175000017500000003745712214647251022412 0ustar biscuitbiscuit00000000000000 image/svg+xml Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas justo. Nam massa turpis, nonummy et, consectetuer id, placerat ac, ante. Sed non ipsum. Pellentesque suscipit accumsan massa. Quisque malesuada nulla sed pede volutpat pulvinar. Nullam venenatis gravida orci. Sed elementum, felis quis porttitor sollicitudin, augue nulla sodales sapien, sit amet posuere quam purus at lacus. Vestibulum non arcu a ante feugiat vestibulum. Mauris urna sem, suscipit vitae, dignissim id, ultrices sed, nunc. Praesent scelerisque. Phasellus lacinia iaculis mi. Praesent a lacus vitae turpis consequat semper. Praesent semper, neque vel condimentum hendrerit, lectus elit pretium ligula, nec consequat nisl velit at dui. Curabitur risus urna, placerat et, luctus pulvinar, auctor vel, orci. Aliquam velit dui, commodo quis, porttitor eget, convallis et, nisi. Morbi urna. Nam rhoncus, lectus vel hendrerit congue, nisl lorem feugiat ante, in fermentum erat nulla tristique arcu. cloud_sptheme-1.8.0/docs/_static/logo.svg0000644000175000017500000002633012214647251021550 0ustar biscuitbiscuit00000000000000 image/svg+xml cloud_sptheme-1.8.0/docs/_static/masthead.png0000644000175000017500000003320312214647251022360 0ustar biscuitbiscuit00000000000000PNG  IHDR`UsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxyy;a_8")ʒ82ue'I//Ky>~"ϳrD,EGrdkX6K\$( D$b,e{t}u{  Hs}~} "5&/W\5yY}pB,]+5YCI8t2yyy177'=kooǏSGG p lY⡇wpk5=P.U jB ʶR5&۫Ց#GTWW7416Fqs߱! !p";dϧw(RPh۴uۦm۷tGha^kzx\eq''OTu|ga!,jjl_F_3XqÅɔOr]vǷxcEto]CMBO܉OO3/D<ҒEQxhn-ӎVNco4N\3 o-$i~qFgy籃 yJApJV,@Bxz'T'~19G(*7K )îrY:tH)!{َOϾ[5k`bJ> ;yw~;anwO<B_К!HCiPA-@ᑇ\8zo9gz}!AX6V=xu`*Bl qO:U/P o/:@%= OK"62cЀ B+To>Aw޹#'PCp%H I0 $bĠ"ZB#T){(z߮KģYj}ߧ!X&UWk~b c~iW0JB`xxX>|XDS/,{Cw( V[ AdVߎ&[%7ܘ;uG+Vy9_ :Ҽ` !&Bä }`D @ J~^my5r4=-Pll!"5<<,xqȑuxx߽;t{@)gFx( 2>Hn9@.Pp OgזU}SG[[ס;(iyϪUPvTVpe .!+ZzOOi(`ttT>|X;wN9G %P /3sGwШУ֯_ 0jnnjy=fg[eveN(mSwc2'ď1\U))f<"$p;K29G:][:OG Bt}Ez]kåV W,[XID&z7LLLQ\-N<3 ҹqMB#]qV C[nu>򑏈ZV,~S"߲u ;wvwXt!{},(tr@#NEM@*[DZ&1'MfPB S^@@ā[;u'ē(VAEťi:woX1l1D++=TY<9><<>gp7ӟ\4gώ-7\< 8R0ޓQES̹<17Z |QB3$"`̹lp-ZNXZ\ D.Wӏ ܹ0 3g(,K|3 @3l |ck?rrf5>p;r⨻ hDsE|9 ɴ$NVyڧNQ &.L(M)}/lt 奥QHᾇKIDTo6ihW)ȓ'y}7:[{{뎁vsyGZĜV$+eFd bvj,G,uRN4a\@FĜ v̅kF\>]WK7gR҇z^ٱ}wL.~]o(+TJD!hxf`D7JoTR(hmcڑD npMkW}B a$F(luFq?/:qnƧ~m,:("1J>jD=H֖18DlTi9Wr dڀH'dL)oV\&~ƭs 1r]" [J۴iTYt3όj?B%ײCXd5#0ʑߺM$WfP[܋)M7NfR|p4d B_|-ÿpׯc&)eRJ\"<6"%Ef{ha0S3dqvs.Eo-ET;%| )OyL:hD#cq.lP ip-CMuϑ9s0imqJ ȴ҆nwg= Wk6??ߴigzeի@*g+& :JV5ib+ɪd8^tz핳y adbn}Ѭhl$o&4Ye dDԟj*v VL~b*5;0ׯs0۱T o ō7[摆2ƞ2g].. 0@i"IoȈJ9bOrFI9x'@&J^#Zi{Mi:MR`NuV `bRRI})@Zcb[qFQ٩c;qοmi TY3OwΖ\=)|:H4fRxmE6^]zSͦXhw74uxɓأ'3t\,q 8ܑjKJtɬ)BFXd=˗w™mtTH)6H6K>&(Ld_)4tQ\'s-b{5NC& 7<?}Gsd|1Hrhf)hm.b",S{ (1 "lsZBu65 2IF'liÛ"=LSMD+1O0-h6b*iDp\T|{v ^wu#eQ֭Ȓe TcaͲØl[ @i޽[b"HGpu΁$Qma ! H#~w 2TUɺITL94ؚ@ĶM5-<&q& MؤiB,ؼ-x뉐˹p;E2/*Rzhį|6laF qSp*̶2%:xv 1{A>?XWJ+7["8Dfz4/&y/v=R x`f DɁ'?fJ)i ѩ̈́]^&J89'q6a1ҕRHh|8ڹ=^XPJDR@Xe HfoX"34XWcdZ8 B"L2^\TsYکɴ)W80LIx#uKJ!#AR jGJ92K5NIğ˧5i7 #!G$^],ت̥h/ 06&f8; q25k:")G|7FrNg \"NT&9V(x׬_-g?1⠚26:g XgԴ8eڑ= :m9ABґ$d؀l|.7$ =6\ML-,4=.ll 賞-< 9ɓQ> wқ.>" @RL湂f`Ddbp*,0eHV i=J7lyj & &O#L qB3JS#a׵ Np7i;㮉y(-Eޖ& M0g},eNᛰu #Gb?9slw@ )BDFdMS G$ xg̍ڊ11gKsF9@blzi:}bn1|BJ%EQkaxCXqUA0=;gEDL #w6̷l|rj z{бj)B( >AF!>T)Xi֖FamҔSFh4FٟAĚfuXEfk)B0J".k(G8oQſI8"1+gϞX;7p R;\ bK+#ɜ|w!9f<% snFj]X={`JQ=^[{vu\ud@¼"dYqkqL,|,$xS)"\$sIq2jz-4DAvL+kMƏ:R>u{4Pz4iw2tUQ|Vl9ZԼ_˚Hɼ/DqQv7L:t(?TӶէ]7וRJ@ e^9 ai`~&r+r# VM0+$͚-%1֚˄yl/Ԅ7l!sa@Ŷ|K`^8zvL4&^ kh6bNR6 ~EpHׄD:땣 da+LY -ư XD .v1l|{lTu]=Nܧ}?xfrգ$Pap\o!Ё \儂+pIkqDZkBD5-D-rG;5/!LB-&!k:dՓZjY]@=GFFJ#J)lsKo'oq;r^ t< bS4PĔ:q|b8ؑ"ظ}oR>0 R8oYyú`C @a-bnݺ~[:s9XAӧ/4'}EDPq  "@亡#W=PP5ATDeU"k9K퍆 E,T(NRJ EU CEQh4=>>D:^¬xcP`' ߖIy0?S7axg"&;wl7BV+Qg@|G;9nuH~A#zگM'r9wFh땥B4Q.G;z9[k-؆ۙ7!.\.Tjc~^W(sjZE **N^>VQXp=-rR|EU-7UuUPtMM鎎:x`)"X,_ժ׹iS~}}}~ɓ" 1-yp-ſl_ pYټKZSGc֥xޗ7h{p`.۶"40:*zʫjmA~B.F:܂GZDt=Oj#* (R0 5t{}R)H)<K2E ~6aA<BQ@U?rv;D:,U\yvl.nrryus^;saan=\JCZZ7 N{G}Bء gASK&/<^dU8+^x||p+9ik%yD Wef04ǝ򥒒z _Z.#QAk°\G tO-.,; D"Z=. KR"W+T"0:*FERFC6m<P(PGG@R'v?۰}G_.=`SggOsb4 œtiUj8\\1!-`,+ =X˿[)4gbQP_$u{oC7f0rɧ朳Ĭ$ BbeOW( C,k&/2{l9-]̔exfDZpnu>s@'9@DK|/|z_>횦'KOhǶ|! QZmf(Z*޽{!zsB.4>Ӟ*b^PG:t Tnr(!6hD s7aý575i9pEY6 =I? Iy4^=0boL9?f_uo7|F "9ulG6 A/DJ?թ)[o>EDX1PϽʂKNs^ 1]4}{A D \/DT$\.U] ZGXopcv+>#'9d̬x>1}įPэIGslWWfT$T ζTn_\ը^ZMwa,XO[0`a i NGax쒿@M=Ve20] ʯȋyk<.ǣɔqw"fy:9|/߾?W.xW9LL/מt! JйsEϗL\eZ?wkWϗ[\IV}mbp- ]eԶ ާ7mw}i?MCJwl|uo~fW -Lڸbۮ>n+_~%Sr^t)`x(@zW^bװhe"O lqK=}Ο?xrvg_zswML{ݻwfF&`j~ _bVoy5.켕n ,0@$˱MgOܱޟ]y {1xtٳgvwDwo=~ۭm0e|}_F;w8??!05̓ig1 ΍6 R9]#DN iNq.2'oYD8 E`ˤQ LDl["NYu\<&)>LeѢlUGGG@Á7˹=o1[ÿ]~֡ޞNOМpm 0~g_=T{=_ \\nVf=jqdq'4L&j"Mx$! `iJ% J.`@3…u't H۞"k$j#4'p]ıAS ]P(t N:E[{˽ɷͯ۲X r` .%@ 'qS7qVՑzx!-!6 ~c˓2Bz}QyN!uj[?0M] >וzomkw@#8ޙ5/ߍ7N/MU6ݲe}ط/Ij[ }eO[09@HDad,\K!Ǐ&+0GaϹnAE tvL[>[}BL=ũ~lYSzұcKuL+ɥz<štIt819tuuաΩ\./|*@g'=crT%g=O1GVDpl-md0,[*yb2w"- iѕ `eEDDq"1WpD7'.bDΙip1^1oؐ[={j|,@QXm|R>fWb@!玺e"ຄH󓭀Ke3d4U2f\ZT\ncOC4hw.t63hVJM8Ɠb]x L\Xυy|bgf~nyߝj" M@=gcv@0}j\ɪ X>Nvz(痔i0+]o{z;~r id5{ R6d3;Y%c n{]֗5/w8G=)3!g%jT{.{yav/@N3guu\xAxlSۀ̮,˒lʇ7ˬ4.qB1<HZN;BNjҖ-[M\MouG4˪Ւha7x^7rLr-z]\.qs=OnP8H^9@ɡz,bO ccc9cjq>.ҭٸa8bs.:5kmjra VH@sd8 WfʴzE L-)\'4<g``7߆?ݶrgNL|LȧE8j⢚89ު_;vNS~g#`9;5s4ѭ49ŕ҆\]ΎMBvR i$;„N51=TGhN;&ƒ9uu=+ <4!?s}}u3[<UKssšu̵uL#=1~xZ۲=FeݷSdZaFĔ'3*f,q?K}oڴ0F4YL+AV٤nDFpeyVl]wV ?\eupߋ}+7|n"xM(iojZUk"=Fcd`e~ֶaZd%LrUh#sϠ咛l}192@ 2joD !}Oo?P=9p TdՑLӁtoomaabOq }و=.*d܊iVdXJ_E(>ÍC+cw~&ِ$KszI/^zVf:du-/BrDw >gΩ_*>O}}%,e{ͫWӒH%bUx֮Yܒg٬+N1<<\7x[o'g˹ k[ EBbAWz[5""͜@m*bV:IRs TGzl>ũ#ϝHJu=[?&k+*jUZ͞Ϟ=h!nnhQ٣c""ۀ"+0.h|M.Q(ɷlڗ}B;})h/D|ɝk$!s,If]ߵqc866E^c#޳Hm{ww݄Kp=EPt\U)^.B/{p0D{us )]PBNakຂs X install cloud_theme cloud_theme_test lib/cloud_sptheme lib/cloud_sptheme.ext.index_styling lib/cloud_sptheme.ext.relbar_toc lib/cloud_sptheme.ext.autodoc_sections lib/cloud_sptheme.ext.autoattribute_search_bases lib/cloud_sptheme.ext.docfield_markup lib/cloud_sptheme.ext.issue_tracker lib/cloud_sptheme.ext.escaped_samp_literals lib/cloud_sptheme.ext.page_only lib/cloud_sptheme.ext.role_index lib/cloud_sptheme.ext.table_styling history copyright .. lib/cloud_sptheme.make_helper cloud_sptheme-1.8.0/docs/cloud_theme_test.rst0000644000175000017500000001200612671303000022501 0ustar biscuitbiscuit00000000000000.. index:: cloud; feature test ================== Cloud Feature Test ================== This page contains examples of various features of the Cloud theme. It's mainly useful internally, to make sure everything is displaying correctly. Inline Text ============= Inline literal: ``literal text``. Samp literal: :samp:`this is a {variable}, these are literal \\{ and \\}`. External links are prefixed with an arrow: ``_. But email links are not prefixed: bob@example.com. Issue tracker link: :issue:`5`. Admonition Styles ================= .. note:: This is a note. .. warning:: This is warning. .. seealso:: This is a "see also" message. .. todo:: This is a todo message. With some additional next on another line. .. deprecated:: XXX This is a deprecation warning. .. rst-class:: floater .. note:: This is a floating note. .. rst-class:: without-title .. seealso:: This is a "see also" using ``.. rst-class:: without-title``. Code Styles =========== Python Code Block: .. code-block:: python :linenos: >>> import os >>> os.listdir("/home") ['bread', 'pudding'] >>> os.listdir("/root") Traceback (most recent call last): File "", line 1, in OSError: [Errno 13] Permission denied: '/root' INI Code Block: .. code-block:: ini :linenos: [rueben] bread = rye meat = corned beef veg = sauerkraut Long Lines (:issue:`22`): .. literalinclude:: _static/longline.txt :linenos: .. literalinclude:: _static/longline.txt Function styling: .. function:: frobfunc(foo=1, *, bar=False) :param foo: foobinate strength :type foo: int :param bar: enabled barring. :type bar: bool :returns: frobbed return :rtype: str :raises TypeError: if *foo* is out of range Class styling: .. class:: FrobClass(foo=1, *, bar=False) Class docstring. Saying things. .. attribute:: foo foobinate strength .. attribute:: bar barring enabled .. method:: run() execute action, return result. Table Styles ============ .. table:: Normal Table =========== =========== =========== Header1 Header2 Header3 =========== =========== =========== Row 1 Row 1 Row 1 Row 2 Row 2 Row 2 Row 3 Row 3 Row 3 =========== =========== =========== .. rst-class:: plain .. table:: Plain Table (no row shading) =========== =========== =========== Header1 Header2 Header3 =========== =========== =========== Row 1 Row 1 Row 1 Row 2 Row 2 Row 2 Row 3 Row 3 Row 3 =========== =========== =========== .. rst-class:: centered .. table:: Centered Table =========== =========== =========== Header1 Header2 Header3 =========== =========== =========== Row 1 Row 1 Row 1 Row 2 Row 2 Row 2 Row 3 Row 3 Row 3 =========== =========== =========== .. rst-class:: fullwidth .. table:: Full Width Table =========== =========== =========== Header1 Header2 Header3 =========== =========== =========== Row 1 Row 1 Row 1 Row 2 Row 2 Row 2 Row 3 Row 3 Row 3 =========== =========== =========== .. table:: :doc:`Table Styling Extension ` :widths: 1 2 3 :header-columns: 1 :column-alignment: left center right :column-dividers: none single double single :column-wrapping: nnn =========== =========== =========== Width x1 Width x2 Width x3 =========== =========== =========== Header 1 Center 1 Right 1 Header 2 Center 2 Right 2 Header 3 Center 3 Right 3 =========== =========== =========== .. rst-class:: html-toggle .. _toggle-test-link: Toggleable Section ================== This section is collapsed by default. But if a visitor follows a link to this section or something within it (such as :ref:`this `), it will automatically be expanded. .. rst-class:: html-toggle expanded Toggleable Subsection --------------------- Subsections can also be marked as toggleable. This one should be expanded by default. Normal Section ============== Child Section ------------- .. rst-class:: html-toggle Toggleable Subsection --------------------- Test of emphasized + toggleable styles. Should be collapsed by default. .. rst-class:: emphasize-children Section With Emphasized Children ================================ Mainly useful for sections with many long subsections, where a second level of visual dividers would be useful. Child Section ---------------- Should have slightly lighter background, and be indented. .. rst-class:: html-toggle Toggleable Subsection --------------------- Test of emphasized + toggleable styles. Should be collapsed by default. :mod:`~cloud_sptheme.ext.autodoc_sections` Extension ==================================================== .. autofunction:: cloud_sptheme.ext.autodoc_sections._doctestfunc cloud_sptheme-1.8.0/CHANGES0000644000175000017500000002021213014372644016475 0ustar biscuitbiscuit00000000000000.. -*- restructuredtext -*- .. _whats-new: =============== Release History =============== **1.8** (2016-11-20) ==================== * Admonitions now support "without-title" class to hide title prefix ("Note", "See also", etc) * Added :mod:`~cloud_sptheme.ext.role_index` extension * Added :mod:`~cloud_sptheme.ext.page_only` extension * Fixed :mod:`~cloud_sptheme.ext.index_styling` extension to be compatible with Sphinx 1.4 * Sticky sidebar code now allows sidebar to be scrolled independantly of main document -- just scroll mouse while overing over sidebar. * Sidebar can now be viewed from mobile mode; hidden state is stored independantly of large screen menu. * ``collapsablesidebar`` flag is now ignored, sidebar is always collapsable. flag will be removed in 1.9. * A large amount of the sidebar css & js was rewritten, many of the DOM classes have changed. **1.7.1** (2015-12-12) ====================== Bugfix release * Fixed divide-by-zero error under python 3 (:issue:`23`). * JS url comparison code now handles ``file://`` urls (:issue:`24`). * Now requires Sphinx >= 1.3. **1.7** (2015-07-25) ========================== .. note:: This theme now requires Sphinx >= 1.2 (some of the javascript code won't work with the jquery version bundled in Sphinx 1.1 and earlier). New Features ------------ * Function, class, and other object declaration now have colored backgrounds (controlled by ``colored_objects`` flag). * All python code blocks now have button to hide prompts & output text, for easier copying (Adapted from python's copybutton.js) (:issue:`17`). * Added :ref:`font sizing options `. * Added :ref:`document options ` to customize look and feel. * Added :mod:`cloud_sptheme.ext.autoattribute_search_bases` extension. * Added :mod:`cloud_sptheme.ext.docfield_markup` extension. Other Changes ------------- * :mod:`~cloud_sptheme.ext.autodoc_sections` has been completely rewritten. now utilitizes docutil's native RST parser, creates real section elements rather than hacked up definition lists; should now handle *any* valid rest directive that can be put at module-level. * Added styling for 2nd-level section headers, and the nested section headers generated by :mod:`!autodoc_sections`. * Default font size adjusted for compactness. * The ``popuptoc`` feature has been removed. It was just too awkward to maintain the required styling. May revisit in the future using a JS-based approach. * Unified button hover look & color through relbar, sidebar, and body. * Completely rewrote TOC highlighter code, now indicates active section, and collapses inactive TOC entries that are too large. * Makes use of Sphinx 1.2's egg entry point, so :func:`~cloud_sptheme.get_theme_dir` no longer needs to be used directly. Bugfixes -------- * :mod:`~cloud_sptheme.ext.autodoc_sections` now monkeypatches sphinx so that `:param foo:` and other fields get formatted correctly when they're embedded in a nested section (:issue:`21`). * now compatibile with Sphinx 1.3's switch from ```` to ```` for literals. * :mod:`!autodoc_sections` now monkeypatches sphinx so that ``:param foo:`` and other fields get formatted correctly when they're embedded in a nested section (:issue:`21`). * :mod:`!autodoc_sections` now handles method descriptors correctly (:issue:`16`). * the sidebar collapse state is now consistent across subfolders of document (:issue:`9`). * jumping to method or attribute permalink will now highlight the object. **1.6** (2013-12-28) ==================== New Features ------------ * Added ``rightsidebar`` option to base theme, ala the Sphinx default theme. * TOC entries which overflow sidebar now popup when hovered over (can be disabled via ``popuptoc = false``). * Added ``sidebar_localtoc_title`` and a number of other options for changing the titles of various links in the sidebar. * Added a sidebar called ``quicklinks.html``, which mirrors the navbar at the top and bottom of the page. * Various other small styling changes. .. undocumented features: * :mod:`!cloud_sptheme.ext.perpage` extension. Bugfixes -------- * Web font url now works with HTTPS * TOC highlighter now works with global toc (:issue:`7`) **1.5** (2012-10-01) ==================== New Features ------------ * Added ``plain``, ``centered``, and ``fullwidth`` css classes for positioning tables (see the :ref:`theme options `). * Added new extension :mod:`cloud_sptheme.ext.table_styling`, which adds some per-column styling options to the ``.. table::`` directive. Other Changes ------------- * Changed default font to Open Sans, for readability. * Removed all hardcoded ``pt`` or ``px`` font sizes, all sizes now specified as % of browser default. * Various improvements to mobile layout, including use of "viewport" metatag. Bugfixes -------- * Now compatible with jquery 1.8 (and thus sphinx 1.2) * Sticky sidebar code now more intelligent about various border cases. * Sticky sidebar now works when logo not present (:issue:`5`) * Sidebar toggle and headers now displayed correctly when printed (:issue:`4`) **1.4** (2012-08-02) ==================== * Sidebar now collapsible by default (:issue:`3`). * Sidebar now "sticks" to window when scrolling. * Sidebar TOC now highlights sections currently being shown in window. * Numerous documentation updates. * Various minor bugfixes. * Now natively compatible with Python 3, the **2to3** command is no longer required. **1.3** (2012-05-01) ==================== * Cleaned up documentation. * Redid css layouts. Cloud now has three layouts, controlled by css media queries: - "Normal" mode displays the document as a center-aligned box within the browser window. It will not grow to be larger than ``max_width`` (default 11 inches) in size. (This theme parameter was previously named ``docwidth``). - "Compact" mode strips the body padding to fill the whole window, but otherwise looks "Normal" mode. It will be used when the browser is less than ``compact_width`` (default 960 pixels) in size. This layout is new in 1.3. - "Minimal" mode strips excess padding, hides the sidebar, and does other things to reduce it's footprint as much as possible. This mode will be used if the browser is less than ``minimal_width`` in size (currently 700px), or if it uses the ``"handheld"`` css media type. (This theme parameter was previously named ``smallwidth``). * Added :mod:`~cloud_sptheme.ext.issue_tracker` extension, for auto-creating links to a project's issue tracker. * Added :mod:`~cloud_sptheme.ext.escaped_samp_literals` extension, which patches Sphinx to allow literal ``{`` characters in *samp* roles. * Added optional Google Analytics integration. * Added ``collapsiblesidebar`` option, as well as ``defaultcollapsed`` option. Though sidebar is still always hidden under minimal mode. * Added a number of other ``rst-class`` styling directives. **1.2** (2011-07-11) ==================== Minor stylistic changes to theme: * Changed section headers have colored background. * Added icons to admonitions. * Changed default font. * Other minor changes. **1.1** (2011-05-04) ==================== New features: * CSS media query automatically hides sidebar & trim for small displays (e.g. mobile devices) * Toggleable sections javascript code rewritten, now auto-expands based on url hash. * The parser used by the :mod:`~cloud_sptheme.ext.autodoc_sections` extension is now much more robust, and relies on fewer assumptions about the source. * Fixed header margin glitch that was occurring under Chrome. * Various minor layout enhancements. **1.0** (2011-03-25) ==================== First public release. cloud_sptheme-1.8.0/LICENSE0000644000175000017500000000411512444410521016504 0ustar biscuitbiscuit00000000000000.. -*- restructuredtext -*- =================== Copyright & License =================== Cloud Sphinx Theme ================== cloud_sptheme is released under the BSD license, and is (c) `Assurance Technologies `_:: The "cloud_sptheme" python package and artwork is Copyright (c) 2010-2012 by Assurance Technologies, LLC. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Assurance Technologies, nor the names of the contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Other Content ============= Most of the icons in ``cloud_sptheme:themes/cloud/static`` are from the `Tango Icon Project `_, which has released them into the Public Domain. cloud_sptheme-1.8.0/setup.py0000644000175000017500000000621213014331006017203 0ustar biscuitbiscuit00000000000000""" cloud_sptheme setup script """ #========================================================= #init script env #========================================================= import sys,os from os.path import abspath, join root_path = abspath(join(__file__, "..")) os.chdir(root_path) lib_path = '.' #========================================================= #imports #========================================================= import re from setuptools import setup, find_packages import subprocess import time #========================================================= #inspection #========================================================= with open(os.path.join("cloud_sptheme", "__init__.py")) as fh: version = re.search(r"""(?m)^__version__\s*=\s*['"](.*?)['"]\s*$""", fh.read()).group(1) if os.environ.get("CLOUD_SETUP_TAG_RELEASE", "y").lower() in "yes y true t 1".split(): try: # NOTE: for py26 compat, using Popen() instead of check_output() proc = subprocess.Popen(["hg", "tip", "--template", "{date(date, '%Y%m%d%H%M%S')}+hg.{node|short}"], stdout=subprocess.PIPE) stamp, _ = proc.communicate() if proc.returncode: raise subprocess.CalledProcessError(1, []) stamp = stamp.decode("ascii") except (OSError, subprocess.CalledProcessError): stamp = time.strftime("%Y%m%d%H%M%S") version += ".post" + stamp #========================================================= #setup #========================================================= setup( #package info packages = find_packages(), package_data = { "cloud_sptheme": ["themes/*/*.*", "themes/*/static/*.*", "ext/*.css"] }, zip_safe=False, install_requires=["sphinx>=1.4"], # metadata name = "cloud_sptheme", version = version, author = "Eli Collins", author_email = "elic@assurancetechnologies.com", description = "a nice sphinx theme named 'Cloud', and some related extensions", long_description="""\ This is a small package containing a Sphinx theme named "Cloud", along with some related Sphinx extensions. To see an example of the theme in action, check out it's documentation at ``_. """, license = "BSD", keywords = "sphinx extension theme", url = "https://bitbucket.org/ecollins/cloud_sptheme", download_url = "http://pypi.python.org/pypi/cloud_sptheme", classifiers=[ 'Development Status :: 5 - Production/Stable', 'Framework :: Sphinx :: Extension', 'Framework :: Sphinx :: Theme', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Topic :: Documentation', 'Topic :: Software Development :: Documentation', ], entry_points={ 'sphinx_themes': [ 'path = cloud_sptheme:get_theme_dir', ], }, ) #========================================================= #EOF #========================================================= cloud_sptheme-1.8.0/README0000644000175000017500000000152012214647251016363 0ustar biscuitbiscuit00000000000000.. -*- restructuredtext -*- ==================== "Cloud" Sphinx Theme ==================== About ===== This is a small package containing a Sphinx theme named "Cloud", along with some related Sphinx extensions. For more details (and to see the theme in action), check out it's documentation at ``_. Requirements ------------ * Sphinx 1.1 or newer Installation ------------ To install from pypi:: pip install cloud_sptheme To install from the source:: python setup.py install For more detailed installation & testing instructions, see "docs/install.rst", Online Resources ---------------- * **Homepage & Source:** ``_ * **Docs:** ``_ * **Download & PyPI:** ``_ cloud_sptheme-1.8.0/PKG-INFO0000644000175000017500000000222713014372770016605 0ustar biscuitbiscuit00000000000000Metadata-Version: 1.1 Name: cloud_sptheme Version: 1.8.0 Summary: a nice sphinx theme named 'Cloud', and some related extensions Home-page: https://bitbucket.org/ecollins/cloud_sptheme Author: Eli Collins Author-email: elic@assurancetechnologies.com License: BSD Download-URL: http://pypi.python.org/pypi/cloud_sptheme Description: This is a small package containing a Sphinx theme named "Cloud", along with some related Sphinx extensions. To see an example of the theme in action, check out it's documentation at ``_. Keywords: sphinx extension theme Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Sphinx :: Extension Classifier: Framework :: Sphinx :: Theme Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Documentation Classifier: Topic :: Software Development :: Documentation cloud_sptheme-1.8.0/MANIFEST.in0000644000175000017500000000027312444410521017236 0ustar biscuitbiscuit00000000000000recursive-include docs * recursive-include cloud_sptheme/themes * recursive-include cloud_sptheme/ext * include LICENSE CHANGES README prune docs/_build exclude .hgignore *.komodoproject cloud_sptheme-1.8.0/cloud_sptheme/0000755000175000017500000000000013014372770020340 5ustar biscuitbiscuit00000000000000cloud_sptheme-1.8.0/cloud_sptheme/__init__.py0000644000175000017500000000555413014230233022445 0ustar biscuitbiscuit00000000000000""" This module contains a few small sphinx extensions. They are mainly used to help with the generation of BPS's own documentation, but some other projects use them as well, so they are kept here. """ #============================================================================= # imports #============================================================================= # core import re import os.path import sys # local __all__ = [ # constants "__version__", "std_exts", "all_exts", # public utility functions "get_theme_dir", "get_version", # internal helpers "is_cloud_theme", ] #============================================================================= # constants #============================================================================= __version__ = "1.8.0" # names of standard cloud extensions used by most cloud themes std_exts = [ 'cloud_sptheme.ext.autodoc_sections', 'cloud_sptheme.ext.autoattribute_search_bases', 'cloud_sptheme.ext.docfield_markup', 'cloud_sptheme.ext.escaped_samp_literals', 'cloud_sptheme.ext.index_styling', 'cloud_sptheme.ext.relbar_toc', 'cloud_sptheme.ext.table_styling', ] # names of all cloud extensions all_exts = std_exts + [ 'cloud_sptheme.ext.issue_tracker', ] #============================================================================= # public helpers #============================================================================= _root_dir = os.path.abspath(os.path.dirname(__file__)) def get_theme_dir(): """Returns path to directory containing this package's Sphinx themes. .. deprecated:: 1.7 As of Sphinx 1.2, this is passed to Sphinx via a ``setup.py`` entry point, and no longer needs to be included in your documentation's ``conf.py``. """ return os.path.join(_root_dir, "themes") def get_version(release): """Derive short version string from longer 'release' string. This is quick helper which takes a project's ``release`` string, and generates the shortened ``version`` string required by ``conf.py``. Usage example for ``conf.py``:: import cloud_sptheme as csp ... # The version info for the project you're documenting from myapp import __version__ as release version = csp.get_version(release) """ return re.match("(\d+\.\d+)", release).group(1) #============================================================================= # misc internal helpers #============================================================================= def is_cloud_theme(name): """[hack] internal helper to check if theme accepts cloud theme options""" return os.path.isfile(os.path.join(get_theme_dir(), name, "theme.conf")) #============================================================================= # eof #============================================================================= cloud_sptheme-1.8.0/cloud_sptheme/ext/0000755000175000017500000000000013014372770021140 5ustar biscuitbiscuit00000000000000cloud_sptheme-1.8.0/cloud_sptheme/ext/__init__.py0000644000175000017500000000033212214647250023246 0ustar biscuitbiscuit00000000000000"package containing various sphinx extensions" #legacy aliases from __future__ import absolute_import from . import (autodoc_sections as nested_sections, index_styling as index_styles, ) cloud_sptheme-1.8.0/cloud_sptheme/ext/issue_tracker.py0000644000175000017500000001001113010714261024335 0ustar biscuitbiscuit00000000000000"""cloud_sptheme.ext.issue_tracker - added ":issue:" text role to link to issue tracker""" #=========================================================================== # imports #=========================================================================== #core import re #site from docutils import nodes from docutils.parsers.rst.roles import set_classes #pkg from cloud_sptheme import __version__ #local #=========================================================================== # issue role #=========================================================================== def make_error(inliner, rawtext, line, value): "generate error node and msg" msg = inliner.reporter.error(value, line=line) node = inliner.problematic(rawtext, rawtext, msg) return [node], [msg] def get_issue_tracker_title(config): "retrieve issue_tracker_title template" return getattr(config, "issue_tracker_title", None) or "issue {issue}" def get_issue_tracker_url(config): "retrieve issue_tracker_url template, replacing aliases" template = getattr(config, "issue_tracker_url", None) if not template: # causes :issue:`xx` to be replaced with label instead of url. return None elif template.startswith("bb:"): # parse "bb:", and replace with bitbucket url project = template[3:].strip("/") return "https://bitbucket.org/" + project + "/issues/{issue}" elif template.startswith("gc:"): # parse "gc:", and replace with google code url project = template[3:].strip("/") return "https://code.google.com/p/" + project + \ "/issues/detail?id={issue}" elif template.startswith("gh:"): # parse "gh:", and replace with github url project = template[3:].strip("/") return "https://github.com/" + project + "/issues/{issue}" else: # assume it contains {issue} and possibly {title} return template # pattern allows inside :issue: text roles issue_re = re.compile(""" ^ (?: (?P[^<]+) \s* < (?P<issue1>\d+) > | (?P<issue2>\d+) ) $ """, re.X) def issue_role(name, rawtext, text, line, inliner, options={}, content=[]): "generate link to an issue" #NOTE: # name - role name in doc, should be 'issue' # rawtext - text of entire node # text - contents of role # lineno # inliner - ??? # options - ??? # content - ??? # returns (nodes, messages) # extract title & issue number from text m = issue_re.match(text) if m: issue = int(m.group("issue1") or m.group("issue2")) title = m.group("title") else: return make_error(inliner, rawtext, line, "Invalid issue identifier: %r" % (text,)) # get url template from config, resolve aliases config = inliner.document.settings.env.app.config url_template = get_issue_tracker_url(config) title_template = get_issue_tracker_title(config) # generate replacement node if not title: title = title_template.format(issue=issue) set_classes(options) clist = options.setdefault('classes',[]) clist.append("issue") if url_template: url = url_template.format(issue=issue, title=title) node = nodes.reference(rawtext, title, refuri=url, **options) else: node = nodes.emphasis(rawtext, title, **options) return [node], [] #=========================================================================== # init #=========================================================================== def setup(app): "install plugin" app.add_config_value('issue_tracker_url', None, 'env') app.add_config_value('issue_tracker_title', None, 'env') app.add_role('issue', issue_role) # identifies the version of our extension return {'version': __version__} #=========================================================================== # eof #=========================================================================== �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/index_styling.py����������������������������������������������0000644�0001750�0001750�00000004566�13010714261�024374� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""cloud_sptheme.ext.index_styling - improves css styling for genindex""" import logging; log = logging.getLogger(__name__) import re from jinja2 import Markup as literal, escape from cloud_sptheme import __version__ prefix = r"^(?P<name>.*)\(" suffix = r"\)$" _attr_re = re.compile(prefix + r"(?P<left>)(?P<loc>.*)(?P<right> attribute)" + suffix) _meth_re = re.compile(prefix + r"(?P<left>)(?P<loc>.*)(?P<right> method)" + suffix) _fc_re = re.compile(prefix + r"(?P<left>class in |in module )(?P<loc>.*)(?P<right>)" + suffix) _mod_re = re.compile(prefix + r"module" + suffix) def format_index_name(name): while True: m = _attr_re.match(name) if m: name, left, loc, right = m.group("name","left", "loc", "right") type = "attribute" break m = _meth_re.match(name) if m: name, left, loc, right = m.group("name","left", "loc", "right") type = "method" break m = _fc_re.match(name) if m: name, left, loc, right = m.group("name","left", "loc", "right") if left.startswith("class"): type = "class" else: type = "function" break m = _mod_re.match(name) if m: name = m.group("name") left = "module" loc = right = '' type = "module" break return name if loc: loc = literal('<span class="location">') + escape(loc) + literal("</span>") cat = left + loc + right return escape(name) + literal('<span class="category ' + type + '">') + escape(cat) + literal("</span>") def mangle_index(app, pagename, templatename, ctx, event_arg): if pagename != "genindex": return fmt = format_index_name for key, entries in ctx['genindexentries']: for idx, entry in enumerate(entries): name, data = entry entries[idx] = fmt(name), data # NOTE: data is list of [links, subitems, some_key], # though 'key' not added until sphinx 1.4 (1.3?) subitems = data[1] for idx, entry in enumerate(subitems): name, links = entry subitems[idx] = fmt(name), links def setup(app): app.connect('html-page-context', mangle_index) # identifies the version of our extension return {'version': __version__} ������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/table_styling.css���������������������������������������������0000644�0001750�0001750�00000001675�12444410521�024514� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* css fragment used by cloud_sptheme.ext.table_styling * for themes which don't derive from base cloud theme */ table.docutils .left-align { text-align: left; } table.docutils .center-align { text-align: center; } table.docutils .right-align { text-align: right; } table.docutils .justify-align { text-align: justify; } table.docutils .nowrap { white-space: nowrap; } table.docutils .no-left-divider { border-left-width: 0; } table.docutils .single-left-divider { border-left-width: 2px; border-left-style: solid; } table.docutils .double-left-divider { border-left-width: 6px; border-left-style: double; } table.docutils .no-right-divider, table.docutils .single-right-divider, table.docutils .double-right-divider { border-right-width: 0; } table.docutils .single-right-divider:last-child { border-right-width: 2px; border-right-style: solid; } table.docutils .double-right-divider:last-child { border-right-width: 6px; border-right-style: double; } �������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/relbar_toc.pyc������������������������������������������������0000644�0001750�0001750�00000002577�13014220543�023772� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #Xc�����������@���sS���d��Z��d�d�l�Z�d�d�l�Z�e�j�e��Z�d�d�l�m�Z�d���Z �d���Z �d�S(���s8���cloud_sptheme.ext.relbar_toc - addes TOC entry to relbariN(���t ���__version__c��� ������C���s���d�|�k�r�d��S|�d�}�x5�t��|��D]'�\�}�}�|�d�d�k�r'�|�|�=Pq'�q'�Wd�}�x8�t��|��D] �\�}�}�|�d�d �k�re�Pqe�qe�W|�d�7}�d�|�k�r�t�j�j�t�j�j�|�d�d ���d ��d�} �n�d �} �|�j�|�| �d �d �d�f��d��S(���Nt���rellinksi���t���tocit���nextt���previousi���t���pathtot���contentsi����s���Table Of Contentst���C(���s���nexts���previous(���t ���enumeratet���ost���patht���splitt���splitextt���insert( ���t���appt���pagenamet ���templatenamet���ctxt ���event_argt���linkst���idxt���elemt���entryR ���(����(����sD���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/relbar_toc.pyt ���insert_toc���s ����    3c���������C���s���|��j��d�t��i�t�d�6S(���Ns���html-page-contextt���version(���t���connectR���R����(���R���(����(����sD���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/relbar_toc.pyt���setup%���s����( ���t���__doc__t���os.pathR ���t���loggingt ���getLoggert���__name__t���logt ���cloud_spthemeR����R���R���(����(����(����sD���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/relbar_toc.pyt���<module>���s ���  � ���������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/docfield_markup.py��������������������������������������������0000644�0001750�0001750�00000005160�13014230044�024627� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" cloud_sptheme.ext.docfield_markup -- monkeypatches sphinx to allow ``~`` in docfields. """ #============================================================================= # imports #============================================================================= # core import logging; log = logging.getLogger(__name__) # site # pkg from cloud_sptheme import __version__ from cloud_sptheme.utils import patchapplier, monkeypatch # local __all__ = [ "setup", ] #============================================================================= # patch #============================================================================= @patchapplier def _patch_docfield(): from sphinx.util.docfields import Field, nodes, addnodes # NOTE: would like to just wrap make_xref(), but have to override so # many parts that just end up replicating all the code :( # hence this ignored _wrapped() entirely @monkeypatch(Field) def make_xref(_wrapped, self, rolename, domain, target, innernode=nodes.emphasis, contnode=None): # 'contnode' argument added in sphinx 1.3 # not sure what it does, aborting if feature is present if contnode: return _wrapped(self, rolename, domain, target, innernode=innernode, contnode=contnode) # NOTE: this tries to replicate the convention used in PyXRefRole.process_link() rawtext = title = target if rawtext.startswith("~"): # if the first character is a tilde, don't display the module/class # parts of the contents target = target.lstrip("~") title = target.rpartition(".")[2] if issubclass(innernode, nodes.Text): # Text classes want rawtext second node = innernode(title, rawtext) else: # Element classes want rawtext first node = innernode(rawtext, title) if not rolename: return node refnode = addnodes.pending_xref(title, refdomain=domain, refexplicit=True, reftype=rolename, reftarget=target) refnode += node return refnode #============================================================================= # sphinx entrypoint #============================================================================= def setup(app): # don't apply our patch unless actually loaded by sphinx _patch_docfield() # identifies the version of our extension return {'version': __version__} #============================================================================= # eoc #============================================================================= ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/escaped_samp_literals.py��������������������������������������0000644�0001750�0001750�00000007553�13010714261�026036� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""cloud_sptheme.ext.escaped_samp_literals - allow escaping { and } in samp.""" #============================================================================= # imports #============================================================================= # core # site from docutils import nodes, utils # pkg from cloud_sptheme import __version__ from cloud_sptheme.utils import u, ru # local __all__ = [ "setup", ] #============================================================================= # replacement samp role parser #============================================================================= def emph_literal_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): """replacement for sphinx's ``:samp:`` role handler. this is a bit stricter in it's parsing, and allows escaping of literal ``{`` and ``}`` characters. """ def make_error(pos, value): value = "%s at char %d of %s" % (value, pos, rawtext) msg = inliner.reporter.error(value, line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] text = utils.unescape(text) retnode = nodes.literal(role=typ.lower(), classes=[typ]) buffer = u("") # contains text being accumulated for next node in_escape = False # True if next char is part of escape sequence in_var = False # True if parsing variable section instead of plain text var_start = None # marks start of var section if in_var is True i = 0 for c in text: i += 1 if in_escape: # parse escape sequence if c in ru("{}\\"): buffer += c in_escape = False else: return make_error(i-2, "unknown samp-escape '\\\\%s'" % (c,)) elif c == ru("\\"): # begin escape sequence in_escape = True i += 1 # account for extra escape char in rawtext elif in_var: # parsing variable section if c == u("{"): return make_error(i, "unescaped '{'") elif c == u("}"): # finalize variable section, return to plaintext if not buffer: return make_error(i-1, "empty variable section") retnode += nodes.emphasis(buffer, buffer) buffer = u("") in_var = False else: buffer += c else: # parsing plaintext section if c == u("{"): # finalize plaintext section, start variable section if buffer: retnode += nodes.Text(buffer, buffer) buffer = u("") in_var = True var_start = i elif c == u("}"): return make_error(i, "unescaped '}'") else: buffer += c if in_escape: return make_error(i, "unterminated samp-escape sequence") elif in_var: return make_error(var_start, "unterminated variable section") elif buffer: retnode += nodes.Text(buffer, buffer) return [retnode], [] #============================================================================= # sphinx entry point #============================================================================= def setup(app): # register our handler to overrride sphinx.roles.emph_literal_role from docutils.parsers.rst import roles import sphinx.roles as mod names = [ key for key,value in mod.specific_docroles.items() if value is mod.emph_literal_role ] for name in names: roles.register_local_role(name, emph_literal_role) # identifies the version of our extension return {'version': __version__} #============================================================================= # eof #============================================================================= �����������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/__init__.pyc��������������������������������������������������0000644�0001750�0001750�00000000635�13014220543�023406� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ N3Rc�����������@@��s0���d��Z��d�d�l�m�Z�d�d�l�m�Z�m�Z�d�S(���s,���package containing various sphinx extensionsi����(���t���absolute_importi���(���t���autodoc_sectionst ���index_stylingN(���t���__doc__t ���__future__R����t����R���t���nested_sectionsR���t ���index_styles(����(����(����sB���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/__init__.pyt���<module>���s������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/index_styling.pyc���������������������������������������������0000644�0001750�0001750�00000005110�13014220543�024520� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #Xc�����������@���s���d��Z��d�d�l�Z�e�j�e��Z�d�d�l�Z�d�d�l�m�Z�m �Z �d�d�l �m �Z �d�Z �d�Z �e�j�e �d�e ��Z�e�j�e �d�e ��Z�e�j�e �d �e ��Z�e�j�e �d �e ��Z�d ���Z�d ���Z�d ���Z�d�S(���sC���cloud_sptheme.ext.index_styling - improves css styling for genindexiN(���t���Markupt���escape(���t ���__version__s���^(?P<name>.*)\(s���\)$s*���(?P<left>)(?P<loc>.*)(?P<right> attribute)s'���(?P<left>)(?P<loc>.*)(?P<right> method)s4���(?P<left>class in |in module )(?P<loc>.*)(?P<right>)t���modulec���������C���s��x*t��r,t�j�|���}�|�rL�|�j�d�d�d�d��\�}��}�}�}�d�}�Pn��t�j�|���}�|�r�|�j�d�d�d�d��\�}��}�}�}�d�}�Pn��t�j�|���}�|�r�|�j�d�d�d�d��\�}��}�}�}�|�j�d��r�d�}�n�d�}�Pn��t�j�|���}�|�r(|�j�d��}��d �}�d �}�}�d �}�Pn��|��SW|�rVt�d ��t �|��t�d ��}�n��|�|�|�}�t �|���t�d �|�d��t �|��t�d ��S(���Nt���namet���leftt���loct���rightt ���attributet���methodt���classt���functionR���t����s���<span class="location">s���</span>s���<span class="category s���">( ���t���Truet���_attr_ret���matcht���groupt���_meth_ret���_fc_ret ���startswitht���_mod_ret���literalR���(���R���t���mR���R���R���t���typet���cat(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/index_styling.pyt���format_index_name���s<���� $$$  #c���������C���s���|�d�k�r�d��St��}�x�|�d�D]�\�}�}�x�t�|��D]w�\�}�} �| �\�} �} �|�| ��| �f�|�|�<| �d�} �x<�t�| ��D].�\�}�} �| �\�} �} �|�| ��| �f�| �|�<q�Wq:�Wq!�Wd��S(���Nt���genindext���genindexentriesi���(���R���t ���enumerate(���t���appt���pagenamet ���templatenamet���ctxt ���event_argt���fmtt���keyt���entriest���idxt���entryR���t���datat���subitemst���links(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/index_styling.pyt ���mangle_index/���s����    c���������C���s���|��j��d�t��i�t�d�6S(���Ns���html-page-contextt���version(���t���connectR*���R���(���R���(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/index_styling.pyt���setup>���s����(���t���__doc__t���loggingt ���getLoggert���__name__t���logt���ret���jinja2R����R���R���t ���cloud_spthemeR���t���prefixt���suffixt���compileR���R���R���R���R���R*���R-���(����(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/index_styling.pyt���<module>���s��� �  ! ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/role_index.py�������������������������������������������������0000644�0001750�0001750�00000007364�13010714261�023643� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" ====================================================== :mod:`cloud_sptheme.ext.role_index` -- JSON Role Index ====================================================== .. versionadded:: 1.8 Overview ======== This sphinx extension for the HTML builder places a file called ``roleindex.json`` in the output directory along with the documentation. This file contains a dictionary which maps all defined references (made via ``:ref:`` or ``:doc:``) to a ``(page, anchor, title)`` list. This is useful e.g. for integrating a Sphinx manual into the online help of web application -- context-specific help can be provided by looking up a predefined ``:ref:`` tag within the json file, and redirecting the user to the appropriate page and anchor location. As an example, see the `roleindex.json <../roleindex.json>`_ for this documentation. .. warning:: This extension should be considered "beta" quality. It was recently written, may have unknown issues, and may need to be revised. Configuration ============= This extension reads the following ``conf.py`` options: ``role_index_style`` style of json output -- can be ``"compact"`` (the default), or ``"pretty"`` (for debugging). """ #========================================================= # imports #========================================================= # core from __future__ import absolute_import, division, print_function import codecs import logging log = logging.getLogger(__name__) import json import os # pkg from cloud_sptheme import __version__ from sphinx.locale import _TranslationProxy # local __all__ = [ "setup", ] #========================================================= # hooks #========================================================= def write_role_index(app): """ helper which generates ``"roleindex.json"`` for document. """ if app.buildername != "html": return style = app.config.role_index_style or "compact" index = {} # add 'ref' role mappings index['ref'] = dict( (key, (page, anchor, label)) for key, (page, anchor, label) in app.env.domaindata['std']['labels'].items() ) # add 'doc' role mappings index['doc'] = dict( (doc.lower(), (doc, "", title.astext())) for doc, title in app.env.titles.items() ) # create composite 'all' mapping index['any'] = index['doc'].copy() index['any'].update(index['ref']) # write to file def encode(value): if isinstance(value, _TranslationProxy): return str(value) raise TypeError("can't serialize value: %r (type=%r)" % (value, type(value))) target = os.path.join(app.builder.outdir, "roleindex.json") kwds = dict(sort_keys=True, separators=(",", ":"), default=encode) if style == "compact": pass elif style == "pretty": kwds.update(separators=(", ", ": "), indent=True) else: raise ValueError("unknown role_index_style: %r" % style) with codecs.open(target, "w", encoding="utf-8") as fh: json.dump(index, fh, **kwds) #========================================================= # sphinx entrypoint #========================================================= def setup(app): app.add_config_value('role_index_style', None, 'html') # XXX: this probably isn't right event to attach to... # but want to run during writing phase, after all pages have been scanned into tree, # and this seems like close to the right place. def wrapper(app): write_role_index(app) return [] app.connect('html-collect-pages', wrapper) # identifies the version of our extension return {'version': __version__} #========================================================= # eof #========================================================= ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/docfield_markup.pyc�������������������������������������������0000644�0001750�0001750�00000003461�13014230147�025000� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ $01Xc�����������@���sl���d��Z��d�d�l�Z�e�j�e��Z�d�d�l�m�Z�d�d�l�m�Z�m �Z �d�g�Z �e�d����Z �d���Z �d�S(���sX��� cloud_sptheme.ext.docfield_markup -- monkeypatches sphinx to allow ``~`` in docfields. iN(���t ���__version__(���t ���patchappliert ���monkeypatcht���setupc�������������sG���d�d�l��m�}��m��m���t�|����j�d�����f�d���}�d��S(���Ni(���t���Fieldt���nodest���addnodesc��� ��� ������s���|�r%�|��|�|�|�|�d�|�d�|�S|�}�}�|�j��d��rc�|�j�d��}�|�j�d��d�}�n��t�|��j��r�|�|�|��} �n�|�|�|��} �|�s�| �S��j�|�d�|�d�t�d�|�d �|�} �| �| �7} �| �S( ���Nt ���innernodet���contnodet���~t���.i���t ���refdomaint ���refexplicitt���reftypet ���reftarget(���t ���startswitht���lstript ���rpartitiont ���issubclasst���Textt ���pending_xreft���True( ���t���_wrappedt���selft���rolenamet���domaint���targetR���R���t���rawtextt���titlet���nodet���refnode(���R���R���(����sI���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/docfield_markup.pyt ���make_xref���s����  (���t���sphinx.util.docfieldsR���R���R���R���t���emphasist���None(���R���R���(����(���R���R���sI���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/docfield_markup.pyt���_patch_docfield���s���� c���������C���s���t����i�t�d�6S(���Nt���version(���R#���R����(���t���app(����(����sI���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/docfield_markup.pyR���:���s����( ���t���__doc__t���loggingt ���getLoggert���__name__t���logt ���cloud_spthemeR����t���cloud_sptheme.utilsR���R���t���__all__R#���R���(����(����(����sI���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/docfield_markup.pyt���<module>���s��� � %���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/relbar_toc.py�������������������������������������������������0000644�0001750�0001750�00000002414�13010714261�023616� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""cloud_sptheme.ext.relbar_toc - addes TOC entry to relbar""" import os.path import logging; log = logging.getLogger(__name__) from cloud_sptheme import __version__ def insert_toc(app, pagename, templatename, ctx, event_arg): if "rellinks" not in ctx: # e.g. json builder 'genindex' page return links = ctx['rellinks'] #remove any existing toc (present on some pages) for idx, elem in enumerate(links): if elem[3] == "toc": del links[idx] break #place toc right after "next" / "previous" idx = -1 for idx, entry in enumerate(links): if entry[3] in ("next","previous"): break else: idx += 1 #insert our toc entry # FIXME: there's probably a MUCH better / less broken way to do this if "pathto" in ctx: # normal html builder path = os.path.split(os.path.splitext(ctx['pathto']("contents"))[0])[1] else: # hardcode path for special "json" builder -- # seems to always use docroot-relative paths path = "contents" links.insert(idx, (path, "Table Of Contents", "C", "toc")) def setup(app): app.connect('html-page-context', insert_toc) # identifies the version of our extension return {'version': __version__} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/table_styling.pyc���������������������������������������������0000644�0001750�0001750�00000017467�13014220543�024522� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #Xc�����������@���s��d��Z��d�d�l�m�Z�e�r/�d�d�l�m�Z�n�d�d�l�m�Z�d�d�l�Z�d�d�l�m�Z�d�d�l �m �Z �d�d�l �m �Z �d�d �l �m�Z�d�d �l�m�Z�d�d �l�m�Z�d�d �l�m�Z�m�Z�d �g�Z�d�Z�d�Z�d���Z�d���Z�e�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�� Z�d���Z�i�e�d�6e�d�6e�d�6e�d �6e�d!�6e�d"�6e�d#�6e�d$�6Z�d%���Z �d&���Z!�i�d#�d'�6d(�d)�6d*�d+�6d#�d,�6d(�d(�6d*�d*�6Z"�d-���Z#�d.�e�f�d/�����YZ$�d0���Z%�d1���Z&�d�S(2���sD���cloud_sptheme.ext.table_styling -- add directives for styling tablesi(���t���PY3(���t ���zip_longest(���t ���izip_longestN(���t���copyfile(���t���nodes(���t ���directives(���t���RSTTable(���t���StandaloneHTMLBuilder(���t ���__version__(���t ���_root_dirt���is_cloud_themet���setupt���table_styling_embed_csst���table_styling_classc���������C���s'���d�|��k�r�|��j��d��S|��j����Sd��S(���Nt���,(���t���split(���t���argument(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���_split_argument_list(���s����  c������������sz���t��|���}�t�|��d�k�rK�t���f�d���|�d�D��rK�|�d�}�n�����f�d���}�g��|�D]�}�|�|��^�qd�S(���Ni���c���������3���s���|��]�}�|���k�Vq�d��S(���N(����(���t���.0t���c(���t���argmap(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pys ���<genexpr>0���s����i����c������������s:���y ���|��SWn'�t��k �r5�t�d��|��f���n�Xd��S(���Ns���invalid %s: %r(���t���KeyErrort ���ValueError(���t���arg(���R���t���param(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���norm2���s����  (���R���t���lent���all(���R���R���R���t���argsR���R���(����(���R���R���sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���_parse_argument_map.���s ���� 2 t���lt���leftt���rt���rightR���t���centert���jt���justifyt���centeredt ���justifiedc���������C���s���t��|��t�d��S(���sk���convert into list of alignment options. raise ``ValueError`` if no args found, or invalid strings. t ���alignment(���R���t���_alignment_map(���R���(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���alignment_listF���s����t���truet���tt���yest���yt���falset���ft���not���nc���������C���s���t��|��t�d��S(���s$���convert to list of true/false valuess ���boolean value(���R���t ���_bool_map(���R���(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt ���bool_listR���s����c���������C���s,���t��|���}�g��|�D]�}�t�j�|��^�q�S(���s"���convert to list of list of classes(���R���R���t ���class_option(���R���R���R���(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���class_option_listV���s���� t���0t���singlet���1t���doublet���2t���nonec���������C���s���t��|��t�d��S(���Ns ���divider style(���R���t ���_divider_map(���R���(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt ���divider_listd���s����t���ExtendedRSTTablec�����������B���sf���e��Z�e�j�j���Z�e�j�i�e�j�d��6e�j�d�6e �d�6e �d�6e �d�6e �d�6�d���Z �d���Z�RS(���s���header-columnst���widthss���column-alignments���column-wrappings���column-classess���column-dividersc���������C���sC���t��j�|���}�|�r?�t�|�d�t�j��r?�|��j�|�d��n��|�S(���Ni����(���R���t���runt ���isinstanceR���t���tablet���_update_table_classes(���t���selft���result(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyR@������s����c������������s��t���t�j��s�t��|��j�j�j�j�j�}�t �|�t ��}�|�rm�x(�|�j ���D]�}��d�j �|��qO�Wn��|��j �j�d��p�d�}�|��j �j�d��}�|��j �j�d������d��k�r�d��}�n���f�d���}�d�}�|��j �j�d�|��|��j �j�d�|��|��j �j�d �|��f�} ��f�d ���} �| �t�j��} �| �s7d��Sd�} �x| �D]} �t��| �t�j��r|�r| �t�|��k��r|�| �| �d �<n��| �|�k��rd �| �d �<n��| �d �7} �qDn��t��| �t�j�t�j�f��st��x| �j�D]}�t��|�t�j��st��x�t�t�|�| ���D]�\�}�\�}�}�}�}�|�d��k�r@t�d���n��t��|�t�j��sXt��|�d�}�|�r||�j �|�d��n��|�t�k�r|�j �d��n��|�r|�j�|��n��|�r |�j �|�|��d��|�j �|�|�d ��d��q q WqWqDWd��S(���Nt���classess���header-columnsi����R?���s���column-dividersc������������s%���y ���|��SWn�t��k �r �d�SXd��S(���NR0���(���t ���IndexError(���t���idx(���t���dividers(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt ���get_divider���s����  s���column-alignments���column-wrappings���column-classesc������������s+���x$���j��D]�}�t�|�|���r �|�Sq �Wd��S(���N(���t���childrenRA���t���None(���t���clst���child(���RB���(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���locate���s����t���colwidthi���t���stubs$���not enough columns for field optionss���-alignt���nowraps ���-left-dividers���-right-divider(����(���RA���R���RB���t���AssertionErrort���statet���documentt���settingst���envt���configt���getattrt ���CLASS_KEYR���t���appendt���optionst���getRL���t���tgroupt���colspecR���t���theadt���tbodyRK���t���rowt ���enumerateR���R���t���entryt���Falset���extend(���RD���RB���RX���RF���RM���t ���header_colsR?���RJ���t���EMPTYt���optsRO���R^���t���colRN���Rb���RH���Rd���t���alignt���wrapt���clist(����(���RI���RB���sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyRC������s^����      !+   (���t���__name__t ���__module__R���t ���option_spect���copyt���updateR���t���nonnegative_intt���positive_int_listR)���R3���R5���R=���R@���RC���(����(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyR>���j���s���     c������������s���|��j����t���t��s�d��St�|��j�t��}�|�d��k�rP�t�|��j�j�� }�n��|�sZ�d��Sd��|��j �����j ������f�d���}�|���_ �d��S(���Ns���table_styling.cssc�������������sK������t��j�j�t�d���}��t��j�j���j�d���}�t�|��|��d��S(���Nt���extt���_static(���t���ost���patht���joinR ���t���outdirR���(���t���sourcet���target(���t���buildert���namet���orig(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���wrapper���s����( ���R}���RA���R���RY���RX���t ���EMBED_KEYRL���R ���t ���html_themet���add_stylesheett���copy_static_files(���t���appt���valueR���(����(���R}���R~���R���sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���prepare_builder���s����    c���������C���sQ���|��j��t�d��d��|��j��t�d�d��|��j�d�t��|��j�d�t��i�t�d�6S(���Nt���htmls ���styled-tableRB���s���builder-initedt���version( ���t���add_config_valueR���RL���RZ���t ���add_directiveR>���t���connectR���R���(���R���(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyR ������s ����('���t���__doc__t���cloud_sptheme.utilsR����t ���itertoolsR���R���Rw���t���shutilR���t���docutilsR���t���docutils.parsers.rstR���t&���docutils.parsers.rst.directives.tablesR���t���sphinx.builders.htmlR���t ���cloud_spthemeR���R ���R ���t���__all__R���RZ���R���R���t���dictR(���R)���t���TrueRe���R2���R3���R5���R<���R=���R>���R���R ���(����(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/table_styling.pyt���<module>���s\���          h ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/autodoc_sections.pyc������������������������������������������0000644�0001750�0001750�00000016411�13014220543�025213� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #Xc�����������@���s���d��Z��d�d�l�Z�d�d�l�Z�d�d�l�Z�e�j�e��Z�d�d�l�m�Z�d�d�l �m �Z �m �Z �m �Z �d�g�Z �d�d�d��Z�e �d����Z�d���Z�d ���Z�d ���Z�d�S( ���sH���cloud_sptheme.ext.autodoc_sections - support ReST sections in docstringsiN(���t ���__version__(���t���ut ���patchappliert ���monkeypatcht���setupc���������C���s���d�}�z�t�j���j�}�xm�t�r�|�j�j�d��|��k�rV�|� sR�|�j�j�|�k�rV�Pn��|�j�}�|�s�t �d�|��|�pw�d�f���q�q�W|�j �|�}�|�r�t �|�|�� r�t �d�|�|�|�f���n��|�SWd�d�}�Xd�S(���s�� helper which looks for nearest ancestor in call stack which occurred in module, and return specified local variable. :param module: name of module to look for on stack :param var: name of local variable to return :param rtype: do optional type-check to ensure **name** has expected type. :param code: optionally match based on function name (``frame.f_code.co_name``) as well as module. t���__name__s.���couldn't find module=%r, code=%r in call stacks���<any>s���%s: expected a %r instance: %rN( ���t���Nonet���inspectt ���currentframet���f_backt���Truet ���f_globalst���gett���f_codet���co_namet ���RuntimeErrort���f_localst ���isinstancet ���TypeError(���t���modulet���vart���rtypet���codet���framet���value(����(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt���get_caller_value���s ����   c���� ���������s���d�d�l��m�}��m�}�t�|���d����}�d �|��_�d�d�l�m�}�t�|��d����}�d�d�l�m �}�d�d�l �m ���t�|����f�d����}�d�d �l �m �}�t�|�_�d�d �l�m�}�d�d �l��m��t�|���f�d ����} �d �S(���sI��� helper which monkeypatches sphinx to install some of our hooks. i(���t���documentt���make_idc���������_���s���|�j��}�|�s"�|��|�|�|�|��Sd��|�_��|�d�j�d��|�d�j�d�|�d��|�d�d�j�d��|�j�}�|�j�}�zZ�|�d�r�|�r�t�d��|�j�|�d�f�|�_�q�|�d�|�_�n��|��|�|�|�|��SWd��|�|�_�Xd��S( ���Nt���classess ���desc-sections���desc-section-%dt���leveli����s���section-headert���prefixs���%s-%s(���t���_modify_new_desc_sectionR���t���appendt���settingst ���id_prefixR���(���t���_wrappedt���selft���targett���argst���kwdst���entryR!���t���orig(����(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt���note_implicit_targetL���s ����     #(���t���RSTStatec���������_���sX���t��|�j�d�d���}�|�rH�|�d�}�|�j�j�d�|�d�<|�|�j�_�n��|��|�|�|��S(���Nt ���desc_stackii���R���(���t���getattrt���memoR���t ���section_levelR���R���(���R#���R$���R&���R'���R,���R(���(����(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt���new_subsection���s ���� (���t���ObjectDescription(���t���descc������������sC���t��������f�d����}�t�������f�d����}�|�����S(���Nc������ ������s2��|����t��d�d�d��d�d�}�|�j�d�}�|�j�d��rO�|�d�d�}�n,�|�j�d��ro�|�d�d�}�n �|�j���}�t�j�d �d �|��j�d ��d �}��j�j�}�t �|�d ��s�g��|�_ �n��|�j �j �t �d �|�d ��d�|�d�d����j���t ���d��s%t ������f�d����}�n��t���_�d��S(���Ns���sphinx.directivest���nodeR���R���t���runi����t���idst���namess���[^a-zA-Z0-9_.]+t���-R,���R���t���ownert���signodeR���t���_set_next_match_titles_flagc������������s,�����j��r�t�|�d�<t���_��n��|��|�|���S(���Nt ���match_titles(���R:���R ���t���False(���t���_wrapped_parseR&���R'���(���t���state(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt ���nested_parse���s����   (���R���t���childrenR ���t���astextt���ret���subt���stripR>���R.���t���hasattrR,���R ���t���dictR���R ���R:���(���t���_wrapped_beforeR3���R9���t���baseR���R.���R?���(���t ���DescNodeTypeR$���(���R>���sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt���before_content���s,����   "   c������������s8�����j��j�j�j���}�|�d���k�s1�t�d���|����S(���NR8���s���sanity check failed(���R>���R.���R,���t���popt���AssertionError(���t���_wrapped_afterR2���(���R$���(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt ���after_content���s����(���R���(���t ���_wrapped_runR$���RJ���RN���(���RI���(���R$���sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyR4������s���� 8(���t ���Documenter(���t���DocFieldTransformer(���t���sectionc������������sD���|��|�|��x0�|�D](�}�t��|����r�|��|�|�j��q�q�Wd��S(���N(���R���R@���(���R#���R$���R3���t���child(���RR���(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt ���transform_all ��s����  N(���t���docutils.nodesR���R���R���R���R���t���docutils.parsers.rst.statesR+���t���sphinx.directivesR1���t���sphinx.addnodesR2���t���sphinx.ext.autodocRP���R ���t���titles_allowedt���sphinx.util.docfieldsRQ���RR���( ���R���R���R*���R+���R0���R1���R4���RP���RQ���RT���(����(���RI���RR���sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt ���_patch_sphinx<���s����% W c���������C���s���|�d�k�r�d�St��j�d�j�t��j�|���t��j�t��j�B�}�t�|��d�k�r�|�j�|�d��r�|�d�j���d�k�r�|�d�4n��d�S(���sO��� helper to remove one-line description from top of module (if preset). R���NsP��� ^ \s* ( {0} \s* -- \s* )? [a-z0-9 _."']* $ i���i����t����i���( ���RB���t���compilet���formatt���escapet���Xt���It���lent���matchRD���(���t���appt���whatt���namet���objt���optionst���linest ���_title_re(����(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt���trim_module_header��s ���� (;c���������C���s"���t����|��j�d�t��i�t�d�6S(���Ns���autodoc-process-docstringt���version(���R\���t���connectRl���R����(���Re���(����(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyR���/��s����c�����������C���s���d�S(���s�� The :mod:`~cloud_sptheme.ext.autodoc_sections` extension should generate nested sections as found within object docstrings. Nested Section ============== :param arg: xxx .. attribute:: foo bar These sections can in turn contain others: Child Section ------------- Which allows breaking long class docstrings up in meaningful ways. Child Section 2 --------------- And more content Nested Section 2 ================ end of class N(����(����(����(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt ���_doctestfunc?��s����(���t���__doc__R���RB���t���loggingt ���getLoggerR���t���logt ���cloud_spthemeR����t���cloud_sptheme.utilsR���R���R���t���__all__R���R���R\���Rl���R���Ro���(����(����(����sJ���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autodoc_sections.pyt���<module>���s���   � '  �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/autoattribute_search_bases.pyc��������������������������������0000644�0001750�0001750�00000003654�13014220543�027251� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #Xc�����������@���sl���d��Z��d�d�l�Z�e�j�e��Z�d�d�l�m�Z�d�d�l�m�Z�m �Z �d�g�Z �e�d����Z �d���Z �d�S(���s��� cloud_sptheme.ext.autoattribute_search_bases -- monkeypatches autodoc so ``autoattribute`` searches base classes for attr doc. iN(���t ���__version__(���t ���patchappliert ���monkeypatcht���setupc�������������s>���d�d�l��m�}��m���m��t�|������f�d����}�d��S(���Ni(���t���AttributeDocumentert���ModuleAnalyzert ���PycodeErrorc��� ���������s��|�j�� r�|�j�r�|�j�r�|�j�j���}�d�j�|�j�d� �|�j�d�f�}�|�|�k�r�t�|�j�d��r�x�|�j�j�d�D]u�}�y"���j�|�j ��}�|�j���}�Wn��k �r�} �q}�n�X|�j �|�j�d�f�} �| �|�k�r}�|�| �|�|�<Pq}�q}�Wq�q�n��|��|�|�|��S(���Nt���.it���__mro__i���( ���t���_datadescriptort���analyzert���objpatht���find_attr_docst���joint���hasattrt���parentR���t ���for_modulet ���__module__t���__name__( ���t���_wrappedt���selft���argst���kwdst ���attr_docst���keyt���baseclsR ���t���base_attr_docst���errt���base_key(���R���R���(����sT���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autoattribute_search_bases.pyt ���add_content���s ����#  (���t���sphinx.ext.autodocR���R���R���R���(���R���R���(����(���R���R���sT���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autoattribute_search_bases.pyt���_patch_autoattribute���s����c���������C���s���t����i�t�d�6S(���Nt���version(���R���R����(���t���app(����(����sT���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autoattribute_search_bases.pyR���5���s����( ���t���__doc__t���loggingt ���getLoggerR���t���logt ���cloud_spthemeR����t���cloud_sptheme.utilsR���R���t���__all__R���R���(����(����(����sT���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/autoattribute_search_bases.pyt���<module>���s��� �  ������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/perpage.py����������������������������������������������������0000644�0001750�0001750�00000006326�13010714261�023133� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""cloud_sptheme.ext.perpage -- override sphinx config per-page * perpage_html_logo -- glob map (ala html_sidebars), used to change sidebar logo per-page .. todo:: document this extension """ #============================================================================= # imports #============================================================================= # core import os.path import re import logging; log = logging.getLogger(__name__) # site from sphinx.util.matching import patmatch #pkg from cloud_sptheme import __version__ # local #============================================================================= # helpers #============================================================================= def _rank_pattern(pattern): """return sorting key for prioritizing which glob pattern should match""" # TODO: add more ways to distinguish patterns if both have wildcards return not any(char in pattern for char in '*?[') def bestmatch(patmap, source, default=None, param="source"): """return best match given a dictionary mapping glob pattersn -> values""" best = None best_rank = None for pattern in patmap: if not patmatch(pattern, source): continue cur_rank = _rank_pattern(pattern) if best is None or cur_rank < best_rank: best = pattern best_rank = cur_rank elif cur_rank == best_rank: raise KeyError("%s %r matches too many patterns: %r and %r" % (param, source, best, pattern)) if best is None: return default else: return patmap[best] #============================================================================= # sphinx hooks #============================================================================= def perpage_html_logo(app, pagename, templatename, ctx, event_arg): """helper to override sidebar logo per-page""" patmap = getattr(app.config, "perpage_html_logo", {}) logo = bestmatch(patmap, pagename, ctx.get("logo"), param="pagename") if logo is None: ctx.pop("logo", None) else: ctx['logo'] = logo # NOTE: this works, just don't have a use for it yet ##def perpage_html_theme_options(app, pagename, templatename, ctx, event_arg): ## patmap = getattr(app.config, "perpage_html_theme_options") ## if not patmap: ## return ## values = bestmatch(patmap, pagename, None, param="pagename") ## if values: ## for key, value in values.items(): ## # TODO: validate 'key' is valid theme option ## ctx['theme_' + key] = value #============================================================================= # sphinx init #============================================================================= def setup(app): app.add_config_value('perpage_html_logo', None, 'env') ##app.add_config_value('perpage_html_theme_options', None, 'env') app.connect('html-page-context', perpage_html_logo) ##app.connect('html-page-context', perpage_html_theme_options) # identifies the version of our extension return {'version': __version__} #============================================================================= # eof #============================================================================= ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/table_styling.py����������������������������������������������0000644�0001750�0001750�00000021722�13010714261�024345� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""cloud_sptheme.ext.table_styling -- add directives for styling tables""" #============================================================================= # imports #============================================================================= # core from cloud_sptheme.utils import PY3 if PY3: from itertools import zip_longest as izip_longest else: # FIXME: not present in py25 from itertools import izip_longest import os from shutil import copyfile # site from docutils import nodes from docutils.parsers.rst import directives from docutils.parsers.rst.directives.tables import RSTTable from sphinx.builders.html import StandaloneHTMLBuilder # pkg from cloud_sptheme import __version__ from cloud_sptheme import _root_dir, is_cloud_theme # local __all__ = [ "setup", ] #============================================================================= # constants #============================================================================= # name of key controlling whether css file is included EMBED_KEY = "table_styling_embed_css" # name of key controlling css class name CLASS_KEY = "table_styling_class" #============================================================================= # field option parsers #============================================================================= def _split_argument_list(argument): if "," in argument: return argument.split(",") else: return argument.split() def _parse_argument_map(argument, argmap, param): args = _split_argument_list(argument) if len(args) == 1 and all(c in argmap for c in args[0]): args = args[0] def norm(arg): try: return argmap[arg] except KeyError: raise ValueError("invalid %s: %r" % (param, arg)) return [norm(arg) for arg in args] _alignment_map = dict( l="left", r="right", c="center", j="justify", left="left", right="right", center="center", centered="center", # compat alias justify="justify", justified="justify", # compat alias ) def alignment_list(argument): """convert into list of alignment options. raise ``ValueError`` if no args found, or invalid strings. """ return _parse_argument_map(argument, _alignment_map, "alignment") _bool_map = {"true": True, "t": True, "yes": True, "y": True, "false": False, "f": False, "no": False, "n": False, } def bool_list(argument): """convert to list of true/false values""" return _parse_argument_map(argument, _bool_map, "boolean value") def class_option_list(argument): """convert to list of list of classes""" args = _split_argument_list(argument) return [directives.class_option(arg) for arg in args] _divider_map = { "0": "no", "1": "single", "2": "double", "none": "no", "single": "single", "double": "double", } def divider_list(argument): return _parse_argument_map(argument, _divider_map, "divider style") #============================================================================= # replacement for table directive #============================================================================= class ExtendedRSTTable(RSTTable): # TODO: could have this auto-generate tabularcolumns directive for latex, # based on alignment, dividers, and wrapping settings: # |,|| for dividers # l,c,r - align, nowrap # L,C,R,J - align, wrap # XXX: how to handle widths for tabularcolumns? option_spec = RSTTable.option_spec.copy() option_spec.update({ # class, name already present ##'header-rows': directives.nonnegative_int, 'header-columns': directives.nonnegative_int, # TODO: column-widths: support limited set of units (em/in/%) # expressable under both css & latex 'widths': directives.positive_int_list, 'column-alignment': alignment_list, 'column-wrapping': bool_list, 'column-classes': class_option_list, 'column-dividers': divider_list, }) def run(self): result = RSTTable.run(self) if result and isinstance(result[0], nodes.table): self._update_table_classes(result[0]) return result def _update_table_classes(self, table): assert isinstance(table, nodes.table) config = self.state.document.settings.env.config classes = getattr(config, CLASS_KEY) if classes: for cls in classes.split(): table['classes'].append(cls) header_cols = self.options.get("header-columns") or 0 ## header_rows = self.options.get("header-rows") widths = self.options.get("widths") dividers = self.options.get("column-dividers") if dividers is None: get_divider = None else: def get_divider(idx): try: return dividers[idx] except IndexError: return "no" EMPTY = () opts = ( self.options.get("column-alignment", EMPTY), self.options.get("column-wrapping", EMPTY), self.options.get("column-classes", EMPTY), ) def locate(cls): for child in table.children: if isinstance(child, cls): return child return None tgroup = locate(nodes.tgroup) if not tgroup: return col = 0 for child in tgroup: if isinstance(child, nodes.colspec): if widths and col < len(widths): child['colwidth'] = widths[col] if col < header_cols: child['stub'] = 1 col += 1 continue assert isinstance(child, (nodes.thead, nodes.tbody)) for row in child.children: # add alignment and wrap classes to each entry (would add to # colspec, but html doesn't inherit much from colgroup) assert isinstance(row, nodes.row) for idx, (entry, align, wrap, clist) in \ enumerate(izip_longest(row, *opts)): if entry is None: # FIXME: make into propert rst error raise ValueError("not enough columns for field options") assert isinstance(entry, nodes.entry) classes = entry['classes'] if align: classes.append(align + "-align") if wrap is False: classes.append("nowrap") if clist: classes.extend(clist) if get_divider: classes.append(get_divider(idx) + "-left-divider") classes.append(get_divider(idx+1) + "-right-divider") # untested - might be missing some docutils node framework bits ##if header_rows > 1: ## thead = locate(nodes.thead) ## if not thead: ## thead = nodes.thead() ## idx = table.children.index(tgroup) ## table.children.insert(idx, thead) ## thead.extend(tgroup.children[:header_rows]) ## del tgroup.children[:header_rows] #============================================================================= # patch builder to copy css file (if needed) #============================================================================= def prepare_builder(app): # make sure needed css styling gets included when building html builder = app.builder if not isinstance(builder, StandaloneHTMLBuilder): return value = getattr(app.config, EMBED_KEY) if value is None: value = not is_cloud_theme(app.config.html_theme) if not value: return # add custom css stylesheet name = "table_styling.css" app.add_stylesheet(name) # monkeypatch builder to copy over css file orig = builder.copy_static_files def wrapper(): orig() source = os.path.join(_root_dir, "ext", name) target = os.path.join(builder.outdir, "_static", name) copyfile(source, target) builder.copy_static_files = wrapper #============================================================================= # register extension #============================================================================= def setup(app): # whether it will embed raw css app.add_config_value(EMBED_KEY, None, "html") # default class to add to all styled tables app.add_config_value(CLASS_KEY, "styled-table", "html") # replace existing table directive with custom one app.add_directive("table", ExtendedRSTTable) # add extra resources app.connect("builder-inited", prepare_builder) # identifies the version of our extension return {'version': __version__} #============================================================================= # eof #============================================================================= ����������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/autoattribute_search_bases.py���������������������������������0000644�0001750�0001750�00000005263�13010714261�027105� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" cloud_sptheme.ext.autoattribute_search_bases -- monkeypatches autodoc so ``autoattribute`` searches base classes for attr doc. """ #============================================================================= # imports #============================================================================= # core import logging; log = logging.getLogger(__name__) # site # pkg from cloud_sptheme import __version__ from cloud_sptheme.utils import patchapplier, monkeypatch # local __all__ = [ "setup", ] #============================================================================= # patch #============================================================================= @patchapplier def _patch_autoattribute(): from sphinx.ext.autodoc import AttributeDocumenter, ModuleAnalyzer, PycodeError @monkeypatch(AttributeDocumenter) def add_content(_wrapped, self, *args, **kwds): if not self._datadescriptor and self.analyzer and self.objpath: attr_docs = self.analyzer.find_attr_docs() key = ('.'.join(self.objpath[:-1]), self.objpath[-1]) if key not in attr_docs: # look for parent class w/ correct attr if hasattr(self.parent, "__mro__"): for basecls in self.parent.__mro__[1:]: try: analyzer = ModuleAnalyzer.for_module(basecls.__module__) base_attr_docs = analyzer.find_attr_docs() except PycodeError as err: continue # FIXME: need qualname or equivalent for basecls base_key = (basecls.__name__, self.objpath[-1]) if base_key in base_attr_docs: # insert data into existing analyzer # XXX: might be prettier way to handle this, # (esp so actual source file was reported) # but would have to duplicate much of add_content() attr_docs[key] = base_attr_docs[base_key] break return _wrapped(self, *args, **kwds) #============================================================================= # sphinx entry point #============================================================================= def setup(app): # don't apply our patch unless actually loaded by sphinx _patch_autoattribute() # identifies the version of our extension return {'version': __version__} #============================================================================= # eoc #============================================================================= ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/issue_tracker.pyc���������������������������������������������0000644�0001750�0001750�00000006415�13014220543�024514� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #Xc�����������@���s���d��Z��d�d�l�Z�d�d�l�m�Z�d�d�l�m�Z�d�d�l�m�Z�d���Z�d���Z �d���Z �e�j �d �e�j ��Z �i��g��d ��Z�d ���Z�d�S( ���sT���cloud_sptheme.ext.issue_tracker - added ":issue:" text role to link to issue trackeriN(���t���nodes(���t ���set_classes(���t ���__version__c���������C���s=���|��j��j�|�d�|�}�|��j�|�|�|��}�|�g�|�g�f�S(���s���generate error node and msgt���line(���t���reportert���errort ���problematic(���t���inlinert���rawtextR���t���valuet���msgt���node(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/issue_tracker.pyt ���make_error���s����c���������C���s���t��|��d�d��p�d�S(���s%���retrieve issue_tracker_title templatet���issue_tracker_titles ���issue {issue}N(���t���getattrt���None(���t���config(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/issue_tracker.pyt���get_issue_tracker_title���s����c���������C���s���t��|��d�d ��}�|�s�d �S|�j�d��rJ�|�d�j�d��}�d�|�d�S|�j�d��rx�|�d�j�d��}�d�|�d �S|�j�d ��r�|�d�j�d��}�d �|�d�S|�Sd �S( ���s6���retrieve issue_tracker_url template, replacing aliasest���issue_tracker_urls���bb:i���t���/s���https://bitbucket.org/s���/issues/{issue}s���gc:s���https://code.google.com/p/s���/issues/detail?id={issue}s���gh:s���https://github.com/N(���R���R���t ���startswitht���strip(���R���t���templatet���project(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/issue_tracker.pyt���get_issue_tracker_url���s����  s��� ^ (?: (?P<title>[^<]+) \s* < (?P<issue1>\d+) > | (?P<issue2>\d+) ) $ c���������C���s4��t��j�|��}�|�rK�t�|�j�d��p3�|�j�d���}�|�j�d��} �n�t�|�|�|�d�|�f��S|�j�j�j�j�j �} �t �| ��} �t �| ��} �| �s�| �j �d�|��} �n��t �|��|�j�d�g���} �| �j�d��| �r| �j �d�|�d�| ��}�t�j�|�| �d�|�|�}�n�t�j�|�| �|��}�|�g�g��f�S(���s���generate link to an issuet���issue1t���issue2t���titles���Invalid issue identifier: %rt���issuet���classest���refuri(���t���issue_ret���matcht���intt���groupR ���t���documentt���settingst���envt���appR���R���R���t���formatR���t ���setdefaultt���appendR����t ���referencet���emphasis(���t���nameR���t���textR���R���t���optionst���contentt���mR���R���R���t ���url_templatet���title_templatet���clistt���urlR ���(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/issue_tracker.pyt ���issue_roleF���s&���� $     c���������C���sA���|��j��d�d�d��|��j��d�d�d��|��j�d�t��i�t�d�6S(���s���install pluginR���R%���R ���R���t���versionN(���t���add_config_valueR���t���add_roleR5���R���(���R&���(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/issue_tracker.pyt���setupq���s����(���t���__doc__t���ret���docutilsR����t���docutils.parsers.rst.rolesR���t ���cloud_spthemeR���R ���R���R���t���compilet���XR���R5���R9���(����(����(����sG���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/issue_tracker.pyt���<module>���s���     +���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/escaped_samp_literals.pyc�������������������������������������0000644�0001750�0001750�00000005522�13014220562�026173� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ #Xc�����������@���sg���d��Z��d�d�l�m�Z�m�Z�d�d�l�m�Z�d�d�l�m�Z�m�Z�d�g�Z �i��g��d��Z �d���Z �d�S( ���sI���cloud_sptheme.ext.escaped_samp_literals - allow escaping { and } in samp.i(���t���nodest���utils(���t ���__version__(���t���ut���rut���setupc������������s<������f�d���}�t��j�|��}�t�j�d�|��j���d�|��g��}�t�d��} �t�} �t�} �d�} �d�} �x~|�D]v}�| �d�7} �| �r�|�t�d��k�r�| �|�7} �t�} �q|�| �d�d �|�f��Sqp�|�t�d ��k�r�t �} �| �d�7} �qp�| �rq|�t�d ��k�r|�| �d ��S|�t�d ��k�rd| �s9|�| �d�d��S|�t�j �| �| ��7}�t�d��} �t�} �q| �|�7} �qp�|�t�d ��k�r| �r|�t�j �| �| ��7}�n��t�d��} �t �} �| �} �qp�|�t�d ��k�r|�| �d��S| �|�7} �qp�W| �r|�| �d��S| �r|�| �d��S| �r/|�t�j �| �| ��7}�n��|�g�g��f�S(���s���replacement for sphinx's ``:samp:`` role handler. this is a bit stricter in it's parsing, and allows escaping of literal ``{`` and ``}`` characters. c������������sP���d�|�|���f�}���j��j�|�d��}���j���|��}�|�g�|�g�f�S(���Ns���%s at char %d of %st���line(���t���reportert���errort ���problematic(���t���post���valuet���msgt���prb(���t���inlinert���linenot���rawtext(����sO���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/escaped_samp_literals.pyt ���make_error���s����t���rolet���classest����i����i���s���{}\i���s���unknown samp-escape '\\%s's���\t���{s ���unescaped '{'t���}s���empty variable sections ���unescaped '}'s!���unterminated samp-escape sequences���unterminated variable sectionN( ���R���t���unescapeR����t���literalt���lowerR���t���Falset���NoneR���t���Truet���emphasist���Text(���t���typR���t���textR���R���t���optionst���contentR���t���retnodet���buffert ���in_escapet���in_vart ���var_startt���it���c(����(���R���R���R���sO���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/escaped_samp_literals.pyt���emph_literal_role���sX����!               c���������C���s���d�d�l��m�}�d�d��l�j�}�g��|�j�j���D]!�\�}�}�|�|�j�k�r/�|�^�q/�}�x�|�D]�}�|�j�|�t��q]�Wi�t�d�6S(���Ni(���t���rolest���version(���t���docutils.parsers.rstR+���t ���sphinx.rolest���specific_docrolest���itemsR*���t���register_local_roleR���(���t���appR+���t���modt���keyR ���t���namest���name(����(����sO���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/escaped_samp_literals.pyR���V���s���� N( ���t���__doc__t���docutilsR����R���t ���cloud_spthemeR���t���cloud_sptheme.utilsR���R���t���__all__R*���R���(����(����(����sO���/home/biscuit/dev/libs/cloud/default/cloud_sptheme/ext/escaped_samp_literals.pyt���<module>���s ��� C������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/page_only.py��������������������������������������������������0000644�0001750�0001750�00000015071�13010714261�023462� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������""" ============================================================== :mod:`cloud_sptheme.ext.page_only` -- Exclude Pages from Build ============================================================== .. versionadded:: 1.8 Overview ======== This extension provides a ``.. page-only::`` directive, which allows conditionally omitting entire pages from the document based on build tags. The first line of a page should be a ``.. page-only:: <expr>`` directive; where ``<expr>`` is a tag, or simple tag expression, just like ``.. only::``. If the expression evaluates to False, the page won't be included in the final build (and should be silently omitted from any TOC lists). E.g. ``.. page-only:: draft and html`` """ #============================================================================= # imports #============================================================================= # core from __future__ import absolute_import, division, print_function import logging log = logging.getLogger(__name__) import re from weakref import WeakKeyDictionary # site from docutils.parsers.rst import Directive import sphinx.addnodes # pkg from cloud_sptheme import __version__ from cloud_sptheme.utils import patchapplier, monkeypatch # local __all__ = [ "setup", ] #============================================================================= # patching #============================================================================= @patchapplier def _patch_sphinx(): # # to get files list right, best to modify found_files before env.get_outdated_files() # gets a hold of them, and starts looking for changes. # from sphinx.environment import BuildEnvironment @monkeypatch(BuildEnvironment) def get_outdated_files(__wrapped__, env, config_changed): # call out hook to modify found_docs to remove omitted entries, # and store them in env.omitted_by_page_only strip_omitted_docs(env) # hand off to orig function return __wrapped__(env, config_changed) # # patch TocTree.run() so it doesn't warning about broken toc entries. # from sphinx.directives.other import TocTree @monkeypatch(TocTree) def run(__wrapped__, self): env = self.state.document.settings.env omitted_docs = env.omitted_by_pageonly found_docs = env.found_docs try: # temporarily restore found_docs so TocTree doesn't throw warning. # NOTE: this causes broken toc entries to be generated (rather than warnings). # these are cleaned up by remove_toc_entries() below env.found_docs = found_docs | omitted_docs return __wrapped__(self) finally: env.found_docs = found_docs #============================================================================= # hooks #============================================================================= #: regex used to detect page-only directive _header_re = re.compile(r"^\.\.\s+page-only::\s+(?P<expr>.+)\s*$") #: as hack, using this to store reference to app so we can resolve it w/in env monkeypatch _env_to_app = WeakKeyDictionary() def install_app_ref(app): """ hack to get app ref w/in env.get_outdated_files() monkeypatch, called on 'builder-inited' event """ _env_to_app[app.env] = app def strip_omitted_docs(env): """ helper invoked right before env.get_outdated_files() is called, scans for omitted files and modifies document set accordingly. called via monkeypatch before .get_outdated_files() is run, which happens during env.update(), shortly before 'env-get-outdated' event. """ # scan through found docs, removing any that should be omitted app = _env_to_app[env] found_docs = env.found_docs omitted_docs = set() for doc in found_docs: # find first non-empty line with open(env.doc2path(doc), 'r') as fh: line = '' for line in fh: if line.strip(): break # check if it's a PageOnly directive m = _header_re.match(line) if not m: continue # add page to omitted list if expression doesn't validate if not app.tags.eval_condition(m.group("expr")): omitted_docs.add(doc) if omitted_docs: app.info("%s pages omitted by page-only" % len(omitted_docs)) # persist omitted list for TocTree.run() wrapper and remove_from_toc() env.omitted_by_pageonly = omitted_docs # remove omitted from 'found_docs', so get_outdated_files() doesn't see them found_docs.difference_update(omitted_docs) class PageOnly(Directive): """ Directive used to capture info. Notes that this doesn't actually do anything, job has already been done by find_omitted_docs(). This is just here to prevent parse errors. """ # NOTE: cloned from Author directive, should be ok... has_content = False required_arguments = 1 optional_arguments = 0 final_argument_whitespace = True option_spec = {} def run(self): # XXX: could issue warning if this is encountered anywhere but top of document. return [] def remove_from_toc(app, doctree): """ remove omitted pages from TOC, let through by TocTree.run() monkeypatch called on doctree-read event. """ # FIXME: removing entries now seems to leave broken PREV/NEXT links before & after # the omitted entries. either need to patch that as well, or move this up # into our TocTree.run() call, where we'd have to deal w/ nodes up there. omitted_docs = app.env.omitted_by_pageonly for toctreenode in doctree.traverse(sphinx.addnodes.toctree): entries = toctreenode['entries'] # print("%r %r %r" % (doctree, toctreenode, entries)) # dbgcon() idx = 0 while idx < len(entries): entry = entries[idx] # entry is (label|None, doc) tuple... if str(entry[1]) in omitted_docs: del entries[idx] else: idx += 1 #============================================================================= # sphinx entrypoint #============================================================================= def setup(app): _patch_sphinx() app.add_directive('page-only', PageOnly) app.connect('builder-inited', install_app_ref) app.connect('doctree-read', remove_from_toc) # identifies the version of our extension return {'version': __version__} #============================================================================= # eoc #============================================================================= �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/ext/autodoc_sections.py�������������������������������������������0000644�0001750�0001750�00000035717�13010714261�025063� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""cloud_sptheme.ext.autodoc_sections - support ReST sections in docstrings""" #============================================================================= # imports #============================================================================= # core import inspect import re import logging; log = logging.getLogger(__name__) # site # pkg from cloud_sptheme import __version__ from cloud_sptheme.utils import u, patchapplier, monkeypatch # local __all__ = [ "setup", ] #============================================================================= # internal helpers used for hacking up sphinx. almost ashamed to be doing this. #============================================================================= def get_caller_value(module, var, rtype=None, code=None): """ helper which looks for nearest ancestor in call stack which occurred in module, and return specified local variable. :param module: name of module to look for on stack :param var: name of local variable to return :param rtype: do optional type-check to ensure **name** has expected type. :param code: optionally match based on function name (``frame.f_code.co_name``) as well as module. """ frame = None try: frame = inspect.currentframe().f_back while True: if ((frame.f_globals.get("__name__") == module) and (not code or frame.f_code.co_name == code)): break frame = frame.f_back if not frame: raise RuntimeError("couldn't find module=%r, code=%r in call stack" % (module, code or '<any>')) value = frame.f_locals[var] if rtype and not isinstance(value, rtype): raise TypeError("%s: expected a %r instance: %r" % (var, rtype, value)) return value finally: frame = None #============================================================================= # autodoc monkeypatches / hacks #============================================================================= @patchapplier def _patch_sphinx(): """ helper which monkeypatches sphinx to install some of our hooks. """ #---------------------------------------------------------------------- # patch document.note_implicit_target() to look for _modify_new_desc_section # attribute, as signal that it should munge up node that's passed to it, # to represent new description-level section, rather than document-level section. # this flag is then set by RSTState.new_subsection() patch, below. # NOTE: ideally, all this action could be done by a hook w/in # RSTState.new_subsection(), but would have to modify source. #---------------------------------------------------------------------- from docutils.nodes import document, make_id @monkeypatch(document) def note_implicit_target(_wrapped, self, target, *args, **kwds): # use default behavior unless signal flag is set entry = self._modify_new_desc_section if not entry: return _wrapped(self, target, *args, **kwds) self._modify_new_desc_section = None # NOTE: target should be section() node we're modifying, # as we just got called from RSTState.new_subsection(), # which is what sets modify_new_desc_section flag. # 'entry' should be last item in memo.desc_stack # (see below). # add our custom css classes for styling # NOTE: adding 'section-header' class to H<N> node, # so that our css rules don't have to be duplicated for every H<N> value. target['classes'].append("desc-section") target['classes'].append("desc-section-%d" % entry['level']) target[0]['classes'].append("section-header") # for duration of call, modify settings.id_prefix to include # decription prefix in any auto-generated ids. this helpers # section names remaining unique even if used between classes # (e.g. common names such as 'Constructor Options') settings = self.settings orig = settings.id_prefix try: if entry['prefix']: if orig: settings.id_prefix = u("%s-%s") % (settings.id_prefix, entry['prefix']) else: settings.id_prefix = entry['prefix'] return _wrapped(self, target, *args, **kwds) finally: settings.id_prefix = orig document._modify_new_desc_section = None #---------------------------------------------------------------------- # patch RSTState.new_subsection() to generate sections nested within # a description. It reads ``memo.desc_stack`` to determine if it's within # a description. If set, this attr should be a list of dicts, # each entry representing a nested description (e.g. an ObjectDescription) # whose content is being parsed, most recent should be last. # Each entry should be a dict containing: # # If there are no description entries active, the normal behavior is used. # # Each dict should contain the following keys: # * prefix -- None, or string to use as prefix for section identifiers. # helps keep links unique w/in document. # * signode -- signature node used to generate prefix (for debugging) # * owner -- arbitary object (ObjectDescription in our case) # which added this entry to list. intended as sanity check # when popping entries back off stack. # * level -- section level w/in declaration (autoset by code below) #---------------------------------------------------------------------- from docutils.parsers.rst.states import RSTState @monkeypatch(RSTState) def new_subsection(_wrapped, self, *args, **kwds): desc_stack = getattr(self.memo, "desc_stack", None) if desc_stack: # after new_subsection() creates section node, # it will invoke document.note_implicit_target(). # setting this attr signals our monkeypatch of that method (above) # to make changes to that node based on desc_stack entry. # NOTE: ideally, the note_implicit_target() monkeypatch, # as well as this code, would be placed inside RSTState.new_subsection(), # but that would require modifying sphinx's source :( entry = desc_stack[-1] entry['level'] = self.memo.section_level+1 # set level w/in description self.document._modify_new_desc_section = entry # enable note hack # hand off to real method return _wrapped(self, *args, **kwds) #---------------------------------------------------------------------- # monkeypatch ObjectDescription.run() so that: # 1. before calling state.nested_parse(), we push a desc context # onto state_machine.desc_context_stack (see above). # 2. when it does call state.nested_parse() the first time, # ``match_titles=True`` gets set. # FIXME: using a really awkward way to accomplish this :| # 3. pop our context off desc_context_stack when done. #---------------------------------------------------------------------- from sphinx.directives import ObjectDescription from sphinx.addnodes import desc as DescNodeType @monkeypatch(ObjectDescription) def run(_wrapped_run, self): # ObjectDescription.before_content() will be invoked right before # run calls ``self.state.nested_parse()``. We take advantage of that # by wrapping the instance's before_content() call so that the last # thing is does is set up ``self.state`` the way we want. # NOTE: have to patch per-instance, since subclasses that override this # don't tend to invoke super() @monkeypatch(self) def before_content(_wrapped_before): # let real method do all the setup it wants. _wrapped_before() #---------------------------------------------------------------------- # need to figure out prefix to prepend to our description sections, # so their IDs are unique. for now, using signature node # ObjectDescription.run() has finished generating right before before_content() # was called. Unfortunately, it's not available via self, # so we have to reach into call stack to grab it... # NOTE: ideally we would do this in ObjectDescription.run(). #---------------------------------------------------------------------- node = get_caller_value("sphinx.directives", "node", rtype=DescNodeType, code="run") # FIXME: would like a more bullet-proof way of deriving our id prefix... signode = node.children[0] if signode.get("ids"): base = signode['ids'][0] elif signode.get("names"): base = signode['names'][0] else: base = signode.astext() prefix = re.sub("[^a-zA-Z0-9_.]+", "-", base).strip("-") + "-" # now that we've got that info, add our description context entry # to the stack memo = self.state.memo if not hasattr(memo, "desc_stack"): memo.desc_stack = [] memo.desc_stack.append(dict( # see new_subsection() above for dict format prefix=prefix, owner=self, signode=signode, level=0, )) #---------------------------------------------------------------------- # hack up ``state.nested_parse()`` so that the next time it's called, # 'match_titles=True' is set. that call should happen as soon as this # function returns back to ObjectDescription.run() # NOTE: ideally, we would just set match_titles=True within ObjectDescription.run() #---------------------------------------------------------------------- state = self.state if not hasattr(state, "_set_next_match_titles_flag"): # state is persistent object, only want to patch it once. @monkeypatch(state) def nested_parse(_wrapped_parse, *args, **kwds): if state._set_next_match_titles_flag: kwds['match_titles'] = True state._set_next_match_titles_flag = False return _wrapped_parse(*args, **kwds) # signal our hack to set match_titles state._set_next_match_titles_flag = True @monkeypatch(self) def after_content(_wrapped_after): # remove our description context entry # NOTE: ideally would do this in ObjectDescription.run() desc = self.state.memo.desc_stack.pop() assert desc['owner'] is self, "sanity check failed" # let real method do it's work return _wrapped_after() # now invoke the real run() method. # as soon as it calls before_content(), our hack above will patch self.state. # after before_content() returns, real run method will call self.state.nested_parse(), # and invoke our patched version instead. return _wrapped_run(self) #---------------------------------------------------------------------- # make autodoc invoke parse_nested_section_with_titles() for ALL objects # if this isn't done, autodoc generates paragraphs instead of sections. # this causes all nested content to be omitted # FIXME: why is the lack of this causing a problem? should track it down. #---------------------------------------------------------------------- from sphinx.ext.autodoc import Documenter Documenter.titles_allowed = True #---------------------------------------------------------------------- # finally, monkeypatch DocFieldTransformer.transform_all() # so that it transforms doc fields within one of our nested sections # (default code only looks at top-level nodes) # # FIXME: find a cleaner way to do this :| #---------------------------------------------------------------------- from sphinx.util.docfields import DocFieldTransformer from docutils.nodes import section @monkeypatch(DocFieldTransformer) def transform_all(_wrapped, self, node): # transform immediate node contents like normal _wrapped(self, node) # our nested sections show up as definition lists, # so make sure transform_all is also invoked for the contents # of any definition list for child in node: if isinstance(child, section): _wrapped(self, child.children) #---------------------------------------------------------------------- # sigh. done monkeypatching. #---------------------------------------------------------------------- #============================================================================= # docstring mangling #============================================================================= def trim_module_header(app, what, name, obj, options, lines): """ helper to remove one-line description from top of module (if preset). """ if what != "module": return _title_re = re.compile(r""" ^ \s* ( {0} \s* -- \s* )? [a-z0-9 _."']* $ """.format(re.escape(name)), re.X|re.I) if len(lines) > 1 and _title_re.match(lines[0]) and lines[1].strip() == '': del lines[:2] #============================================================================= # sphinx extension entrypoint #============================================================================= def setup(app): # don't patch sphinx unless this extension is actually in use _patch_sphinx() # clean up leading bit of module docstring app.connect('autodoc-process-docstring', trim_module_header) # identifies the version of our extension return {'version': __version__} #============================================================================= # documentation helper # # NOTE: this function doesn't actually do anything, # it exists to test this extension's behavior as part of docs/cloud_theme_test #============================================================================= def _doctestfunc(): """ The :mod:`~cloud_sptheme.ext.autodoc_sections` extension should generate nested sections as found within object docstrings. Nested Section ============== :param arg: xxx .. attribute:: foo bar These sections can in turn contain others: Child Section ------------- Which allows breaking long class docstrings up in meaningful ways. Child Section 2 --------------- And more content Nested Section 2 ================ end of class """ pass #============================================================================= # eof #============================================================================= �������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/utils.py����������������������������������������������������������0000644�0001750�0001750�00000004760�13014217452�022054� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""cloud_sptheme.utils -- internal helper utilities""" #============================================================================= # imports #============================================================================= # core from functools import update_wrapper import logging; log = logging.getLogger(__name__) import sys # site # pkg # local __all__ = [ # py2/3 compat 'PY2', 'PY3', 'u', 'ru', # monkeypatch helpers "patchapplier", "monkeypatch", ] #============================================================================= # internal py2/3 compat helpers #============================================================================= PY2 = sys.version_info < (3,0) PY3 = not PY2 # FIXME: these aren't very rigorous / correct, but they work for current purposes. if PY2: def u(s): return s.decode("unicode_escape") def ru(s): return s.decode("ascii") else: def u(s): return s ru = u #============================================================================= # monkeypatch helpers #============================================================================= def patchapplier(func): """ function decorator to help functions that apply a monkeypatch. makes them only run once. """ def wrapper(): if wrapper.patched: return False func() wrapper.patched = True logging.getLogger(func.__module__).debug("%s: patch applied", func.__name__) return True wrapper.patched = False update_wrapper(wrapper, func) return wrapper def monkeypatch(target, name=None): """ helper to monkeypatch another object. the decorated function is wrapped around the existing function in :samp:`target.{name}`, and used to replace it. **name** defaults to the name of the function being decorated. the original value is passed in as the first positional argument to the function. """ def builder(func): attr = name or func.__name__ wrapped = getattr(target, attr) def wrapper(*args, **kwds): return func(wrapped, *args, **kwds) update_wrapper(wrapper, wrapped) wrapper.__wrapped__ = wrapped # not set by older update_wrapper() versions setattr(target, attr, wrapper) return func # return orig func so we can use it again return builder #============================================================================= # eof #============================================================================= ����������������cloud_sptheme-1.8.0/cloud_sptheme/make_helper.py����������������������������������������������������0000644�0001750�0001750�00000021077�12444410521�023166� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""helper for quick cross-platform makefile for sphinx TODO: this was hacked up really quickly, could use lots of work. """ #=============================================================== #imports #=============================================================== #core from __future__ import print_function import logging; log = logging.getLogger(__name__) import os,sys from string import Template import subprocess #pkg #local __all__ = [ "SphinxMaker", ] #=============================================================== #misc helpers #=============================================================== def sub(fmt, **kwds): if not kwds: kwds = globals() return Template(fmt).substitute(**kwds) #=============================================================== #fs helpers #=============================================================== joinpath = os.path.join def abspath(*args): return os.path.abspath(joinpath(*args)) if hasattr(os.path, "realpath"): def realpath(*args): return os.path.realpath(joinpath(*args)) else: #probably windows - fake it best we can def realpath(*args): return os.path.normcase(os.path.abspath(joinpath(*args))) def pathdir(path): return os.path.split(path)[0] def clearpath(path): "recursively remove all contents of dir, but leave dir" for root, dirs, files in os.walk(path, topdown=False): for name in files: os.remove(joinpath(root, name)) for name in dirs: os.rmdir(joinpath(root, name)) def rmpath(path): "drecursively delete path" if os.path.exists(path): if os.path.isdir(path): clearpath(path) os.rmdir(path) else: os.remove(path) def ensuredirs(path): "ensure specified directory & all parents exist" if not os.path.isdir(path): os.makedirs(path) #=============================================================== #main class #=============================================================== class SphinxMaker(object): #=============================================================== #class attrs #=============================================================== # You can subclass these variables SPHINXOPTS = [] SPHINXBUILD = "sphinx-build" PAPER = "letter" SERVEHTML_PORT = 8000 # Paths BUILD = "_build" SOURCE = "." #internal opts PAPEROPT_a4 = ["-D","latex_paper_size=a4"] PAPEROPT_letter = ["-D","latex_paper_size=letter"] #: list of attrs to check os.environ for overriddes. env_vars = [ "SPHINXOPTS", "SPHINXBUILD", "PAPER", "SERVEHTML_PORT", "BUILD", "SOURCE" ] #=============================================================== #instance attrs #=============================================================== root_dir = None conf_file = None conf = None #=============================================================== #frontend #=============================================================== def __init__(self, root_dir=None, **kwds): #FIXME: this may not be properly flexible. if root_dir is None: root_dir = joinpath(sys.modules["__main__"].__file__, os.pardir) self.root_dir = abspath(root_dir) self.conf_file = joinpath(self.root_dir, "conf.py") if not os.path.exists(self.conf_file): raise RuntimeError("conf file not found in root: %r" % (self.root_dir)) #check environment for overrides, as well as constructor for key in self.env_vars: value = kwds.pop(key, None) value = os.environ.get(key, value) if value is not None: t = type(getattr(self,key)) #FIXME: this is *real* hacked way to do type conversion if isinstance(t, str): if isinstance(t, int): #for ints, eg SERVEHTML_PORT value = int(t) elif isinstance(t, list): #for list of arguments, eg SPHINXOPTS #FIXME: should use proper quote escaping logic when we split :( value = " ".split(value) setattr(self, key, value) # make all relative paths relative to root dir for name in ("BUILD", "SOURCE"): value = getattr(self, name) if not os.path.isabs(value): value = abspath(self.root_dir, value) setattr(self, name, value) if kwds: raise TypeError("unknown keywords: %r" % (kwds,)) @classmethod def execute(cls, args=None, **kwds): return cls(**kwds).run(args) def run(self, args=None): if args is None: args = sys.argv[1:] os.chdir(self.root_dir) #due to relative paths like self.BUILD for arg in args: getattr(self,"target_"+arg)() #=============================================================== #targets #=============================================================== def target_help(self): print("Please use \`make <target>' where <target> is one of") print(" clean remove all compiled files") print(" html to make standalone HTML files") print(" servehtml to serve standalone HTML files on port 8000") # print(" pickle to make pickle files") # print(" json to make JSON files") print(" htmlhelp to make HTML files and a HTML help project") # print(" latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter") # print(" changes to make an overview over all changed/added/deprecated items") # print(" linkcheck to check all external links for integrity") def target_clean(self): rmpath(self.BUILD) def target_html(self): self.build("html") def target_htmlhelp(self): self.build("htmlhelp") def target_servehtml(self): path = realpath(self.BUILD, "html") port = self.SERVEHTML_PORT # try to use paste try: from paste.httpserver import serve from paste.urlparser import StaticURLParser except ImportError: # fall back to stdlib server if sys.version_info[0] >= 3: import http.server as s HTTPServer = s.HTTPServer else: import SimpleHTTPServer as s HTTPServer = s.BaseHTTPServer.HTTPServer os.chdir(path) print("Serving files from %r on port %r" % (path, port)) HTTPServer(('',port), s.SimpleHTTPRequestHandler).serve_forever() else: serve(StaticURLParser(path), host="0.0.0.0", port=port) #TODO: support latex, pdf, etc... ##def target_latex(self): ## build("latex") ## print("Run \`make all-pdf' or \`make all-ps' in that directory to" \ ## "run these through (pdf)latex.") ## ##def target_pdf(): ## assert os.name == "posix", "pdf build support not automated for your os" ## build("latex") ## target = BUILD / "latex" ## target.chdir() ## subprocess.call(['make', 'all-pdf']) ## print("pdf built") #=============================================================== #helpers #=============================================================== def build(self, name): BUILD = self.BUILD ALLSPHINXOPTS = self.get_sphinx_opts() dt = joinpath(BUILD, "doctrees") ensuredirs(dt) target = joinpath(BUILD, name) ensuredirs(target) rc = subprocess.call([self.SPHINXBUILD, "-b", name] + ALLSPHINXOPTS + [ target ]) if rc: print("Sphinx-Build returned error, exiting.") sys.exit(rc) print("Build finished. The %s pages are in %r." % (name, target,)) return target def get_paper_opts(self): return getattr(self,"PAPER_" + self.PAPER, []) def get_sphinx_opts(self): return ["-d", joinpath(self.BUILD, "doctrees")] + self.get_paper_opts() + self.SPHINXOPTS + [ self.SOURCE ] #=============================================================== #eoc #=============================================================== class ProjectSphinxMaker(SphinxMaker): "SphinxMaker variant which more usefully integrates into setup.py of a python project" #TODO: make this read setup.cfg etc to see where build_sphinx *actually* puts things BUILD = os.path.join(os.pardir, "build", "sphinx") #=============================================================== #eof #=============================================================== �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/�����������������������������������������������������������0000755�0001750�0001750�00000000000�13014372770�021625� 5����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/greencloud/������������������������������������������������0000755�0001750�0001750�00000000000�13014372770�023754� 5����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/greencloud/theme.conf��������������������������������������0000644�0001750�0001750�00000001754�12701741301�025724� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[theme] inherit = cloud stylesheet = cloud.css [options] #styling for document body bgcolor = #f8f8f8 linkcolor = #006906 #styling for document headers headlinkcolor = #327438 #styling for section headers sectiontextcolor = inherit sectionbgcolor = #75c47c sectiontrimcolor = rgba(0,0,0,.1) rubricbgcolor = #d2e7d0 rubric_trim_color = rgba(0,0,0,0.05) #styling for footer / html background footerbgcolor = #565B57 #styling for sidebar sidebarbgcolor = #ededed sidebarlinkcolor= #006906 sidebarhighcolor= #FFF5DD bodytrimcolor = rgba(0,0,0,.15) #styling for top & bottom relbars relbarbgcolor = #57A75E # code blocks codebgcolor = #d6d6d6 codetrimcolor = rgba(0,0,0,.15) # admonitions admonition_note_color = #D9E4F1 admonition_warning_color = #EBC5A7 admonition_seealso_color = #eeeeee admonition_deprecated_color = #ffebab admonition_todo_color = #eeeeee # inline literals quotebgcolor = rgba(0,0,0,.06) quotetrimcolor = transparent # index page index_category_color = #999999 ��������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/magenta_cloud/���������������������������������������������0000755�0001750�0001750�00000000000�13014372770�024427� 5����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/magenta_cloud/theme.conf�����������������������������������0000644�0001750�0001750�00000000444�13010715347�026377� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[theme] inherit = redcloud stylesheet = cloud.css [options] relbarbgcolor=#821f4d footerbgcolor=#521330 sectionbgcolor=#964361 rubricbgcolor=#B4748B sidebarlinkcolor=#6A3051 link_hover_text_color=#ff0000 link_hover_trim_color=#ddb1b8 toc_local_bg_color=#eddbdb toc_local_trim_color=#ddb1b8 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/�����������������������������������������������������0000755�0001750�0001750�00000000000�13014372770�022733� 5����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/globaltoc.html���������������������������������������0000644�0001750�0001750�00000000420�12744461316�025567� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{# cloud/globaltoc.html ~~~~~~~~~~~~~~~~~~~ Wraps <basic/globaltoc.html> with an identifiable div, so the page highlight code has a reliable selector to lock onto. #} <div class="sphinx-toc sphinxglobaltoc"> {%- include "basic/globaltoc.html" -%} </div> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/theme.conf�������������������������������������������0000644�0001750�0001750�00000013142�13013214653�024677� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[theme] inherit = basic stylesheet = cloud.css pygments_style = sphinx [options] # TODO: would like to rename all options to use underscores instead of running together. # inherited these names from 'default' theme. # TODO: would like to normalize color names to format '<obj>[_<state>]_<attr>_color', # e.g. 'link_text_color' / 'link_hover_text_color' # configuration options ; restyles theme so page background is same as document borderless_decor = false ; adds some slight gradients to headers & menu bars shaded_decor = false ; uses lighter header & section styling lighter_header_decor = false rightsidebar = false ; NOTE: this option is ignored, will remove in 1.9 release collapsiblesidebar = IGNORED defaultcollapsed = false stickysidebar = true highlighttoc = true cleanup_toc = false ; ms to spend scrolling when link to section on current page is clicked. ; 0 to disable. smooth_scroll_links = 500 externalrefs = true externalicon = "\21D7" issueicon = #issueicon = "\2727" # NOTE: would like to use sphinx's language setting, # but doesn't seem to be available in templates. hyphenation_language = # link targets # NOTE: roottarget can be name of document (eg: 'index', or "<toc>") # logotarget is same, or can be "<root>" to reflect root value roottarget = <toc> logotarget = <root> # document dimensions ; max width document will expand to. max_width = 11.5in ; max width of "minimal" mode (hides sidebar and other extras). minimal_width = 700px ; minimum size for large_screen_text_size to be used large_width = 16in ; min height of document min_height = 6in # font sizes ; base font size (% relative to browser default) default_layout_text_size = 100% ; optional base font size for screens larger than <minimal_width> minimal_layout_text_size = 75% ; optional base font size for screens bigger than <large_width> large_layout_text_size = # styling for document body bodyfont = "Open Sans", sans-serif bodytrimcolor = rgba(0,0,0,.05) bgcolor = #ffffff textcolor = #000000 linkcolor = #003469 link_hover_text_color = #d39110 link_hover_bg_color = #fff9e4 link_hover_trim_color = #F8D186 highlightcolor = #fbe54e quotebgcolor = rgba(0,0,0,.075) quotetrimcolor = rgba(0,0,0,.05) codebgcolor = #eeffcc codetextcolor = #111111 codetrimcolor = #AACC99 codevarfont = "Droid Sans Mono", monospace codeblockfont = "Droid Sans Mono", monospace bodylineheight = 1.5em # styling for document headers headfont = "Noticia Text", serif headtextcolor = #333 headtrimcolor = #d0d0d0 headlinkcolor = header_icon = # styling for section headers sectionbgcolor = #84A6C7 sectiontrimcolor = rgba(0,0,0,.125) sectiontextcolor = #ffffff # TODO: rename this to childsectionbgcolor rubricbgcolor = #92BCDE section_radius = 5px # admonitions inline_admonitions = auto admonition_note_color = #E7F0FE admonition_warning_color = #ffe4e4 admonition_seealso_color = #FFF7E0 admonition_deprecated_color = #fbece0 admonition_todo_color = #FFF7E0 admonition_trim_color = rgba(0,0,0,.05) admonition_trim_width = 1px 0 admonition_title_color = rgba(0,0,0,.05) admonition_size = 88% admonition_radius = 5px # objects ; whether domain objects should get colored header colored_objects = true colored_object_prefixes = nested object_default_color = #deebf5 object_class_color = #eee3ce object_exception_color = object_function_color = object_attribute_color = #e6e6e6 object_trim_color = rgba(0,0,0,0.1) object_type_color = rgba(0,0,0,0.3) object_radius = 3px object_header_prefix = '<%- name %> \\2014\\0020' # tables table_header_color = rgba(0,0,0,.15) table_shade_color = rgba(0,0,0,.06) table_trim_color = rgba(0,0,0,.15) # styling for footer / html background footerbgcolor = #1A4162 footertextcolor = #B0B0B0 # styling for sidebar sidebarwidth = 2.5in ; sidebar width used when document is greater than max width large_sidebar_width = 3in sidebarbgcolor = #F2F2F2 small_sidebar_bg_color = sidebartextcolor= #777777 sidebarlinkcolor= #003469 sidebartrimcolor= rgba(0,0,0,.15) sidebardetailcolor = #999999 sidebarhighcolor= #FFF8E4 sidebar_button_bg = #F2F2F2 sidebar_link_hover_text_color = sidebar_link_hover_bg_color = sidebar_link_hover_trim_color = ; globaltoc: bg color for current page's LI ; can also be set to special "section" value toc_local_bg_color = default ; globaltoc: text color for current page's LI toc_local_text_color = default ; globaltoc: trim color around current page's LI (defaults to toc_hover_trim_color) toc_local_trim_color = default ; color for current section's TOC link (defaults to toc_hover_text_color) toc_current_text_color = default # override names used within sidebars sidebar_master_title = sidebar_root_title = sidebar_quicklinks_title = Quick links sidebar_localtoc_title = Page contents sidebar_prev_title = Previous page sidebar_next_title = Next page # styling for top & bottom relbars relbarbgcolor = #5682AD relbartextcolor = #ffffff relbarlinkcolor = #ffffff relbar_link_bg_color = rgba(0,0,0,.1) # index page index_category_color = #84ADBE # font css url - for loading in fonts (eg google font dir) fontcssurl = //fonts.googleapis.com/css?family=Noticia+Text|Open+Sans|Droid+Sans+Mono # set google analytics tracker googleanalytics_id = googleanalytics_path = / # legacy aliases, will be removed in 2.0 # legacy alias for lighter_header_decor lighter_decor = # legacy alias for shaded_decor beveled_decor = # legacy alias for sidebar_link_hover_bg_color sidebar_button_bg_hover = # legacy alias for relbar_link_bg_color relbar_link_bg = # legacy option relbar_link_bg_hover = # legacy option (noop) compact_width = # legacy option (noop) popuptoc = ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/����������������������������������������������0000755�0001750�0001750�00000000000�13014372770�024222� 5����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/icon-deprecated.png���������������������������0000644�0001750�0001750�00000002461�12214647250�027760� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD������C��� pHYs�� �� ����tIME b���5tEXtComment�(c) 2004 Jakub Steiner Created with The GIMPًo��}IDAT8˵[lTE3{nv7zJ)/V@ >L x A45& JBb0eCa[.tngwTE}pf2|73?_oςP8N !Pڻgw3v蛧frT:}eյ擾zuݳ߃L&k1sL걱QJ%u29vޟŋ/8_T'}WWڶM: |ȁB^Xxi7~uUNpNPNLT!u]#=�rt'{jEs�-]Akm稨rMv>NJG"2KR(H$p8h Ld2i I47.?ȼHPsXayjjS(f8CYY/_`TVΥ[�u%a,h~&` 0rܾ} 6 d&ɲe�|;v²,8}z�4XdzaɒH)X:R5 X~BqffPJaY~lƍ׉.Fst!`4q]˲PJ!'Ŵƽs_k( χRE ]BJG&3I>S(ضM @kp @hvuB!odtt)%>'4MQJL�,6Ji2 ?S]]ܹUH%J"k8{ C@(Bj|}\n!D (Zuf$ ZZDJ<~cԋ:m�utϻeU*9>>F ܹ|l6KQs9R$+W'co1=ӏnyK5ʁZݻv>vMgID- 9Ry<'>>SgHq`Dx[@ȃW^}+n7M#LӬ4 _cW8~�ƀqQ,W>;,0Lb7e�&PA}%< ZR)z(�9v}$m9kt~g!����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/icon-danger.png�������������������������������0000644�0001750�0001750�00000002370�10325033750�027112� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD������C��� pHYs�� �� ����tIME +�C+G��IDAT8ˍ[hTGsnl jH[M f R DB)TzЇBPA (ڂsѴIۺI9sD<o.<c%xƖH s-<IB\ 4%Oꆆ65u *m,T3}}K$|`Νx_qm<TJ-b5\9w.3 Wuuo۵# !DnJaaPS_կ;Y@`fOt$BA*˶gf2ɚSXM>߮޾M:!v#Ș&v6[' ]x8#JxwF ; 77{]]dB!rJ,}H|L ieejme޽BV # [lh'�hB OZ3gBRڊm�F8iB.źT*y!@)*lӧYq /?ihJ1p0r9R()IU*Ò*`r pz<8^"/bmc?Gxm=%tvM4FnaIF&i4 JJX|3HI0<^:v gY:EhBPs(Sĥ$C=~0i?*)HIr<V{Fٳ9bc{;yr,^fBJ98" b&lDM_DuJGG)/ӭiԄ+/H.bҙ-Ͷu \$Bnbg"p52g`��Ц޹C.r%U�=7nWR)5:6qΜa цC".SJrdGF(2Noݻz'XE耫i9:>^ﯯwIx*+YY[_mxԭe2h08s ttiWU/dbmxX1|V}ֆ %ee/hy%!R`9< v o�B B䣠os8SUyP,�y@xP(0 (?dy����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/cloud.js_t������������������������������������0000644�0001750�0001750�00000137121�13014234615�026211� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ~~~~~~~~~~~~~~ * cloud.js_t *~~~~~~~~~~~~~~ * * Various bits of javascript driving the moving parts behind various * parts of the cloud theme. Handles things such as toggleable sections, * collapsing the sidebar, etc. * * :copyright: Copyright 2011-2012 by Assurance Technologies * :license: BSD */ {# helper vars based on location of sidebar #} {% if theme_rightsidebar | tobool %} {% set sidebar_side = "right" %} {% set sidebar_opp = "left" %} {% else %} {% set sidebar_side = "left" %} {% set sidebar_opp = "right" %} {% endif %} // begin encapsulation (function (window, $, _) { /*========================================================================== * common helpers *==========================================================================*/ var isUndef = _.isUndefined, TEXT_NODE = 3, // could use Node.TEXT_NODE, but IE doesn't define it :( $window = $(window); // helper to generate an absolute url path from a relative one. // absolute paths passed through unchanged. // paths treated as relative to <base>, // if base is omitted, uses directory of current document. function abspath(path, base) { var parts = path.split("/"), stack = []; if (parts[0]) { // if path is relative, put base on stack stack = (base || document.location.pathname).split("/"); // remove blank from leading '/' if (!stack[0]) { stack.shift(); } // discard filename & blank from trailing '/' if (stack.length && !(base && stack[stack.length - 1])) { stack.pop(); } } for (var i = 0; i < parts.length; ++i) { if (parts[i] && parts[i] != '.') { if (parts[i] == '..') { stack.pop(); } else { stack.push(parts[i]); } } } return "/" + stack.join("/"); } // helper to normalize urls for comparison // * strips current document's scheme, host, & path from local document links (just fragment will be left) // * strips current document's scheme & host from internal urls (just path + fragment will be left) // * makes all internal url paths absolute // * external urls returned unchanged. var // hosturl is url to root of host, without trailing '/' // allowing netloc segment to be empty to support 'file:///' urls hosturl = document.location.href.match(/^[a-z0-9]+:(?:\/\/)?(?:[^@/]*@)?[^/]*/)[0], docpath = document.location.pathname; function shorten_url(url) { if (!url){ return ""; } else if (url.indexOf(hosturl) == 0) { // absolute path to same host url = url.substr(hosturl.length) || '/'; } else if (url[0] == '.') { // relative path url = abspath(url); } else if (!url.match(/^[/#?]|[a-z0-9]+:/)) { // not abs path, or fragment, or query, or uri:// -- // another page in current dir url = abspath('./' + url); } if (url.indexOf(docpath) == 0) { // strip current doc's url; only thing left will be e.g. #anchor url = url.substr(docpath.length); } if (url == "#" || url == "#top") { // normalize to empty string url = ""; } return url; } // url w/ query params & hash stripped function baseUrl(url){ return shorten_url(url).replace(/[#?].*$/, ''); } // helper that retrieves css property in pixels function csspx(elem, prop) { return parseInt($(elem).css(prop).replace("px", ""), 10); } // custom helper to toggle visibility $.fn.toggleVis = function (state){ if(state) { this.show(); } else { this.hide(); } return this; }; /* * debugging */ // 'CloudSphinxTheme' window.CST = window.CloudSphinxTheme = { hosturl: hosturl, docpath: docpath, shorten_url: shorten_url, }; // NOTE: would use $().offset(), but it's document-relative, // and we need viewport-relative... which means getBoundingClientRect(). // NOTE: 'window.frameElement' will only work we're embedded in an iframe on same domain. var parentFrame = window.frameElement; if (window.parent && window.parent !== window) { $(window.parent).scroll(function () { $window.scroll(); }); } function leftFrameOffset() { return parentFrame ? parentFrame.getBoundingClientRect().left : 0; } function topFrameOffset() { return parentFrame ? parentFrame.getBoundingClientRect().top : 0; } function leftViewOffset($node) { return ($node && $node.length > 0) ? $node[0].getBoundingClientRect().left + leftFrameOffset() : 0; } function topViewOffset($node) { return ($node && $node.length > 0) ? $node[0].getBoundingClientRect().top + topFrameOffset() : 0; } function bottomViewOffset($node) { return ($node && $node.length > 0) ? $node[0].getBoundingClientRect().bottom + topFrameOffset() : 0; } {# return top offset relative to parent, or to frame/viewport if parent is omitted #} function topOffset($target, $parent) { if (!($target && $target[0])) { return 0; } var offset = $target[0].getBoundingClientRect().top; if ($parent && $parent[0]) { offset -= $parent[0].getBoundingClientRect().top; } else { offset += topFrameOffset(); } return offset; } // return normalized nodename, takes in node or jquery selector // (can't trust nodeName, per http://ejohn.org/blog/nodename-case-sensitivity/) function nodeName(elem) { if (elem && elem.length) { elem = elem[0]; } return elem && elem.nodeName.toUpperCase(); } /*========================================================================== * Sythesize 'cloud-breakpoint' event *========================================================================== * Event emitted when crossing small <-> medium media breakpoint *==========================================================================*/ var smallScreen; $(function (){ var $smallDiv = $('<div class="hide-for-small" />').appendTo("body"); function update(){ var test = $smallDiv.css("display") == "none"; if(test !== smallScreen){ smallScreen = test; $window.trigger("cloud-breakpoint"); } } $window.on("DOMContentLoaded load resize", update); update(); }); /*========================================================================== * Highlighter Assist *========================================================================== * Sphinx's highlighter marks some objects when user follows link, * but doesn't include section names, etc. This catches those. *==========================================================================*/ $(function () { // helper to locate highlight target based on #fragment function locate_target() { // find id referenced by #fragment var hash = document.location.hash; if (!hash) return null; var section = document.getElementById(hash.substr(1)); if (!section) return null; // could be div.section, or hidden span at top of div.section var name = nodeName(section); if (name != "DIV") { if (name == "SPAN" && section.innerHTML == "" && nodeName(section.parentNode) == "DIV") { section = section.parentNode; } else if (name == "DT" && section.children.length && $(section).children("tt.descname, code.descname").length > 0) { // not a section, but an object definition, e.g. a class, func, or attr return $(section); } } // now at section div and either way we have to find title element - h2, h3, etc. var header = $(section).children("h2, h3, h4, h5, h6").first(); return header.length ? header : null; } // init highlight var target = locate_target(); if (target) target.addClass("highlighted"); // update highlight if hash changes $window.on("hashchange", function () { if (target) target.removeClass("highlighted"); target = locate_target(); if (target) target.addClass("highlighted"); }); }); /*========================================================================== * Toggleable Sections *========================================================================== * Added expand/collapse button to any collapsible RST sections. * Looks for sections with CSS class "html-toggle", * along with the optional classes "expanded" or "collapsed". * Button toggles "html-toggle.expanded/collapsed" classes, * and relies on CSS to do the rest of the job displaying them as appropriate. *==========================================================================*/ // given "#hash-name-with.periods", escape so it's usable as CSS selector // (e.g. "#hash-name-with\\.periods") function escapeHash(hash) { return hash.replace(/\./g, "\\."); } $(function () { function init() { // get header & section, and add static classes var header = $(this); var section = header.parent(); header.addClass("html-toggle-button"); // helper to test if url hash is within this section function contains_hash() { var hash = document.location.hash; return hash && (section[0].id == hash.substr(1) || section.find(escapeHash(hash)).length > 0); } // helper to control toggle state function set_state(expanded) { expanded = !!expanded; // toggleClass et al need actual boolean section.toggleClass("expanded", expanded); section.toggleClass("collapsed", !expanded); section.children().toggle(expanded); if (!expanded) { section.children("span:first-child:empty").show(); /* for :ref: span tag */ header.show(); } } // initialize state set_state(section.hasClass("expanded") || contains_hash()); // bind toggle callback header.click(function (evt) { var state = section.hasClass("expanded") if (state && $(evt.target).is(".headerlink")) { return; } set_state(!state); $window.trigger('cloud-section-toggled', section[0]); }); // open section if user jumps to it from w/in page $window.on("hashchange", function () { if (contains_hash()) set_state(true); }); } $(".html-toggle.section > h2, .html-toggle.section > h3, .html-toggle.section > h4, .html-toggle.section > h5, .html-toggle.section > h6").each(init); }); /*========================================================================== * mobile menu / collapsible sidebar *========================================================================== * Instruments sidebar toggle buttons. Relies on applying classes * to div.document in order to trigger css rules that show/hide sidebar. * Persists sidebar state via session cookie. * Sidebar state for small screens is tracked separately, * and is NOT persisted. *==========================================================================*/ $(function () { // get nodes if (!$(".sphinxsidebar").length) { return; } var $doc = $('div.document'), $hide = $('button#sidebar-hide'), $show = $('button#sidebar-show'), copts = { // expires: 7, path: abspath(DOCUMENTATION_OPTIONS.URL_ROOT || "") }; // set sidebar state for current media size var lastSmall = false, smallState = false, largeState = false; function setState(visible){ console.debug("set menu state: visible=%o smallSreen=%o", visible, smallScreen); $doc.toggleClass("sidebar-hidden", !smallScreen && !visible) .toggleClass("document-hidden", smallScreen && visible); $hide.toggleVis(visible); $show.toggleVis(!visible); lastSmall = smallScreen; if(smallScreen) { smallState = visible; if(visible) { largeState = true; } } else { largeState = visible; if(!visible) { smallState = false; } $.cookie("sidebar", visible ? "expanded" : "collapsed", copts); } $window.trigger("cloud-sidebar-toggled", visible); } // change when buttons clicked $show.click(function () { setState(true); }); $hide.click(function () { setState(false); }); // refresh sidebar state when crossing breakpoints $window.on("cloud-breakpoint", function (){ setState(smallScreen ? smallState : largeState); }); // load initial state if(smallScreen){ setState(false); } else { var value = $.cookie("sidebar"); {% if theme_defaultcollapsed | tobool %} if (!value) value = "collapsed"; {% endif %} setState(value != "collapsed"); } // make buttons visible now that they're instrumented $(".sidebar-toggle-group").removeClass("no-js"); }); {%- if theme_stickysidebar | tobool %} /*========================================================================== * sticky sidebar *========================================================================== * Instrument sidebar so that it sticks in place as page is scrolled. *==========================================================================*/ function resetStickyState($target){ $target.css({ position: "", marginLeft: "", top: "", {{sidebar_side}}: "", bottom: "" }); } // helper to update 'sticky' state of target -- // tried to make this generic, but some bits are specific to sidebar function setStickyState($target, top, start, end, $container){ if (top >= start) { // top of sidebar is above stickyStart -- scroll with document resetStickyState($target); } else if (top > end) { $target.css({ position: "fixed", marginLeft: 0, top: start - topFrameOffset(), {{sidebar_side}}: leftViewOffset($container), bottom: "" }); } else { // bottom of sidebar is below stickyEnd -- scroll with document, // but place at bottom of container $target.css({ position: "absolute", marginLeft: 0, top: "", {{sidebar_side}}: 0, bottom: 0 }); } } $(function () { // initialize references to relevant elements, // and internal state var $bodywrapper = $(".bodywrapper"), // element that contains content $bodytoc = $('.sphinxglobaltoc a[href="#"]').parent(), // element containing toc for page $container = $('.document'), // element to stick within $target = $('.sphinxsidebar'), // element to sticky $toggle = $(".sidebar-toggle-group"), // extra element to sticky targetMargin = 0, // $target top margin windowHeight = 0, // cache of window height disable = false, // whether sticky is disabled for given window size start = 0, // start sticking when top of target goes above this point lastTop = null, // tracks last offset for scroll+hover handling containerOffset = 0, // top margin of target (included) offset = 0, // offset within target offsetMin = Math.max(0, start); // min offset // func to update sidebar position based on scrollbar & container positions function update_sticky(evt) { if (disable) { return; } // calc stats // HACK: using $container for offset so we don't have to reset_sticky() for calc. // then add cached container-relative offset to get topViewOffset($target). var top = topViewOffset($container), targetHeight = $target.outerHeight(true), end = targetHeight - $container.height(); // adjust offset if users scrolls while hovering over sidebar if (evt && evt.type == "scroll" && ($target.first().is(":hover") || // make sure local toc scrolls into view // XXX: will this still work right if window height < bodytoc height? ($bodytoc.length && bottomViewOffset($bodytoc) + 16 >= windowHeight))) { offset -= top - lastTop; } lastTop = top; // see note in top init (above), but doing this here // so it doesn't affect offset adjustment top += containerOffset; // limit offset to container bounds if (offset < offsetMin) { offset = offsetMin; } else { var offsetMax = targetHeight - windowHeight - start; offset = Math.max(offsetMin, Math.min(offset, -top, offsetMax)); } // offset = 0; // console.debug("sticky sidebar: top=%o offset=%o start=%o end=%o", // top, offset, start, end); // set sticky state setStickyState($target, top, start - offset, end - offset, $container); // set button sticky state -- has to stay at top of screen setStickyState($toggle, top, start - Math.min(offset, targetMargin), -1e9, $container); } // func to update sidebar measurements, and then call update_sticky() function update_measurements() { // if body shorter than sidebar, setting sidebar to 'fixed' would cause doc // to shrink below sidebar height, so have to disable sticky mode in this case. resetStickyState($target); resetStickyState($toggle); disable = (smallScreen || $bodywrapper.height() < $target.height()); if (disable) { return; } // calc stats windowHeight = $window.height(); targetMargin = csspx($target, "margin-top"); if($target.css("display") == "none"){ // so toggle positioned correctly on collapsed sidebar containerOffset = 0; } else { // NOTE: this includes margin-top since it's not removed by sticky code above containerOffset = topOffset($target, $container) - targetMargin; } // update state update_sticky(); } // run function now, and every time window scrolls // XXX: would it help to throttle/raf() scroll & resize calls? $window.scroll(update_sticky) .on("resize hashchange cloud-section-toggled cloud-sidebar-toggled", update_measurements); update_measurements(); // hack to fix errant initial-layout issue $window.load(update_sticky); }); {% endif %} // flag set by smooth scroller to temporarily disable toc sliding. var scrollingActive = false; {%- if theme_highlighttoc | tobool %} /*========================================================================== * sidebar toc highlighter *========================================================================== * highlights toc entry for current section being viewed; * as well as expands & collapses entries for sections that aren't onscreen. *==========================================================================*/ $(function () { // scan all links, gathering info about their relationships var $sbody = $("div.body"), localDB = [], // entries that are part of local page OR child page toggleDB = []; // subset of localDB which has $ul defined // scan all links w/o TOCs $(".sphinxlocaltoc ul a, .sphinxglobaltoc ul a").each(function (idx, link) { // grab basic info about link var $link = $(link), // NOTE: reading link.attr() so highlight parameter // from current location isn't included... href = shorten_url($link.attr("href")) || "#", isLocal = (href[0] == "#"), isTop = (href == "#"), $li = $link.parent("li"), parent = $li.parent("ul").prev("a").data("toc"), $target; // determine type of link & target element for visibility calc if (isLocal) { // css code relies on all local links starting with "#" // so make sure links use right representation $link.attr("href", href); // needing for styling $li.addClass("local"); // link points to section in current document. // use that section as visibility target if(isTop){ $target = $sbody; // don't bother traversing to parent entry if outside page parent = null; } else { $target = $(document.getElementById(href.slice(1))); // XXX: what about rare border case where there's // multiple toplevel entries? not sure *how* to handle that. // (parent will be null in this case) } } else if (parent) { // needing for styling $li.addClass("child"); // parent (or some ancestor) is part of page, // so this is link for child page. // prefer to use actual link in document as visibility target $target = parent.$target.find("a").filter(function () { return shorten_url(this.href) == href; }); if (!$target.length) { // target link not actually visible in document // XXX: what if target has multiple links, but to subfragments // e.g. (passlib.hash manpage's link to passlib.hash.ldap_std)? return; } if (($target.parent("li").attr("class") || '').search(/(^|\w)toctree-/) == 0) { // it's part of embedded toc tree, use whole LI as target. $target = $target.parent("li"); } // XXX: what if target link is w/in subsection, // even though it belongs at this level in TOC? // *think* active_child code below will prevent spurious highlighting. } else { // this link isn't local, nor is any ancestor, so ignore this one. return; } // add to update list var entry = { // // static vars // $target: $target, // section/object controlling link's visibility $li: $li, // list item we're instrumenting parent: parent, // reference to parent entry children: [], // list of child nodes href: href, // normalized copy of li > a[href] isLocal: isLocal, // whether href points to local page // filled by $ul pass, below $ul: null, // list of child items if we're doing collapse checking, else null openSize: 0, // avg # of child items expecting to be visible at a time. // // state vars modified by updateTOC() // rect: null, // cache of client bounding rect visible: false, // whether target is onscreen active: false, // whether this entry (or child) is marked active justOpened: false // whether toc-toggle was opened during this updateTOC() pass }; localDB.push(entry); if(parent) { parent.children.push(entry); } $link.data("toc", entry); // used to get parent entry (above), and for debugging }); // if no local links found, don't bother w/ update hook //console.debug("localDB: %o", localDB); if (!localDB.length) return; // figure out which nodes should be collapsible. // go in reverse order, so we have count available for parent elements. // fills in $ul & viewCount in entries for(var i=localDB.length - 1; i>=0; --i){ // don't fill in $ul for toplevel, or ones w/ no entries. var entry = localDB[i], $ul = entry.$li.children("ul"); if(!i || !$ul.length){ continue; } // calculate how many children will be visible at a time // when $ul is open. this is # of children, plus number // of descendants always visible in non-collapsing children, // plus the largest visibility count of all collapsing children. var weight = entry.children.length, dynamic = 0; entry.children.forEach(function (child){ if(!child.$ul) { // always open weight += child.openSize; } else if(child.openSize > dynamic){ // largest collapsible child seen so far dynamic = child.openSize; } }); entry.openSize = (weight += dynamic); // determine if this one should actually be collapsible // TODO: this max weight should really depend on how much // room is available; and/or be decided when parent // is comparing all the children. // NOTE: 'toc-always-open' and 'toc-always-toggle' are control // flags that can be applied via rst-class to section header. if((weight > 3 && !entry.$target.hasClass("toc-always-open") || entry.$target.hasClass("toc-always-toggle"))) { entry.$ul = $ul; entry.$li.addClass("toc-toggle"); toggleDB.push(entry); } } // debugging helper // var cutoffPrefix = 'pointer-events: none; position: fixed; left: 0; right: 0; background: ', // $cutoff = $('<div/>', {style: cutoffPrefix + 'rgba(0,0,255,0.3)'}).appendTo("body"), // $cutoff2 = $('<div/>', {style: cutoffPrefix + 'rgba(0,255,0,0.3)'}).appendTo("body"); // function to update cutoff settings var winHeight, // window height lineHeight, // sbody's line height (px) minCutoff, // minimum viewport offset where we assume user is reading curHash; // hash of current highlighted section function updateConfig(_evt, first_run){ // determine viewable range lineHeight = csspx($sbody, "line-height"); winHeight = $window.height(); minCutoff = Math.floor(Math.min(winHeight * 0.2, 7 * lineHeight)); curHash = shorten_url(document.location.hash) || "#"; // update TOC markers updateTOC(_evt, first_run); } // function to update toc markers function updateTOC(_evt, first_run) { // recalc readline -- attempt to estimate where user who's // scanning through docs is "reading". We start w/ minCutoff, // but when at bottom of screen, may have a bunch of sections visible, // and want to have them expand as last bit of document scrolls into view, // so the readline moves down page when document gets to the end. var readline = minCutoff, bodyBottom = $sbody[0].getBoundingClientRect().bottom, useMaxRatio = (2 * winHeight - bodyBottom - minCutoff) / (winHeight - minCutoff); if (useMaxRatio > 0) { var maxCutoff = Math.min(bodyBottom - 3 * lineHeight, winHeight); readline = minCutoff + (maxCutoff - minCutoff) * Math.min(useMaxRatio, 1); } if (winHeight > $sbody.height()) { readline = 0; } // debug stats // console.debug("useMaxRatio=%o", useMaxRatio); // $cutoff.css({height: readline, top: 0}); // $cutoff2.css({height: minCutoff, top: 0}); // reset entries -- recalc .rect & .visible; clear .active flag; // clear active/focus styling classes localDB.forEach(function (entry){ var rect = entry.rect = entry.$target[0].getBoundingClientRect(); entry.visible = (rect.top <= winHeight && rect.bottom >= 0 && (rect.width || rect.height)); entry.active = false; entry.$li.removeClass("active focus"); }); // pick focus at top TOC level, then check if one of it's // children would be better choice, and so on until // there are no children that could hold focus. // NOTE: assumes children are listed in reading order. var focus = localDB[0]; while (true) { var best = null, children = focus.children, cutoff = readline; for(var i = 0, e = children.length; i < e; ++i){ var child = children[i]; // skip hidden children if(!child.visible) { continue; } // pick bottom-most child which starts above readline. else if (child.rect.top <= cutoff) { best = child; // if child is highlighted, keep it open longer, // by raising the readline up to minCutoff. if(child.href == curHash){ cutoff = minCutoff; } } } var $li = focus.$li; focus.active = true; $li.addClass("active"); if (best) { if(!best.isLocal && focus.isLocal){ // set focus on final local section // as well as child link $li.addClass("focus"); } focus = best; } else { $li.addClass("focus"); break; } } // update open/closed status of nested ULs // TODO: would like to do cleaner job tracking // which sections are being animated open/close, // and sync it w/ smooth-scrolling code (below). // for now, only have '.justOpened' hack to detect // if we're currently animating a parent element. toggleDB.forEach(function (entry){ var $li = entry.$li, $ul = entry.$ul, closed = (!entry.visible || !entry.active || entry.$target.hasClass("collapsed")); if(smallScreen) { closed = false; first_run = true; } entry.justOpened = false; if ($li.hasClass("closed") == closed) { return; } if (closed) { if (first_run) { $ul.hide(); // don't animate things on first run } else { $ul.slideUp(); } } else { var parent = entry.parent; if (first_run || (parent && parent.justOpened)) { $ul.show(); // don't animate if parent is animated. } else { $ul.slideDown(); } entry.justOpened = true; } $li.toggleClass("closed", closed); }); } // run function now, and every time window is resized // TODO: disable when sidebar isn't sticky (including when window is too small) // and when sidebar is collapsed / invisible function scrollWrapper(evt){ if(scrollingActive) { return; } return updateTOC(evt); } $window.on("scroll", scrollWrapper) .on('resize hashchange cloud-section-toggled cloud-sidebar-toggled', updateConfig); updateConfig(null, true); }); {% endif %} /* ========================================================================== * header breaker * ========================================================================== * attempts to intelligently insert linebreaks into page titles, where possible. * currently only handles titles such as "module - description", * adding a break after the "-". * ==========================================================================*/ $(function () { // get header's content, insert linebreaks var header = $("h1"); var orig = header[0].innerHTML; var shorter = orig; if ($("h1 > a:first > tt > span.pre").length > 0) { shorter = orig.replace(/(<\/tt><\/a>\s*[-\u2013\u2014:]\s+)/im, "$1<br> "); } else if ($("h1 > tt.literal:first").length > 0) { shorter = orig.replace(/(<\/tt>\s*[-\u2013\u2014:]\s+)/im, "$1<br> "); } if (shorter == orig) { return; } // hack to determine full width of header header.css({whiteSpace: "nowrap", position: "absolute"}); var header_width = header.width(); header.css({whiteSpace: "", position: ""}); // func to insert linebreaks when needed function layout_header() { header[0].innerHTML = (header_width > header.parent().width()) ? shorter : orig; } // run function now, and every time window is resized layout_header(); $window.on('resize cloud-sidebar-toggled', layout_header); }); {% if theme_cleanup_toc|tobool %} /*========================================================================== * toc cleaner *========================================================================== * attempts to remove clutter from toc lists. * mainly, looks for toc entries with format "{module} -- {desc}"", * and reduces them down to just "{module}" to save space. *==========================================================================*/ $(function () { var $toc = $(".sphinxglobaltoc"), candidates = {}; // scan TOC for module entries $toc.find("a.internal.reference:has(.literal:first-child > .pre)").each(function () { var $this = $(this), text = $this.find(".literal").text(); // wrap details in .objdesc class $this.contents().filter(function () { return ((this.nodeType == TEXT_NODE)) }).wrap('<span class="objdesc"></span>'); // work out modules that have exactly 1 toc entry if (isUndef(candidates[text])) { candidates[text] = $this; } else { candidates[text] = null; } }); // for all modules that had unique names, add 'unique' flag $.each(candidates, function (text, $entry) { if ($entry) { $entry.children(".objdesc").addClass("unique"); } }); }); {% endif %} {% if theme_smooth_scroll_links|int %} /*========================================================================== * smooth scrolling * instrument toc links w/in same page to use smooth scrolling *==========================================================================*/ var scrollSpeed = {{ theme_smooth_scroll_links|int }}; $(function () { $('.sphinxsidebar a[href^="#"]').click(function (event) { var hash = this.hash; event.preventDefault(); scrollingActive = true; // disable toc focus calc $('html,body').animate({ // NOTE: hash == "" for top of document scrollTop: hash ? $(escapeHash(hash)).offset().top : 0 }, scrollSpeed).promise().always(function (){ // enable & redraw toc focus // xxx: would really like to update *before* animation starts, // so it's animation happened in parallel to scrolling animation scrollingActive = false; $window.trigger("cloud-sidebar-toggled"); }); if (window.history.pushState) { window.history.pushState(null, "", hash || "#"); } $window.trigger("hashchange"); // for toggle section code }); }); {% endif %} {% if theme_inline_admonitions == "auto" %} /*========================================================================== * auto determine when admonition should have inline / block title * under this mode, the css will default to styling everything like a block, * so we just mark everything that shouldn't be blocked out. *==========================================================================*/ $(function () { $("div.body div.admonition:not(.inline-title):not(.block-title)" + ":not(.danger):not(.error)" + ":has(p.first + p.last)").addClass("inline-title"); }); {% endif %} /*========================================================================== * patch sphinx search code to try to and prevent rest markup from showing up * in search results *==========================================================================*/ var Search = window.Search; if (Search && Search.makeSearchSummary) { var sphinxSummary = Search.makeSearchSummary; Search.makeSearchSummary = function (text, keywords, hlwords) { /* very primitive regex hack to turn headers into dots */ text = text.replace(/^(\s|\n)*([-#=.])\2{6,}\s*\n/, ''); text = text.replace(/^([-#=.])\1{6,}\s*$/mg, '\u26AB'); text = text.replace(/^\s*#\.\s*/mg, '\u2022 '); //console.debug("makeSearchSummary: text=%o keywords=%o hlwords=%o", text, keywords, hlwords); return sphinxSummary.call(this, text, keywords, hlwords); } } /*========================================================================== * toc page styling *========================================================================== * adds some classes to TOC page so items can be styled. * sets li.page and div.highlight-pages markers *==========================================================================*/ $(function () { $("div.body div.toctree-wrapper").each(function (){ var $div = $(this), highlight = false; $div.find("li").each(function (){ var $li = $(this), url = baseUrl($li.children("a").attr("href")), $parent = $li.parent("ul").prev("a"), parentUrl = baseUrl($parent.attr("href")); if(!$parent.length || parentUrl != url){ $li.addClass("page"); } else { highlight = true; } }); if(highlight) { $div.addClass("highlight-pages"); } }); {# XXX: make it so arbitrary pages / toctrees can have "hide page sections" toggle added, via rst-class trigger? #} var $toc = $("#table-of-contents div.toctree-wrapper.highlight-pages"); if($toc.length){ $('<label id="hide-page-sections"><input type="checkbox" /> {{ _("Hide page sections") }}</label>') .insertBefore($toc).find("input") .change(function (evt){ $toc.toggleClass("hide-sections", evt.target.checked); }).change(); $(".sphinxglobaltoc > h3").css("margin-top", "4px").wrap('<ul><li class="current active"></li></ul>'); } }); /* ========================================================================== * codeblock lineno aligner * if document contains multiple codeblocks, and some have different counts * (e.g. 10 lines vs 300 lines), the alignment will look off, since the * 300 line block will be indented 1 extra space to account for the hundreds. * this unifies the widths of all such blocks (issue 19) *==========================================================================*/ $(function () { var $lines = $(".linenodiv pre"); if (!$lines.length) { return; } // NOTE: using ems so this holds under font size changes var largest = Math.max.apply(null, $lines.map(function () { return $(this).innerWidth(); })), em_to_px = csspx($lines, "font-size"); $lines.css("width", (largest / em_to_px) + "em").css("text-align", "right"); }); /*========================================================================== * codeblock copy helper button *========================================================================== * * Add a [>>>] button on the top-right corner of code samples to hide * the '>>>' and '...' prompts and the output and thus make the code * copyable. Also hides linenumbers. * * Adapted from copybutton.js, * Copyright 2014 PSF. Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 * File originates from the cpython source found in Doc/tools/sphinxext/static/copybutton.js *==========================================================================*/ $(function () { // TODO: enhance this to hide linenos for ALL highlighted code blocks, // and only perform python-specific hiding as-needed. // static text var hide_text = 'Hide the prompts and output', show_text = 'Show the prompts and output'; // helper which sets button & codeblock state function setButtonState($button, active) { $button.parent().find('.go, .gp, .gt').toggle(!active); $button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', active ? 'hidden' : 'visible'); $button.closest(".highlighttable").find(".linenos pre").css('visibility', active ? 'hidden' : 'visible'); $button.attr('title', active ? show_text : hide_text); $button.toggleClass("active", active); } // create and add the button to all the code blocks containing a python prompt var $blocks = $('.highlight-python, .highlight-python3'); $blocks.find(".highlight:has(pre .gp)").each(function () { var $block = $(this); // tracebacks (.gt) contain bare text elements that need to be // wrapped in a span to work with .nextUntil() call in setButtonState() $block.find('pre:has(.gt)').contents().filter(function () { return ((this.nodeType == TEXT_NODE) && (this.data.trim().length > 0)); }).wrap('<span>'); // insert button into block var $button = $('<button class="copybutton">>>></button>'); $block.css("position", "relative").prepend($button); setButtonState($button, false); }); // toggle button state when clicked $('.copybutton').click( function () { var $button = $(this); setButtonState($button, !$button.hasClass("active")); }); }); /*========================================================================== * nested section helper *========================================================================== * fills out 'data-nested-label' for nested sections (e.g. those w/in a class def) * based on name of containing class. this is used to generate a "return to top" * link w/in nested section header. *==========================================================================*/ {% if theme_object_header_prefix %} $(function () { var template = _.template(({{ theme_object_header_prefix }}).replace( /\\(\d{4})/g, function (m, char) { return String.fromCharCode(parseInt(char,16)); } )); $(".desc-section > .section-header").each(function (idx, header) { var $header = $(header), $parent = $header.closest("dd").prev("dt"), name = $parent.find(".descname").text(); if (!name) { return; } $header.attr("data-nested-label", template({name: name, parent: $parent})); }); }); {% endif %} /*========================================================================== * eof *==========================================================================*/ // end encapsulation // NOTE: sphinx provides underscore.js as $u }(window, jQuery, $u)); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/cloud.css_t�����������������������������������0000644�0001750�0001750�00000202465�13014372046�026372� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************** * cloud.css_t * ~~~~~~~~~~~ * * stylesheet for "Cloud" theme for Sphinx. * * :copyright: Copyright 2011-2012 by Assurance Technologies * :license: BSD * *****************************************************/ @import url("basic.css"); {#********************************************** # helper for accumulating warnings, which we hack into document via css. # submitting sphinx issue (https://github.com/sphinx-doc/sphinx/issues/2157) # in hopes of having a better way to warn user in the future. #**********************************************#} {% set _warnings = [] %} {% macro css_warning(message) %} {% set _ = _warnings.append(message) %} {% endmacro %} {% macro render_css_warnings() %} {% if _warnings %} {% set text = "cloud_sptheme errors:\n\u00B7 " + "\n\u00B7 ".join(_warnings) %} body:before { content: " {{ text.replace('\\', '\\\\').replace('\n', '\\000A').replace('"', '\\"') }} "; position: absolute; left: 0; right: 0; top: 0; z-index: 1000; display: block; padding: 1em; background: black; border: 2px solid red; font-size: 1.5em; line-height: 1.5; color: red; white-space: pre-wrap; } {% endif %} {% endmacro %} {#********************************************** # variable init #**********************************************#} {# legacy aliases #} {% if theme_lighter_decor|trim %} {% set theme_lighter_header_decor = theme_lighter_decor %} {% endif %} {% if theme_beveled_decor|trim %} {% set theme_shaded_decor = theme_beveled_decor %} {% endif %} {% if theme_sidebar_button_bg_hover|trim %} {% set theme_sidebar_link_hover_bg_color = theme_sidebar_button_bg_hover %} {% endif %} {% if theme_relbar_link_bg|trim %} {% set theme_relbar_link_bg_color = theme_relbar_link_bg %} {% endif %} {# default values #} {% if not theme_sidebar_link_hover_text_color|trim %} {% set theme_sidebar_link_hover_text_color = theme_link_hover_text_color %} {% endif %} {% if not theme_sidebar_link_hover_bg_color|trim %} {% set theme_sidebar_link_hover_bg_color = theme_link_hover_bg_color %} {% endif %} {% if not theme_sidebar_link_hover_trim_color|trim %} {% set theme_sidebar_link_hover_trim_color = theme_link_hover_trim_color %} {% endif %} {% if not theme_large_sidebar_width|trim %} {% set theme_large_sidebar_width = theme_sidebarwidth %} {% endif %} {# NOTE: could make the following configurable via theme, just trying not to multiply the number of configuration vars until needed :) #} {% set theme_relbar_link_hover_text_color = theme_sidebar_link_hover_text_color %} {# NOTE: theme_relbar_link_bg_hover is depcrecated... #} {% set theme_relbar_link_hover_bg_color = (theme_relbar_link_bg_hover|trim) or theme_sidebar_link_hover_bg_color %} {% set theme_relbar_link_hover_trim_color = theme_sidebar_link_hover_trim_color %} {% set theme_toc_hover_text_color = theme_sidebar_link_hover_text_color %} {% set theme_toc_hover_bg_color = theme_sidebar_link_hover_bg_color %} {% set theme_toc_hover_trim_color = theme_sidebar_link_hover_trim_color %} {% if not theme_headlinkcolor|trim %} {% set theme_headlinkcolor = theme_linkcolor %} {% endif %} {% if not theme_headtrimcolor|trim %} {% set theme_headtrimcolor = theme_headtextcolor %} {% endif %} {% if not theme_sectionbgcolor|trim %} {% set theme_sectionbgcolor = theme_headtrimcolor %} {% endif %} {% if not theme_rubricbgcolor|trim %} {% set theme_rubricbgcolor = theme_sectionbgcolor %} {% endif %} {% set default_toc_local_text_color = "" %} {% set default_toc_local_trim_color = theme_toc_hover_trim_color %} {% if theme_toc_local_bg_color|trim == "section" %} {% set theme_toc_local_bg_color = theme_sectionbgcolor %} {% if theme_sectiontextcolor == "inherit" %} {% set default_toc_local_text_color = theme_textcolor %} {% else %} {% set default_toc_local_text_color = theme_sectiontextcolor %} {% endif %} {% set default_toc_local_trim_color = theme_sectiontrimcolor %} {% elif theme_toc_local_bg_color|trim == "default" %} {% set theme_toc_local_bg_color = "" %} {% endif %} {% if theme_toc_local_text_color|trim == "default" %} {% set theme_toc_local_text_color = default_toc_local_text_color %} {% endif %} {% if theme_toc_local_trim_color|trim == "default" %} {% set theme_toc_local_trim_color = default_toc_local_trim_color %} {% endif %} {% if theme_toc_current_text_color|trim == "default" %} {% set theme_toc_current_text_color = theme_toc_hover_text_color %} {% endif %} {# helper based on location of sidebar #} {% if theme_rightsidebar | tobool %} {% set sidebar_side = "right" %} {% set sidebar_opp = "left" %} {% else %} {% set sidebar_side = "left" %} {% set sidebar_opp = "right" %} {% endif %} {#********************************************** # helper macros for accumulating media-specific rules # from throughout the code, and then rendering them under one location at end. #**********************************************#} {% set _media_rules = {} %} {% macro on_media(section, content=None) %} {% if content is none %}{% set content = caller() %}{% endif %} {% set _ = _media_rules.setdefault(section, []).append(content) %} {% endmacro %} {% macro on_xlarge_screen() %} {{ on_media("xlarge_screen", caller()) }} {% endmacro %} {% macro on_large_screen() %} {{ on_media("large_screen", caller()) }} {% endmacro %} {% macro on_medium_or_small_screen() %} {{ on_media("medium_or_small_screen", caller()) }} {% endmacro %} {% macro on_medium_up_screen() %} {{ on_media("medium_up_screen", caller()) }} {% endmacro %} {% macro on_small_screen() %} {{ on_media("small_screen", caller()) }} {% endmacro %} {% macro on_print_media() %} {{ on_media("print", caller()) }} {% endmacro %} {% macro render_media_rules(section) %} {{ "\n".join(_media_rules.get(section, [])) }} {% endmacro %} {#********************************************** # helper macros for rendering semi-standard css3 keywords, # e.g. border-radius #**********************************************#} {# helper to convert various font sizes to float EM value #} {%- macro size_to_em(value, rem_per_em=1) %} {% if value is string %} {% set value = value|trim %} {% if value|float(-999) != -999 %} {{ value }} {% elif value.endswith("px") %} {{ value[:-2]|float / (px_per_rem * rem_per_em) }} {% elif value.endswith("em") %} {{ value[:-2] }} {% elif value.endswith("%") %} {{ value[:-1]|float / 100 }} {% else %} {# XXX: could add 'param' keyword to provide context #} {{ css_warning("cloud.css_t: can't parse float value: %r"|format(value)) }} {% endif %} {% else %} {{ value }} {% endif %} {%- endmacro %} {% set px_per_rem = 16 %} {% set text_size_em = size_to_em(theme_default_layout_text_size)|float %} {% if not text_size_em %} {# detect issue 23 #} {{ css_warning("theme.conf: invalid/null default_layout_text_size: %r"|format(theme_default_layout_text_size)) }} {% set text_size_em = 1 %} {% endif %} {% set px_per_rem = px_per_rem * text_size_em %} {% set bl_height = size_to_em(theme_bodylineheight)|float -%} {# base line height, in rems #} {# hacked attempt to autocalculate margins & line size for various headers, etc #} {%- macro box_typography(font_height, vert_margin=2, align=0.5, set_line=True, set_size=True, horiz_margin=0, vert_padding=0, border_padding=0) -%} {%- set font_height = size_to_em(font_height)|float -%} {# header font size, in rems #} {% if vert_padding is string or vert_padding is not sequence %} {% set vert_padding = [vert_padding, vert_padding] %} {% endif %} {%- set top_padding, bottom_padding = vert_padding %} {%- set top_padding = size_to_em(top_padding, rem_per_em=font_height)|float + size_to_em(border_padding, rem_per_em=font_height)|float /2 -%} {# externally controlled header padding, in header ems #} {%- set bottom_padding = size_to_em(bottom_padding, rem_per_em=font_height)|float + size_to_em(border_padding, rem_per_em=font_height)|float /2 -%} {# externally controlled header padding, in header ems #} {% if horiz_margin is string or not horiz_margin is sequence %} {% set horiz_margin = [horiz_margin, horiz_margin] %} {% endif %} {%- set hl_height = (font_height / bl_height)|round(0, "ceil") * bl_height / font_height -%} {# debug helper -- content: "hl_height {{ hl_height }}; padding {{ vert_padding }}; vert_margin {{ vert_margin }}"; #} {%- if set_line and set_size -%} font-size: {{ font_height }}em; {% endif -%} {%- if set_line -%} line-height: {{ hl_height }}em; {% endif -%} margin: {{ (hl_height * vert_margin * align - top_padding)|round(3) }}em {{ horiz_margin[0] }} {{ (hl_height * vert_margin * (1-align) - bottom_padding)|round(3) }}em {{ horiz_margin[1] }}; {% endmacro -%} {# macro for rendering rule with vendor-specific prefix #} {% macro experimental(keyword, value) %} {% if value %} -moz-{{ keyword }}: {{ value }}; -webkit-{{ keyword }}: {{ value }}; -o-{{ keyword }}: {{ value }}; -ms-{{ keyword }}: {{ value }}; {{ keyword }}: {{ value }}; {% endif %} {% endmacro %} {% macro border_radius(value) -%} {{ experimental("border-radius", value) }} {% endmacro %} {% macro box_shadow(value) -%} {{ experimental("box-shadow", value) }} {% endmacro %} {% macro box_sizing(value) -%} {{ experimental("box-sizing", value) }} {% endmacro %} {% macro opacity(value) -%} filter: progid:DXImageTransform.Microsoft.Alpha(Opacity= {{ (value|float*100)|round|int }}); opacity: {{ value }}; {% endmacro %} {% macro vert_gradient(stops) %} background-image: -moz-linear-gradient({{ stops }}); background-image: -webkit-linear-gradient({{ stops }}); background-image: linear-gradient({{ stops }}); {% endmacro %} {% macro horiz_gradient(stops) %} background-image: -moz-linear-gradient(left, {{ stops }}); background-image: -webkit-linear-gradient(left, {{ stops }}); background-image: linear-gradient(left, {{ stops }}); background-image: linear-gradient(to right, {{ stops }}); {% endmacro %} {% set button_box_shadow = box_shadow("1px 1px 2px -1px rgba(0,0,0,0.5)") %} {% set soft_corner_radius = "3px" %} {% set round_corner_radius = "10px" %} {# hack to parse sphinx version info into tuple could probably do this by registering filter, but wanted to try :) #} {% set sphinx_version_info = [] %} {% set _buf = "" %} {% set _end = false %} {% for char in (sphinx_version + ".") %} {% if _end %} {% elif char.isdigit() %} {% set _buf = _buf + char %} {% else %} {% if _buf %} {% set x = sphinx_version_info.append(_buf|int) %} {% set _buf = "" %} {% endif %} {% if char != "." %} {% set _end = true %} {% endif %} {% endif %} {% endfor %} {#**************************************************** # page layout - body #***************************************************#} {% set body_margin = "1em" %} * { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } body { padding: 0; color: #000; font-family: {{ theme_bodyfont }}; font-size: {{ theme_default_layout_text_size }}; line-height: {{ theme_bodylineheight }}; {% if theme_borderless_decor | tobool %} margin: 0; background: {{ theme_bgcolor }}; {% else %} margin: {{ body_margin }} {{ body_margin }} 0; background: {{ theme_footerbgcolor }}; background-attachment: fixed; {% endif %} } {% if theme_minimal_layout_text_size %} {% call on_small_screen() %} body { font-size: {{ theme_minimal_layout_text_size }}; } {% endcall %} {% endif %} {% if not theme_borderless_decor | tobool %} {% call on_medium_or_small_screen() %} body { margin: 0; } {% endcall %} {% endif %} {% if theme_large_layout_text_size %} {% call on_xlarge_screen() %} body { font-size: {{ theme_large_layout_text_size }}; } {% endcall %} {% endif %} {#**************************************************** # page layout - relbars (top & bottom) #***************************************************#} {% if theme_borderless_decor | tobool %} div.relbar-top, div.relbar-bottom { background: {{ theme_relbarbgcolor }}; padding: 0 {{ body_margin }}; } {% call on_medium_or_small_screen() %} div.relbar-top, div.relbar-bottom { padding: 0; } {% endcall %} {% endif %} div.related { margin: 0 auto; max-width: {{ theme_max_width }}; background: {{ theme_relbarbgcolor }}; line-height: {{ theme_bodylineheight }}; padding: .75em 0; color: {{ theme_relbartextcolor }}; text-shadow: 1px 1px 1px rgba(0,0,0,.3); {% if theme_borderless_decor | tobool %} background: none; {% endif %} {% if theme_shaded_decor|tobool %} {{ vert_gradient("rgba(255,255,255,.2), rgba(255,255,255,0)") }} border-width: 0 2px 3px 1px; {% endif %} } div.relbar-top div.related { {{ border_radius(".7em .7em 0 0") }} } div.relbar-bottom div.related { {{ border_radius("0 0 .7em .7em") }} {% if theme_shaded_decor|tobool %} {{ vert_gradient("rgba(255,255,255,.2), rgba(255,255,255,0.1)") }} border-width: 1px 2px 0 1px; {% endif %} } {# remove margin & rounded corners on small/medium screens #} {% if not theme_borderless_decor | tobool %} {% call on_medium_or_small_screen() %} div.relbar-top div.related, div.relbar-bottom div.related { {{ border_radius("0") }} } {% endcall %} {% endif %} div.related a { display: inline-block; padding: 0.3em 0.6em; {{ border_radius("0.8em") }} font-weight: bold; color: {{ theme_relbarlinkcolor }}; border: 1px solid transparent; } div.related li.right a { background: {{ theme_relbar_link_bg_color }}; font-weight: normal; } div.related a:hover, div.related li.right a:hover { background: {{ theme_relbar_link_hover_bg_color }}; color: {{ theme_relbar_link_hover_text_color }}; border-color: {{ theme_relbar_link_hover_trim_color }}; text-decoration: none; text-shadow: none; {{ button_box_shadow }} } {% call on_small_screen() %} {# tweak relbar - emphasize title, hide crumbs #} div.related > ul > li.right + li:not(.right) { font-weight: bold; } div.related > ul > li:not(.right) + li { display: none; } {% endcall %} {#**************************************************** # page layout - document #***************************************************#} div.document { {# note: relative used by div.sidebar-toggle-group #} position: relative; margin: 0 auto; max-width: {{ theme_max_width }}; background: {{ theme_sidebarbgcolor }}; {% if theme_borderless_decor | tobool %} background: {{ theme_bgcolor }}; {% endif %} } {% if theme_small_sidebar_bg_color|trim %} {% call on_small_screen() %} div.document { background: {{ theme_small_sidebar_bg_color }}; } {# for borderless mode #} div.sphinxsidebar { background: transparent; border: 0; } {% endcall %} {% endif %} div.documentwrapper { float: left; width: 100%; } div.bodywrapper { {%- if theme_rightsidebar|tobool %} margin: 0 {{ theme_large_sidebar_width }} 0 0; {% else %} margin: 0 0 0 {{ theme_large_sidebar_width }}; {% endif %} } {% call on_small_screen() %} div.bodywrapper { margin-{{ sidebar_side }}: 0; } {% endcall %} {% if theme_large_sidebar_width != theme_sidebarwidth %} {% call on_medium_or_small_screen() %} div.bodywrapper { {%- if theme_rightsidebar|tobool %} margin: 0 {{ theme_sidebarwidth }} 0 0; {% else %} margin: 0 0 0 {{ theme_sidebarwidth }}; {% endif %} } {% endcall %} {% endif %} div.document.sidebar-hidden div.bodywrapper { margin-{{ sidebar_side }}: 0; } div.body { min-height: {{ theme_min_height }}; {# note: this ^ is just a hack to prevent body from being shorter than sidebar #} {# line height debugging -- background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAVCAYAAABsZT8HAAAAFElEQVQImWNgGIKgvLz8PwMDAwMAD3sCZXNDKtkAAAAASUVORK5CYII=") repeat scroll 0 0 transparent; #} background-color: {{ theme_bgcolor }}; border-{{ sidebar_side }}: 1px solid {{ theme_bodytrimcolor }}; {% if not theme_borderless_decor|tobool %} {% if theme_rightsidebar|tobool %} {{ box_shadow("1px 0 2px " + theme_bodytrimcolor) }} {% else %} {{ box_shadow("-1px 0 2px " + theme_bodytrimcolor) }} {% endif %} {% endif %} line-height: {{ theme_bodylineheight }}; color: {{ theme_textcolor }}; padding: 30px 20px; {% if theme_borderless_decor | tobool %} border-width: 0; {% endif %} } {% call on_print_media() %} div.body { border: 0; {{ box_shadow("none") }} } {% endcall %} {#**************************************************** # page layout - sidebar # # NOTE: sidebar visibility is controlled by two classes, # which are set on div.document by the JS code... # * sidebar-hidden -- hide sidebar on medium-up media # (default is to shown sidebar on medium-up media) # * document-hidden -- show sidebar and hide content on small media # (default is to hide sidebar & show content on small media) #***************************************************#} {% set sidebar_top_margin = "0" %} {% if theme_borderless_decor|tobool and theme_sidebarbgcolor != "transparent" %} {% set sidebar_top_margin = "16px" %} {% endif %} div.sphinxsidebar { margin-top: {{ sidebar_top_margin }}; width: {{ theme_large_sidebar_width }}; {%- if theme_rightsidebar|tobool %} float: right; {%- endif %} font-size: 90%; line-height: 1.25em; {% if theme_borderless_decor|tobool %} margin-bottom: 16px; {{ box_sizing("border-box") }} background: {{ theme_sidebarbgcolor }}; border: 1px solid {{ theme_bodytrimcolor }}; {{ border_radius("0.7em") }} {{ box_shadow("1px 1px 1px " + theme_bodytrimcolor) }} {% if theme_shaded_decor|tobool %} {{ horiz_gradient("rgba(0,0,0,.05), rgba(255,255,255,.04), rgba(0,0,0,.05)") }} border-style: dotted solid solid dotted; {% endif %} {% endif %} } {% if theme_large_sidebar_width != theme_sidebarwidth %} {% call on_medium_or_small_screen() %} div.sphinxsidebar { width: {{ theme_sidebarwidth }}; } {% endcall %} {% endif %} {% call on_small_screen() %} div.document:not(.document-hidden) div.sphinxsidebar, div.document.document-hidden div.documentwrapper { display: none; } div.document.document-hidden div.sphinxsidebar { width: 100%; margin: 0; border: 0; border-radius: 0; } {% endcall %} div.document.sidebar-hidden div.sphinxsidebar { display: none; } div.sphinxsidebarwrapper { padding: 1em 0 0 10px; } div.sphinxsidebar h3, div.sphinxsidebar h4 { padding: 0; margin: 24px 16px 0 0; font-family: {{ theme_headfont }}; font-weight: normal; color: {{ theme_sidebartextcolor }}; } div.sphinxsidebar h3 { font-size: 1.4em; } div.sphinxsidebar h4 { font-size: 1.3em; } div.sphinxsidebar h3 a, div.sphinxsidebar h4 a { color: {{ theme_sidebartextcolor }}; } div.sphinxsidebar p { color: {{ theme_sidebartextcolor }}; } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 10px; margin-right: 0; padding: 0; color: {{ theme_sidebartextcolor }}; } div.sphinxsidebar a { color: {{ theme_sidebarlinkcolor }}; border: 1px solid transparent; border-width: 1px 0; } div.sphinxsidebar a:hover { color: {{ theme_link_hover_text_color }}; background: {{ theme_link_hover_bg_color }}; border-color: {{ theme_link_hover_trim_color }}; text-decoration: none; } div.sphinxsidebar ul li a { overflow: hidden; white-space: nowrap; } div.sphinxsidebar ul li a:hover { {# XXX: need something so that overflow bg is on top of document. wanted inline-block, but causes height jumps. #} display: inline-table; min-width: 98%; min-width: calc(100% - 5px); {# outline: 2px solid {{theme_sidebarbgcolor}};#} } div.sphinxsidebar a:active { color: {{ theme_sidebartextcolor }}; } div.sphinxsidebar p.logo { margin: 1em 0 0 -10px; text-align: center; max-width: 100%; } div.sphinxsidebar p.logo a { display: inline-block; {{ border_radius(soft_corner_radius) }} } {# fix margin if h3/h4 is at top of sidebar -- # consequence of sidebar boxes not all being wrapped in divs. #} div.sphinxsidebarwrapper > h3:first-child, div.sphinxsidebarwrapper > h4:first-child, div.sphinxsidebarwrapper > div:first-child > h3:first-child, div.sphinxsidebarwrapper > div:first-child > h4:first-child { margin-top: .2em; } {#**************************************************** # page layout - sidebar TOC sections # # NOTE: classes not marked as "set by sphinx" are autopopulated by js code. # # UL nodes conditionally have the following classes applied: # * current -- if UL contains active page, or is toplevel of active page # [set by sphinx] # # LI nodes conditionally have the following classes applied: # * current -- set for root node down to toplevel of current page. # [set by sphinx] # * local -- if LI > A points to current page # * child -- if LI > A points to child of current page # * active -- if LI is part of current page, and this section # (or child) is marked as the .focus # * focus -- LI is currently focused section (implies .active) # * toc-toggle -- marked by JS code when TOC section will be expanded/collapsed # * closed -- used to mark toc-toggle section that's collapsed # # LIs for other pages contained w/in active page will not have .active-section #***************************************************#} {# sidebar link lists #} div.sphinxsidebar ul, div.sphinxsidebar ul ul, div.sphinxprev p.topless, div.sphinxnext p.topless { list-style: none; margin-left: 0; } div.sphinxsidebar ul ul { margin-left: 1.5em; } {# sidebar links #} div.sphinxsidebar ul a, div.sphinxprev a, div.sphinxnext a { position: relative; display: block; padding: 1px 4px 3px 5px; margin: 0 5px 0 0; border: 1px solid transparent; {{ border_radius(soft_corner_radius) }} } {# hovered sidebar links #} div.sphinxsidebar ul a:hover, div.sphinxprev a:hover, div.sphinxnext a:hover { background: {{ theme_toc_hover_bg_color }}; border-color: {{ theme_toc_hover_trim_color }}; color: {{ theme_toc_hover_text_color }}; text-decoration: none; } {# make links to other page look slightly different #} div.sphinx-toc ul a:not([href^="#"]):hover { position: relative; overflow: visible; {# required for chome #} } div.sphinx-toc ul a:not([href^="#"]):hover:before { content: "⇒"; position: absolute; right: 100%; font-size: 1.5em; margin-right: 4px; opacity: 0.7; } {# global toc -- current page #} {% if theme_toc_local_bg_color %} {# highlight the current page's LI box #} .sphinxglobaltoc li.current.active { background: {{ theme_toc_local_bg_color }}; margin-left: -7px; padding: 6px 0 6px 3px; border: 1px solid {{ theme_toc_local_trim_color or theme_toc_hover_trim_color }}; border-width: 0 0 0 4px; {{ border_radius("6px") }} } {# highlight the current page title link #} .sphinxglobaltoc li.current.active > a { font-weight: bold; } {% call on_small_screen() %} {# merge into left side #} .sphinxglobaltoc li.current.active { border-left-width: 0; margin-left: -10px; padding-left: 10px; } {% endcall %} {# {# remove highlighting from links to child pages #\} .sphinxglobaltoc li.child { {# background: {{ theme_sidebarbgcolor if theme_sidebarbgcolor != "transparent" else theme_bgcolor }};#\} border-top-left-radius: 6px; border: 1px solid {{ theme_toc_local_trim_color }}; border-width: 0 0 0 2px; } .sphinxglobaltoc li.child + li.child { border-top-left-radius: 0; } {# XXX: would like this to be li.child:not(+ li.child) #\} .sphinxglobaltoc li.child:last-child { border-bottom-left-radius: 6px; } #} {% endif %} {# use alt color for local page's links (mainly useful w/ local_bg_color #} {% if theme_toc_local_text_color %} .sphinxglobaltoc li.active a { color: {{ theme_toc_local_text_color }}; } {% endif %} {# style page sections #} div.sphinxglobaltoc ul a[href="#"] { font-style: italic; } div.sphinxglobaltoc ul a:not([href*="#"]) { font-size: 0.95em; font-style: italic; } {# link to active TOC section #} div.sphinx-toc li { position: relative; } div.sphinx-toc li:before { position: absolute; left: -0.8em; color: {{ theme_toc_current_text_color }}; } {# link to top of page #} {% if not theme_toc_local_bg_color %} div.sphinx-toc li.current.active:not(.focus):before { content: "▼"; top: 0.1em; opacity: 0.5; } {% endif %} {# link to focused section #} div.sphinx-toc li.focus.local:before { content: "▶"; opacity: 0.7; {# fix offset to account for extra padding #} {% if theme_toc_local_bg_color %} left: calc(-0.8em + 5px); {% endif %} } {# link to focused link to child page #} div.sphinx-toc > ul:not(:hover) li.focus.child:before { content: "⇒"; opacity: 0.5; font-size: 1.5em; margin-left: -4px; } {# link to focused TOC section #} div.sphinx-toc li.focus.local > a:not(:hover) { color: {{ theme_toc_current_text_color }}; } {# TOC collapsed toc lists #} div.sphinx-toc li.toc-toggle > a:after { content: "[–]"; padding-left: .25em; {{ opacity(0.5) }} } div.sphinx-toc li.toc-toggle.closed > a:after { content: "[+]"; } {% if theme_cleanup_toc | tobool %} a.reference > .objdesc { font-size: 88%; } a.reference:not(:hover) > .objdesc { {{ opacity(0.6) }} } .current ul a > .objdesc.unique { display: none; } {% endif %} {#**************************************************** # page layout - sidebar searchbox & search page #***************************************************#} div.sphinxsidebar input, h1#search-documentation ~ form > input { border: 1px solid {{ theme_sidebartrimcolor }}; font-family: sans-serif; font-size: 1em; } div#searchbox input[type="submit"], h1#search-documentation ~ form > input[type="submit"] { background: {{ theme_sidebar_button_bg }}; {{ border_radius("0 0 0.7em 0") }} } div#searchbox input[type="submit"]:hover, h1#search-documentation ~ form > input[type="submit"]:hover, button.sidebar-toggle#sidebar-hide:hover, button.sidebar-toggle#sidebar-show:hover, .highlight .copybutton:hover { background: {{ theme_sidebar_link_hover_bg_color }}; color: {{ theme_sidebar_link_hover_text_color }}; border-color: {{ theme_sidebar_link_hover_trim_color }}; } h1#search-documentation ~ form > input[type="text"]:focus, div.sphinxsidebar input[type="text"]:focus { border-color: {{ theme_sidebar_link_hover_trim_color }}; } .highlight .copybutton:hover:not(:active), div.sphinxsidebar button:hover:not(:active), div.sphinxsidebar input[type="submit"]:hover:not(:active), h1#search-documentation ~ form > input[type="submit"]:hover, button.sidebar-toggle:hover:not(:active) { {{ button_box_shadow }} } button.sidebar-toggle::-moz-focus-inner, .highlight .copybutton::-moz-focus-inner { border: 0; } div.sphinxsidebar .searchtip { color: {{ theme_sidebardetailcolor }}; } #searchbox .highlight-link a[href$="hideSearchWords()"] { display: block; padding: 0 1em; font-size: 80%; text-align: right; } #searchbox .highlight-link a[href$="hideSearchWords()"]:before { content: "\00D7"; font-weight: bold; padding-right: 0.25em; } {#**************************************************** # page layout - collapsible sidebar buttons #***************************************************#} .sidebar-toggle-group { position: absolute; width: {{ theme_large_sidebar_width }}; top: 0; {{ sidebar_side }}: 0; z-index: 1; } .sidebar-toggle-group.no-js { display: none; } {% if theme_large_sidebar_width != theme_sidebarwidth %} {% call on_medium_or_small_screen() %} .sidebar-toggle-group { width: {{ theme_sidebarwidth }}; } {% endcall %} {% endif %} {% call on_print_media() %} .sidebar-toggle-group { display: none; } {% endcall %} div.document.sidebar-hidden .sidebar-toggle-group { width: auto; } div.document.document-hidden .sidebar-toggle-group { width: 100%; } button.sidebar-toggle { margin: 0; padding: 6px 12px; color: {{ theme_sidebartextcolor }}; font-size: 1em; white-space: nowrap; } button#sidebar-hide { position: absolute; {% if theme_borderless_decor | tobool %} top: {{ sidebar_top_margin }}; {{ sidebar_opp }}: 0; {% else %} top: 0; {{ sidebar_opp }}: -1px; {% endif %} background: transparent; border: 1px solid {{ theme_bodytrimcolor }}; {% if not theme_borderless_decor | tobool %} border-top-width: 0; {% elif theme_shaded_decor|tobool and not theme_rightsidebar|tobool %} border-left-width: 2px; {% endif %} border-bottom-{{ sidebar_side }}-radius: 0.7em; {% if theme_borderless_decor|tobool and theme_sidebar_top_margin %} border-top-{{ sidebar_opp }}-radius: 0.7em; {% endif %} } {% call on_small_screen() %} button#sidebar-hide { left: auto; top: 0; right: 0; background: {{ theme_bgcolor }}; border-color: {{ theme_sidebartrimcolor }}; } {% endcall %} button#sidebar-show { position: absolute; top: 0; {% if theme_borderless_decor|tobool %} {{ sidebar_side }}: 10px; {% else %} {{ sidebar_side }}: 0; {% endif %} background: {{ theme_sidebar_button_bg }}; border: 1px solid {{ theme_sidebartrimcolor }}; {% if not theme_borderless_decor | tobool %} border-top-width: 0; {% elif theme_shaded_decor|tobool and not theme_rightsidebar|tobool %} border-right-width: 2px; {% endif %} border-bottom-{{ sidebar_opp }}-radius: 0.7em; {% if theme_borderless_decor|tobool %} border-bottom-{{ sidebar_side }}-radius: 0.7em; {% endif %} } {% if theme_borderless_decor|tobool %} {% call on_medium_or_small_screen() %} button.sidebar-toggle#sidebar-show { {{ sidebar_side }}: 0; border-bottom-{{ sidebar_side }}-radius: 0; } {% endcall %} {% endif %} {#**************************************************** # page layout - footer #***************************************************#} div.footer { color: {{ theme_footertextcolor }}; width: 100%; padding: 9px 0; text-align: center; font-size: 75%; {% if theme_borderless_decor | tobool %} background: {{ theme_footerbgcolor }}; width: auto; {% if theme_shaded_decor|tobool %} {{ vert_gradient("rgba(255,255,255,0.1), rgba(255,255,255,0.0)") }} border-width: 0 2px 0 0; {% endif %} {# hack so body below footer gets correct color #} box-shadow: 0 50vh 0 50vh {{ theme_footerbgcolor }}; {% endif %} } div.footer button.link { margin: 0 -1px; padding: 0; background: none; border: none; font-size: inherit; font-family: inherit; } div.footer a, div.footer button.link { color: {{ theme_footertextcolor }}; text-decoration: underline; } div.footer a:hover, div.footer button.link:hover { color: white; } div.footer + div.footer, div.footer + script + div.footer { margin-top: -12px; } {% if theme_borderless_decor | tobool %} div.footer, div.footer a:not(:hover) { color: {{ theme_relbartextcolor }}; } {% endif %} {#=================================================== # document body - headers #==================================================#} {% set h1_size = 2.0 %} {% set h2_size = 1.875 %} {% set h3_size = 1.625 %} {% set h4_size = 1.25 %} {% set h5_size = 1.1 %} {% set h6_size = 1.0 %} {#--------------------------------------------------- # common header styling #--------------------------------------------------#} div.body h1, div.body h2, div.body p.rubric, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: {{ theme_headfont }}; font-weight: normal; color: {{ theme_sectionbgcolor if theme_lighter_header_decor|tobool else theme_headtextcolor }}; clear: both; {# for floating admonitions; to take this off, have to explicitly set 'allow-float' class -- or a 'across-section' flag for admonition #} } {% call on_print_media() %} {# remove styling from headers #} div.body h1, div.body h2, div.body p.rubric, div.body h3, div.body h4, div.body h5, div.body h6 { color: {{ theme_headtextcolor }} !important; text-shadow: none !important; border: none !important; padding: 0; } {% endcall %} {#--------------------------------------------------- # h1 #--------------------------------------------------#} div.body h1 { {{ box_typography(h1_size) }} text-align: center; {% if theme_lighter_header_decor|tobool %} color: {{ theme_sectionbgcolor }}; {% endif %} } {# hack to fix toplevel header margin #} div.body > .section > h1 { {{ box_typography(h1_size, set_line=False, vert_padding=("30px",0)) }} } {# page subtitle effect #} div.body h1 + .subtitle { opacity: 0.54; font-style: italic; font-weight: bold; margin-bottom: 2.25rem; margin-top: -2.25rem; text-align: center; } {#--------------------------------------------------- # h2, h3, & rubric #--------------------------------------------------#} div.body h2, div.body p.rubric { {{ box_typography(h2_size, vert_margin=1) }} } div.body h3 { {{ box_typography(h3_size, vert_margin=0.75) }} } {#--------------------------------------------------- # solid-colored header style for h2, h3, & rubric #--------------------------------------------------#} {# h2, h3, rubric - common styling for solid-colored section #} div.body h2, div.body p.rubric, .section.emphasize-children > .section > h3, #table-of-contents > h1, {# hack for toc page #} h1#search-documentation {# hack for search page #} { {% if theme_lighter_header_decor | tobool %} {% set h2_margin = "-12px" %} padding: 0 6px; border: 1px solid {{ theme_sectionbgcolor }}; border-width: 0 0 2px 0; color: {{ theme_sectionbgcolor }}; text-shadow: 1px 1px {{ theme_sectiontrimcolor }}; {% else %} {% set h2_margin = "1px" %} padding: 6px 10px; background-color: {{ theme_sectionbgcolor }}; border: 1px solid {{ theme_sectiontrimcolor }}; border-width: 0 0 0 6px; color: {{ theme_sectiontextcolor }}; text-shadow: 1px 1px {{ theme_sectiontrimcolor }}; {% if theme_shaded_decor|tobool %} {{ vert_gradient("rgba(255,255,255,0.2), rgba(255,255,255,0)") }} {% endif %} {% endif %} {{ border_radius(theme_section_radius) }} } {% call on_small_screen() %} {# remove spacing on headers and reduce body padding #} div.body h2, div.body p.rubric, .section.emphasize-children > .section > h3 { {% if not theme_lighter_header_decor|tobool %} padding-top: 0.25em; padding-bottom: .25em; {% endif %} {{ border_radius(soft_corner_radius) }} } {% endcall %} {% if theme_shaded_decor|tobool and not theme_lighter_header_decor|tobool %} {% call on_print_media() %} div.body h2, div.body p.rubric, .section.emphasize-children > .section > h3 { border-width: 0 0 .2em 0; padding-bottom: 0.1em; } {% endcall %} {% endif %} {# h2, rubric - resize margins to account for padding & border #} div.body h2, div.body p.rubric, #table-of-contents > h1, {# hack for toc page #} h1#search-documentation {# hack for search page #} { {{ box_typography(h2_size, set_line=False, vert_margin=1, horiz_margin=h2_margin) }} } {# h3 - resize margins to account for padding & border #} .section.emphasize-children > .section > h3 { {{ box_typography(h3_size, set_line=False, vert_margin=1, horiz_margin=h2_margin) }} } {# h3, rubric - use alternate color #} div.body p.rubric, .section.emphasize-children > .section > h3 { {% if theme_lighter_header_decor|tobool %} border-color: {{ theme_rubricbgcolor }}; color: {{ theme_rubricbgcolor }}; border-width: 0 0 1px 0; {% else %} background-color: {{ theme_rubricbgcolor }}; {% if theme_rubric_trim_color|trim %} border-color: {{ theme_rubric_trim_color }} {% endif %} {% endif %} } {% if not theme_lighter_header_decor|tobool %} {# permalink styling #} div.body h2:hover a.headerlink:not(:hover), .section.emphasize-children > .section > h3:hover a.headerlink:not(:hover) { {{ opacity(0.4) }} } {# highlighted as permalink #} div.body h2.highlighted, .section.emphasize-children > .section > h3.highlighted { background-color: {{ theme_highlightcolor }}; border-color: {{ theme_link_hover_trim_color }}; color: {{ theme_headtextcolor }}; } {% endif %} {# h2, rubric -- add icon to main headers for decoration (experimental) #} {% if theme_header_icon|trim and (theme_lighter_header_decor|tobool or not theme_shaded_decor|tobool) %} div.body h2, div.body p.rubric { background-image: url("{{ theme_header_icon }}"); background-repeat: no-repeat; background-position: 10px 50%; background-size: 32px auto; padding-left: 48px; } {% endif %} {#--------------------------------------------------- # h4 etc #--------------------------------------------------#} div.body h4 { {{ box_typography(h4_size) }} clear: both; {# for floating admonitions #} } div.body h5 { {{ box_typography(h5_size) }} } div.body h6 { {{ box_typography(h6_size) }} } {#--------------------------------------------------- # fixups #--------------------------------------------------#} #table-of-contents > h1, {# hack for toc page #} h1#search-documentation {# hack for search page #} { margin-top: 0; } {# NOTE: li.page attribute set by js code #} .toctree-wrapper.highlight-pages:not(.hide-sections) li.page > a { font-weight: bold; } .toctree-wrapper.space-pages li.page { margin-top: 1em; } {# 'hide-sections' modifier is toggled by JS code for TOC page #} .toctree-wrapper.hide-sections li:not(.page) { list-style: none; margin-left: -2.5rem; } .toctree-wrapper.hide-sections li:not(.page) > a { display: none; } #hide-page-sections { float: right; opacity: 0.88; } {#--------------------------------------------------- # header permalink styling #--------------------------------------------------#} a.headerlink { color: {{ theme_headlinkcolor }}; font-size: 0.8em; margin: 0 0 0 1px; padding: 0 5px 0 4px; text-decoration: none; border: 1px solid transparent; border-width: 1px 0; {{ border_radius("0.35em") }} } div.body a.headerlink:hover { background-color: {{ theme_link_hover_bg_color }}; border-color: {{ theme_link_hover_trim_color }}; color: {{ theme_link_hover_text_color }}; text-decoration: none; {# {{button_box_shadow}} #} } a.headerlink:hover:active { {{ box_shadow("none") }} } {#--------------------------------------------------- # toggleable sections # # NOTE: .html-toggle-button class added by JS, # so we can trust that section has been instrumented. #--------------------------------------------------#} {# toggle section - common style #} .html-toggle-button { position: relative; cursor: pointer; } {# toggle section - hover style #} .html-toggle-button:hover:after, .section.emphasize-children > .section > h3.html-toggle-button:hover:after {# hack to override higher priority rule #} { background: {{ theme_link_hover_bg_color }}; {# border-color: transparent; {{ border_radius("8px") }} {{ box_shadow("0 0 0 1px " + theme_link_hover_trim_color) }}; #} border-color: {{ theme_link_hover_trim_color }}; {{ border_radius("4px") }} {{ button_box_shadow }} color: {{ theme_link_hover_text_color }}; } {# toggle button - common style #} .html-toggle-button:after { position: relative; top: -0.15em; margin: 0; padding: 0.15em 0.3em; text-shadow: none; font-size: 65%; font-style: italic; font-weight: bold; border: 1px solid transparent; } {# toggle button - content #} {# XXX: move this part to JS? #} .html-toggle.collapsed > .html-toggle-button:after { content: "[+ show section]"; } .html-toggle.expanded > .html-toggle-button:after { content: "[- hide section]"; } {# toggle button label - active style #} .html-toggle-button:active:after, .section.emphasize-children > .section > h3.html-toggle-button:active:after {# hack to override higher priority rule #} { position: relative; top: calc(-0.15em + 1px); left: 1px; } {% call on_print_media() %} {# omit "hide section" label #} .html-toggle.expanded > .html-toggle-button:after { display: none; } {# indicate collapsed sections were omitted TODO: would like to auto-expand them instead, but not sure how to create a reliable CSS rule given the way the JS code currently works. #} .html-toggle.collapsed > .html-toggle-button:after { content: "[not printed]" !important; } {% endcall %} {#**************************************************** # content styling #***************************************************#} {#------------------------------------ # block effects #------------------------------------#} .clear { clear: both; } .clear-none { clear: none; } div.body .clear-none > h3 { clear: none; } {#------------------------------------ # misc styles #------------------------------------#} div.body p { text-align: justify; {{ box_typography(1.0, set_line=False) }} } {% if theme_hyphenation_langage %} div.body p:not(.admonition-title) { {# NOTE: requires lang="xxx" on body element or parent, which our layout.html sets #} {{ experimental("hyphens", "auto") }} } {% endif %} div.body li, div.body dd { text-align: justify; } div.body hr { margin: 0 10px; background: none; border: 1px dashed {{ theme_sidebartrimcolor }}; border-width: 1px 0 0 0; } {#------------------------------------ # footnotes #------------------------------------#} a.footnote-reference { font-size: 70%; position: relative; top: -.75em; } table.docutils.footnote { margin: 1em 0 0 1em; } {#------------------------------------ # lists (UL, OL, DL) #------------------------------------#} dl { margin-bottom: 1.5em; } li > dl:only-child { margin-bottom: 0; } dd { margin-right: 10px; } {# to match left indent #} dd ol { margin-bottom: 10px; } dl.docutils > dt { font-size: 1.1em; margin-bottom: .5em; } dl.docutils > dd + dt { margin-top: 1.5em; } {# join separate ULs together #} ul + ul, ul + div > ul:only-child, div.toctree-wrapper + ul { margin-top: -1em; } {# override basic.css rule #} dd ul { margin-bottom: {{ theme_bodylineheight }}; } {# add margin after ul if there's a paragraph before it, so margins are even #} li > p ~ ul.simple { margin-bottom: 1.5em; } {#**************************************************** # document - links #***************************************************#} a { color: {{ theme_linkcolor }}; text-decoration: none; } a:visited { {% if theme_visitedlinkcolor %} color: {{ theme_visitedlinkcolor }}; {% endif %} text-decoration: none; } a:hover { color: {{ theme_link_hover_text_color }}; background: {{ theme_link_hover_bg_color }}; text-decoration: underline; } a:hover:active { position: relative; left: 1px; top: 1px; {{ box_shadow("0") }} } a.biglink { font-size: 130%; } {% if theme_externalrefs|tobool %} a.external:before { content: {{ theme_externalicon }}; padding-right: .1em; } a.external.issue:before { content: {{ theme_issueicon or theme_externalicon }}; } a.external[href^="mailto:"]:before { content: ""; } em.issue:before { content: {{ theme_issueicon or theme_externalicon }}; padding-right: .1em; } {% endif %} {#------------------------------------- # permalink highlighting #------------------------------------#} dt:target, .footnote:target, .highlighted { padding: 4px; margin: -4px; background-color: {{ theme_highlightcolor }}; {{ border_radius(round_corner_radius) }} } {#**************************************************** # document - table styles #***************************************************#} {#------------------------------------ # custom table classes #------------------------------------#} table.fullwidth { width: 100%; } table.centered { margin-left: auto; margin-right: auto; } table.docutils.plain { border: none; } table.docutils.plain tr.row-odd > * { background: none; } {# legacy alias for table.plain #} table.docutils.html-plain-table tr.row-odd > * { background: none; } {#------------------------------------ # default table styling #------------------------------------#} table.docutils th { border: 0 solid transparent; padding: .4em; font-family: {{ theme_headfont }}; background: {{ theme_table_header_color }}; } table.docutils th.head:not(.stub) { border-bottom: 1px solid {{ theme_table_trim_color }}; } table.docutils th.stub + td { border-left: 1px solid {{ theme_table_trim_color }}; } table.docutils td { padding: .4em; border: 0 solid {{ theme_table_trim_color }}; } table.docutils tr.row-odd td { background: {{ theme_table_shade_color }}; } h2 + table.docutils { margin-top: 1em; } table > caption { margin: 1em 0 .5em; font-style: italic; } {#------------------------------------ # td/th classes added by .ext.table_styling #------------------------------------#} table.docutils .left-align { text-align: left; } table.docutils .center-align { text-align: center; } table.docutils .right-align { text-align: right; } table.docutils .justify-align { text-align: justify; } table.docutils .nowrap { white-space: nowrap; } table.docutils .single-left-divider { border-left-width: 2px; } table.docutils th + .single-left-divider, table.docutils th + .double-left-divider { border-left-width: 0; } table.docutils .double-left-divider { border-left-width: 6px; border-left-style: double; } table.docutils .single-right-divider:last-child { border-right-width: 2px; } table.docutils .double-right-divider:last-child { border-right-width: 6px; border-right-style: double; } {#**************************************************** # document - field-list tables & contents #***************************************************#} {# add margin to field-list table, since cell margins won't collapse, but can't be relied on #} table.field-list { margin: {{ theme_bodylineheight }} 0; } {# clear stying added by table.docutils styling (above) #} table.field-list th { background: none; padding: 0 0.4em 0 0; } {# add margins between field entries, except last one #} table.field-list td { padding: 0 0 {{ theme_bodylineheight }} 0; } table.field-list tr:last-child td { padding-bottom: 0; } {# parameter definition - add margins between entries, except last one #} td.field-body > ul.first.simple > li { margin: 0 0 {{ theme_bodylineheight }} 0; } td.field-body > ul.first.simple > li:last-child { margin-bottom: 0; } {# parameter definition - add some spacing between () in type declaration #} td.field-body > em, td.field-body > ul.first.simple > li > em { padding: 2px 4px; } {# parameter definition - set margins between paragraphs, except last one #} td.field-body > p, td.field-body > ul > li > p { margin: 0 0 {{ theme_bodylineheight }}; } td.field-body > p:last-child, td.field-body > ul > li > .admonition { margin-bottom: 0; } {# docutils loves to create empty paragraphs - hide them so margin don't muck with things #} td.field-body > p:empty { display: none; } {#**************************************************** # document - admonitions #***************************************************#} {#--------------------------------------------------- # basic admonition styling - adds bg color & icons #--------------------------------------------------#} {% set icon_size_em = "2.65em" %} div.admonition, p.deprecated { background: {{ theme_admonition_note_color }}; {{ box_typography(theme_admonition_size, vert_padding="1em") }} padding: .5em 1em; border: 1px solid {{ theme_admonition_trim_color }}; border-width: {{ theme_admonition_trim_width }}; {{ border_radius(theme_admonition_radius) }} {# make space for icon #} background-position: .6em .5em; background-size: auto 1.58em; background-repeat: no-repeat; {# set default icon #} background-image: url("icon-note.png"); } {# set icon & color for different types #} {# 'div.note' used as default style #} div.caution, div.important { background-color: {{ theme_admonition_todo_color }}; background-image: url("icon-caution.png"); } div.warning { background-color: {{ theme_admonition_warning_color }}; background-image: url("icon-warning.png"); } div.danger, div.admonition.error { background-color: {{ theme_admonition_warning_color }}; background-image: url("icon-danger.png"); } div.seealso { background-color: {{ theme_admonition_seealso_color }}; background-image: url("icon-seealso.png"); } div.admonition-todo { background-color: {{ theme_admonition_todo_color }}; background-image: url("icon-todo.png"); } p.deprecated { background-color: {{ theme_admonition_deprecated_color }}; background-image: url("icon-deprecated.png"); } {# set margins w/in admonition #} div.admonition p, div.admonition pre, div.admonition ul, div.admonition ol { {{ box_typography(theme_admonition_size, set_size=False, vert_margin=0) }} } {# ident if at toplevel #} h1 ~ div.admonition { margin-left: {{ theme_bodylineheight }}; margin-right: {{ theme_bodylineheight }}; } {#--------------------------------------------------- # 'floating' admonitions #--------------------------------------------------#} div.admonition.float-right, div.admonition.floater {# deprecated alias #} { float: right; max-width: 40%; margin: 0 0 {{ theme_bodylineheight }} {{ theme_bodylineheight }}; } .admonition.float-left { float: left; max-width: 50%; margin: 0 {{ theme_bodylineheight }} {{ theme_bodylineheight }} 0; } .admonition.float-center { clear: both; max-width: 65%; margin: 0 auto 1.5em; } {# helpers for stacking admonitions #} .clear-left { clear: left; } .clear-right { clear: right; } .clear, .clear-both { clear: both; } {#--------------------------------------------------- # admonition header styling #--------------------------------------------------#} {% if theme_inline_admonitions == "auto" %} {% set theme_inline_admonitions = false %} {% endif %} {% if theme_inline_admonitions|tobool %} {% set inline_title_selector = "" %} {% set block_title_selector = "div.admonition.block-title" %} {% else %} {% set inline_title_selector = "div.admonition.inline-title" %} {% set block_title_selector = "" %} {% endif %} {# put admontion title in row all it's own #} {{ block_title_selector }} p.admonition-title.first { {% if theme_inline_admonitions|tobool %} display: block; {% endif %} margin: -.5em -1em .5em; padding: .5em .5em .5em {{ icon_size_em }}; background: {{ theme_admonition_title_color }}; {{ border_radius(soft_corner_radius + " " + soft_corner_radius + " 0 0") }} {# match admonition #} } {# fix to override basic.css's !important #} {{ block_title_selector }} p.admonition-title.first { margin-top: -.5em !important; } {# put admonition title inline with text #} {{ inline_title_selector }} p.admonition-title { display: inline; margin: 0; padding: 0 .25em 0 1.5em; {# make room for icon #} } {{ inline_title_selector }} p.admonition-title:after { content: ":"; } {{ inline_title_selector }} p.admonition-title + p { display: inline; } {{ inline_title_selector }} p.admonition-title + ul { margin-top: 0; } {% if not theme_inline_admonitions|tobool %} {{ inline_title_selector }} p.admonition-title { background: none; } {% endif %} {# flag to hide title #} div.admonition.without-title p.admonition-title { display: none; } div.admonition.without-title { padding-left: {{ icon_size_em }}; } {#--------------------------------------------------- # 'todo' admonition summary list #--------------------------------------------------#} div#todos p.admonition-title { font-weight: normal; color: #AAA; font-size: 70%; } div#todos div.admonition-todo + p { font-size: 70%; text-align: right; margin-top: -.5em; margin-bottom: 1.5em; color: #AAA; } div#todos div.admonition-todo + p a { font-size: 130%; } {#**************************************************** # document - verionchanged/modified/deprecated #***************************************************#} div.deprecated, div.versionchanged, div.versionadded { {{ box_typography(theme_admonition_size) }} {{ opacity("0.6") }}; } {# always contained in one of above sections #} span.versionmodified { font-weight: bold; } {#**************************************************** # document - quoted text (TT & PRE) #***************************************************#} div.highlight { background: none; margin: {{ theme_bodylineheight }} 0; } div.highlight pre, td.linenos pre { padding: 10px; font-family: {{ theme_codeblockfont }}; font-size: 85%; line-height: {{ theme_bodylineheight }}; } div.highlight pre { background-color: {{ theme_codebgcolor }}; border: 1px solid {{ theme_codetrimcolor }}; border-width: 1px 0; border-style: solid dotted dotted solid; {{ border_radius(soft_corner_radius) }} color: {{ theme_codetextcolor }}; } {# remove extra margin from consecutive .highlight-xxx + .highlight-yyy sections #} div[class|="highlight"] + div[class|="highlight"] { margin-top: -{{ bl_height }}em; } {# for source-view pages #} p + [class|=highlight] > table.highlighttable { margin-top: -1em; {# hack fixing extra padding being inserted somewhere in table td #} margin-bottom: -1em; } {# for code blocks w/ linenos added #} table.highlighttable { display: block; } table.highlighttable tbody { display: block; } table.highlighttable tr { display: flex; align-items: flex-start; justify-content: flex-start; } table.highlighttable td { display: block; padding: 0; } table.highlighttable td.code { width: 100%; max-width: calc(100% - 1em); } table.highlighttable div.linenodiv { margin-top: 2.2em; } table.highlighttable div.linenodiv pre { background: none; border: 0; margin: 0; padding: 0; padding-right: .5em; } {# NOTE:: sphinx 1.3 switch to 'code' instead of 'tt' for literals #} {% if sphinx_version_info < [1,3] %} {% set code = "tt" %} {% else %} {% set code = "code" %} {% endif %} {{ code }} { font-family: {{ theme_codeblockfont }}; font-size: 90%; } {{ code }}.literal { background-color: {{ theme_quotebgcolor }}; border: 1px solid {{ theme_quotetrimcolor }}; padding: 0px 4px; margin: 1px; {{ border_radius("4px") }} } p {{ code }}.literal { white-space: nowrap; } {{ code }}.samp.literal > em { font-family: {{ theme_codevarfont }}; padding: 0 1px; {{ opacity(0.6) }} } {{ code }}.samp.literal > em:before { content: "{"; } {{ code }}.samp.literal > em:after { content: "}"; } h1 {{ code }}.literal { {# background-color: inherit; border: 0; #} font-size: 80%; } h1 {{ code }}.samp.literal > em { font-weight: normal; } div.sphinxsidebar {{ code }}.literal, a.reference {{ code }}.literal, div.related a {{ code }}.literal, {{ code }}.literal.xref { background-color: transparent; border: none; padding: 0; margin: 0; } .viewcode-back { font-family: {{ theme_bodyfont }}; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } {# code block 'copybutton' #} .highlight .copybutton { position: absolute; right: 0; top: 0; margin: 0; padding: 0 6px; background: transparent; border: 1px solid transparent; {{ border_radius(soft_corner_radius) }} font-size: 75%; color: {{ theme_sidebartextcolor }}; white-space: nowrap; cursor: pointer; } .highlight .copybutton.active { text-decoration: line-through; {{ opacity(0.8) }} } .highlight:not(:hover) .copybutton:not(.active) { {{ opacity(0.7) }} } {#**************************************************** # document - object description sections # requires css classes to set by .ext.autodoc_sections # # NOTE: all sections nested w/in an object description will have the form: # <div class="section desc-section desc-section-{LEVEL}"> # <hN class="section-header">{TITLE}</hN> # {CONTENT} # </div> #***************************************************#} {# styling for nested sections #} .desc-section > .section-header { position: relative; } .desc-section-1 > .section-header { {{ box_typography(h2_size, set_line=False, vert_margin=1) }} border-bottom: 1px dotted {{ theme_nestedtextcolor or theme_sectionbgcolor }}; color: {{ theme_nestedtextcolor or theme_sectionbgcolor }}; } .desc-section-2 > .section-header { color: {{ theme_nestedtextcolor or theme_sectionbgcolor }}; } .desc-section > .section-header:before { {# NOTE: data-nested-label is filled in by js code #} content: attr(data-nested-label); font-size: 0.75em; opacity: 0.75; letter-spacing: 1px; font-style: italic; } {# styling for object declarations #} {% if theme_colored_objects in ["true", "row", "prefix"] %} {#**************************************************** # document - object definition styling #***************************************************#} {# XXX: if sphinx just added a common class to all these, e.g. 'object' or 'objdesc', wouldn't need so many rules. #} {% set color_object_row = theme_colored_objects in ["true", "row"] %} {% if color_object_row %} {# color entire declaration #} {% set unmarked_bg_suffix = "> dt" %} {% set marked_bg_suffix = "> dt" %} {% else %} {# just color the prefix #} {% set unmarked_bg_suffix = "> dt:before" %} {% set marked_bg_suffix = "> dt > .property:first-child" %} {% endif %} {# assign common row styling #} dl.object {{ unmarked_bg_suffix }}, dl.function {{ unmarked_bg_suffix }}, dl.method {{ unmarked_bg_suffix }}, dl.attribute {{ unmarked_bg_suffix }}, dl.class {{ marked_bg_suffix }}, dl.exception {{ marked_bg_suffix }}, dl.classmethod {{ marked_bg_suffix }}, dl.staticmethod {{ marked_bg_suffix }} { display: inline-block; {% if color_object_row %} padding: 0.3em 0 0.3em 0.6em; {% else %} margin-right: 0.5em; padding: 0.3em 0.6em; {% endif %} border: {{ theme_object_trim_color }} solid 1px; border-width: 0 0 0 3px; {{ border_radius(theme_object_radius) }} } {# assign type-specific row coloring/styling #} dl.object {{ unmarked_bg_suffix }}, dl.attribute {{ unmarked_bg_suffix }} { background-color: {{ theme_object_attribute_color or theme_object_default_color }}; } dl.function {{ unmarked_bg_suffix }}, dl.method {{ unmarked_bg_suffix }}, dl.classmethod {{ marked_bg_suffix }}, dl.staticmethod {{ marked_bg_suffix }} { background-color: {{ theme_object_function_color or theme_object_default_color }}; } dl.class {{ marked_bg_suffix }} { background-color: {{ theme_object_class_color or theme_object_default_color }}; border-width: 0 0 0 6px; } dl.exception {{ marked_bg_suffix }} { background-color: {{ theme_object_exception_color or theme_object_class_color or theme_object_default_color }}; } {# assign common prefix styling #} dl.object > dt:before, dl.function > dt:before, dl.method > dt:before, dl.attribute > dt:before, dl.class > dt > .property:first-child, dl.exception > dt > .property:first-child, dl.classmethod > dt > .property:first-child, dl.staticmethod > dt > .property:first-child { font-size: 0.8em; font-weight: bold; font-style: italic; letter-spacing: 0.1em; color: {{ theme_object_type_color }}; } {# assign type-specific prefix content #} {% if theme_colored_object_prefixes in ["all", "nested"] %} {% set nested_prefix = ".desc-section " if theme_colored_object_prefixes == "nested" else "" %} {{ nested_prefix }} dl.object > dt:before { content: "obj"; padding-right: 0.6em; } {{ nested_prefix }} dl.attribute > dt:before { content: "attr"; padding-right: 0.6em; } {{ nested_prefix }} dl.function > dt:before { content: "func"; padding-right: 0.6em; } {{ nested_prefix }} dl.method > dt:before { content: "method"; padding-right: 0.6em; } {% elif theme_colored_object_prefixes != "default" %} {{ css_warning("cloud.css_t: unknown 'colored_object_prefixes' value: %r"|format(theme_colored_object_prefixes)) }} {% endif %} {% elif theme_colored_objects not in ["false", "none"] %} {{ css_warning("cloud.css_t: unknown 'colored_objects' value: %r"|format(theme_colored_objects)) }} {% endif %} dl > dt.highlighted { background: {{ theme_highlightcolor }}; } {# fix viewcode link positioning since DT is now inline #} .viewcode-link { position: absolute; right: 0; margin-right: 1.5em; margin-right: calc(1em + 10px); } {#**************************************************** # index page styling # requires classes set by .ext.index_styling #***************************************************#} table.indextable span.category { font-size: 80%; font-style: italic; color: {{ theme_index_category_color }}; } table.indextable a, table.indextable a:hover span.category { color: {{ theme_linkcolor }}; } table.indextable span.category span.location { font-weight: bold; } table.indextable td > dl > dt { margin-bottom: .5em; } table.indextable td > dl > dd > dl { margin-top: -.5em; margin-bottom: .5em; } {#***************************************************** # adapt for various page sizes & media #****************************************************#} {# adapt for xlarge displays #} @media only screen and (min-device-width: {{ theme_large_width }}) { {{ render_media_rules("xlarge_screen") }} } {# adapt for large displays #} @media only screen and (min-width: {{ theme_max_width }}) { {{ render_media_rules("large_screen") }} } {# adapt for medium & up displays #} @media only screen and (min-width: {{ theme_minimal_width }}) { {{ render_media_rules("medium_up_screen") }} {# helper to omit small-only elements #} .show-for-small { display: none !important; } } {# adapt for medium & small displays #} @media only screen and (max-width: {{ theme_max_width }}), only screen and (max-width: {{ theme_minimal_width }}), only screen and (max-device-width: {{ theme_minimal_width }}), handheld { {{ render_media_rules("medium_or_small_screen") }} } {# adapt for small displays #} @media only screen and (max-width: {{ theme_minimal_width }}), only screen and (max-device-width: {{ theme_minimal_width }}), handheld { {{ render_media_rules("small_screen") }} {# helper to omit unimportant elements on small displays #} .hide-for-small { display: none; } } {# adapt for print media #} @media print { {{ render_media_rules("print") }} } {{ render_css_warnings() }} {#**************************************************** # EOF #***************************************************#} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/icon-note.png���������������������������������0000644�0001750�0001750�00000002264�12214647250�026626� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD������C��� pHYs�� �� ����tIME / ={H��AIDAT8˝]lUw|NgnRU[PJ!i@DjjR#} AM !$1`ԄBb4F%>!Ce�q@;ͽ%EB9a,!$Ι-?E#Na7nZص[4,A/HeEsשFNx]íoتԃD`q\~IÇ7E#낷صi-ejqpsBŌOdϣmZPicHfpkamM)#~mPb6xĒK>TlNyA D9߱p+WoòM)1 !eA %JHRRDР)*M|Pq|xs]gl[CA 1 !VN5N1̙.l8.f_%J yN7尢+D� fEt(�~" GUPGKY:נޮ`C7-F5:=3k8U1"c'y Վu9ʖ&i=ۻCuɹS3/ S}Ŭ^4*X"q}QVs\<GNYgFG߷ی6ṳ̏1*lJSͪlmT:ri98؜9C KAu?\ sm"/L-.c[cшyG*<aɩ ƣgF~xYϝc E=kd,IzZױ_=<|M46l|Øh쳻coZ 7T&.Qv!�ӳU!u=pMǧ3 |J[7 ²e+h hb[PPHCVd<~=1o'~_�@{=Ȑz{Mm��;A�*�u++&Τ5kBݟ1�� �jj�Z�fs_~6�)�s�Ups?z2�ou�֜G����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/icon-seealso.png������������������������������0000644�0001750�0001750�00000001667�12214647250�027322� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���sBIT|d��nIDAT8_hEǿsMz^4XZz, /}7D|+| RLM($`ʥ3%p1;;g3`miG^'0�|6N=;^i}a/p HN-*5*(#axyҡqvαho, � $ket|O,=99>}t䉾q �5ZF ]C6CMM?)<7K'NԂ6LBXA| h U :m&_SOh`JBl{zx�u�sSnu $^Z B84-9%Vo"Dp`w#HH]Hx`PV $J -IBFǭhvy.O3.ہ0&?-m:=DL l;uج"QE oreKWQ ɡ`pbםw4'ە=U�@yy?_pNOZ ;Um I �P`�{ҕ҂;V|!@{$w0*Ip%�ANg  |={YjHį{U��a7t)t8&\EORr =ͭkF+3$ܞwYHdƅCdcXHv7KfBkd)^dm`{2yk=8z#t0{ސ pdYr$Mik '(O#� iu����IENDB`�������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/icon-caution.png������������������������������0000644�0001750�0001750�00000002114�10336103541�027306� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD������ pHYs�� �� B(x���tIME  ,' F��IDAT8˅]h\Es?3Mn?BmĖT0* F+D)>>Ԃ"} *Z "->hZKZLbӴ4d7w{LJMp93ga?p]Bh’y⩓i^5䶝Ǖ@}0[,P&;1$܂F_7DTKj. Fdt=�=Hn|ͥouqڱ,[/6=E@a'Ӄdz+'Z [uY(-YV0Ԇ5ceS-4y*�(U"h`e-z>%sWG?Iuta]ep}[;B!+'Ѭbڕf_ZFw ԷU[U97`Ŭ &kT#/*U!%-v�W5ŭZs]U@c5ܙAF7EӐUM9daipDfٗE5!")V yą % 9˓3m}>"# x`X溊Ǫ[ gzˁbz}V_(@C7K1%L:㚦} /s fDM0+tN_Z�3c#˻xSM~PVţ?v`3S#7m5w+ Ƃ5t<N:",Lɓ_*gLnfvH3&JZ%шٸEN ߶fo}O`] "߽q?X<ZET"8˶FͿ@Xr�< DfOK(,sֵ9NA+m (}A*! ު$P,4|<E=5՛/ˇ(zQ^jx:k$����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/icon-warning.png������������������������������0000644�0001750�0001750�00000001567�12214647250�027333� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���sBIT|d��� pHYs�� �� B(x���tEXtSoftware�www.inkscape.org<��IDAT8OSYn>@^i*G;#]vAqa&tXs?qal\b2Y`L1a@tM ddD+Ѐ;B#HK➜so5Cwf=EEC4/Z_O]+{ٳ YOϾIf? &E <%0Lɰ4=4^&aDᒓNm~ͻϫQ(}et ȡe]?NCRCqxiu}JWUwh-bJ<aJggqp"ݍmm"Vr9NF'OP<'QVr9".Ot 638\f tzN#  YH:v<Z>?OJ�Z)~f}a&'"!J8r6v\E+UsR.GYf ?(u'؇/ZYZ)##GFjTU--a'> ebyzh(0>N`|vnmz|ӧb1eݘ?JK2yd}~$lw0Q.J잞#A5wDg.PxSǷ+dK=cff3g(mVWU܁Ѕ"}J(U."l ll`'؉ħmvPym @ ]#M?~ۿaA)Zխ` ` x#Zk �`U|�1oz����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/icon-todo.png���������������������������������0000644�0001750�0001750�00000002454�12214647250�026627� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������Ĵl;���bKGD������ pHYs�� �� B(x���tIME ';T��IDAT8˕[k߹͙3dM4D[bAEO"^|S>"J }h"h"e$K4^&ɜ39e0!̃ lf-g~vK"LTJ4t^y}6_=o7W>ҴlI\./0?g=D!Ľ_G}d}$2u/7XQ=|q\9Zpv`lzBr�AT-z4< 7aޝw8 &?_T/H ȡbC"r[ޥ2uíOG?;#_ժr[@;Sk `EC.Q.bŘ96QoQ]ePu|F)'x' >Ad=HylgķkOflfwudr+{xe_l:.6k+ I 0i+n͏>q6Qް-gxUmm~wM]ۓ&.Ibӯp D:M8A?j"bNO1E :TSQM w23ی{YN&]!"8k(zPsM4UOˌ�m�qm!!A n%0>s>} u-?mKY^nq2w XSt+q|/s!OEI"!b)dYA5Аs!^6%7U5pӲ4I/0 U~H34[ `$_QOZ g݅ړ޺MJn0f Xb :/TەZ' F'w+☘E^H-^M/]qh忖S1Eת),h W UhC/n?^Uor$:@+^=}[5·MO"<"5} ٸ(wb?&] Lܾ nزyCȐ! JQ,_DtW>?r䣗nO�@"!`ۙj~9>RlyDq �RN.A_Wy^Z@ N .P2|SݾJo=d9$�vί98P< �8̇SCmץ����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/static/jquery.cookie.js������������������������������0000644�0001750�0001750�00000006061�12444623630�027352� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2013 Klaus Hartl * Released under the MIT license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var pluses = /\+/g; function encode(s) { return config.raw ? s : encodeURIComponent(s); } function decode(s) { return config.raw ? s : decodeURIComponent(s); } function stringifyCookieValue(value) { return encode(config.json ? JSON.stringify(value) : String(value)); } function parseCookieValue(s) { if (s.indexOf('"') === 0) { // This is a quoted cookie as according to RFC2068, unescape... s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); } try { // Replace server-side written pluses with spaces. // If we can't decode the cookie, ignore it, it's unusable. // If we can't parse the cookie, ignore it, it's unusable. s = decodeURIComponent(s.replace(pluses, ' ')); return config.json ? JSON.parse(s) : s; } catch(e) {} } function read(s, converter) { var value = config.raw ? s : parseCookieValue(s); return $.isFunction(converter) ? converter(value) : value; } var config = $.cookie = function (key, value, options) { // Write if (value !== undefined && !$.isFunction(value)) { options = $.extend({}, config.defaults, options); if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setTime(+t + days * 864e+5); } return (document.cookie = [ encode(key), '=', stringifyCookieValue(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // Read var result = key ? undefined : {}; // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling $.cookie(). var cookies = document.cookie ? document.cookie.split('; ') : []; for (var i = 0, l = cookies.length; i < l; i++) { var parts = cookies[i].split('='); var name = decode(parts.shift()); var cookie = parts.join('='); if (key && key === name) { // If second argument (value) is a function it's a converter... result = read(cookie, value); break; } // Prevent storing a cookie that we couldn't decode. if (!key && (cookie = read(cookie)) !== undefined) { result[name] = cookie; } } return result; }; config.defaults = {}; $.removeCookie = function (key, options) { if ($.cookie(key) === undefined) { return false; } // Must not alter options, thus extending a fresh object... $.cookie(key, '', $.extend({}, options, { expires: -1 })); return !$.cookie(key); }; })); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/quicklinks.html��������������������������������������0000644�0001750�0001750�00000002020�12444572160�025771� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{# cloud/quicklinks.html ~~~~~~~~~~~~~~~~~~~ Provides links mirroring the relbar, for use on pages such as the TOC and searchbox. #} <div class="sphinxquicklinks"> <h3><a href="{{ pathto(master_doc) }}" title="{{ sidebar_master_title|e or master_doc|title|e }}"> {{ theme_sidebar_quicklinks_title or _('Quick Links') }} </a></h3> <ul> {% block quicklinkslist %} {% if theme_roottarget and theme_roottarget != master_doc %} <li><a href="{{ pathto(theme_roottarget) }}" title="{{ theme_sidebar_root_title|e or _("Front Page") }}"> {{ theme_sidebar_root_title|e or _("Front Page") }}</a></li> {% endif %} {%- for entry in rellinks[::-1] %} {# NOTE: entry is [page, title, key, label] #} {% if entry[3] not in ["previous", "next"] %} <li><a href="{{ pathto(entry[0]) }}" title="{{ entry[1]|striptags|e }}">{{ entry[1]|e }}</a></li> {% endif %} {%- endfor %} {% endblock %} </ul> </div> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/layout.html������������������������������������������0000600�0001750�0001750�00000011414�12746442760�025137� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{# cloud/layout.html ~~~~~~~~~~~~~~~~~ Sphinx layout template for the cloud theme. :copyright: Copyright 2009-2011 Assurance Technologies LLC :license: BSD roottarget - optional target for root link (default to toc) logotarget - optional target for logo link (defaults to root target) googleanalytics_id - if set, enabled google analytics snippet & footer googleanalytics_path - optional subpatch for GA cookie #} {% extends "basic/layout.html" %} {% set reldelim2 = reldim2 is not defined and '    ' or reldelim2 %} {# add script file to instrument collapsable sections and other features #} {% set script_files = script_files + ['_static/jquery.cookie.js', '_static/cloud.js'] %} {# add font stylesheets #} {% set css_files = css_files + [theme_fontcssurl] %} {# make root link redirectable #} {%- set theme_roottarget = (theme_roottarget == "<toc>" and master_doc or theme_roottarget) %} {% block rootrellink %} <li><a href="{{ pathto(theme_roottarget) }}">{{shorttitle|e}}</a>{{reldelim1}}</li> {% endblock %} {# make logo link redirectable #} {%- set theme_logotarget = (theme_logotarget == "<root>" and theme_roottarget or (theme_logotarget == "<toc>" and master_doc or theme_logotarget)) %} {%- block sidebarlogo %} {%- if logo %} <p class="logo"><a href="{{ pathto(theme_logotarget) }}" title="{{ theme_logotarget }}"> <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/> </a></p> {%- endif %} {%- endblock %} {# wrap relbars in distinct classes to make themeing easier #} {%- block relbar1 %} <div class="relbar-top"> {{ super() }} </div> {% endblock %} {%- block relbar2 %} <div class="relbar-bottom"> {{ super() }} </div> {% endblock %} {% block extrahead -%} {{ super() }} <meta name="viewport" content="width=device-width, initial-scale=1"> {%- if theme_googleanalytics_id -%} <script type="text/javascript"> var ga_enabled = !$.cookie('disable-ga'); if(ga_enabled){ var _gaq = _gaq || []; _gaq.push(['_setAccount', '{{ theme_googleanalytics_id }}']); _gaq.push(['_setCookiePath', '{{ theme_googleanalytics_path }}']); _gaq.push(['_setDetectFlash', false]); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); } </script> {%- endif %} {%- endblock %} {% block body -%} {# hack to insert lang=en in scope of div.body #} {% if theme_hyphenation_langage %} <div lang="{{ theme_hyphenation_language }}">{{ super() }}</div> {% endif %} {%- endblock %} {% block sidebar2 -%} {{ super() }} {# insert markup for sidebar toggle button #} {% block sidebartoggle %} <div class="sidebar-toggle-group no-js"> {% set right = theme_rightsidebar|tobool %} <button class="sidebar-toggle" id="sidebar-hide" title="Hide the sidebar menu"> {% if not right %} «{% endif %} <span class="show-for-small">hide menu</span> {% if right %} »{% endif %} </button> <button class="sidebar-toggle" id="sidebar-show" title="Show the sidebar menu"> {% if right %} «{% endif %} <span class="show-for-small">menu</span> <span class="hide-for-small">sidebar</span> {% if not right %} »{% endif %} </button> </div> {% endblock %} {%- endblock %} {% block footer -%} {{ super() }} {%- if theme_googleanalytics_id -%} <script type="text/javascript"> if(ga_enabled){ document.write("<div class=\"footer\">This page uses <a href=\"http://analytics.google.com\">Google Analytics</a> to collect statistics. "); document.write("Click <button title=\"set cookie to disable analytics for this site\" class=\"link\" onclick=\"$.cookie('disable-ga', 'true', {expires: 3650, path: '{{ theme_googleanalytics_path }}'}); window.location.reload(); return false; \">here</button> to disable analytics for this site."); document.write("</div>"); }else{ document.write("<div class=\"footer\">Google Analytics has been disabled. "); document.write("Click <button title=\"set cookie to re-enable analytics for this site\" class=\"link\" onclick=\"$.cookie('disable-ga', null, {path: '{{ theme_googleanalytics_path }}'}); window.location.reload(); return false; \">here</button> to re-enable analytics for this site."); }; </script> {%- endif %} <!-- cloud_sptheme 1.4 --> {%- endblock %} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/relations.html���������������������������������������0000644�0001750�0001750�00000001345�12444611500�025615� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{# cloud/relations.html ~~~~~~~~~~~~~~~~~~~~ Sphinx sidebar template: relation links, modified from sphinx's basic/relations.html #} {%- if prev %} <div class="sphinxprev"> <h4>{{_(theme_sidebar_prev_title or 'Previous topic') }}</h4> <p class="topless"><a href="{{ prev.link|e }}" title="{{_(theme_sidebar_prev_title or 'Previous topic') }}">← {{ prev.title }}</a></p> </div> {%- endif %} {%- if next %} <div class="sphinxnext"> <h4>{{_(theme_sidebar_next_title or 'Next topic') }}</h4> <p class="topless"><a href="{{ next.link|e }}" title="{{_(theme_sidebar_next_title or 'Next topic') }}">→ {{ next.title }}</a></p> </div> {%- endif %} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/cloud/localtoc.html����������������������������������������0000644�0001750�0001750�00000000744�12744461316�025432� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{# cloud/localtoc.html ~~~~~~~~~~~~~~~~~~~ Overrides <basic/localtoc.html> to add an identifiable div wrapper (so the section highlight code has a reliable selector to lock onto), and allows overriding the title via 'localtoc_title' theme option #} {%- if display_toc -%} <div class="sphinx-toc sphinxlocaltoc"> <h3><a href="{{ pathto(master_doc) }}">{{ _(theme_sidebar_localtoc_title or 'Table Of Contents') }}</a></h3> {{ toc }} </div> {%- endif -%} ����������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/redcloud/��������������������������������������������������0000755�0001750�0001750�00000000000�13014372770�023426� 5����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/redcloud/theme.conf����������������������������������������0000600�0001750�0001750�00000001706�12454774131�025377� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[theme] inherit = cloud stylesheet = cloud.css [options] #styling for document body linkcolor = #690A00 #codebgcolor = #FFEFCF codebgcolor = #E7F3FF codetrimcolor = rgba(0,0,0,.05) link_hover_text_color = #EB5703 link_hover_trim_color = #EDB08D link_hover_bg_color = #FFF1E4 #styling for document headers headtrimcolor = #DCC4B7 sectionbgcolor = #A96C49 rubricbgcolor = #C1957C #styling for footer / html background footerbgcolor = #41190A footertextcolor = #AD6755 #styling for sidebar sidebarbgcolor = #FFFBF2 sidebarlinkcolor= #690A00 sidebarhighcolor= #FFF5DE bodytrimcolor = #EDDEDA #styling for top & bottom relbars relbarbgcolor = #AD6755 # objects object_default_color = #EEE6D8 object_class_color = # index page index_category_color = #999999 # font configuration #bodyfont = "Noticia Text", serif #headfont = "Noticia Text", serif #fontcssurl = //fonts.googleapis.com/css?family=Noticia+Text|Droid+Sans+Mono ����������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/solarcloud/������������������������������������������������0000755�0001750�0001750�00000000000�13014372770�023774� 5����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme/themes/solarcloud/theme.conf��������������������������������������0000600�0001750�0001750�00000002552�12453063006�025734� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[theme] inherit = cloud stylesheet = cloud.css [options] # Solarized colors: # base03: #002b36 # base02: #073642 # # base01: #586e75 # base00: #657b83 # # base0: #839496 # base1: #93a1a1 # # base1.5: #c1c5bb # # base2: #eee8d5 # base3: #fdf6e3 # # yellow: #b58900 # yellow-base2: #d2b96b # orange: #cb4b16 # red: #dc322f # magenta: #d33682 # violet: #6c71c4 # blue: #268bd2 # blue-base2: #c1c5bb # cyan: #2aa198 # green: #859900 # styling for document body bgcolor = #eee8d5 textcolor = #657b83 highlightcolor = #d2b96b linkcolor = #268bd2 codebgcolor = #eee8d5 codetrimcolor = rgba(0,0,0,.05) link_hover_text_color = #eee8d5 link_hover_trim_color = #8abad4 link_hover_bg_color = #268bd2 #styling for document headers headtextcolor = #657b83 headtrimcolor = sectionbgcolor = sectiontextcolor = rubricbgcolor = #styling for footer / html background footerbgcolor = #002b36 footertextcolor = #839496 #styling for sidebar sidebarbgcolor = #eee8d5 sidebarlinkcolor= #268bd2 sidebarhighcolor= #FFF5DE bodytrimcolor = #c1c5bb #styling for top & bottom relbars relbarbgcolor = #eee8d5 # objects object_default_color = #EFE9DE object_class_color = object_exception_color = object_function_color = object_attribute_color = #F4F4F4 # index page index_category_color = #999999 ������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/setup.cfg�����������������������������������������������������������������������0000644�0001750�0001750�00000000211�13014372770�017320� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[upload_docs] upload_dir = build/sphinx/html [bdist_wheel] universal = true [egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme.egg-info/���������������������������������������������������������0000755�0001750�0001750�00000000000�13014372770�022032� 5����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme.egg-info/PKG-INFO�������������������������������������������������0000644�0001750�0001750�00000002227�13014372770�023132� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Metadata-Version: 1.1 Name: cloud-sptheme Version: 1.8.0 Summary: a nice sphinx theme named 'Cloud', and some related extensions Home-page: https://bitbucket.org/ecollins/cloud_sptheme Author: Eli Collins Author-email: elic@assurancetechnologies.com License: BSD Download-URL: http://pypi.python.org/pypi/cloud_sptheme Description: This is a small package containing a Sphinx theme named "Cloud", along with some related Sphinx extensions. To see an example of the theme in action, check out it's documentation at `<http://packages.python.org/cloud_sptheme>`_. Keywords: sphinx extension theme Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Sphinx :: Extension Classifier: Framework :: Sphinx :: Theme Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Documentation Classifier: Topic :: Software Development :: Documentation �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme.egg-info/dependency_links.txt�������������������������������������0000644�0001750�0001750�00000000001�13014372770�026100� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme.egg-info/entry_points.txt�����������������������������������������0000644�0001750�0001750�00000000064�13014372770�025330� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������[sphinx_themes] path = cloud_sptheme:get_theme_dir ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme.egg-info/requires.txt���������������������������������������������0000644�0001750�0001750�00000000014�13014372770�024425� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������sphinx>=1.4 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme.egg-info/not-zip-safe���������������������������������������������0000644�0001750�0001750�00000000001�12444576751�024273� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme.egg-info/top_level.txt��������������������������������������������0000644�0001750�0001750�00000000016�13014372770�024561� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cloud_sptheme-1.8.0/cloud_sptheme.egg-info/SOURCES.txt����������������������������������������������0000644�0001750�0001750�00000005505�13014372770�023723� 0����������������������������������������������������������������������������������������������������ustar �biscuit�������������������������biscuit�������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������CHANGES LICENSE MANIFEST.in README setup.cfg setup.py cloud_sptheme/__init__.py cloud_sptheme/make_helper.py cloud_sptheme/utils.py cloud_sptheme.egg-info/PKG-INFO cloud_sptheme.egg-info/SOURCES.txt cloud_sptheme.egg-info/dependency_links.txt cloud_sptheme.egg-info/entry_points.txt cloud_sptheme.egg-info/not-zip-safe cloud_sptheme.egg-info/requires.txt cloud_sptheme.egg-info/top_level.txt cloud_sptheme/ext/__init__.py cloud_sptheme/ext/__init__.pyc cloud_sptheme/ext/autoattribute_search_bases.py cloud_sptheme/ext/autoattribute_search_bases.pyc cloud_sptheme/ext/autodoc_sections.py cloud_sptheme/ext/autodoc_sections.pyc cloud_sptheme/ext/docfield_markup.py cloud_sptheme/ext/docfield_markup.pyc cloud_sptheme/ext/escaped_samp_literals.py cloud_sptheme/ext/escaped_samp_literals.pyc cloud_sptheme/ext/index_styling.py cloud_sptheme/ext/index_styling.pyc cloud_sptheme/ext/issue_tracker.py cloud_sptheme/ext/issue_tracker.pyc cloud_sptheme/ext/page_only.py cloud_sptheme/ext/perpage.py cloud_sptheme/ext/relbar_toc.py cloud_sptheme/ext/relbar_toc.pyc cloud_sptheme/ext/role_index.py cloud_sptheme/ext/table_styling.css cloud_sptheme/ext/table_styling.py cloud_sptheme/ext/table_styling.pyc cloud_sptheme/themes/cloud/globaltoc.html cloud_sptheme/themes/cloud/layout.html cloud_sptheme/themes/cloud/localtoc.html cloud_sptheme/themes/cloud/quicklinks.html cloud_sptheme/themes/cloud/relations.html cloud_sptheme/themes/cloud/theme.conf cloud_sptheme/themes/cloud/static/cloud.css_t cloud_sptheme/themes/cloud/static/cloud.js_t cloud_sptheme/themes/cloud/static/icon-caution.png cloud_sptheme/themes/cloud/static/icon-danger.png cloud_sptheme/themes/cloud/static/icon-deprecated.png cloud_sptheme/themes/cloud/static/icon-note.png cloud_sptheme/themes/cloud/static/icon-seealso.png cloud_sptheme/themes/cloud/static/icon-todo.png cloud_sptheme/themes/cloud/static/icon-warning.png cloud_sptheme/themes/cloud/static/jquery.cookie.js cloud_sptheme/themes/greencloud/theme.conf cloud_sptheme/themes/magenta_cloud/theme.conf cloud_sptheme/themes/redcloud/theme.conf cloud_sptheme/themes/solarcloud/theme.conf docs/cloud_theme.rst docs/cloud_theme_test.rst docs/conf.py docs/contents.rst docs/copyright.rst docs/history.rst docs/index.rst docs/install.rst docs/_static/logo.svg docs/_static/longline.txt docs/_static/masthead.png docs/_static/masthead.svg docs/lib/cloud_sptheme.ext.autoattribute_search_bases.rst docs/lib/cloud_sptheme.ext.autodoc_sections.rst docs/lib/cloud_sptheme.ext.docfield_markup.rst docs/lib/cloud_sptheme.ext.escaped_samp_literals.rst docs/lib/cloud_sptheme.ext.index_styling.rst docs/lib/cloud_sptheme.ext.issue_tracker.rst docs/lib/cloud_sptheme.ext.page_only.rst docs/lib/cloud_sptheme.ext.relbar_toc.rst docs/lib/cloud_sptheme.ext.role_index.rst docs/lib/cloud_sptheme.ext.table_styling.rst docs/lib/cloud_sptheme.make_helper.rst docs/lib/cloud_sptheme.rst���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������