From cb22b97387f0630fa6b7f9f3e0427894f41ddcf2 Mon Sep 17 00:00:00 2001 From: Hristo Genev Date: Tue, 8 Mar 2016 16:36:35 +0200 Subject: [PATCH 1/2] 1st working --- .coveragerc | 9 - .gitignore | 7 - .travis.yml | 13 - MANIFEST.in | 3 - docs/conf.py | 250 ------------------ docs/index.rst | 153 ----------- script.module.cssselect.zip | Bin 0 -> 29383 bytes AUTHORS => script.module.cssselect/AUTHORS | 0 CHANGES => script.module.cssselect/CHANGES | 0 LICENSE => script.module.cssselect/LICENSE | 0 README.rst => script.module.cssselect/README | 0 script.module.cssselect/addon.xml | 17 ++ .../cssselect}/__init__.py | 0 .../cssselect}/parser.py | 0 .../cssselect}/tests.py | 0 .../cssselect}/xpath.py | 0 setup.cfg | 13 - setup.py | 44 --- tox.ini | 10 - 19 files changed, 17 insertions(+), 502 deletions(-) delete mode 100644 .coveragerc delete mode 100644 .gitignore delete mode 100644 .travis.yml delete mode 100644 MANIFEST.in delete mode 100644 docs/conf.py delete mode 100644 docs/index.rst create mode 100644 script.module.cssselect.zip rename AUTHORS => script.module.cssselect/AUTHORS (100%) rename CHANGES => script.module.cssselect/CHANGES (100%) rename LICENSE => script.module.cssselect/LICENSE (100%) rename README.rst => script.module.cssselect/README (100%) create mode 100644 script.module.cssselect/addon.xml rename {cssselect => script.module.cssselect/cssselect}/__init__.py (100%) rename {cssselect => script.module.cssselect/cssselect}/parser.py (100%) rename {cssselect => script.module.cssselect/cssselect}/tests.py (100%) mode change 100755 => 100644 rename {cssselect => script.module.cssselect/cssselect}/xpath.py (100%) delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 tox.ini diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 2ee5ff3..0000000 --- a/.coveragerc +++ /dev/null @@ -1,9 +0,0 @@ -[run] -branch = True - -[report] -exclude_lines = - pragma: no cover - def __repr__ - if sys.version_info - if __name__ == '__main__': diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 4c89f4c..0000000 --- a/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -*.pyc -*.egg-info -/.tox -/MANIFEST -/dist -/docs/_build -/.coverage diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ba56d9a..0000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: python - -python: - - "2.6" - - "2.7" - - "3.2" - - "3.3" - - "3.4" - -install: - - pip install --use-mirrors lxml -e . - -script: py.test diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index e98d213..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -include AUTHORS CHANGES LICENSE README.rst tox.ini .coveragerc -recursive-include docs * -prune docs/_build diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index 22e6032..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# cssselect documentation build configuration file, created by -# sphinx-quickstart on Tue Mar 27 14:20:34 2012. -# -# 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. - -import sys, os, re - -# 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('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', - 'sphinx.ext.doctest'] - -# 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-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = 'cssselect' -copyright = '2012, Simon Sapin' - -# 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. -# -# The full version, including alpha/beta/rc tags. -init_py = open(os.path.join(os.path.dirname(__file__), - '..', 'cssselect', '__init__.py')).read() -release = re.search("VERSION = '([^']+)'", init_py).group(1) -# The short X.Y version. -version = release.rstrip('dev') - -# 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 = ['_build'] - -# 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 = [] - - -# -- 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 = 'agogo' - -# 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 = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# 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 = 'cssselectdoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'cssselect.tex', 'cssselect Documentation', - 'Simon Sapin', '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 - -# 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', 'cssselect', 'cssselect Documentation', - ['Simon Sapin'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------------ - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'cssselect', 'cssselect Documentation', - 'Simon Sapin', 'cssselect', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 4ac7401..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,153 +0,0 @@ -.. module:: cssselect - -.. include:: ../README.rst - - -.. contents:: Contents - :local: - :depth: 1 - -Quickstart -========== - -Use :class:`HTMLTranslator` for HTML documents, :class:`GenericTranslator` -for "generic" XML documents. (The former has a more useful translation -for some selectors, based on HTML-specific element types or attributes.) - - -.. sourcecode:: pycon - - >>> from cssselect import GenericTranslator, SelectorError - >>> try: - ... expression = GenericTranslator().css_to_xpath('div.content') - ... except SelectorError: - ... print('Invalid selector.') - ... - >>> print(expression) - descendant-or-self::div[@class and contains(concat(' ', normalize-space(@class), ' '), ' content ')] - -The resulting expression can be used with lxml's `XPath engine`_: - -.. _XPath engine: http://lxml.de/xpathxslt.html#xpath - -.. sourcecode:: pycon - - >>> from lxml.etree import fromstring - >>> document = fromstring(''' - ...
- ...
text
- ...
- ... ''') - >>> [e.get('id') for e in document.xpath(expression)] - ['inner'] - -User API -======== - -In CSS3 Selectors terms, the top-level object is a `group of selectors`_, a -sequence of comma-separated selectors. For example, ``div, h1.title + p`` -is a group of two selectors. - -.. _group of selectors: http://www.w3.org/TR/selectors/#grouping - -.. autofunction:: parse -.. autoclass:: Selector() - :members: - -.. autoclass:: FunctionalPseudoElement - -.. autoclass:: GenericTranslator - :members: css_to_xpath, selector_to_xpath - -.. autoclass:: HTMLTranslator - -Exceptions ----------- - -.. autoexception:: SelectorError -.. autoexception:: SelectorSyntaxError -.. autoexception:: ExpressionError - - -Supported selectors -=================== - -This library implements CSS3 selectors as described in `the W3C specification -`_. -In this context however, there is no interactivity or history of visited links. -Therefore, these pseudo-classes are accepted but never match anything: - -* ``:hover`` -* ``:active`` -* ``:focus`` -* ``:target`` -* ``:visited`` - -Additionally, these depend on document knowledge and only have a useful -implementation in :class:`HTMLTranslator`. In :class:`GenericTranslator`, -they never match: - -* ``:link`` -* ``:enabled`` -* ``:disabled`` -* ``:checked`` - -These applicable pseudo-classes are not yet implemented: - -* ``*:first-of-type``, ``*:last-of-type``, ``*:nth-of-type``, - ``*:nth-last-of-type``, ``*:only-of-type``. All of these work when - you specify an element type, but not with ``*`` - -On the other hand, *cssselect* supports some selectors that are not -in the Level 3 specification: - -* The ``:contains(text)`` pseudo-class that existed in `an early draft`_ - but was then removed. -* The ``!=`` attribute operator. ``[foo!=bar]`` is the same as - ``:not([foo=bar])`` -* ``:not()`` accepts a *sequence of simple selectors*, not just single - *simple selector*. For example, ``:not(a.important[rel])`` is allowed, - even though the negation contains 3 *simple selectors*. - -.. _an early draft: http://www.w3.org/TR/2001/CR-css3-selectors-20011113/#content-selectors - -.. - The following claim was copied from lxml: - - """ - XPath has underspecified string quoting rules (there seems to be no - string quoting at all), so if you use expressions that contain - characters that requiring quoting you might have problems with the - translation from CSS to XPath. - """ - - It seems "string quoting" meant "quote escaping". There is indeed - no quote escaping, but the xpath_literal method handles this. - It should not be a problem anymore. - - -Customizing the translation -=========================== - -Just like :class:`HTMLTranslator` is a subclass of :class:`GenericTranslator`, -you can make new sub-classes of either of them and override some methods. -This enables you, for example, to customize how some pseudo-class is -implemented without forking or monkey-patching cssselect. - -The "customization API" is the set of methods in translation classes -and their signature. You can look at the `source code`_ to see how it works. -However, be aware that this API is not very stable yet. It might change -and break your sub-class. - -.. _source code: https://github.com/SimonSapin/cssselect/blob/master/cssselect/xpath.py - - -Namespaces -========== - -In CSS you can use ``namespace-prefix|element``, similar to -``namespace-prefix:element`` in an XPath expression. In fact, it maps -one-to-one. How prefixes are mapped to namespace URIs depends on the -XPath implementation. - -.. include:: ../CHANGES diff --git a/script.module.cssselect.zip b/script.module.cssselect.zip new file mode 100644 index 0000000000000000000000000000000000000000..ddc97cf7c482c3202e9fea4474ba1f43992e1c15 GIT binary patch literal 29383 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ⅅ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 + + + + + + + parses CSS3 Selectors and translates them to XPath 1.0 + Packed for Kodi from https://github.com/SimonSapin/cssselect/ + all + + Apache2 + https://github.com/SimonSapin/cssselect/issues + https://pypi.python.org/pypi/cssselect + https://github.com/SimonSapin/cssselect/ + + diff --git a/cssselect/__init__.py b/script.module.cssselect/cssselect/__init__.py similarity index 100% rename from cssselect/__init__.py rename to script.module.cssselect/cssselect/__init__.py diff --git a/cssselect/parser.py b/script.module.cssselect/cssselect/parser.py similarity index 100% rename from cssselect/parser.py rename to script.module.cssselect/cssselect/parser.py diff --git a/cssselect/tests.py b/script.module.cssselect/cssselect/tests.py old mode 100755 new mode 100644 similarity index 100% rename from cssselect/tests.py rename to script.module.cssselect/cssselect/tests.py diff --git a/cssselect/xpath.py b/script.module.cssselect/cssselect/xpath.py similarity index 100% rename from cssselect/xpath.py rename to script.module.cssselect/cssselect/xpath.py diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 7a3317f..0000000 --- a/setup.cfg +++ /dev/null @@ -1,13 +0,0 @@ -[build_sphinx] -source-dir = docs -build-dir = docs/_build -#all_files = 1 - -[upload_sphinx] # Sphinx-PyPI-upload -upload-dir = docs/_build/html - -[pytest] -python_files=tests.py - -[bdist_wheel] -universal = 1 diff --git a/setup.py b/setup.py deleted file mode 100644 index 42bde1f..0000000 --- a/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -# coding: utf-8 - -import re -import os.path -try: - from setuptools import setup - extra_kwargs = {'test_suite': 'cssselect.tests'} -except ImportError: - from distutils.core import setup - extra_kwargs = {} - - -ROOT = os.path.dirname(__file__) -README = open(os.path.join(ROOT, 'README.rst')).read() -INIT_PY = open(os.path.join(ROOT, 'cssselect', '__init__.py')).read() -VERSION = re.search("VERSION = '([^']+)'", INIT_PY).group(1) - - -setup( - name='cssselect', - version=VERSION, - author='Ian Bicking', - author_email='ianb@colorstudy.com', - maintainer='Simon Sapin', - maintainer_email='simon.sapin@exyr.org', - description= - 'cssselect parses CSS3 Selectors and translates them to XPath 1.0', - long_description=README, - url='http://packages.python.org/cssselect/', - license='BSD', - packages=['cssselect'], - classifiers=[ - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.5', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.2', - ], - **extra_kwargs -) diff --git a/tox.ini b/tox.ini deleted file mode 100644 index ca053d8..0000000 --- a/tox.ini +++ /dev/null @@ -1,10 +0,0 @@ -[tox] -envlist = py25,py26,py27,py32,py33 - -[testenv] -deps=lxml -commands = python cssselect/tests.py - -[testenv:py25] -setenv = - PIP_INSECURE = 1 From f5dc59c1dbde04391fac73dbaa80207a5aa827ef Mon Sep 17 00:00:00 2001 From: Harry G Date: Tue, 8 Mar 2016 16:37:37 +0200 Subject: [PATCH 2/2] Create README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..a516f4e --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# cssselect +CSS Selectors for Python + +Cssselect module bundled for use in Kodi