remy пре 6 година
родитељ
комит
a64ea629f7
100 измењених фајлова са 0 додато и 10100 уклоњено
  1. BIN
      Lib python/feedparser-5.2.1.tar.gz
  2. 0 66
      Lib python/feedparser-5.2.1/LICENSE
  3. 0 6
      Lib python/feedparser-5.2.1/MANIFEST.in
  4. 0 409
      Lib python/feedparser-5.2.1/NEWS
  5. 0 31
      Lib python/feedparser-5.2.1/PKG-INFO
  6. 0 75
      Lib python/feedparser-5.2.1/README.rst
  7. 0 4007
      Lib python/feedparser-5.2.1/build/lib.linux-x86_64-2.7/feedparser.py
  8. BIN
      Lib python/feedparser-5.2.1/dist/feedparser-5.2.1-py2.7.egg
  9. 0 5
      Lib python/feedparser-5.2.1/docs/_static/feedparser.css
  10. 0 3
      Lib python/feedparser-5.2.1/docs/add_custom_css.py
  11. 0 38
      Lib python/feedparser-5.2.1/docs/advanced.rst
  12. 0 87
      Lib python/feedparser-5.2.1/docs/annotated-atom03.rst
  13. 0 87
      Lib python/feedparser-5.2.1/docs/annotated-atom10.rst
  14. 0 14
      Lib python/feedparser-5.2.1/docs/annotated-examples.rst
  15. 0 55
      Lib python/feedparser-5.2.1/docs/annotated-rss10.rst
  16. 0 54
      Lib python/feedparser-5.2.1/docs/annotated-rss20-dc.rst
  17. 0 68
      Lib python/feedparser-5.2.1/docs/annotated-rss20.rst
  18. 0 49
      Lib python/feedparser-5.2.1/docs/atom-detail.rst
  19. 0 26
      Lib python/feedparser-5.2.1/docs/basic-existence.rst
  20. 0 14
      Lib python/feedparser-5.2.1/docs/basic.rst
  21. 0 36
      Lib python/feedparser-5.2.1/docs/bozo.rst
  22. 0 36
      Lib python/feedparser-5.2.1/docs/changes-26.rst
  23. 0 70
      Lib python/feedparser-5.2.1/docs/changes-27.rst
  24. 0 226
      Lib python/feedparser-5.2.1/docs/changes-30.rst
  25. 0 23
      Lib python/feedparser-5.2.1/docs/changes-301.rst
  26. 0 25
      Lib python/feedparser-5.2.1/docs/changes-31.rst
  27. 0 33
      Lib python/feedparser-5.2.1/docs/changes-32.rst
  28. 0 35
      Lib python/feedparser-5.2.1/docs/changes-33.rst
  29. 0 27
      Lib python/feedparser-5.2.1/docs/changes-40.rst
  30. 0 9
      Lib python/feedparser-5.2.1/docs/changes-401.rst
  31. 0 9
      Lib python/feedparser-5.2.1/docs/changes-402.rst
  32. 0 8
      Lib python/feedparser-5.2.1/docs/changes-41.rst
  33. 0 22
      Lib python/feedparser-5.2.1/docs/changes-42.rst
  34. 0 113
      Lib python/feedparser-5.2.1/docs/changes-early.rst
  35. 0 134
      Lib python/feedparser-5.2.1/docs/character-encoding.rst
  36. 0 130
      Lib python/feedparser-5.2.1/docs/common-atom-elements.rst
  37. 0 81
      Lib python/feedparser-5.2.1/docs/common-rss-elements.rst
  38. 0 19
      Lib python/feedparser-5.2.1/docs/conf.py
  39. 0 74
      Lib python/feedparser-5.2.1/docs/content-normalization.rst
  40. 0 177
      Lib python/feedparser-5.2.1/docs/date-parsing.rst
  41. 0 19
      Lib python/feedparser-5.2.1/docs/history.rst
  42. 0 815
      Lib python/feedparser-5.2.1/docs/html-sanitization.rst
  43. 0 135
      Lib python/feedparser-5.2.1/docs/http-authentication.rst
  44. 0 92
      Lib python/feedparser-5.2.1/docs/http-etag.rst
  45. 0 40
      Lib python/feedparser-5.2.1/docs/http-other.rst
  46. 0 82
      Lib python/feedparser-5.2.1/docs/http-redirect.rst
  47. 0 57
      Lib python/feedparser-5.2.1/docs/http-useragent.rst
  48. 0 11
      Lib python/feedparser-5.2.1/docs/http.rst
  49. 0 24
      Lib python/feedparser-5.2.1/docs/index.rst
  50. 0 78
      Lib python/feedparser-5.2.1/docs/introduction.rst
  51. 0 28
      Lib python/feedparser-5.2.1/docs/license.rst
  52. 0 137
      Lib python/feedparser-5.2.1/docs/namespace-handling.rst
  53. 0 18
      Lib python/feedparser-5.2.1/docs/reference-bozo.rst
  54. 0 10
      Lib python/feedparser-5.2.1/docs/reference-bozo_exception.rst
  55. 0 16
      Lib python/feedparser-5.2.1/docs/reference-encoding.rst
  56. 0 20
      Lib python/feedparser-5.2.1/docs/reference-entry-author.rst
  57. 0 48
      Lib python/feedparser-5.2.1/docs/reference-entry-author_detail.rst
  58. 0 14
      Lib python/feedparser-5.2.1/docs/reference-entry-comments.rst
  59. 0 103
      Lib python/feedparser-5.2.1/docs/reference-entry-content.rst
  60. 0 39
      Lib python/feedparser-5.2.1/docs/reference-entry-contributors.rst
  61. 0 22
      Lib python/feedparser-5.2.1/docs/reference-entry-created.rst
  62. 0 19
      Lib python/feedparser-5.2.1/docs/reference-entry-created_parsed.rst
  63. 0 47
      Lib python/feedparser-5.2.1/docs/reference-entry-enclosures.rst
  64. 0 24
      Lib python/feedparser-5.2.1/docs/reference-entry-expired.rst
  65. 0 20
      Lib python/feedparser-5.2.1/docs/reference-entry-expired_parsed.rst
  66. 0 17
      Lib python/feedparser-5.2.1/docs/reference-entry-id.rst
  67. 0 16
      Lib python/feedparser-5.2.1/docs/reference-entry-license.rst
  68. 0 33
      Lib python/feedparser-5.2.1/docs/reference-entry-link.rst
  69. 0 67
      Lib python/feedparser-5.2.1/docs/reference-entry-links.rst
  70. 0 24
      Lib python/feedparser-5.2.1/docs/reference-entry-published.rst
  71. 0 21
      Lib python/feedparser-5.2.1/docs/reference-entry-published_parsed.rst
  72. 0 18
      Lib python/feedparser-5.2.1/docs/reference-entry-publisher.rst
  73. 0 42
      Lib python/feedparser-5.2.1/docs/reference-entry-publisher_detail.rst
  74. 0 482
      Lib python/feedparser-5.2.1/docs/reference-entry-source.rst
  75. 0 43
      Lib python/feedparser-5.2.1/docs/reference-entry-summary.rst
  76. 0 101
      Lib python/feedparser-5.2.1/docs/reference-entry-summary_detail.rst
  77. 0 46
      Lib python/feedparser-5.2.1/docs/reference-entry-tags.rst
  78. 0 30
      Lib python/feedparser-5.2.1/docs/reference-entry-title.rst
  79. 0 98
      Lib python/feedparser-5.2.1/docs/reference-entry-title_detail.rst
  80. 0 41
      Lib python/feedparser-5.2.1/docs/reference-entry-updated.rst
  81. 0 38
      Lib python/feedparser-5.2.1/docs/reference-entry-updated_parsed.rst
  82. 0 18
      Lib python/feedparser-5.2.1/docs/reference-entry.rst
  83. 0 13
      Lib python/feedparser-5.2.1/docs/reference-etag.rst
  84. 0 23
      Lib python/feedparser-5.2.1/docs/reference-feed-author.rst
  85. 0 51
      Lib python/feedparser-5.2.1/docs/reference-feed-author_detail.rst
  86. 0 65
      Lib python/feedparser-5.2.1/docs/reference-feed-cloud.rst
  87. 0 35
      Lib python/feedparser-5.2.1/docs/reference-feed-contributors.rst
  88. 0 20
      Lib python/feedparser-5.2.1/docs/reference-feed-docs.rst
  89. 0 10
      Lib python/feedparser-5.2.1/docs/reference-feed-errorreportsto.rst
  90. 0 19
      Lib python/feedparser-5.2.1/docs/reference-feed-generator.rst
  91. 0 48
      Lib python/feedparser-5.2.1/docs/reference-feed-generator_detail.rst
  92. 0 12
      Lib python/feedparser-5.2.1/docs/reference-feed-icon.rst
  93. 0 15
      Lib python/feedparser-5.2.1/docs/reference-feed-id.rst
  94. 0 107
      Lib python/feedparser-5.2.1/docs/reference-feed-image.rst
  95. 0 94
      Lib python/feedparser-5.2.1/docs/reference-feed-info-detail.rst
  96. 0 28
      Lib python/feedparser-5.2.1/docs/reference-feed-info.rst
  97. 0 15
      Lib python/feedparser-5.2.1/docs/reference-feed-language.rst
  98. 0 17
      Lib python/feedparser-5.2.1/docs/reference-feed-license.rst
  99. 0 29
      Lib python/feedparser-5.2.1/docs/reference-feed-link.rst
  100. 0 65
      Lib python/feedparser-5.2.1/docs/reference-feed-links.rst

BIN
Lib python/feedparser-5.2.1.tar.gz


+ 0 - 66
Lib python/feedparser-5.2.1/LICENSE

@@ -1,66 +0,0 @@
-Universal Feed Parser (feedparser.py), its testing harness (feedparsertest.py),
-and its unit tests (everything in the tests/ directory) are released under the
-following license:
-
------ begin license block -----
-
-Copyright (c) 2010-2013 Kurt McKee <contactme@kurtmckee.org>
-Copyright (c) 2002-2008 Mark Pilgrim
-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.
-
-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.
-
------ end license block -----
-
-
-
-
-
-Universal Feed Parser documentation (everything in the docs/ directory) is
-released under the following license:
-
------ begin license block -----
-
-Copyright 2004-2008 Mark Pilgrim. All rights reserved.
-
-Redistribution and use in source (Sphinx ReST) and "compiled" forms (HTML, PDF,
-PostScript, RTF and so forth) with or without modification, are permitted
-provided that the following conditions are met:
-
-* Redistributions of source code (Sphinx ReST) must retain the above copyright
-  notice, this list of conditions and the following disclaimer.
-* Redistributions in compiled form (converted to HTML, PDF, PostScript, RTF and
-  other formats) 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.
-
-THIS DOCUMENTATION 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 DOCUMENTATION, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.

+ 0 - 6
Lib python/feedparser-5.2.1/MANIFEST.in

@@ -1,6 +0,0 @@
-recursive-include feedparser/tests *.xml *.gz *.z
-recursive-include docs *.rst *.py *.css
-include feedparser/feedparsertest.py
-include feedparser/sgmllib3.py
-include LICENSE
-include NEWS

+ 0 - 409
Lib python/feedparser-5.2.1/NEWS

@@ -1,409 +0,0 @@
-5.2.1 - July 23, 2015
-    * Fix #22 (pip package keeps upgrading all the time)
-
-5.2.0 - April 16, 2015
-    * Support PyPy
-    * Remove the HTTP Status 9001 test that caused unit test tracebacks
-    * Remove the completely-untested HTML tidy code
-    * Remove BeautifulSoup as a dependency
-    * Remove the XFN microformat parsing code
-    * Remove the rel_enclosure microformat parsing code
-    * Remove the rel_hcard microformat parsing code
-    * Remove the rel_tag microformat parsing code
-    * Replace the regex-based RFC 822 date parser with a procedural one
-    * Replace the Python-licensed W3DTF date parser
-    * Support HTML5 audio/source/video element relative URL's
-    * Remove the unparsed itunes_keywords key from the result dictionary
-    * Fix issue 321 just a little more (yet another code path was missed)
-    * Issue 62 (support georss and gml namespaces)
-    * Issue 296 (GUID's are always treated like relative URI's)
-    * Issue 334 (media:restriction element content is not returned)
-    * Issue 335 (sub-elements of media:group are not parsed and returned)
-    * Issue 342 (support multiple dc:creator elements)
-    * Issue 357 (loose parser breaks ampersands in link element URL's)
-    * Issue 374 (support the Podlove Simple Chapters namespace)
-    * Issue 380 (support media:rating element)
-    * Issue 384 (fix chardet support in Python 3)
-    * Issue 389 (elements in unknown uppercase namespaces are ignored)
-    * Issue 392 (tags element subverts 'tags' key in result dictionary)
-    * Issue 396 (Podlove Simple Chapters version 1.0 causes a KeyError)
-    * Issue 399 (docs call `request_headers` parameter `extra_headers`)
-    * Issue 401 (support additional dcterms and media namespaces elements)
-    * Issue 404 (support asctime datetime strings with timezone information)
-    * Issue 407 (decode forward slashes encoded as character entities)
-    * Issue 421 (delay chardet invocation as long as possible)
-    * Issue 422 (add return types docstrings)
-    * Issue 433 (update the list of allowed MathML elements and attributes)
-
-5.1.3 - December 9, 2012
-    * Consolidated and simplified the character encoding detection code
-    * Issue 346 (the gb2312 encoding isn't always upgraded to gb18030)
-    * Issue 350 (HTTP Last-Modified example is incorrect in documentation)
-    * Issue 352 (importing lxml.etree changes what exceptions libxml2 throws)
-    * Issue 356 (add support for the HTML5 attributes `poster` and `preload`)
-    * Issue 364 (enclosure-sniffing microformat code can throw ValueError)
-    * Issue 373 (support RFC822-ish dates with swapped days and months)
-    * Issue 376 (uppercase 'X' in hex character references cause ValueError)
-    * Issue 382 (don't strip inline user:password credentials from FTP URL's)
-
-5.1.2 - May 3, 2012
-    * Minor changes to the documentation
-    * Strip potentially dangerous ENTITY declarations in encoded feeds
-    * feedparser will now try to continue parsing despite compression errors
-    * Fix issue 321 a little more (the initial fix missed a code path)
-    * Issue 337 (`_parse_date_rfc822()` returns None on single-digit days)
-    * Issue 343 (add magnet links to the ACCEPTABLE_URI_SCHEMES)
-    * Issue 344 (handle deflated data with no headers nor checksums)
-    * Issue 347 (support `itunes:image` elements with a `url` attribute)
-
-5.1.1 - March 20, 2011
-    * Fix mistakes, typos, and bugs in the unit test code
-    * Fix crash in Python 2.4 and 2.5 if the feed has a UTF_32 byte order mark
-    * Replace the RFC822 date parser for more extensibility
-    * Issue 304 (handle RFC822 dates with timezones like GMT+00:00)
-    * Issue 309 (itunes:keywords should be split by commas, not whitespace)
-    * Issue 310 (pubDate should map to `published`, not `updated`)
-    * Issue 313 (include the compression test files in MANIFEST.in)
-    * Issue 314 (far-flung RFC822 dates don't throw OverflowError on x64)
-    * Issue 315 (HTTP server for unit tests runs on 0.0.0.0)
-    * Issue 321 (malformed URIs can cause ValueError to be thrown)
-    * Issue 322 (HTTP redirect to HTTP 304 causes SAXParseException)
-    * Issue 323 (installing chardet causes 11 unit test failures)
-    * Issue 325 (map `description_detail` to `summary_detail`)
-    * Issue 326 (Unicode filename causes UnicodeEncodeError if locale is ASCII)
-    * Issue 327 (handle RFC822 dates with extraneous commas)
-    * Issue 328 (temporarily map `updated` to `published` due to issue 310)
-    * Issue 329 (escape backslashes in Windows path in docs/introduction.rst)
-    * Issue 331 (don't escape backslashes that are in raw strings in the docs)
-
-5.1 - December 2, 2011
-    * Extensive, extensive unit test refactoring
-    * Convert the Docbook documentation to ReST
-    * Include the documentation in the source distribution
-    * Consolidate the disparate README files into one
-    * Support Jython somewhat (almost all unit tests pass)
-    * Support Python 3.2
-    * Fix Python 3 issues exposed by improved unit tests
-    * Fix international domain name issues exposed by improved unit tests
-    * Issue 148 (loose parser doesn't always return unicode strings)
-    * Issue 204 (FeedParserDict behavior should not be controlled by `assert`)
-    * Issue 247 (mssql date parser uses hardcoded tokyo timezone)
-    * Issue 249 (KeyboardInterrupt and SystemExit exceptions being caught)
-    * Issue 250 (`updated` can be a 9-tuple or a string, depending on context)
-    * Issue 252 (running setup.py in Python 3 fails due to missing sgmllib)
-    * Issue 253 (document that text/plain content isn't sanitized)
-    * Issue 260 (Python 3 doesn't decompress gzip'ed or deflate'd content)
-    * Issue 261 (popping from empty tag list)
-    * Issue 262 (docs are missing from distribution files)
-    * Issue 264 (vcard parser crashes on non-ascii characters)
-    * Issue 265 (http header comparisons are case sensitive)
-    * Issue 271 (monkey-patching sgmllib breaks other libraries)
-    * Issue 272 (can't pass bytes or str to `parse()` in Python 3)
-    * Issue 275 (`_parse_date()` doesn't catch OverflowError)
-    * Issue 276 (mutable types used as default values in `parse()`)
-    * Issue 277 (`python3 setup.py install` fails)
-    * Issue 281 (`_parse_date()` doesn't catch ValueError)
-    * Issue 282 (`_parse_date()` crashes when passed `None`)
-    * Issue 285 (crash on empty xmlns attribute)
-    * Issue 286 ('apos' character entity not handled properly)
-    * Issue 289 (add an option to disable microformat parsing)
-    * Issue 290 (Blogger's invalid img tags are unparseable)
-    * Issue 292 (atom id element not explicitly supported)
-    * Issue 294 ('categories' key exists but raises KeyError)
-    * Issue 297 (unresolvable external doctype causes crash)
-    * Issue 298 (nested nodes clobber actual values)
-    * Issue 300 (performance improvements)
-    * Issue 303 (unicode characters cause crash during relative uri resolution)
-    * Remove "Hot RSS" support since the format doesn't actually exist
-    * Remove the old feedparser.org website files from the source
-    * Remove the feedparser command line interface
-    * Remove the Zope interoperability hack
-    * Remove extraneous whitespace
-
-5.0.1 - February 20, 2011
-    * Fix issue 91 (invalid text in XML declaration causes sanitizer to crash)
-    * Fix issue 254 (sanitization can be bypassed by malformed XML comments)
-    * Fix issue 255 (sanitizer doesn't strip unsafe URI schemes)
-
-5.0 - January 25, 2011
-    * Improved MathML support
-    * Support microformats (rel-tag, rel-enclosure, xfn, hcard)
-    * Support IRIs
-    * Allow safe CSS through sanitization
-    * Allow safe HTML5 through sanitization
-    * Support SVG
-    * Support inline XML entity declarations
-    * Support unescaped quotes and angle brackets in attributes
-    * Support additional date formats
-    * Added the `request_headers` argument to parse()
-    * Added the `response_headers` argument to parse()
-    * Support multiple entry, feed, and source authors
-    * Officially make Python 2.4 the earliest supported version
-    * Support Python 3
-    * Bug fixes, bug fixes, bug fixes
-
-===============================================================================
-
-1.0 - 9/27/2002 - MAP - fixed namespace processing on prefixed RSS 2.0 elements,
-  added Simon Fell's test suite
-
-1.1 - 9/29/2002 - MAP - fixed infinite loop on incomplete CDATA sections
-
-2.0 - 10/19/2002
-  JD - use inchannel to watch out for image and textinput elements which can
-  also contain title, link, and description elements
-  JD - check for isPermaLink='false' attribute on guid elements
-  JD - replaced openAnything with open_resource supporting ETag and
-  If-Modified-Since request headers
-  JD - parse now accepts etag, modified, agent, and referrer optional
-  arguments
-  JD - modified parse to return a dictionary instead of a tuple so that any
-  etag or modified information can be returned and cached by the caller
-
-2.0.1 - 10/21/2002 - MAP - changed parse() so that if we don't get anything
-  because of etag/modified, return the old etag/modified to the caller to
-  indicate why nothing is being returned
-
-2.0.2 - 10/21/2002 - JB - added the inchannel to the if statement, otherwise its
-  useless.  Fixes the problem JD was addressing by adding it.
-
-2.1 - 11/14/2002 - MAP - added gzip support
-
-2.2 - 1/27/2003 - MAP - added attribute support, admin:generatorAgent.
-  start_admingeneratoragent is an example of how to handle elements with
-  only attributes, no content.
-
-2.3 - 6/11/2003 - MAP - added USER_AGENT for default (if caller doesn't specify);
-  also, make sure we send the User-Agent even if urllib2 isn't available.
-  Match any variation of backend.userland.com/rss namespace.
-
-2.3.1 - 6/12/2003 - MAP - if item has both link and guid, return both as-is.
-
-2.4 - 7/9/2003 - MAP - added preliminary Pie/Atom/Echo support based on Sam Ruby's
-  snapshot of July 1 <http://www.intertwingly.net/blog/1506.html>; changed
-  project name
-
-2.5 - 7/25/2003 - MAP - changed to Python license (all contributors agree);
-  removed unnecessary urllib code -- urllib2 should always be available anyway;
-  return actual url, status, and full HTTP headers (as result['url'],
-  result['status'], and result['headers']) if parsing a remote feed over HTTP --
-  this should pass all the HTTP tests at <http://diveintomark.org/tests/client/http/>;
-  added the latest namespace-of-the-week for RSS 2.0
-
-2.5.1 - 7/26/2003 - RMK - clear opener.addheaders so we only send our custom
-  User-Agent (otherwise urllib2 sends two, which confuses some servers)
-
-2.5.2 - 7/28/2003 - MAP - entity-decode inline xml properly; added support for
-  inline <xhtml:body> and <xhtml:div> as used in some RSS 2.0 feeds
-
-2.5.3 - 8/6/2003 - TvdV - patch to track whether we're inside an image or
-  textInput, and also to return the character encoding (if specified)
-
-2.6 - 1/1/2004 - MAP - dc:author support (MarekK); fixed bug tracking
-  nested divs within content (JohnD); fixed missing sys import (JohanS);
-  fixed regular expression to capture XML character encoding (Andrei);
-  added support for Atom 0.3-style links; fixed bug with textInput tracking;
-  added support for cloud (MartijnP); added support for multiple
-  category/dc:subject (MartijnP); normalize content model: 'description' gets
-  description (which can come from description, summary, or full content if no
-  description), 'content' gets dict of base/language/type/value (which can come
-  from content:encoded, xhtml:body, content, or fullitem);
-  fixed bug matching arbitrary Userland namespaces; added xml:base and xml:lang
-  tracking; fixed bug tracking unknown tags; fixed bug tracking content when
-  <content> element is not in default namespace (like Pocketsoap feed);
-  resolve relative URLs in link, guid, docs, url, comments, wfw:comment,
-  wfw:commentRSS; resolve relative URLs within embedded HTML markup in
-  description, xhtml:body, content, content:encoded, title, subtitle,
-  summary, info, tagline, and copyright; added support for pingback and
-  trackback namespaces
-
-2.7 - 1/5/2004 - MAP - really added support for trackback and pingback
-  namespaces, as opposed to 2.6 when I said I did but didn't really;
-  sanitize HTML markup within some elements; added mxTidy support (if
-  installed) to tidy HTML markup within some elements; fixed indentation
-  bug in _parse_date (FazalM); use socket.setdefaulttimeout if available
-  (FazalM); universal date parsing and normalization (FazalM): 'created', modified',
-  'issued' are parsed into 9-tuple date format and stored in 'created_parsed',
-  'modified_parsed', and 'issued_parsed'; 'date' is duplicated in 'modified'
-  and vice-versa; 'date_parsed' is duplicated in 'modified_parsed' and vice-versa
-
-2.7.1 - 1/9/2004 - MAP - fixed bug handling &quot; and &apos;.  fixed memory
-  leak not closing url opener (JohnD); added dc:publisher support (MarekK);
-  added admin:errorReportsTo support (MarekK); Python 2.1 dict support (MarekK)
-
-2.7.4 - 1/14/2004 - MAP - added workaround for improperly formed <br/> tags in
-  encoded HTML (skadz); fixed unicode handling in normalize_attrs (ChrisL);
-  fixed relative URI processing for guid (skadz); added ICBM support; added
-  base64 support
-
-2.7.5 - 1/15/2004 - MAP - added workaround for malformed DOCTYPE (seen on many
-  blogspot.com sites); added _debug variable
-
-2.7.6 - 1/16/2004 - MAP - fixed bug with StringIO importing
-
-3.0b3 - 1/23/2004 - MAP - parse entire feed with real XML parser (if available);
-  added several new supported namespaces; fixed bug tracking naked markup in
-  description; added support for enclosure; added support for source; re-added
-  support for cloud which got dropped somehow; added support for expirationDate
-
-3.0b4 - 1/26/2004 - MAP - fixed xml:lang inheritance; fixed multiple bugs tracking
-  xml:base URI, one for documents that don't define one explicitly and one for
-  documents that define an outer and an inner xml:base that goes out of scope
-  before the end of the document
-
-3.0b5 - 1/26/2004 - MAP - fixed bug parsing multiple links at feed level
-
-3.0b6 - 1/27/2004 - MAP - added feed type and version detection, result['version']
-  will be one of SUPPORTED_VERSIONS.keys() or empty string if unrecognized;
-  added support for creativeCommons:license and cc:license; added support for
-  full Atom content model in title, tagline, info, copyright, summary; fixed bug
-  with gzip encoding (not always telling server we support it when we do)
-
-3.0b7 - 1/28/2004 - MAP - support Atom-style author element in author_detail
-  (dictionary of 'name', 'url', 'email'); map author to author_detail if author
-  contains name + email address
-
-3.0b8 - 1/28/2004 - MAP - added support for contributor
-
-3.0b9 - 1/29/2004 - MAP - fixed check for presence of dict function; added
-  support for summary
-
-3.0b10 - 1/31/2004 - MAP - incorporated ISO-8601 date parsing routines from
-  xml.util.iso8601
-
-3.0b11 - 2/2/2004 - MAP - added 'rights' to list of elements that can contain
-  dangerous markup; fiddled with decodeEntities (not right); liberalized
-  date parsing even further
-
-3.0b12 - 2/6/2004 - MAP - fiddled with decodeEntities (still not right);
-  added support to Atom 0.2 subtitle; added support for Atom content model
-  in copyright; better sanitizing of dangerous HTML elements with end tags
-  (script, frameset)
-
-3.0b13 - 2/8/2004 - MAP - better handling of empty HTML tags (br, hr, img,
-  etc.) in embedded markup, in either HTML or XHTML form (<br>, <br/>, <br />)
-
-3.0b14 - 2/8/2004 - MAP - fixed CDATA handling in non-wellformed feeds under
-  Python 2.1
-
-3.0b15 - 2/11/2004 - MAP - fixed bug resolving relative links in wfw:commentRSS;
-  fixed bug capturing author and contributor URL; fixed bug resolving relative
-  links in author and contributor URL; fixed bug resolvin relative links in
-  generator URL; added support for recognizing RSS 1.0; passed Simon Fell's
-  namespace tests, and included them permanently in the test suite with his
-  permission; fixed namespace handling under Python 2.1
-
-3.0b16 - 2/12/2004 - MAP - fixed support for RSS 0.90 (broken in b15)
-
-3.0b17 - 2/13/2004 - MAP - determine character encoding as per RFC 3023
-
-3.0b18 - 2/17/2004 - MAP - always map description to summary_detail (Andrei);
-  use libxml2 (if available)
-
-3.0b19 - 3/15/2004 - MAP - fixed bug exploding author information when author
-  name was in parentheses; removed ultra-problematic mxTidy support; patch to
-  workaround crash in PyXML/expat when encountering invalid entities
-  (MarkMoraes); support for textinput/textInput
-
-3.0b20 - 4/7/2004 - MAP - added CDF support
-
-3.0b21 - 4/14/2004 - MAP - added Hot RSS support
-
-3.0b22 - 4/19/2004 - MAP - changed 'channel' to 'feed', 'item' to 'entries' in
-  results dict; changed results dict to allow getting values with results.key
-  as well as results[key]; work around embedded illformed HTML with half
-  a DOCTYPE; work around malformed Content-Type header; if character encoding
-  is wrong, try several common ones before falling back to regexes (if this
-  works, bozo_exception is set to CharacterEncodingOverride); fixed character
-  encoding issues in BaseHTMLProcessor by tracking encoding and converting
-  from Unicode to raw strings before feeding data to sgmllib.SGMLParser;
-  convert each value in results to Unicode (if possible), even if using
-  regex-based parsing
-
-3.0b23 - 4/21/2004 - MAP - fixed UnicodeDecodeError for feeds that contain
-  high-bit characters in attributes in embedded HTML in description (thanks
-  Thijs van de Vossen); moved guid, date, and date_parsed to mapped keys in
-  FeedParserDict; tweaked FeedParserDict.has_key to return True if asking
-  about a mapped key
-
-3.0fc1 - 4/23/2004 - MAP - made results.entries[0].links[0] and
-  results.entries[0].enclosures[0] into FeedParserDict; fixed typo that could
-  cause the same encoding to be tried twice (even if it failed the first time);
-  fixed DOCTYPE stripping when DOCTYPE contained entity declarations;
-  better textinput and image tracking in illformed RSS 1.0 feeds
-
-3.0fc2 - 5/10/2004 - MAP - added and passed Sam's amp tests; added and passed
-  my blink tag tests
-
-3.0fc3 - 6/18/2004 - MAP - fixed bug in _changeEncodingDeclaration that
-  failed to parse utf-16 encoded feeds; made source into a FeedParserDict;
-  duplicate admin:generatorAgent/@rdf:resource in generator_detail.url;
-  added support for image; refactored parse() fallback logic to try other
-  encodings if SAX parsing fails (previously it would only try other encodings
-  if re-encoding failed); remove unichr madness in normalize_attrs now that
-  we're properly tracking encoding in and out of BaseHTMLProcessor; set
-  feed.language from root-level xml:lang; set entry.id from rdf:about;
-  send Accept header
-
-3.0 - 6/21/2004 - MAP - don't try iso-8859-1 (can't distinguish between
-  iso-8859-1 and windows-1252 anyway, and most incorrectly marked feeds are
-  windows-1252); fixed regression that could cause the same encoding to be
-  tried twice (even if it failed the first time)
-
-3.0.1 - 6/22/2004 - MAP - default to us-ascii for all text/* content types;
-  recover from malformed content-type header parameter with no equals sign
-  ('text/xml; charset:iso-8859-1')
-
-3.1 - 6/28/2004 - MAP - added and passed tests for converting HTML entities
-  to Unicode equivalents in illformed feeds (aaronsw); added and
-  passed tests for converting character entities to Unicode equivalents
-  in illformed feeds (aaronsw); test for valid parsers when setting
-  XML_AVAILABLE; make version and encoding available when server returns
-  a 304; add handlers parameter to pass arbitrary urllib2 handlers (like
-  digest auth or proxy support); add code to parse username/password
-  out of url and send as basic authentication; expose downloading-related
-  exceptions in bozo_exception (aaronsw); added __contains__ method to
-  FeedParserDict (aaronsw); added publisher_detail (aaronsw)
-
-3.2 - 7/3/2004 - MAP - use cjkcodecs and iconv_codec if available; always
-  convert feed to UTF-8 before passing to XML parser; completely revamped
-  logic for determining character encoding and attempting XML parsing
-  (much faster); increased default timeout to 20 seconds; test for presence
-  of Location header on redirects; added tests for many alternate character
-  encodings; support various EBCDIC encodings; support UTF-16BE and
-  UTF16-LE with or without a BOM; support UTF-8 with a BOM; support
-  UTF-32BE and UTF-32LE with or without a BOM; fixed crashing bug if no
-  XML parsers are available; added support for 'Content-encoding: deflate';
-  send blank 'Accept-encoding: ' header if neither gzip nor zlib modules
-  are available
-
-3.3 - 7/15/2004 - MAP - optimize EBCDIC to ASCII conversion; fix obscure
-  problem tracking xml:base and xml:lang if element declares it, child
-  doesn't, first grandchild redeclares it, and second grandchild doesn't;
-  refactored date parsing; defined public registerDateHandler so callers
-  can add support for additional date formats at runtime; added support
-  for OnBlog, Nate, MSSQL, Greek, and Hungarian dates (ytrewq1); added
-  zopeCompatibilityHack() which turns FeedParserDict into a regular
-  dictionary, required for Zope compatibility, and also makes command-
-  line debugging easier because pprint module formats real dictionaries
-  better than dictionary-like objects; added NonXMLContentType exception,
-  which is stored in bozo_exception when a feed is served with a non-XML
-  media type such as 'text/plain'; respect Content-Language as default
-  language if not xml:lang is present; cloud dict is now FeedParserDict;
-  generator dict is now FeedParserDict; better tracking of xml:lang,
-  including support for xml:lang='' to unset the current language;
-  recognize RSS 1.0 feeds even when RSS 1.0 namespace is not the default
-  namespace; don't overwrite final status on redirects (scenarios:
-  redirecting to a URL that returns 304, redirecting to a URL that
-  redirects to another URL with a different type of redirect); add
-  support for HTTP 303 redirects
-
-4.0 - MAP - support for relative URIs in xml:base attribute; fixed
-  encoding issue with mxTidy (phopkins); preliminary support for RFC 3229;
-  support for Atom 1.0; support for iTunes extensions; new 'tags' for
-  categories/keywords/etc. as array of dict
-  {'term': term, 'scheme': scheme, 'label': label} to match Atom 1.0
-  terminology; parse RFC 822-style dates with no time; lots of other
-  bug fixes
-
-4.1 - MAP - removed socket timeout; added support for chardet library

+ 0 - 31
Lib python/feedparser-5.2.1/PKG-INFO

@@ -1,31 +0,0 @@
-Metadata-Version: 1.1
-Name: feedparser
-Version: 5.2.1
-Summary: Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds
-Home-page: https://github.com/kurtmckee/feedparser
-Author: Kurt McKee
-Author-email: contactme@kurtmckee.org
-License: UNKNOWN
-Download-URL: https://pypi.python.org/pypi/feedparser
-Description: UNKNOWN
-Keywords: atom,cdf,feed,parser,rdf,rss
-Platform: POSIX
-Platform: Windows
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.4
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.0
-Classifier: Programming Language :: Python :: 3.1
-Classifier: Programming Language :: Python :: 3.2
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Text Processing :: Markup :: XML

+ 0 - 75
Lib python/feedparser-5.2.1/README.rst

@@ -1,75 +0,0 @@
-feedparser - Parse Atom and RSS feeds in Python.
-
-| Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org>
-| Copyright 2002-2008 Mark Pilgrim
-
-feedparser is open source. See the LICENSE file for more information.
-
-
-Installation
-============
-
-Feedparser can be installed using distutils or setuptools by running::
-
-    $ python setup.py install
-
-If you're using Python 3, feedparser will automatically be updated by the 2to3
-tool; installation should be seamless across Python 2 and Python 3.
-
-There's one caveat, however: sgmllib.py was deprecated in Python 2.6 and is no
-longer included in the Python 3 standard library. Because feedparser currently
-relies on sgmllib.py to handle illformed feeds (among other things), it's a
-useful library to have installed.
-
-If your feedparser download included a copy of sgmllib.py, it's probably called
-sgmllib3.py, and you can simply rename the file to sgmllib.py. It will not be
-automatically installed using the command above, so you will have to manually
-copy it to somewhere in your Python path.
-
-If a copy of sgmllib.py was not included in your feedparser download, you can
-grab a copy from the Python 2 standard library (preferably from the Python 2.7
-series) and run the 2to3 tool on it::
-
-    $ 2to3 -w sgmllib.py
-
-If you copied sgmllib.py from a Python 2.6 or 2.7 installation you'll
-additionally need to edit the resulting file to remove the `warnpy3k` lines at
-the top of the file. There should be four lines at the top of the file that you
-can delete.
-
-Because sgmllib.py is a part of the Python codebase, it's licensed under the
-Python Software Foundation License. You can find a copy of that license at
-python.org:
-
-    http://docs.python.org/license.html
-
-
-Documentation
-=============
-
-The feedparser documentation is available on the web at:
-
-    https://pythonhosted.org/feedparser/
-
-It is also included in its source format, ReST, in the docs/ directory. To
-build the documentation you'll need the Sphinx package, which is available at:
-
-    http://sphinx.pocoo.org/
-
-You can then build HTML pages using a command similar to::
-
-    $ sphinx-build -b html docs/ fpdocs
-
-This will produce HTML documentation in the fpdocs/ directory.
-
-
-Testing
-=======
-
-Feedparser has an extensive test suite that has been growing for a decade. If
-you'd like to run the tests yourself, you can run the following command::
-
-    $ python feedparsertest.py
-
-This will spawn an HTTP server that will listen on port 8097. The tests will
-fail if that port is in use.

+ 0 - 4007
Lib python/feedparser-5.2.1/build/lib.linux-x86_64-2.7/feedparser.py

@@ -1,4007 +0,0 @@
-"""Universal feed parser
-
-Handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds
-
-Visit https://code.google.com/p/feedparser/ for the latest version
-Visit http://packages.python.org/feedparser/ for the latest documentation
-
-Required: Python 2.4 or later
-Recommended: iconv_codec <http://cjkpython.i18n.org/>
-"""
-
-__version__ = "5.2.1"
-__license__ = """
-Copyright 2010-2015 Kurt McKee <contactme@kurtmckee.org>
-Copyright 2002-2008 Mark Pilgrim
-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.
-
-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."""
-__author__ = "Mark Pilgrim <http://diveintomark.org/>"
-__contributors__ = ["Jason Diamond <http://injektilo.org/>",
-                    "John Beimler <http://john.beimler.org/>",
-                    "Fazal Majid <http://www.majid.info/mylos/weblog/>",
-                    "Aaron Swartz <http://aaronsw.com/>",
-                    "Kevin Marks <http://epeus.blogspot.com/>",
-                    "Sam Ruby <http://intertwingly.net/>",
-                    "Ade Oshineye <http://blog.oshineye.com/>",
-                    "Martin Pool <http://sourcefrog.net/>",
-                    "Kurt McKee <http://kurtmckee.org/>",
-                    "Bernd Schlapsi <https://github.com/brot>",]
-
-# HTTP "User-Agent" header to send to servers when downloading feeds.
-# If you are embedding feedparser in a larger application, you should
-# change this to your application name and URL.
-USER_AGENT = "UniversalFeedParser/%s +https://code.google.com/p/feedparser/" % __version__
-
-# HTTP "Accept" header to send to servers when downloading feeds.  If you don't
-# want to send an Accept header, set this to None.
-ACCEPT_HEADER = "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1"
-
-# List of preferred XML parsers, by SAX driver name.  These will be tried first,
-# but if they're not installed, Python will keep searching through its own list
-# of pre-installed parsers until it finds one that supports everything we need.
-PREFERRED_XML_PARSERS = ["drv_libxml2"]
-
-# If you want feedparser to automatically resolve all relative URIs, set this
-# to 1.
-RESOLVE_RELATIVE_URIS = 1
-
-# If you want feedparser to automatically sanitize all potentially unsafe
-# HTML content, set this to 1.
-SANITIZE_HTML = 1
-
-# ---------- Python 3 modules (make it work if possible) ----------
-try:
-    import rfc822
-except ImportError:
-    from email import _parseaddr as rfc822
-
-try:
-    # Python 3.1 introduces bytes.maketrans and simultaneously
-    # deprecates string.maketrans; use bytes.maketrans if possible
-    _maketrans = bytes.maketrans
-except (NameError, AttributeError):
-    import string
-    _maketrans = string.maketrans
-
-# base64 support for Atom feeds that contain embedded binary data
-try:
-    import base64, binascii
-except ImportError:
-    base64 = binascii = None
-else:
-    # Python 3.1 deprecates decodestring in favor of decodebytes
-    _base64decode = getattr(base64, 'decodebytes', base64.decodestring)
-
-# _s2bytes: convert a UTF-8 str to bytes if the interpreter is Python 3
-# _l2bytes: convert a list of ints to bytes if the interpreter is Python 3
-try:
-    if bytes is str:
-        # In Python 2.5 and below, bytes doesn't exist (NameError)
-        # In Python 2.6 and above, bytes and str are the same type
-        raise NameError
-except NameError:
-    # Python 2
-    def _s2bytes(s):
-        return s
-    def _l2bytes(l):
-        return ''.join(map(chr, l))
-else:
-    # Python 3
-    def _s2bytes(s):
-        return bytes(s, 'utf8')
-    def _l2bytes(l):
-        return bytes(l)
-
-# If you want feedparser to allow all URL schemes, set this to ()
-# List culled from Python's urlparse documentation at:
-#   http://docs.python.org/library/urlparse.html
-# as well as from "URI scheme" at Wikipedia:
-#   https://secure.wikimedia.org/wikipedia/en/wiki/URI_scheme
-# Many more will likely need to be added!
-ACCEPTABLE_URI_SCHEMES = (
-    'file', 'ftp', 'gopher', 'h323', 'hdl', 'http', 'https', 'imap', 'magnet',
-    'mailto', 'mms', 'news', 'nntp', 'prospero', 'rsync', 'rtsp', 'rtspu',
-    'sftp', 'shttp', 'sip', 'sips', 'snews', 'svn', 'svn+ssh', 'telnet',
-    'wais',
-    # Additional common-but-unofficial schemes
-    'aim', 'callto', 'cvs', 'facetime', 'feed', 'git', 'gtalk', 'irc', 'ircs',
-    'irc6', 'itms', 'mms', 'msnim', 'skype', 'ssh', 'smb', 'svn', 'ymsg',
-)
-#ACCEPTABLE_URI_SCHEMES = ()
-
-# ---------- required modules (should come with any Python distribution) ----------
-import cgi
-import codecs
-import copy
-import datetime
-import itertools
-import re
-import struct
-import time
-import types
-import urllib
-import urllib2
-import urlparse
-import warnings
-
-from htmlentitydefs import name2codepoint, codepoint2name, entitydefs
-
-try:
-    from io import BytesIO as _StringIO
-except ImportError:
-    try:
-        from cStringIO import StringIO as _StringIO
-    except ImportError:
-        from StringIO import StringIO as _StringIO
-
-# ---------- optional modules (feedparser will work without these, but with reduced functionality) ----------
-
-# gzip is included with most Python distributions, but may not be available if you compiled your own
-try:
-    import gzip
-except ImportError:
-    gzip = None
-try:
-    import zlib
-except ImportError:
-    zlib = None
-
-# If a real XML parser is available, feedparser will attempt to use it.  feedparser has
-# been tested with the built-in SAX parser and libxml2.  On platforms where the
-# Python distribution does not come with an XML parser (such as Mac OS X 10.2 and some
-# versions of FreeBSD), feedparser will quietly fall back on regex-based parsing.
-try:
-    import xml.sax
-    from xml.sax.saxutils import escape as _xmlescape
-except ImportError:
-    _XML_AVAILABLE = 0
-    def _xmlescape(data,entities={}):
-        data = data.replace('&', '&amp;')
-        data = data.replace('>', '&gt;')
-        data = data.replace('<', '&lt;')
-        for char, entity in entities:
-            data = data.replace(char, entity)
-        return data
-else:
-    try:
-        xml.sax.make_parser(PREFERRED_XML_PARSERS) # test for valid parsers
-    except xml.sax.SAXReaderNotAvailable:
-        _XML_AVAILABLE = 0
-    else:
-        _XML_AVAILABLE = 1
-
-# sgmllib is not available by default in Python 3; if the end user doesn't have
-# it available then we'll lose illformed XML parsing and content santizing
-try:
-    import sgmllib
-except ImportError:
-    # This is probably Python 3, which doesn't include sgmllib anymore
-    _SGML_AVAILABLE = 0
-
-    # Mock sgmllib enough to allow subclassing later on
-    class sgmllib(object):
-        class SGMLParser(object):
-            def goahead(self, i):
-                pass
-            def parse_starttag(self, i):
-                pass
-else:
-    _SGML_AVAILABLE = 1
-
-    # sgmllib defines a number of module-level regular expressions that are
-    # insufficient for the XML parsing feedparser needs. Rather than modify
-    # the variables directly in sgmllib, they're defined here using the same
-    # names, and the compiled code objects of several sgmllib.SGMLParser
-    # methods are copied into _BaseHTMLProcessor so that they execute in
-    # feedparser's scope instead of sgmllib's scope.
-    charref = re.compile('&#(\d+|[xX][0-9a-fA-F]+);')
-    tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
-    attrfind = re.compile(
-        r'\s*([a-zA-Z_][-:.a-zA-Z_0-9]*)[$]?(\s*=\s*'
-        r'(\'[^\']*\'|"[^"]*"|[][\-a-zA-Z0-9./,:;+*%?!&$\(\)_#=~\'"@]*))?'
-    )
-
-    # Unfortunately, these must be copied over to prevent NameError exceptions
-    entityref = sgmllib.entityref
-    incomplete = sgmllib.incomplete
-    interesting = sgmllib.interesting
-    shorttag = sgmllib.shorttag
-    shorttagopen = sgmllib.shorttagopen
-    starttagopen = sgmllib.starttagopen
-
-    class _EndBracketRegEx:
-        def __init__(self):
-            # Overriding the built-in sgmllib.endbracket regex allows the
-            # parser to find angle brackets embedded in element attributes.
-            self.endbracket = re.compile('''([^'"<>]|"[^"]*"(?=>|/|\s|\w+=)|'[^']*'(?=>|/|\s|\w+=))*(?=[<>])|.*?(?=[<>])''')
-        def search(self, target, index=0):
-            match = self.endbracket.match(target, index)
-            if match is not None:
-                # Returning a new object in the calling thread's context
-                # resolves a thread-safety.
-                return EndBracketMatch(match)
-            return None
-    class EndBracketMatch:
-        def __init__(self, match):
-            self.match = match
-        def start(self, n):
-            return self.match.end(n)
-    endbracket = _EndBracketRegEx()
-
-
-# iconv_codec provides support for more character encodings.
-# It's available from http://cjkpython.i18n.org/
-try:
-    import iconv_codec
-except ImportError:
-    pass
-
-# chardet library auto-detects character encodings
-# Download from http://chardet.feedparser.org/
-try:
-    import chardet
-except ImportError:
-    chardet = None
-
-# ---------- don't touch these ----------
-class ThingsNobodyCaresAboutButMe(Exception): pass
-class CharacterEncodingOverride(ThingsNobodyCaresAboutButMe): pass
-class CharacterEncodingUnknown(ThingsNobodyCaresAboutButMe): pass
-class NonXMLContentType(ThingsNobodyCaresAboutButMe): pass
-class UndeclaredNamespace(Exception): pass
-
-SUPPORTED_VERSIONS = {'': u'unknown',
-                      'rss090': u'RSS 0.90',
-                      'rss091n': u'RSS 0.91 (Netscape)',
-                      'rss091u': u'RSS 0.91 (Userland)',
-                      'rss092': u'RSS 0.92',
-                      'rss093': u'RSS 0.93',
-                      'rss094': u'RSS 0.94',
-                      'rss20': u'RSS 2.0',
-                      'rss10': u'RSS 1.0',
-                      'rss': u'RSS (unknown version)',
-                      'atom01': u'Atom 0.1',
-                      'atom02': u'Atom 0.2',
-                      'atom03': u'Atom 0.3',
-                      'atom10': u'Atom 1.0',
-                      'atom': u'Atom (unknown version)',
-                      'cdf': u'CDF',
-                      }
-
-class FeedParserDict(dict):
-    keymap = {'channel': 'feed',
-              'items': 'entries',
-              'guid': 'id',
-              'date': 'updated',
-              'date_parsed': 'updated_parsed',
-              'description': ['summary', 'subtitle'],
-              'description_detail': ['summary_detail', 'subtitle_detail'],
-              'url': ['href'],
-              'modified': 'updated',
-              'modified_parsed': 'updated_parsed',
-              'issued': 'published',
-              'issued_parsed': 'published_parsed',
-              'copyright': 'rights',
-              'copyright_detail': 'rights_detail',
-              'tagline': 'subtitle',
-              'tagline_detail': 'subtitle_detail'}
-    def __getitem__(self, key):
-        '''
-        :return: A :class:`FeedParserDict`.
-        '''
-        if key == 'category':
-            try:
-                return dict.__getitem__(self, 'tags')[0]['term']
-            except IndexError:
-                raise KeyError, "object doesn't have key 'category'"
-        elif key == 'enclosures':
-            norel = lambda link: FeedParserDict([(name,value) for (name,value) in link.items() if name!='rel'])
-            return [norel(link) for link in dict.__getitem__(self, 'links') if link['rel']==u'enclosure']
-        elif key == 'license':
-            for link in dict.__getitem__(self, 'links'):
-                if link['rel']==u'license' and 'href' in link:
-                    return link['href']
-        elif key == 'updated':
-            # Temporarily help developers out by keeping the old
-            # broken behavior that was reported in issue 310.
-            # This fix was proposed in issue 328.
-            if not dict.__contains__(self, 'updated') and \
-                dict.__contains__(self, 'published'):
-                warnings.warn("To avoid breaking existing software while "
-                    "fixing issue 310, a temporary mapping has been created "
-                    "from `updated` to `published` if `updated` doesn't "
-                    "exist. This fallback will be removed in a future version "
-                    "of feedparser.", DeprecationWarning)
-                return dict.__getitem__(self, 'published')
-            return dict.__getitem__(self, 'updated')
-        elif key == 'updated_parsed':
-            if not dict.__contains__(self, 'updated_parsed') and \
-                dict.__contains__(self, 'published_parsed'):
-                warnings.warn("To avoid breaking existing software while "
-                    "fixing issue 310, a temporary mapping has been created "
-                    "from `updated_parsed` to `published_parsed` if "
-                    "`updated_parsed` doesn't exist. This fallback will be "
-                    "removed in a future version of feedparser.",
-                    DeprecationWarning)
-                return dict.__getitem__(self, 'published_parsed')
-            return dict.__getitem__(self, 'updated_parsed')
-        else:
-            realkey = self.keymap.get(key, key)
-            if isinstance(realkey, list):
-                for k in realkey:
-                    if dict.__contains__(self, k):
-                        return dict.__getitem__(self, k)
-            elif dict.__contains__(self, realkey):
-                return dict.__getitem__(self, realkey)
-        return dict.__getitem__(self, key)
-
-    def __contains__(self, key):
-        if key in ('updated', 'updated_parsed'):
-            # Temporarily help developers out by keeping the old
-            # broken behavior that was reported in issue 310.
-            # This fix was proposed in issue 328.
-            return dict.__contains__(self, key)
-        try:
-            self.__getitem__(key)
-        except KeyError:
-            return False
-        else:
-            return True
-
-    has_key = __contains__
-
-    def get(self, key, default=None):
-        '''
-        :return: A :class:`FeedParserDict`.
-        '''
-        try:
-            return self.__getitem__(key)
-        except KeyError:
-            return default
-
-    def __setitem__(self, key, value):
-        key = self.keymap.get(key, key)
-        if isinstance(key, list):
-            key = key[0]
-        return dict.__setitem__(self, key, value)
-
-    def setdefault(self, key, value):
-        if key not in self:
-            self[key] = value
-            return value
-        return self[key]
-
-    def __getattr__(self, key):
-        # __getattribute__() is called first; this will be called
-        # only if an attribute was not already found
-        try:
-            return self.__getitem__(key)
-        except KeyError:
-            raise AttributeError, "object has no attribute '%s'" % key
-
-    def __hash__(self):
-        return id(self)
-
-_cp1252 = {
-    128: unichr(8364), # euro sign
-    130: unichr(8218), # single low-9 quotation mark
-    131: unichr( 402), # latin small letter f with hook
-    132: unichr(8222), # double low-9 quotation mark
-    133: unichr(8230), # horizontal ellipsis
-    134: unichr(8224), # dagger
-    135: unichr(8225), # double dagger
-    136: unichr( 710), # modifier letter circumflex accent
-    137: unichr(8240), # per mille sign
-    138: unichr( 352), # latin capital letter s with caron
-    139: unichr(8249), # single left-pointing angle quotation mark
-    140: unichr( 338), # latin capital ligature oe
-    142: unichr( 381), # latin capital letter z with caron
-    145: unichr(8216), # left single quotation mark
-    146: unichr(8217), # right single quotation mark
-    147: unichr(8220), # left double quotation mark
-    148: unichr(8221), # right double quotation mark
-    149: unichr(8226), # bullet
-    150: unichr(8211), # en dash
-    151: unichr(8212), # em dash
-    152: unichr( 732), # small tilde
-    153: unichr(8482), # trade mark sign
-    154: unichr( 353), # latin small letter s with caron
-    155: unichr(8250), # single right-pointing angle quotation mark
-    156: unichr( 339), # latin small ligature oe
-    158: unichr( 382), # latin small letter z with caron
-    159: unichr( 376), # latin capital letter y with diaeresis
-}
-
-_urifixer = re.compile('^([A-Za-z][A-Za-z0-9+-.]*://)(/*)(.*?)')
-def _urljoin(base, uri):
-    uri = _urifixer.sub(r'\1\3', uri)
-    if not isinstance(uri, unicode):
-        uri = uri.decode('utf-8', 'ignore')
-    try:
-        uri = urlparse.urljoin(base, uri)
-    except ValueError:
-        uri = u''
-    if not isinstance(uri, unicode):
-        return uri.decode('utf-8', 'ignore')
-    return uri
-
-class _FeedParserMixin:
-    namespaces = {
-        '': '',
-        'http://backend.userland.com/rss': '',
-        'http://blogs.law.harvard.edu/tech/rss': '',
-        'http://purl.org/rss/1.0/': '',
-        'http://my.netscape.com/rdf/simple/0.9/': '',
-        'http://example.com/newformat#': '',
-        'http://example.com/necho': '',
-        'http://purl.org/echo/': '',
-        'uri/of/echo/namespace#': '',
-        'http://purl.org/pie/': '',
-        'http://purl.org/atom/ns#': '',
-        'http://www.w3.org/2005/Atom': '',
-        'http://purl.org/rss/1.0/modules/rss091#': '',
-
-        'http://webns.net/mvcb/':                                'admin',
-        'http://purl.org/rss/1.0/modules/aggregation/':          'ag',
-        'http://purl.org/rss/1.0/modules/annotate/':             'annotate',
-        'http://media.tangent.org/rss/1.0/':                     'audio',
-        'http://backend.userland.com/blogChannelModule':         'blogChannel',
-        'http://web.resource.org/cc/':                           'cc',
-        'http://backend.userland.com/creativeCommonsRssModule':  'creativeCommons',
-        'http://purl.org/rss/1.0/modules/company':               'co',
-        'http://purl.org/rss/1.0/modules/content/':              'content',
-        'http://my.theinfo.org/changed/1.0/rss/':                'cp',
-        'http://purl.org/dc/elements/1.1/':                      'dc',
-        'http://purl.org/dc/terms/':                             'dcterms',
-        'http://purl.org/rss/1.0/modules/email/':                'email',
-        'http://purl.org/rss/1.0/modules/event/':                'ev',
-        'http://rssnamespace.org/feedburner/ext/1.0':            'feedburner',
-        'http://freshmeat.net/rss/fm/':                          'fm',
-        'http://xmlns.com/foaf/0.1/':                            'foaf',
-        'http://www.w3.org/2003/01/geo/wgs84_pos#':              'geo',
-        'http://www.georss.org/georss':                          'georss',
-        'http://www.opengis.net/gml':                            'gml',
-        'http://postneo.com/icbm/':                              'icbm',
-        'http://purl.org/rss/1.0/modules/image/':                'image',
-        'http://www.itunes.com/DTDs/PodCast-1.0.dtd':            'itunes',
-        'http://example.com/DTDs/PodCast-1.0.dtd':               'itunes',
-        'http://purl.org/rss/1.0/modules/link/':                 'l',
-        'http://search.yahoo.com/mrss':                          'media',
-        # Version 1.1.2 of the Media RSS spec added the trailing slash on the namespace
-        'http://search.yahoo.com/mrss/':                         'media',
-        'http://madskills.com/public/xml/rss/module/pingback/':  'pingback',
-        'http://prismstandard.org/namespaces/1.2/basic/':        'prism',
-        'http://www.w3.org/1999/02/22-rdf-syntax-ns#':           'rdf',
-        'http://www.w3.org/2000/01/rdf-schema#':                 'rdfs',
-        'http://purl.org/rss/1.0/modules/reference/':            'ref',
-        'http://purl.org/rss/1.0/modules/richequiv/':            'reqv',
-        'http://purl.org/rss/1.0/modules/search/':               'search',
-        'http://purl.org/rss/1.0/modules/slash/':                'slash',
-        'http://schemas.xmlsoap.org/soap/envelope/':             'soap',
-        'http://purl.org/rss/1.0/modules/servicestatus/':        'ss',
-        'http://hacks.benhammersley.com/rss/streaming/':         'str',
-        'http://purl.org/rss/1.0/modules/subscription/':         'sub',
-        'http://purl.org/rss/1.0/modules/syndication/':          'sy',
-        'http://schemas.pocketsoap.com/rss/myDescModule/':       'szf',
-        'http://purl.org/rss/1.0/modules/taxonomy/':             'taxo',
-        'http://purl.org/rss/1.0/modules/threading/':            'thr',
-        'http://purl.org/rss/1.0/modules/textinput/':            'ti',
-        'http://madskills.com/public/xml/rss/module/trackback/': 'trackback',
-        'http://wellformedweb.org/commentAPI/':                  'wfw',
-        'http://purl.org/rss/1.0/modules/wiki/':                 'wiki',
-        'http://www.w3.org/1999/xhtml':                          'xhtml',
-        'http://www.w3.org/1999/xlink':                          'xlink',
-        'http://www.w3.org/XML/1998/namespace':                  'xml',
-        'http://podlove.org/simple-chapters':                    'psc',
-    }
-    _matchnamespaces = {}
-
-    can_be_relative_uri = set(['link', 'id', 'wfw_comment', 'wfw_commentrss', 'docs', 'url', 'href', 'comments', 'icon', 'logo'])
-    can_contain_relative_uris = set(['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description'])
-    can_contain_dangerous_markup = set(['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description'])
-    html_types = [u'text/html', u'application/xhtml+xml']
-
-    def __init__(self, baseuri=None, baselang=None, encoding=u'utf-8'):
-        if not self._matchnamespaces:
-            for k, v in self.namespaces.items():
-                self._matchnamespaces[k.lower()] = v
-        self.feeddata = FeedParserDict() # feed-level data
-        self.encoding = encoding # character encoding
-        self.entries = [] # list of entry-level data
-        self.version = u'' # feed type/version, see SUPPORTED_VERSIONS
-        self.namespacesInUse = {} # dictionary of namespaces defined by the feed
-
-        # the following are used internally to track state;
-        # this is really out of control and should be refactored
-        self.infeed = 0
-        self.inentry = 0
-        self.incontent = 0
-        self.intextinput = 0
-        self.inimage = 0
-        self.inauthor = 0
-        self.incontributor = 0
-        self.inpublisher = 0
-        self.insource = 0
-
-        # georss
-        self.ingeometry = 0
-
-        self.sourcedata = FeedParserDict()
-        self.contentparams = FeedParserDict()
-        self._summaryKey = None
-        self.namespacemap = {}
-        self.elementstack = []
-        self.basestack = []
-        self.langstack = []
-        self.baseuri = baseuri or u''
-        self.lang = baselang or None
-        self.svgOK = 0
-        self.title_depth = -1
-        self.depth = 0
-        # psc_chapters_flag prevents multiple psc_chapters from being
-        # captured in a single entry or item. The transition states are
-        # None -> True -> False. psc_chapter elements will only be
-        # captured while it is True.
-        self.psc_chapters_flag = None
-        if baselang:
-            self.feeddata['language'] = baselang.replace('_','-')
-
-        # A map of the following form:
-        #     {
-        #         object_that_value_is_set_on: {
-        #             property_name: depth_of_node_property_was_extracted_from,
-        #             other_property: depth_of_node_property_was_extracted_from,
-        #         },
-        #     }
-        self.property_depth_map = {}
-
-    def _normalize_attributes(self, kv):
-        k = kv[0].lower()
-        v = k in ('rel', 'type') and kv[1].lower() or kv[1]
-        # the sgml parser doesn't handle entities in attributes, nor
-        # does it pass the attribute values through as unicode, while
-        # strict xml parsers do -- account for this difference
-        if isinstance(self, _LooseFeedParser):
-            v = v.replace('&amp;', '&')
-            if not isinstance(v, unicode):
-                v = v.decode('utf-8')
-        return (k, v)
-
-    def unknown_starttag(self, tag, attrs):
-        # increment depth counter
-        self.depth += 1
-
-        # normalize attrs
-        attrs = map(self._normalize_attributes, attrs)
-
-        # track xml:base and xml:lang
-        attrsD = dict(attrs)
-        baseuri = attrsD.get('xml:base', attrsD.get('base')) or self.baseuri
-        if not isinstance(baseuri, unicode):
-            baseuri = baseuri.decode(self.encoding, 'ignore')
-        # ensure that self.baseuri is always an absolute URI that
-        # uses a whitelisted URI scheme (e.g. not `javscript:`)
-        if self.baseuri:
-            self.baseuri = _makeSafeAbsoluteURI(self.baseuri, baseuri) or self.baseuri
-        else:
-            self.baseuri = _urljoin(self.baseuri, baseuri)
-        lang = attrsD.get('xml:lang', attrsD.get('lang'))
-        if lang == '':
-            # xml:lang could be explicitly set to '', we need to capture that
-            lang = None
-        elif lang is None:
-            # if no xml:lang is specified, use parent lang
-            lang = self.lang
-        if lang:
-            if tag in ('feed', 'rss', 'rdf:RDF'):
-                self.feeddata['language'] = lang.replace('_','-')
-        self.lang = lang
-        self.basestack.append(self.baseuri)
-        self.langstack.append(lang)
-
-        # track namespaces
-        for prefix, uri in attrs:
-            if prefix.startswith('xmlns:'):
-                self.trackNamespace(prefix[6:], uri)
-            elif prefix == 'xmlns':
-                self.trackNamespace(None, uri)
-
-        # track inline content
-        if self.incontent and not self.contentparams.get('type', u'xml').endswith(u'xml'):
-            if tag in ('xhtml:div', 'div'):
-                return # typepad does this 10/2007
-            # element declared itself as escaped markup, but it isn't really
-            self.contentparams['type'] = u'application/xhtml+xml'
-        if self.incontent and self.contentparams.get('type') == u'application/xhtml+xml':
-            if tag.find(':') <> -1:
-                prefix, tag = tag.split(':', 1)
-                namespace = self.namespacesInUse.get(prefix, '')
-                if tag=='math' and namespace=='http://www.w3.org/1998/Math/MathML':
-                    attrs.append(('xmlns',namespace))
-                if tag=='svg' and namespace=='http://www.w3.org/2000/svg':
-                    attrs.append(('xmlns',namespace))
-            if tag == 'svg':
-                self.svgOK += 1
-            return self.handle_data('<%s%s>' % (tag, self.strattrs(attrs)), escape=0)
-
-        # match namespaces
-        if tag.find(':') <> -1:
-            prefix, suffix = tag.split(':', 1)
-        else:
-            prefix, suffix = '', tag
-        prefix = self.namespacemap.get(prefix, prefix)
-        if prefix:
-            prefix = prefix + '_'
-
-        # special hack for better tracking of empty textinput/image elements in illformed feeds
-        if (not prefix) and tag not in ('title', 'link', 'description', 'name'):
-            self.intextinput = 0
-        if (not prefix) and tag not in ('title', 'link', 'description', 'url', 'href', 'width', 'height'):
-            self.inimage = 0
-
-        # call special handler (if defined) or default handler
-        methodname = '_start_' + prefix + suffix
-        try:
-            method = getattr(self, methodname)
-            return method(attrsD)
-        except AttributeError:
-            # Since there's no handler or something has gone wrong we explicitly add the element and its attributes
-            unknown_tag = prefix + suffix
-            if len(attrsD) == 0:
-                # No attributes so merge it into the encosing dictionary
-                return self.push(unknown_tag, 1)
-            else:
-                # Has attributes so create it in its own dictionary
-                context = self._getContext()
-                context[unknown_tag] = attrsD
-
-    def unknown_endtag(self, tag):
-        # match namespaces
-        if tag.find(':') <> -1:
-            prefix, suffix = tag.split(':', 1)
-        else:
-            prefix, suffix = '', tag
-        prefix = self.namespacemap.get(prefix, prefix)
-        if prefix:
-            prefix = prefix + '_'
-        if suffix == 'svg' and self.svgOK:
-            self.svgOK -= 1
-
-        # call special handler (if defined) or default handler
-        methodname = '_end_' + prefix + suffix
-        try:
-            if self.svgOK:
-                raise AttributeError()
-            method = getattr(self, methodname)
-            method()
-        except AttributeError:
-            self.pop(prefix + suffix)
-
-        # track inline content
-        if self.incontent and not self.contentparams.get('type', u'xml').endswith(u'xml'):
-            # element declared itself as escaped markup, but it isn't really
-            if tag in ('xhtml:div', 'div'):
-                return # typepad does this 10/2007
-            self.contentparams['type'] = u'application/xhtml+xml'
-        if self.incontent and self.contentparams.get('type') == u'application/xhtml+xml':
-            tag = tag.split(':')[-1]
-            self.handle_data('</%s>' % tag, escape=0)
-
-        # track xml:base and xml:lang going out of scope
-        if self.basestack:
-            self.basestack.pop()
-            if self.basestack and self.basestack[-1]:
-                self.baseuri = self.basestack[-1]
-        if self.langstack:
-            self.langstack.pop()
-            if self.langstack: # and (self.langstack[-1] is not None):
-                self.lang = self.langstack[-1]
-
-        self.depth -= 1
-
-    def handle_charref(self, ref):
-        # called for each character reference, e.g. for '&#160;', ref will be '160'
-        if not self.elementstack:
-            return
-        ref = ref.lower()
-        if ref in ('34', '38', '39', '60', '62', 'x22', 'x26', 'x27', 'x3c', 'x3e'):
-            text = '&#%s;' % ref
-        else:
-            if ref[0] == 'x':
-                c = int(ref[1:], 16)
-            else:
-                c = int(ref)
-            text = unichr(c).encode('utf-8')
-        self.elementstack[-1][2].append(text)
-
-    def handle_entityref(self, ref):
-        # called for each entity reference, e.g. for '&copy;', ref will be 'copy'
-        if not self.elementstack:
-            return
-        if ref in ('lt', 'gt', 'quot', 'amp', 'apos'):
-            text = '&%s;' % ref
-        elif ref in self.entities:
-            text = self.entities[ref]
-            if text.startswith('&#') and text.endswith(';'):
-                return self.handle_entityref(text)
-        else:
-            try:
-                name2codepoint[ref]
-            except KeyError:
-                text = '&%s;' % ref
-            else:
-                text = unichr(name2codepoint[ref]).encode('utf-8')
-        self.elementstack[-1][2].append(text)
-
-    def handle_data(self, text, escape=1):
-        # called for each block of plain text, i.e. outside of any tag and
-        # not containing any character or entity references
-        if not self.elementstack:
-            return
-        if escape and self.contentparams.get('type') == u'application/xhtml+xml':
-            text = _xmlescape(text)
-        self.elementstack[-1][2].append(text)
-
-    def handle_comment(self, text):
-        # called for each comment, e.g. <!-- insert message here -->
-        pass
-
-    def handle_pi(self, text):
-        # called for each processing instruction, e.g. <?instruction>
-        pass
-
-    def handle_decl(self, text):
-        pass
-
-    def parse_declaration(self, i):
-        # override internal declaration handler to handle CDATA blocks
-        if self.rawdata[i:i+9] == '<![CDATA[':
-            k = self.rawdata.find(']]>', i)
-            if k == -1:
-                # CDATA block began but didn't finish
-                k = len(self.rawdata)
-                return k
-            self.handle_data(_xmlescape(self.rawdata[i+9:k]), 0)
-            return k+3
-        else:
-            k = self.rawdata.find('>', i)
-            if k >= 0:
-                return k+1
-            else:
-                # We have an incomplete CDATA block.
-                return k
-
-    def mapContentType(self, contentType):
-        contentType = contentType.lower()
-        if contentType == 'text' or contentType == 'plain':
-            contentType = u'text/plain'
-        elif contentType == 'html':
-            contentType = u'text/html'
-        elif contentType == 'xhtml':
-            contentType = u'application/xhtml+xml'
-        return contentType
-
-    def trackNamespace(self, prefix, uri):
-        loweruri = uri.lower()
-        if not self.version:
-            if (prefix, loweruri) == (None, 'http://my.netscape.com/rdf/simple/0.9/'):
-                self.version = u'rss090'
-            elif loweruri == 'http://purl.org/rss/1.0/':
-                self.version = u'rss10'
-            elif loweruri == 'http://www.w3.org/2005/atom':
-                self.version = u'atom10'
-        if loweruri.find(u'backend.userland.com/rss') <> -1:
-            # match any backend.userland.com namespace
-            uri = u'http://backend.userland.com/rss'
-            loweruri = uri
-        if loweruri in self._matchnamespaces:
-            self.namespacemap[prefix] = self._matchnamespaces[loweruri]
-            self.namespacesInUse[self._matchnamespaces[loweruri]] = uri
-        else:
-            self.namespacesInUse[prefix or ''] = uri
-
-    def resolveURI(self, uri):
-        return _urljoin(self.baseuri or u'', uri)
-
-    def decodeEntities(self, element, data):
-        return data
-
-    def strattrs(self, attrs):
-        return ''.join([' %s="%s"' % (t[0],_xmlescape(t[1],{'"':'&quot;'})) for t in attrs])
-
-    def push(self, element, expectingText):
-        self.elementstack.append([element, expectingText, []])
-
-    def pop(self, element, stripWhitespace=1):
-        if not self.elementstack:
-            return
-        if self.elementstack[-1][0] != element:
-            return
-
-        element, expectingText, pieces = self.elementstack.pop()
-
-        if self.version == u'atom10' and self.contentparams.get('type', u'text') == u'application/xhtml+xml':
-            # remove enclosing child element, but only if it is a <div> and
-            # only if all the remaining content is nested underneath it.
-            # This means that the divs would be retained in the following:
-            #    <div>foo</div><div>bar</div>
-            while pieces and len(pieces)>1 and not pieces[-1].strip():
-                del pieces[-1]
-            while pieces and len(pieces)>1 and not pieces[0].strip():
-                del pieces[0]
-            if pieces and (pieces[0] == '<div>' or pieces[0].startswith('<div ')) and pieces[-1]=='</div>':
-                depth = 0
-                for piece in pieces[:-1]:
-                    if piece.startswith('</'):
-                        depth -= 1
-                        if depth == 0:
-                            break
-                    elif piece.startswith('<') and not piece.endswith('/>'):
-                        depth += 1
-                else:
-                    pieces = pieces[1:-1]
-
-        # Ensure each piece is a str for Python 3
-        for (i, v) in enumerate(pieces):
-            if not isinstance(v, unicode):
-                pieces[i] = v.decode('utf-8')
-
-        output = u''.join(pieces)
-        if stripWhitespace:
-            output = output.strip()
-        if not expectingText:
-            return output
-
-        # decode base64 content
-        if base64 and self.contentparams.get('base64', 0):
-            try:
-                output = _base64decode(output)
-            except binascii.Error:
-                pass
-            except binascii.Incomplete:
-                pass
-            except TypeError:
-                # In Python 3, base64 takes and outputs bytes, not str
-                # This may not be the most correct way to accomplish this
-                output = _base64decode(output.encode('utf-8')).decode('utf-8')
-
-        # resolve relative URIs
-        if (element in self.can_be_relative_uri) and output:
-            # do not resolve guid elements with isPermalink="false"
-            if not element == 'id' or self.guidislink:
-                output = self.resolveURI(output)
-
-        # decode entities within embedded markup
-        if not self.contentparams.get('base64', 0):
-            output = self.decodeEntities(element, output)
-
-        # some feed formats require consumers to guess
-        # whether the content is html or plain text
-        if not self.version.startswith(u'atom') and self.contentparams.get('type') == u'text/plain':
-            if self.lookslikehtml(output):
-                self.contentparams['type'] = u'text/html'
-
-        # remove temporary cruft from contentparams
-        try:
-            del self.contentparams['mode']
-        except KeyError:
-            pass
-        try:
-            del self.contentparams['base64']
-        except KeyError:
-            pass
-
-        is_htmlish = self.mapContentType(self.contentparams.get('type', u'text/html')) in self.html_types
-        # resolve relative URIs within embedded markup
-        if is_htmlish and RESOLVE_RELATIVE_URIS:
-            if element in self.can_contain_relative_uris:
-                output = _resolveRelativeURIs(output, self.baseuri, self.encoding, self.contentparams.get('type', u'text/html'))
-
-        # sanitize embedded markup
-        if is_htmlish and SANITIZE_HTML:
-            if element in self.can_contain_dangerous_markup:
-                output = _sanitizeHTML(output, self.encoding, self.contentparams.get('type', u'text/html'))
-
-        if self.encoding and not isinstance(output, unicode):
-            output = output.decode(self.encoding, 'ignore')
-
-        # address common error where people take data that is already
-        # utf-8, presume that it is iso-8859-1, and re-encode it.
-        if self.encoding in (u'utf-8', u'utf-8_INVALID_PYTHON_3') and isinstance(output, unicode):
-            try:
-                output = output.encode('iso-8859-1').decode('utf-8')
-            except (UnicodeEncodeError, UnicodeDecodeError):
-                pass
-
-        # map win-1252 extensions to the proper code points
-        if isinstance(output, unicode):
-            output = output.translate(_cp1252)
-
-        # categories/tags/keywords/whatever are handled in _end_category or _end_tags or _end_itunes_keywords
-        if element in ('category', 'tags', 'itunes_keywords'):
-            return output
-
-        if element == 'title' and -1 < self.title_depth <= self.depth:
-            return output
-
-        # store output in appropriate place(s)
-        if self.inentry and not self.insource:
-            if element == 'content':
-                self.entries[-1].setdefault(element, [])
-                contentparams = copy.deepcopy(self.contentparams)
-                contentparams['value'] = output
-                self.entries[-1][element].append(contentparams)
-            elif element == 'link':
-                if not self.inimage:
-                    # query variables in urls in link elements are improperly
-                    # converted from `?a=1&b=2` to `?a=1&b;=2` as if they're
-                    # unhandled character references. fix this special case.
-                    output = output.replace('&amp;', '&')
-                    output = re.sub("&([A-Za-z0-9_]+);", "&\g<1>", output)
-                    self.entries[-1][element] = output
-                    if output:
-                        self.entries[-1]['links'][-1]['href'] = output
-            else:
-                if element == 'description':
-                    element = 'summary'
-                old_value_depth = self.property_depth_map.setdefault(self.entries[-1], {}).get(element)
-                if old_value_depth is None or self.depth <= old_value_depth:
-                    self.property_depth_map[self.entries[-1]][element] = self.depth
-                    self.entries[-1][element] = output
-                if self.incontent:
-                    contentparams = copy.deepcopy(self.contentparams)
-                    contentparams['value'] = output
-                    self.entries[-1][element + '_detail'] = contentparams
-        elif (self.infeed or self.insource):# and (not self.intextinput) and (not self.inimage):
-            context = self._getContext()
-            if element == 'description':
-                element = 'subtitle'
-            context[element] = output
-            if element == 'link':
-                # fix query variables; see above for the explanation
-                output = re.sub("&([A-Za-z0-9_]+);", "&\g<1>", output)
-                context[element] = output
-                context['links'][-1]['href'] = output
-            elif self.incontent:
-                contentparams = copy.deepcopy(self.contentparams)
-                contentparams['value'] = output
-                context[element + '_detail'] = contentparams
-        return output
-
-    def pushContent(self, tag, attrsD, defaultContentType, expectingText):
-        self.incontent += 1
-        if self.lang:
-            self.lang=self.lang.replace('_','-')
-        self.contentparams = FeedParserDict({
-            'type': self.mapContentType(attrsD.get('type', defaultContentType)),
-            'language': self.lang,
-            'base': self.baseuri})
-        self.contentparams['base64'] = self._isBase64(attrsD, self.contentparams)
-        self.push(tag, expectingText)
-
-    def popContent(self, tag):
-        value = self.pop(tag)
-        self.incontent -= 1
-        self.contentparams.clear()
-        return value
-
-    # a number of elements in a number of RSS variants are nominally plain
-    # text, but this is routinely ignored.  This is an attempt to detect
-    # the most common cases.  As false positives often result in silent
-    # data loss, this function errs on the conservative side.
-    @staticmethod
-    def lookslikehtml(s):
-        # must have a close tag or an entity reference to qualify
-        if not (re.search(r'</(\w+)>',s) or re.search("&#?\w+;",s)):
-            return
-
-        # all tags must be in a restricted subset of valid HTML tags
-        if filter(lambda t: t.lower() not in _HTMLSanitizer.acceptable_elements,
-            re.findall(r'</?(\w+)',s)):
-            return
-
-        # all entities must have been defined as valid HTML entities
-        if filter(lambda e: e not in entitydefs.keys(), re.findall(r'&(\w+);', s)):
-            return
-
-        return 1
-
-    def _mapToStandardPrefix(self, name):
-        colonpos = name.find(':')
-        if colonpos <> -1:
-            prefix = name[:colonpos]
-            suffix = name[colonpos+1:]
-            prefix = self.namespacemap.get(prefix, prefix)
-            name = prefix + ':' + suffix
-        return name
-
-    def _getAttribute(self, attrsD, name):
-        return attrsD.get(self._mapToStandardPrefix(name))
-
-    def _isBase64(self, attrsD, contentparams):
-        if attrsD.get('mode', '') == 'base64':
-            return 1
-        if self.contentparams['type'].startswith(u'text/'):
-            return 0
-        if self.contentparams['type'].endswith(u'+xml'):
-            return 0
-        if self.contentparams['type'].endswith(u'/xml'):
-            return 0
-        return 1
-
-    def _itsAnHrefDamnIt(self, attrsD):
-        href = attrsD.get('url', attrsD.get('uri', attrsD.get('href', None)))
-        if href:
-            try:
-                del attrsD['url']
-            except KeyError:
-                pass
-            try:
-                del attrsD['uri']
-            except KeyError:
-                pass
-            attrsD['href'] = href
-        return attrsD
-
-    def _save(self, key, value, overwrite=False):
-        context = self._getContext()
-        if overwrite:
-            context[key] = value
-        else:
-            context.setdefault(key, value)
-
-    def _start_rss(self, attrsD):
-        versionmap = {'0.91': u'rss091u',
-                      '0.92': u'rss092',
-                      '0.93': u'rss093',
-                      '0.94': u'rss094'}
-        #If we're here then this is an RSS feed.
-        #If we don't have a version or have a version that starts with something
-        #other than RSS then there's been a mistake. Correct it.
-        if not self.version or not self.version.startswith(u'rss'):
-            attr_version = attrsD.get('version', '')
-            version = versionmap.get(attr_version)
-            if version:
-                self.version = version
-            elif attr_version.startswith('2.'):
-                self.version = u'rss20'
-            else:
-                self.version = u'rss'
-
-    def _start_channel(self, attrsD):
-        self.infeed = 1
-        self._cdf_common(attrsD)
-
-    def _cdf_common(self, attrsD):
-        if 'lastmod' in attrsD:
-            self._start_modified({})
-            self.elementstack[-1][-1] = attrsD['lastmod']
-            self._end_modified()
-        if 'href' in attrsD:
-            self._start_link({})
-            self.elementstack[-1][-1] = attrsD['href']
-            self._end_link()
-
-    def _start_feed(self, attrsD):
-        self.infeed = 1
-        versionmap = {'0.1': u'atom01',
-                      '0.2': u'atom02',
-                      '0.3': u'atom03'}
-        if not self.version:
-            attr_version = attrsD.get('version')
-            version = versionmap.get(attr_version)
-            if version:
-                self.version = version
-            else:
-                self.version = u'atom'
-
-    def _end_channel(self):
-        self.infeed = 0
-    _end_feed = _end_channel
-
-    def _start_image(self, attrsD):
-        context = self._getContext()
-        if not self.inentry:
-            context.setdefault('image', FeedParserDict())
-        self.inimage = 1
-        self.title_depth = -1
-        self.push('image', 0)
-
-    def _end_image(self):
-        self.pop('image')
-        self.inimage = 0
-
-    def _start_textinput(self, attrsD):
-        context = self._getContext()
-        context.setdefault('textinput', FeedParserDict())
-        self.intextinput = 1
-        self.title_depth = -1
-        self.push('textinput', 0)
-    _start_textInput = _start_textinput
-
-    def _end_textinput(self):
-        self.pop('textinput')
-        self.intextinput = 0
-    _end_textInput = _end_textinput
-
-    def _start_author(self, attrsD):
-        self.inauthor = 1
-        self.push('author', 1)
-        # Append a new FeedParserDict when expecting an author
-        context = self._getContext()
-        context.setdefault('authors', [])
-        context['authors'].append(FeedParserDict())
-    _start_managingeditor = _start_author
-    _start_dc_author = _start_author
-    _start_dc_creator = _start_author
-    _start_itunes_author = _start_author
-
-    def _end_author(self):
-        self.pop('author')
-        self.inauthor = 0
-        self._sync_author_detail()
-    _end_managingeditor = _end_author
-    _end_dc_author = _end_author
-    _end_dc_creator = _end_author
-    _end_itunes_author = _end_author
-
-    def _start_itunes_owner(self, attrsD):
-        self.inpublisher = 1
-        self.push('publisher', 0)
-
-    def _end_itunes_owner(self):
-        self.pop('publisher')
-        self.inpublisher = 0
-        self._sync_author_detail('publisher')
-
-    def _start_contributor(self, attrsD):
-        self.incontributor = 1
-        context = self._getContext()
-        context.setdefault('contributors', [])
-        context['contributors'].append(FeedParserDict())
-        self.push('contributor', 0)
-
-    def _end_contributor(self):
-        self.pop('contributor')
-        self.incontributor = 0
-
-    def _start_dc_contributor(self, attrsD):
-        self.incontributor = 1
-        context = self._getContext()
-        context.setdefault('contributors', [])
-        context['contributors'].append(FeedParserDict())
-        self.push('name', 0)
-
-    def _end_dc_contributor(self):
-        self._end_name()
-        self.incontributor = 0
-
-    def _start_name(self, attrsD):
-        self.push('name', 0)
-    _start_itunes_name = _start_name
-
-    def _end_name(self):
-        value = self.pop('name')
-        if self.inpublisher:
-            self._save_author('name', value, 'publisher')
-        elif self.inauthor:
-            self._save_author('name', value)
-        elif self.incontributor:
-            self._save_contributor('name', value)
-        elif self.intextinput:
-            context = self._getContext()
-            context['name'] = value
-    _end_itunes_name = _end_name
-
-    def _start_width(self, attrsD):
-        self.push('width', 0)
-
-    def _end_width(self):
-        value = self.pop('width')
-        try:
-            value = int(value)
-        except ValueError:
-            value = 0
-        if self.inimage:
-            context = self._getContext()
-            context['width'] = value
-
-    def _start_height(self, attrsD):
-        self.push('height', 0)
-
-    def _end_height(self):
-        value = self.pop('height')
-        try:
-            value = int(value)
-        except ValueError:
-            value = 0
-        if self.inimage:
-            context = self._getContext()
-            context['height'] = value
-
-    def _start_url(self, attrsD):
-        self.push('href', 1)
-    _start_homepage = _start_url
-    _start_uri = _start_url
-
-    def _end_url(self):
-        value = self.pop('href')
-        if self.inauthor:
-            self._save_author('href', value)
-        elif self.incontributor:
-            self._save_contributor('href', value)
-    _end_homepage = _end_url
-    _end_uri = _end_url
-
-    def _start_email(self, attrsD):
-        self.push('email', 0)
-    _start_itunes_email = _start_email
-
-    def _end_email(self):
-        value = self.pop('email')
-        if self.inpublisher:
-            self._save_author('email', value, 'publisher')
-        elif self.inauthor:
-            self._save_author('email', value)
-        elif self.incontributor:
-            self._save_contributor('email', value)
-    _end_itunes_email = _end_email
-
-    def _getContext(self):
-        if self.insource:
-            context = self.sourcedata
-        elif self.inimage and 'image' in self.feeddata:
-            context = self.feeddata['image']
-        elif self.intextinput:
-            context = self.feeddata['textinput']
-        elif self.inentry:
-            context = self.entries[-1]
-        else:
-            context = self.feeddata
-        return context
-
-    def _save_author(self, key, value, prefix='author'):
-        context = self._getContext()
-        context.setdefault(prefix + '_detail', FeedParserDict())
-        context[prefix + '_detail'][key] = value
-        self._sync_author_detail()
-        context.setdefault('authors', [FeedParserDict()])
-        context['authors'][-1][key] = value
-
-    def _save_contributor(self, key, value):
-        context = self._getContext()
-        context.setdefault('contributors', [FeedParserDict()])
-        context['contributors'][-1][key] = value
-
-    def _sync_author_detail(self, key='author'):
-        context = self._getContext()
-        detail = context.get('%ss' % key, [FeedParserDict()])[-1]
-        if detail:
-            name = detail.get('name')
-            email = detail.get('email')
-            if name and email:
-                context[key] = u'%s (%s)' % (name, email)
-            elif name:
-                context[key] = name
-            elif email:
-                context[key] = email
-        else:
-            author, email = context.get(key), None
-            if not author:
-                return
-            emailmatch = re.search(ur'''(([a-zA-Z0-9\_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))(\?subject=\S+)?''', author)
-            if emailmatch:
-                email = emailmatch.group(0)
-                # probably a better way to do the following, but it passes all the tests
-                author = author.replace(email, u'')
-                author = author.replace(u'()', u'')
-                author = author.replace(u'<>', u'')
-                author = author.replace(u'&lt;&gt;', u'')
-                author = author.strip()
-                if author and (author[0] == u'('):
-                    author = author[1:]
-                if author and (author[-1] == u')'):
-                    author = author[:-1]
-                author = author.strip()
-            if author or email:
-                context.setdefault('%s_detail' % key, detail)
-            if author:
-                detail['name'] = author
-            if email:
-                detail['email'] = email
-
-    def _start_subtitle(self, attrsD):
-        self.pushContent('subtitle', attrsD, u'text/plain', 1)
-    _start_tagline = _start_subtitle
-    _start_itunes_subtitle = _start_subtitle
-
-    def _end_subtitle(self):
-        self.popContent('subtitle')
-    _end_tagline = _end_subtitle
-    _end_itunes_subtitle = _end_subtitle
-
-    def _start_rights(self, attrsD):
-        self.pushContent('rights', attrsD, u'text/plain', 1)
-    _start_dc_rights = _start_rights
-    _start_copyright = _start_rights
-
-    def _end_rights(self):
-        self.popContent('rights')
-    _end_dc_rights = _end_rights
-    _end_copyright = _end_rights
-
-    def _start_item(self, attrsD):
-        self.entries.append(FeedParserDict())
-        self.push('item', 0)
-        self.inentry = 1
-        self.guidislink = 0
-        self.title_depth = -1
-        self.psc_chapters_flag = None
-        id = self._getAttribute(attrsD, 'rdf:about')
-        if id:
-            context = self._getContext()
-            context['id'] = id
-        self._cdf_common(attrsD)
-    _start_entry = _start_item
-
-    def _end_item(self):
-        self.pop('item')
-        self.inentry = 0
-    _end_entry = _end_item
-
-    def _start_dc_language(self, attrsD):
-        self.push('language', 1)
-    _start_language = _start_dc_language
-
-    def _end_dc_language(self):
-        self.lang = self.pop('language')
-    _end_language = _end_dc_language
-
-    def _start_dc_publisher(self, attrsD):
-        self.push('publisher', 1)
-    _start_webmaster = _start_dc_publisher
-
-    def _end_dc_publisher(self):
-        self.pop('publisher')
-        self._sync_author_detail('publisher')
-    _end_webmaster = _end_dc_publisher
-
-    def _start_dcterms_valid(self, attrsD):
-        self.push('validity', 1)
-
-    def _end_dcterms_valid(self):
-        for validity_detail in self.pop('validity').split(';'):
-            if '=' in validity_detail:
-                key, value = validity_detail.split('=', 1)
-                if key == 'start':
-                    self._save('validity_start', value, overwrite=True)
-                    self._save('validity_start_parsed', _parse_date(value), overwrite=True)
-                elif key == 'end':
-                    self._save('validity_end', value, overwrite=True)
-                    self._save('validity_end_parsed', _parse_date(value), overwrite=True)
-
-    def _start_published(self, attrsD):
-        self.push('published', 1)
-    _start_dcterms_issued = _start_published
-    _start_issued = _start_published
-    _start_pubdate = _start_published
-
-    def _end_published(self):
-        value = self.pop('published')
-        self._save('published_parsed', _parse_date(value), overwrite=True)
-    _end_dcterms_issued = _end_published
-    _end_issued = _end_published
-    _end_pubdate = _end_published
-
-    def _start_updated(self, attrsD):
-        self.push('updated', 1)
-    _start_modified = _start_updated
-    _start_dcterms_modified = _start_updated
-    _start_dc_date = _start_updated
-    _start_lastbuilddate = _start_updated
-
-    def _end_updated(self):
-        value = self.pop('updated')
-        parsed_value = _parse_date(value)
-        self._save('updated_parsed', parsed_value, overwrite=True)
-    _end_modified = _end_updated
-    _end_dcterms_modified = _end_updated
-    _end_dc_date = _end_updated
-    _end_lastbuilddate = _end_updated
-
-    def _start_created(self, attrsD):
-        self.push('created', 1)
-    _start_dcterms_created = _start_created
-
-    def _end_created(self):
-        value = self.pop('created')
-        self._save('created_parsed', _parse_date(value), overwrite=True)
-    _end_dcterms_created = _end_created
-
-    def _start_expirationdate(self, attrsD):
-        self.push('expired', 1)
-
-    def _end_expirationdate(self):
-        self._save('expired_parsed', _parse_date(self.pop('expired')), overwrite=True)
-
-    # geospatial location, or "where", from georss.org
-
-    def _start_georssgeom(self, attrsD):
-        self.push('geometry', 0)
-        context = self._getContext()
-        context['where'] = FeedParserDict()
-
-    _start_georss_point = _start_georssgeom
-    _start_georss_line = _start_georssgeom
-    _start_georss_polygon = _start_georssgeom
-    _start_georss_box = _start_georssgeom
-
-    def _save_where(self, geometry):
-        context = self._getContext()
-        context['where'].update(geometry)
-
-    def _end_georss_point(self):
-        geometry = _parse_georss_point(self.pop('geometry'))
-        if geometry:
-            self._save_where(geometry)
-
-    def _end_georss_line(self):
-        geometry = _parse_georss_line(self.pop('geometry'))
-        if geometry:
-            self._save_where(geometry)
-
-    def _end_georss_polygon(self):
-        this = self.pop('geometry')
-        geometry = _parse_georss_polygon(this)
-        if geometry:
-            self._save_where(geometry)
-
-    def _end_georss_box(self):
-        geometry = _parse_georss_box(self.pop('geometry'))
-        if geometry:
-            self._save_where(geometry)
-
-    def _start_where(self, attrsD):
-        self.push('where', 0)
-        context = self._getContext()
-        context['where'] = FeedParserDict()
-    _start_georss_where = _start_where
-
-    def _parse_srs_attrs(self, attrsD):
-        srsName = attrsD.get('srsname')
-        try:
-            srsDimension = int(attrsD.get('srsdimension', '2'))
-        except ValueError:
-            srsDimension = 2
-        context = self._getContext()
-        context['where']['srsName'] = srsName
-        context['where']['srsDimension'] = srsDimension
-
-    def _start_gml_point(self, attrsD):
-        self._parse_srs_attrs(attrsD)
-        self.ingeometry = 1
-        self.push('geometry', 0)
-
-    def _start_gml_linestring(self, attrsD):
-        self._parse_srs_attrs(attrsD)
-        self.ingeometry = 'linestring'
-        self.push('geometry', 0)
-
-    def _start_gml_polygon(self, attrsD):
-        self._parse_srs_attrs(attrsD)
-        self.push('geometry', 0)
-
-    def _start_gml_exterior(self, attrsD):
-        self.push('geometry', 0)
-
-    def _start_gml_linearring(self, attrsD):
-        self.ingeometry = 'polygon'
-        self.push('geometry', 0)
-
-    def _start_gml_pos(self, attrsD):
-        self.push('pos', 0)
-
-    def _end_gml_pos(self):
-        this = self.pop('pos')
-        context = self._getContext()
-        srsName = context['where'].get('srsName')
-        srsDimension = context['where'].get('srsDimension', 2)
-        swap = True
-        if srsName and "EPSG" in srsName:
-            epsg = int(srsName.split(":")[-1])
-            swap = bool(epsg in _geogCS)
-        geometry = _parse_georss_point(this, swap=swap, dims=srsDimension)
-        if geometry:
-            self._save_where(geometry)
-
-    def _start_gml_poslist(self, attrsD):
-        self.push('pos', 0)
-
-    def _end_gml_poslist(self):
-        this = self.pop('pos')
-        context = self._getContext()
-        srsName = context['where'].get('srsName')
-        srsDimension = context['where'].get('srsDimension', 2)
-        swap = True
-        if srsName and "EPSG" in srsName:
-            epsg = int(srsName.split(":")[-1])
-            swap = bool(epsg in _geogCS)
-        geometry = _parse_poslist(
-            this, self.ingeometry, swap=swap, dims=srsDimension)
-        if geometry:
-            self._save_where(geometry)
-
-    def _end_geom(self):
-        self.ingeometry = 0
-        self.pop('geometry')
-    _end_gml_point = _end_geom
-    _end_gml_linestring = _end_geom
-    _end_gml_linearring = _end_geom
-    _end_gml_exterior = _end_geom
-    _end_gml_polygon = _end_geom
-
-    def _end_where(self):
-        self.pop('where')
-    _end_georss_where = _end_where
-
-    # end geospatial
-
-    def _start_cc_license(self, attrsD):
-        context = self._getContext()
-        value = self._getAttribute(attrsD, 'rdf:resource')
-        attrsD = FeedParserDict()
-        attrsD['rel'] = u'license'
-        if value:
-            attrsD['href']=value
-        context.setdefault('links', []).append(attrsD)
-
-    def _start_creativecommons_license(self, attrsD):
-        self.push('license', 1)
-    _start_creativeCommons_license = _start_creativecommons_license
-
-    def _end_creativecommons_license(self):
-        value = self.pop('license')
-        context = self._getContext()
-        attrsD = FeedParserDict()
-        attrsD['rel'] = u'license'
-        if value:
-            attrsD['href'] = value
-        context.setdefault('links', []).append(attrsD)
-        del context['license']
-    _end_creativeCommons_license = _end_creativecommons_license
-
-    def _addTag(self, term, scheme, label):
-        context = self._getContext()
-        tags = context.setdefault('tags', [])
-        if (not term) and (not scheme) and (not label):
-            return
-        value = FeedParserDict(term=term, scheme=scheme, label=label)
-        if value not in tags:
-            tags.append(value)
-
-    def _start_tags(self, attrsD):
-        # This is a completely-made up element. Its semantics are determined
-        # only by a single feed that precipitated bug report 392 on Google Code.
-        # In short, this is junk code.
-        self.push('tags', 1)
-
-    def _end_tags(self):
-        for term in self.pop('tags').split(','):
-            self._addTag(term.strip(), None, None)
-
-    def _start_category(self, attrsD):
-        term = attrsD.get('term')
-        scheme = attrsD.get('scheme', attrsD.get('domain'))
-        label = attrsD.get('label')
-        self._addTag(term, scheme, label)
-        self.push('category', 1)
-    _start_dc_subject = _start_category
-    _start_keywords = _start_category
-
-    def _start_media_category(self, attrsD):
-        attrsD.setdefault('scheme', u'http://search.yahoo.com/mrss/category_schema')
-        self._start_category(attrsD)
-
-    def _end_itunes_keywords(self):
-        for term in self.pop('itunes_keywords').split(','):
-            if term.strip():
-                self._addTag(term.strip(), u'http://www.itunes.com/', None)
-
-    def _end_media_keywords(self):
-        for term in self.pop('media_keywords').split(','):
-            if term.strip():
-                self._addTag(term.strip(), None, None)
-
-    def _start_itunes_category(self, attrsD):
-        self._addTag(attrsD.get('text'), u'http://www.itunes.com/', None)
-        self.push('category', 1)
-
-    def _end_category(self):
-        value = self.pop('category')
-        if not value:
-            return
-        context = self._getContext()
-        tags = context['tags']
-        if value and len(tags) and not tags[-1]['term']:
-            tags[-1]['term'] = value
-        else:
-            self._addTag(value, None, None)
-    _end_dc_subject = _end_category
-    _end_keywords = _end_category
-    _end_itunes_category = _end_category
-    _end_media_category = _end_category
-
-    def _start_cloud(self, attrsD):
-        self._getContext()['cloud'] = FeedParserDict(attrsD)
-
-    def _start_link(self, attrsD):
-        attrsD.setdefault('rel', u'alternate')
-        if attrsD['rel'] == u'self':
-            attrsD.setdefault('type', u'application/atom+xml')
-        else:
-            attrsD.setdefault('type', u'text/html')
-        context = self._getContext()
-        attrsD = self._itsAnHrefDamnIt(attrsD)
-        if 'href' in attrsD:
-            attrsD['href'] = self.resolveURI(attrsD['href'])
-        expectingText = self.infeed or self.inentry or self.insource
-        context.setdefault('links', [])
-        if not (self.inentry and self.inimage):
-            context['links'].append(FeedParserDict(attrsD))
-        if 'href' in attrsD:
-            expectingText = 0
-            if (attrsD.get('rel') == u'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types):
-                context['link'] = attrsD['href']
-        else:
-            self.push('link', expectingText)
-
-    def _end_link(self):
-        value = self.pop('link')
-
-    def _start_guid(self, attrsD):
-        self.guidislink = (attrsD.get('ispermalink', 'true') == 'true')
-        self.push('id', 1)
-    _start_id = _start_guid
-
-    def _end_guid(self):
-        value = self.pop('id')
-        self._save('guidislink', self.guidislink and 'link' not in self._getContext())
-        if self.guidislink:
-            # guid acts as link, but only if 'ispermalink' is not present or is 'true',
-            # and only if the item doesn't already have a link element
-            self._save('link', value)
-    _end_id = _end_guid
-
-    def _start_title(self, attrsD):
-        if self.svgOK:
-            return self.unknown_starttag('title', attrsD.items())
-        self.pushContent('title', attrsD, u'text/plain', self.infeed or self.inentry or self.insource)
-    _start_dc_title = _start_title
-    _start_media_title = _start_title
-
-    def _end_title(self):
-        if self.svgOK:
-            return
-        value = self.popContent('title')
-        if not value:
-            return
-        self.title_depth = self.depth
-    _end_dc_title = _end_title
-
-    def _end_media_title(self):
-        title_depth = self.title_depth
-        self._end_title()
-        self.title_depth = title_depth
-
-    def _start_description(self, attrsD):
-        context = self._getContext()
-        if 'summary' in context:
-            self._summaryKey = 'content'
-            self._start_content(attrsD)
-        else:
-            self.pushContent('description', attrsD, u'text/html', self.infeed or self.inentry or self.insource)
-    _start_dc_description = _start_description
-    _start_media_description = _start_description
-
-    def _start_abstract(self, attrsD):
-        self.pushContent('description', attrsD, u'text/plain', self.infeed or self.inentry or self.insource)
-
-    def _end_description(self):
-        if self._summaryKey == 'content':
-            self._end_content()
-        else:
-            value = self.popContent('description')
-        self._summaryKey = None
-    _end_abstract = _end_description
-    _end_dc_description = _end_description
-    _end_media_description = _end_description
-
-    def _start_info(self, attrsD):
-        self.pushContent('info', attrsD, u'text/plain', 1)
-    _start_feedburner_browserfriendly = _start_info
-
-    def _end_info(self):
-        self.popContent('info')
-    _end_feedburner_browserfriendly = _end_info
-
-    def _start_generator(self, attrsD):
-        if attrsD:
-            attrsD = self._itsAnHrefDamnIt(attrsD)
-            if 'href' in attrsD:
-                attrsD['href'] = self.resolveURI(attrsD['href'])
-        self._getContext()['generator_detail'] = FeedParserDict(attrsD)
-        self.push('generator', 1)
-
-    def _end_generator(self):
-        value = self.pop('generator')
-        context = self._getContext()
-        if 'generator_detail' in context:
-            context['generator_detail']['name'] = value
-
-    def _start_admin_generatoragent(self, attrsD):
-        self.push('generator', 1)
-        value = self._getAttribute(attrsD, 'rdf:resource')
-        if value:
-            self.elementstack[-1][2].append(value)
-        self.pop('generator')
-        self._getContext()['generator_detail'] = FeedParserDict({'href': value})
-
-    def _start_admin_errorreportsto(self, attrsD):
-        self.push('errorreportsto', 1)
-        value = self._getAttribute(attrsD, 'rdf:resource')
-        if value:
-            self.elementstack[-1][2].append(value)
-        self.pop('errorreportsto')
-
-    def _start_summary(self, attrsD):
-        context = self._getContext()
-        if 'summary' in context:
-            self._summaryKey = 'content'
-            self._start_content(attrsD)
-        else:
-            self._summaryKey = 'summary'
-            self.pushContent(self._summaryKey, attrsD, u'text/plain', 1)
-    _start_itunes_summary = _start_summary
-
-    def _end_summary(self):
-        if self._summaryKey == 'content':
-            self._end_content()
-        else:
-            self.popContent(self._summaryKey or 'summary')
-        self._summaryKey = None
-    _end_itunes_summary = _end_summary
-
-    def _start_enclosure(self, attrsD):
-        attrsD = self._itsAnHrefDamnIt(attrsD)
-        context = self._getContext()
-        attrsD['rel'] = u'enclosure'
-        context.setdefault('links', []).append(FeedParserDict(attrsD))
-
-    def _start_source(self, attrsD):
-        if 'url' in attrsD:
-            # This means that we're processing a source element from an RSS 2.0 feed
-            self.sourcedata['href'] = attrsD[u'url']
-        self.push('source', 1)
-        self.insource = 1
-        self.title_depth = -1
-
-    def _end_source(self):
-        self.insource = 0
-        value = self.pop('source')
-        if value:
-            self.sourcedata['title'] = value
-        self._getContext()['source'] = copy.deepcopy(self.sourcedata)
-        self.sourcedata.clear()
-
-    def _start_content(self, attrsD):
-        self.pushContent('content', attrsD, u'text/plain', 1)
-        src = attrsD.get('src')
-        if src:
-            self.contentparams['src'] = src
-        self.push('content', 1)
-
-    def _start_body(self, attrsD):
-        self.pushContent('content', attrsD, u'application/xhtml+xml', 1)
-    _start_xhtml_body = _start_body
-
-    def _start_content_encoded(self, attrsD):
-        self.pushContent('content', attrsD, u'text/html', 1)
-    _start_fullitem = _start_content_encoded
-
-    def _end_content(self):
-        copyToSummary = self.mapContentType(self.contentparams.get('type')) in ([u'text/plain'] + self.html_types)
-        value = self.popContent('content')
-        if copyToSummary:
-            self._save('summary', value)
-
-    _end_body = _end_content
-    _end_xhtml_body = _end_content
-    _end_content_encoded = _end_content
-    _end_fullitem = _end_content
-
-    def _start_itunes_image(self, attrsD):
-        self.push('itunes_image', 0)
-        if attrsD.get('href'):
-            self._getContext()['image'] = FeedParserDict({'href': attrsD.get('href')})
-        elif attrsD.get('url'):
-            self._getContext()['image'] = FeedParserDict({'href': attrsD.get('url')})
-    _start_itunes_link = _start_itunes_image
-
-    def _end_itunes_block(self):
-        value = self.pop('itunes_block', 0)
-        self._getContext()['itunes_block'] = (value == 'yes') and 1 or 0
-
-    def _end_itunes_explicit(self):
-        value = self.pop('itunes_explicit', 0)
-        # Convert 'yes' -> True, 'clean' to False, and any other value to None
-        # False and None both evaluate as False, so the difference can be ignored
-        # by applications that only need to know if the content is explicit.
-        self._getContext()['itunes_explicit'] = (None, False, True)[(value == 'yes' and 2) or value == 'clean' or 0]
-
-    def _start_media_group(self, attrsD):
-        # don't do anything, but don't break the enclosed tags either
-        pass
-
-    def _start_media_rating(self, attrsD):
-        context = self._getContext()
-        context.setdefault('media_rating', attrsD)
-        self.push('rating', 1)
-
-    def _end_media_rating(self):
-        rating = self.pop('rating')
-        if rating is not None and rating.strip():
-            context = self._getContext()
-            context['media_rating']['content'] = rating
-
-    def _start_media_credit(self, attrsD):
-        context = self._getContext()
-        context.setdefault('media_credit', [])
-        context['media_credit'].append(attrsD)
-        self.push('credit', 1)
-
-    def _end_media_credit(self):
-        credit = self.pop('credit')
-        if credit != None and len(credit.strip()) != 0:
-            context = self._getContext()
-            context['media_credit'][-1]['content'] = credit
-
-    def _start_media_restriction(self, attrsD):
-        context = self._getContext()
-        context.setdefault('media_restriction', attrsD)
-        self.push('restriction', 1)
-
-    def _end_media_restriction(self):
-        restriction = self.pop('restriction')
-        if restriction != None and len(restriction.strip()) != 0:
-            context = self._getContext()
-            context['media_restriction']['content'] = [cc.strip().lower() for cc in restriction.split(' ')]
-
-    def _start_media_license(self, attrsD):
-        context = self._getContext()
-        context.setdefault('media_license', attrsD)
-        self.push('license', 1)
-
-    def _end_media_license(self):
-        license = self.pop('license')
-        if license != None and len(license.strip()) != 0:
-            context = self._getContext()
-            context['media_license']['content'] = license
-
-    def _start_media_content(self, attrsD):
-        context = self._getContext()
-        context.setdefault('media_content', [])
-        context['media_content'].append(attrsD)
-
-    def _start_media_thumbnail(self, attrsD):
-        context = self._getContext()
-        context.setdefault('media_thumbnail', [])
-        self.push('url', 1) # new
-        context['media_thumbnail'].append(attrsD)
-
-    def _end_media_thumbnail(self):
-        url = self.pop('url')
-        context = self._getContext()
-        if url != None and len(url.strip()) != 0:
-            if 'url' not in context['media_thumbnail'][-1]:
-                context['media_thumbnail'][-1]['url'] = url
-
-    def _start_media_player(self, attrsD):
-        self.push('media_player', 0)
-        self._getContext()['media_player'] = FeedParserDict(attrsD)
-
-    def _end_media_player(self):
-        value = self.pop('media_player')
-        context = self._getContext()
-        context['media_player']['content'] = value
-
-    def _start_newlocation(self, attrsD):
-        self.push('newlocation', 1)
-
-    def _end_newlocation(self):
-        url = self.pop('newlocation')
-        context = self._getContext()
-        # don't set newlocation if the context isn't right
-        if context is not self.feeddata:
-            return
-        context['newlocation'] = _makeSafeAbsoluteURI(self.baseuri, url.strip())
-
-    def _start_psc_chapters(self, attrsD):
-        if self.psc_chapters_flag is None:
-	    # Transition from None -> True
-            self.psc_chapters_flag = True
-            attrsD['chapters'] = []
-            self._getContext()['psc_chapters'] = FeedParserDict(attrsD)
-
-    def _end_psc_chapters(self):
-        # Transition from True -> False
-        self.psc_chapters_flag = False
-
-    def _start_psc_chapter(self, attrsD):
-        if self.psc_chapters_flag:
-            start = self._getAttribute(attrsD, 'start')
-            attrsD['start_parsed'] = _parse_psc_chapter_start(start)
-
-            context = self._getContext()['psc_chapters']
-            context['chapters'].append(FeedParserDict(attrsD))
-
-
-if _XML_AVAILABLE:
-    class _StrictFeedParser(_FeedParserMixin, xml.sax.handler.ContentHandler):
-        def __init__(self, baseuri, baselang, encoding):
-            xml.sax.handler.ContentHandler.__init__(self)
-            _FeedParserMixin.__init__(self, baseuri, baselang, encoding)
-            self.bozo = 0
-            self.exc = None
-            self.decls = {}
-
-        def startPrefixMapping(self, prefix, uri):
-            if not uri:
-                return
-            # Jython uses '' instead of None; standardize on None
-            prefix = prefix or None
-            self.trackNamespace(prefix, uri)
-            if prefix and uri == 'http://www.w3.org/1999/xlink':
-                self.decls['xmlns:' + prefix] = uri
-
-        def startElementNS(self, name, qname, attrs):
-            namespace, localname = name
-            lowernamespace = str(namespace or '').lower()
-            if lowernamespace.find(u'backend.userland.com/rss') <> -1:
-                # match any backend.userland.com namespace
-                namespace = u'http://backend.userland.com/rss'
-                lowernamespace = namespace
-            if qname and qname.find(':') > 0:
-                givenprefix = qname.split(':')[0]
-            else:
-                givenprefix = None
-            prefix = self._matchnamespaces.get(lowernamespace, givenprefix)
-            if givenprefix and (prefix == None or (prefix == '' and lowernamespace == '')) and givenprefix not in self.namespacesInUse:
-                raise UndeclaredNamespace, "'%s' is not associated with a namespace" % givenprefix
-            localname = str(localname).lower()
-
-            # qname implementation is horribly broken in Python 2.1 (it
-            # doesn't report any), and slightly broken in Python 2.2 (it
-            # doesn't report the xml: namespace). So we match up namespaces
-            # with a known list first, and then possibly override them with
-            # the qnames the SAX parser gives us (if indeed it gives us any
-            # at all).  Thanks to MatejC for helping me test this and
-            # tirelessly telling me that it didn't work yet.
-            attrsD, self.decls = self.decls, {}
-            if localname=='math' and namespace=='http://www.w3.org/1998/Math/MathML':
-                attrsD['xmlns']=namespace
-            if localname=='svg' and namespace=='http://www.w3.org/2000/svg':
-                attrsD['xmlns']=namespace
-
-            if prefix:
-                localname = prefix.lower() + ':' + localname
-            elif namespace and not qname: #Expat
-                for name,value in self.namespacesInUse.items():
-                    if name and value == namespace:
-                        localname = name + ':' + localname
-                        break
-
-            for (namespace, attrlocalname), attrvalue in attrs.items():
-                lowernamespace = (namespace or '').lower()
-                prefix = self._matchnamespaces.get(lowernamespace, '')
-                if prefix:
-                    attrlocalname = prefix + ':' + attrlocalname
-                attrsD[str(attrlocalname).lower()] = attrvalue
-            for qname in attrs.getQNames():
-                attrsD[str(qname).lower()] = attrs.getValueByQName(qname)
-            localname = str(localname).lower()
-            self.unknown_starttag(localname, attrsD.items())
-
-        def characters(self, text):
-            self.handle_data(text)
-
-        def endElementNS(self, name, qname):
-            namespace, localname = name
-            lowernamespace = str(namespace or '').lower()
-            if qname and qname.find(':') > 0:
-                givenprefix = qname.split(':')[0]
-            else:
-                givenprefix = ''
-            prefix = self._matchnamespaces.get(lowernamespace, givenprefix)
-            if prefix:
-                localname = prefix + ':' + localname
-            elif namespace and not qname: #Expat
-                for name,value in self.namespacesInUse.items():
-                    if name and value == namespace:
-                        localname = name + ':' + localname
-                        break
-            localname = str(localname).lower()
-            self.unknown_endtag(localname)
-
-        def error(self, exc):
-            self.bozo = 1
-            self.exc = exc
-
-        # drv_libxml2 calls warning() in some cases
-        warning = error
-
-        def fatalError(self, exc):
-            self.error(exc)
-            raise exc
-
-class _BaseHTMLProcessor(sgmllib.SGMLParser):
-    special = re.compile('''[<>'"]''')
-    bare_ampersand = re.compile("&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)")
-    elements_no_end_tag = set([
-      'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame',
-      'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param',
-      'source', 'track', 'wbr'
-    ])
-
-    def __init__(self, encoding, _type):
-        self.encoding = encoding
-        self._type = _type
-        sgmllib.SGMLParser.__init__(self)
-
-    def reset(self):
-        self.pieces = []
-        sgmllib.SGMLParser.reset(self)
-
-    def _shorttag_replace(self, match):
-        tag = match.group(1)
-        if tag in self.elements_no_end_tag:
-            return '<' + tag + ' />'
-        else:
-            return '<' + tag + '></' + tag + '>'
-
-    # By declaring these methods and overriding their compiled code
-    # with the code from sgmllib, the original code will execute in
-    # feedparser's scope instead of sgmllib's. This means that the
-    # `tagfind` and `charref` regular expressions will be found as
-    # they're declared above, not as they're declared in sgmllib.
-    def goahead(self, i):
-        pass
-    goahead.func_code = sgmllib.SGMLParser.goahead.func_code
-
-    def __parse_starttag(self, i):
-        pass
-    __parse_starttag.func_code = sgmllib.SGMLParser.parse_starttag.func_code
-
-    def parse_starttag(self,i):
-        j = self.__parse_starttag(i)
-        if self._type == 'application/xhtml+xml':
-            if j>2 and self.rawdata[j-2:j]=='/>':
-                self.unknown_endtag(self.lasttag)
-        return j
-
-    def feed(self, data):
-        data = re.compile(r'<!((?!DOCTYPE|--|\[))', re.IGNORECASE).sub(r'&lt;!\1', data)
-        data = re.sub(r'<([^<>\s]+?)\s*/>', self._shorttag_replace, data)
-        data = data.replace('&#39;', "'")
-        data = data.replace('&#34;', '"')
-        try:
-            bytes
-            if bytes is str:
-                raise NameError
-            self.encoding = self.encoding + u'_INVALID_PYTHON_3'
-        except NameError:
-            if self.encoding and isinstance(data, unicode):
-                data = data.encode(self.encoding)
-        sgmllib.SGMLParser.feed(self, data)
-        sgmllib.SGMLParser.close(self)
-
-    def normalize_attrs(self, attrs):
-        if not attrs:
-            return attrs
-        # utility method to be called by descendants
-        attrs = dict([(k.lower(), v) for k, v in attrs]).items()
-        attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs]
-        attrs.sort()
-        return attrs
-
-    def unknown_starttag(self, tag, attrs):
-        # called for each start tag
-        # attrs is a list of (attr, value) tuples
-        # e.g. for <pre class='screen'>, tag='pre', attrs=[('class', 'screen')]
-        uattrs = []
-        strattrs=''
-        if attrs:
-            for key, value in attrs:
-                value=value.replace('>','&gt;').replace('<','&lt;').replace('"','&quot;')
-                value = self.bare_ampersand.sub("&amp;", value)
-                # thanks to Kevin Marks for this breathtaking hack to deal with (valid) high-bit attribute values in UTF-8 feeds
-                if not isinstance(value, unicode):
-                    value = value.decode(self.encoding, 'ignore')
-                try:
-                    # Currently, in Python 3 the key is already a str, and cannot be decoded again
-                    uattrs.append((unicode(key, self.encoding), value))
-                except TypeError:
-                    uattrs.append((key, value))
-            strattrs = u''.join([u' %s="%s"' % (key, value) for key, value in uattrs])
-            if self.encoding:
-                try:
-                    strattrs = strattrs.encode(self.encoding)
-                except (UnicodeEncodeError, LookupError):
-                    pass
-        if tag in self.elements_no_end_tag:
-            self.pieces.append('<%s%s />' % (tag, strattrs))
-        else:
-            self.pieces.append('<%s%s>' % (tag, strattrs))
-
-    def unknown_endtag(self, tag):
-        # called for each end tag, e.g. for </pre>, tag will be 'pre'
-        # Reconstruct the original end tag.
-        if tag not in self.elements_no_end_tag:
-            self.pieces.append("</%s>" % tag)
-
-    def handle_charref(self, ref):
-        # called for each character reference, e.g. for '&#160;', ref will be '160'
-        # Reconstruct the original character reference.
-        ref = ref.lower()
-        if ref.startswith('x'):
-            value = int(ref[1:], 16)
-        else:
-            value = int(ref)
-
-        if value in _cp1252:
-            self.pieces.append('&#%s;' % hex(ord(_cp1252[value]))[1:])
-        else:
-            self.pieces.append('&#%s;' % ref)
-
-    def handle_entityref(self, ref):
-        # called for each entity reference, e.g. for '&copy;', ref will be 'copy'
-        # Reconstruct the original entity reference.
-        if ref in name2codepoint or ref == 'apos':
-            self.pieces.append('&%s;' % ref)
-        else:
-            self.pieces.append('&amp;%s' % ref)
-
-    def handle_data(self, text):
-        # called for each block of plain text, i.e. outside of any tag and
-        # not containing any character or entity references
-        # Store the original text verbatim.
-        self.pieces.append(text)
-
-    def handle_comment(self, text):
-        # called for each HTML comment, e.g. <!-- insert Javascript code here -->
-        # Reconstruct the original comment.
-        self.pieces.append('<!--%s-->' % text)
-
-    def handle_pi(self, text):
-        # called for each processing instruction, e.g. <?instruction>
-        # Reconstruct original processing instruction.
-        self.pieces.append('<?%s>' % text)
-
-    def handle_decl(self, text):
-        # called for the DOCTYPE, if present, e.g.
-        # <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-        #     "http://www.w3.org/TR/html4/loose.dtd">
-        # Reconstruct original DOCTYPE
-        self.pieces.append('<!%s>' % text)
-
-    _new_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9:]*\s*').match
-    def _scan_name(self, i, declstartpos):
-        rawdata = self.rawdata
-        n = len(rawdata)
-        if i == n:
-            return None, -1
-        m = self._new_declname_match(rawdata, i)
-        if m:
-            s = m.group()
-            name = s.strip()
-            if (i + len(s)) == n:
-                return None, -1  # end of buffer
-            return name.lower(), m.end()
-        else:
-            self.handle_data(rawdata)
-#            self.updatepos(declstartpos, i)
-            return None, -1
-
-    def convert_charref(self, name):
-        return '&#%s;' % name
-
-    def convert_entityref(self, name):
-        return '&%s;' % name
-
-    def output(self):
-        '''Return processed HTML as a single string'''
-        return ''.join([str(p) for p in self.pieces])
-
-    def parse_declaration(self, i):
-        try:
-            return sgmllib.SGMLParser.parse_declaration(self, i)
-        except sgmllib.SGMLParseError:
-            # escape the doctype declaration and continue parsing
-            self.handle_data('&lt;')
-            return i+1
-
-class _LooseFeedParser(_FeedParserMixin, _BaseHTMLProcessor):
-    def __init__(self, baseuri, baselang, encoding, entities):
-        sgmllib.SGMLParser.__init__(self)
-        _FeedParserMixin.__init__(self, baseuri, baselang, encoding)
-        _BaseHTMLProcessor.__init__(self, encoding, 'application/xhtml+xml')
-        self.entities=entities
-
-    def decodeEntities(self, element, data):
-        data = data.replace('&#60;', '&lt;')
-        data = data.replace('&#x3c;', '&lt;')
-        data = data.replace('&#x3C;', '&lt;')
-        data = data.replace('&#62;', '&gt;')
-        data = data.replace('&#x3e;', '&gt;')
-        data = data.replace('&#x3E;', '&gt;')
-        data = data.replace('&#38;', '&amp;')
-        data = data.replace('&#x26;', '&amp;')
-        data = data.replace('&#34;', '&quot;')
-        data = data.replace('&#x22;', '&quot;')
-        data = data.replace('&#39;', '&apos;')
-        data = data.replace('&#x27;', '&apos;')
-        if not self.contentparams.get('type', u'xml').endswith(u'xml'):
-            data = data.replace('&lt;', '<')
-            data = data.replace('&gt;', '>')
-            data = data.replace('&amp;', '&')
-            data = data.replace('&quot;', '"')
-            data = data.replace('&apos;', "'")
-            data = data.replace('&#x2f;', '/')
-            data = data.replace('&#x2F;', '/')
-        return data
-
-    def strattrs(self, attrs):
-        return ''.join([' %s="%s"' % (n,v.replace('"','&quot;')) for n,v in attrs])
-
-class _RelativeURIResolver(_BaseHTMLProcessor):
-    relative_uris = set([('a', 'href'),
-                     ('applet', 'codebase'),
-                     ('area', 'href'),
-                     ('audio', 'src'),
-                     ('blockquote', 'cite'),
-                     ('body', 'background'),
-                     ('del', 'cite'),
-                     ('form', 'action'),
-                     ('frame', 'longdesc'),
-                     ('frame', 'src'),
-                     ('iframe', 'longdesc'),
-                     ('iframe', 'src'),
-                     ('head', 'profile'),
-                     ('img', 'longdesc'),
-                     ('img', 'src'),
-                     ('img', 'usemap'),
-                     ('input', 'src'),
-                     ('input', 'usemap'),
-                     ('ins', 'cite'),
-                     ('link', 'href'),
-                     ('object', 'classid'),
-                     ('object', 'codebase'),
-                     ('object', 'data'),
-                     ('object', 'usemap'),
-                     ('q', 'cite'),
-                     ('script', 'src'),
-                     ('source', 'src'),
-                     ('video', 'poster'),
-                     ('video', 'src')])
-
-    def __init__(self, baseuri, encoding, _type):
-        _BaseHTMLProcessor.__init__(self, encoding, _type)
-        self.baseuri = baseuri
-
-    def resolveURI(self, uri):
-        return _makeSafeAbsoluteURI(self.baseuri, uri.strip())
-
-    def unknown_starttag(self, tag, attrs):
-        attrs = self.normalize_attrs(attrs)
-        attrs = [(key, ((tag, key) in self.relative_uris) and self.resolveURI(value) or value) for key, value in attrs]
-        _BaseHTMLProcessor.unknown_starttag(self, tag, attrs)
-
-def _resolveRelativeURIs(htmlSource, baseURI, encoding, _type):
-    if not _SGML_AVAILABLE:
-        return htmlSource
-
-    p = _RelativeURIResolver(baseURI, encoding, _type)
-    p.feed(htmlSource)
-    return p.output()
-
-def _makeSafeAbsoluteURI(base, rel=None):
-    # bail if ACCEPTABLE_URI_SCHEMES is empty
-    if not ACCEPTABLE_URI_SCHEMES:
-        return _urljoin(base, rel or u'')
-    if not base:
-        return rel or u''
-    if not rel:
-        try:
-            scheme = urlparse.urlparse(base)[0]
-        except ValueError:
-            return u''
-        if not scheme or scheme in ACCEPTABLE_URI_SCHEMES:
-            return base
-        return u''
-    uri = _urljoin(base, rel)
-    if uri.strip().split(':', 1)[0] not in ACCEPTABLE_URI_SCHEMES:
-        return u''
-    return uri
-
-class _HTMLSanitizer(_BaseHTMLProcessor):
-    acceptable_elements = set(['a', 'abbr', 'acronym', 'address', 'area',
-        'article', 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button',
-        'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup',
-        'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn',
-        'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset',
-        'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1',
-        'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins',
-        'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter',
-        'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option',
-        'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select',
-        'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong',
-        'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot',
-        'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video', 'noscript'])
-
-    acceptable_attributes = set(['abbr', 'accept', 'accept-charset', 'accesskey',
-      'action', 'align', 'alt', 'autocomplete', 'autofocus', 'axis',
-      'background', 'balance', 'bgcolor', 'bgproperties', 'border',
-      'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding',
-      'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff',
-      'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color', 'cols',
-      'colspan', 'compact', 'contenteditable', 'controls', 'coords', 'data',
-      'datafld', 'datapagesize', 'datasrc', 'datetime', 'default', 'delay',
-      'dir', 'disabled', 'draggable', 'dynsrc', 'enctype', 'end', 'face', 'for',
-      'form', 'frame', 'galleryimg', 'gutter', 'headers', 'height', 'hidefocus',
-      'hidden', 'high', 'href', 'hreflang', 'hspace', 'icon', 'id', 'inputmode',
-      'ismap', 'keytype', 'label', 'leftspacing', 'lang', 'list', 'longdesc',
-      'loop', 'loopcount', 'loopend', 'loopstart', 'low', 'lowsrc', 'max',
-      'maxlength', 'media', 'method', 'min', 'multiple', 'name', 'nohref',
-      'noshade', 'nowrap', 'open', 'optimum', 'pattern', 'ping', 'point-size',
-      'poster', 'pqg', 'preload', 'prompt', 'radiogroup', 'readonly', 'rel',
-      'repeat-max', 'repeat-min', 'replace', 'required', 'rev', 'rightspacing',
-      'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', 'span',
-      'src', 'start', 'step', 'summary', 'suppress', 'tabindex', 'target',
-      'template', 'title', 'toppadding', 'type', 'unselectable', 'usemap',
-      'urn', 'valign', 'value', 'variable', 'volume', 'vspace', 'vrml',
-      'width', 'wrap', 'xml:lang'])
-
-    unacceptable_elements_with_end_tag = set(['script', 'applet', 'style'])
-
-    acceptable_css_properties = set(['azimuth', 'background-color',
-      'border-bottom-color', 'border-collapse', 'border-color',
-      'border-left-color', 'border-right-color', 'border-top-color', 'clear',
-      'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font',
-      'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight',
-      'height', 'letter-spacing', 'line-height', 'overflow', 'pause',
-      'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness',
-      'speak', 'speak-header', 'speak-numeral', 'speak-punctuation',
-      'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent',
-      'unicode-bidi', 'vertical-align', 'voice-family', 'volume',
-      'white-space', 'width'])
-
-    # survey of common keywords found in feeds
-    acceptable_css_keywords = set(['auto', 'aqua', 'black', 'block', 'blue',
-      'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed',
-      'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left',
-      'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive',
-      'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top',
-      'transparent', 'underline', 'white', 'yellow'])
-
-    valid_css_values = re.compile('^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|' +
-      '\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$')
-
-    mathml_elements = set([
-        'annotation',
-        'annotation-xml',
-        'maction',
-        'maligngroup',
-        'malignmark',
-        'math',
-        'menclose',
-        'merror',
-        'mfenced',
-        'mfrac',
-        'mglyph',
-        'mi',
-        'mlabeledtr',
-        'mlongdiv',
-        'mmultiscripts',
-        'mn',
-        'mo',
-        'mover',
-        'mpadded',
-        'mphantom',
-        'mprescripts',
-        'mroot',
-        'mrow',
-        'ms',
-        'mscarries',
-        'mscarry',
-        'msgroup',
-        'msline',
-        'mspace',
-        'msqrt',
-        'msrow',
-        'mstack',
-        'mstyle',
-        'msub',
-        'msubsup',
-        'msup',
-        'mtable',
-        'mtd',
-        'mtext',
-        'mtr',
-        'munder',
-        'munderover',
-        'none',
-        'semantics',
-    ])
-
-    mathml_attributes = set([
-        'accent',
-        'accentunder',
-        'actiontype',
-        'align',
-        'alignmentscope',
-        'altimg',
-        'altimg-height',
-        'altimg-valign',
-        'altimg-width',
-        'alttext',
-        'bevelled',
-        'charalign',
-        'close',
-        'columnalign',
-        'columnlines',
-        'columnspacing',
-        'columnspan',
-        'columnwidth',
-        'crossout',
-        'decimalpoint',
-        'denomalign',
-        'depth',
-        'dir',
-        'display',
-        'displaystyle',
-        'edge',
-        'encoding',
-        'equalcolumns',
-        'equalrows',
-        'fence',
-        'fontstyle',
-        'fontweight',
-        'form',
-        'frame',
-        'framespacing',
-        'groupalign',
-        'height',
-        'href',
-        'id',
-        'indentalign',
-        'indentalignfirst',
-        'indentalignlast',
-        'indentshift',
-        'indentshiftfirst',
-        'indentshiftlast',
-        'indenttarget',
-        'infixlinebreakstyle',
-        'largeop',
-        'length',
-        'linebreak',
-        'linebreakmultchar',
-        'linebreakstyle',
-        'lineleading',
-        'linethickness',
-        'location',
-        'longdivstyle',
-        'lquote',
-        'lspace',
-        'mathbackground',
-        'mathcolor',
-        'mathsize',
-        'mathvariant',
-        'maxsize',
-        'minlabelspacing',
-        'minsize',
-        'movablelimits',
-        'notation',
-        'numalign',
-        'open',
-        'other',
-        'overflow',
-        'position',
-        'rowalign',
-        'rowlines',
-        'rowspacing',
-        'rowspan',
-        'rquote',
-        'rspace',
-        'scriptlevel',
-        'scriptminsize',
-        'scriptsizemultiplier',
-        'selection',
-        'separator',
-        'separators',
-        'shift',
-        'side',
-        'src',
-        'stackalign',
-        'stretchy',
-        'subscriptshift',
-        'superscriptshift',
-        'symmetric',
-        'voffset',
-        'width',
-        'xlink:href',
-        'xlink:show',
-        'xlink:type',
-        'xmlns',
-        'xmlns:xlink',
-    ])
-
-    # svgtiny - foreignObject + linearGradient + radialGradient + stop
-    svg_elements = set(['a', 'animate', 'animateColor', 'animateMotion',
-      'animateTransform', 'circle', 'defs', 'desc', 'ellipse', 'foreignObject',
-      'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern',
-      'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph', 'mpath',
-      'path', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop',
-      'svg', 'switch', 'text', 'title', 'tspan', 'use'])
-
-    # svgtiny + class + opacity + offset + xmlns + xmlns:xlink
-    svg_attributes = set(['accent-height', 'accumulate', 'additive', 'alphabetic',
-       'arabic-form', 'ascent', 'attributeName', 'attributeType',
-       'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height',
-       'class', 'color', 'color-rendering', 'content', 'cx', 'cy', 'd', 'dx',
-       'dy', 'descent', 'display', 'dur', 'end', 'fill', 'fill-opacity',
-       'fill-rule', 'font-family', 'font-size', 'font-stretch', 'font-style',
-       'font-variant', 'font-weight', 'from', 'fx', 'fy', 'g1', 'g2',
-       'glyph-name', 'gradientUnits', 'hanging', 'height', 'horiz-adv-x',
-       'horiz-origin-x', 'id', 'ideographic', 'k', 'keyPoints', 'keySplines',
-       'keyTimes', 'lang', 'mathematical', 'marker-end', 'marker-mid',
-       'marker-start', 'markerHeight', 'markerUnits', 'markerWidth', 'max',
-       'min', 'name', 'offset', 'opacity', 'orient', 'origin',
-       'overline-position', 'overline-thickness', 'panose-1', 'path',
-       'pathLength', 'points', 'preserveAspectRatio', 'r', 'refX', 'refY',
-       'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures',
-       'restart', 'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv',
-       'stop-color', 'stop-opacity', 'strikethrough-position',
-       'strikethrough-thickness', 'stroke', 'stroke-dasharray',
-       'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin',
-       'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'systemLanguage',
-       'target', 'text-anchor', 'to', 'transform', 'type', 'u1', 'u2',
-       'underline-position', 'underline-thickness', 'unicode', 'unicode-range',
-       'units-per-em', 'values', 'version', 'viewBox', 'visibility', 'width',
-       'widths', 'x', 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole',
-       'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type',
-       'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y', 'y1',
-       'y2', 'zoomAndPan'])
-
-    svg_attr_map = None
-    svg_elem_map = None
-
-    acceptable_svg_properties = set([ 'fill', 'fill-opacity', 'fill-rule',
-      'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin',
-      'stroke-opacity'])
-
-    def reset(self):
-        _BaseHTMLProcessor.reset(self)
-        self.unacceptablestack = 0
-        self.mathmlOK = 0
-        self.svgOK = 0
-
-    def unknown_starttag(self, tag, attrs):
-        acceptable_attributes = self.acceptable_attributes
-        keymap = {}
-        if not tag in self.acceptable_elements or self.svgOK:
-            if tag in self.unacceptable_elements_with_end_tag:
-                self.unacceptablestack += 1
-
-            # add implicit namespaces to html5 inline svg/mathml
-            if self._type.endswith('html'):
-                if not dict(attrs).get('xmlns'):
-                    if tag=='svg':
-                        attrs.append( ('xmlns','http://www.w3.org/2000/svg') )
-                    if tag=='math':
-                        attrs.append( ('xmlns','http://www.w3.org/1998/Math/MathML') )
-
-            # not otherwise acceptable, perhaps it is MathML or SVG?
-            if tag=='math' and ('xmlns','http://www.w3.org/1998/Math/MathML') in attrs:
-                self.mathmlOK += 1
-            if tag=='svg' and ('xmlns','http://www.w3.org/2000/svg') in attrs:
-                self.svgOK += 1
-
-            # chose acceptable attributes based on tag class, else bail
-            if  self.mathmlOK and tag in self.mathml_elements:
-                acceptable_attributes = self.mathml_attributes
-            elif self.svgOK and tag in self.svg_elements:
-                # for most vocabularies, lowercasing is a good idea.  Many
-                # svg elements, however, are camel case
-                if not self.svg_attr_map:
-                    lower=[attr.lower() for attr in self.svg_attributes]
-                    mix=[a for a in self.svg_attributes if a not in lower]
-                    self.svg_attributes = lower
-                    self.svg_attr_map = dict([(a.lower(),a) for a in mix])
-
-                    lower=[attr.lower() for attr in self.svg_elements]
-                    mix=[a for a in self.svg_elements if a not in lower]
-                    self.svg_elements = lower
-                    self.svg_elem_map = dict([(a.lower(),a) for a in mix])
-                acceptable_attributes = self.svg_attributes
-                tag = self.svg_elem_map.get(tag,tag)
-                keymap = self.svg_attr_map
-            elif not tag in self.acceptable_elements:
-                return
-
-        # declare xlink namespace, if needed
-        if self.mathmlOK or self.svgOK:
-            if filter(lambda (n,v): n.startswith('xlink:'),attrs):
-                if not ('xmlns:xlink','http://www.w3.org/1999/xlink') in attrs:
-                    attrs.append(('xmlns:xlink','http://www.w3.org/1999/xlink'))
-
-        clean_attrs = []
-        for key, value in self.normalize_attrs(attrs):
-            if key in acceptable_attributes:
-                key=keymap.get(key,key)
-                # make sure the uri uses an acceptable uri scheme
-                if key == u'href':
-                    value = _makeSafeAbsoluteURI(value)
-                clean_attrs.append((key,value))
-            elif key=='style':
-                clean_value = self.sanitize_style(value)
-                if clean_value:
-                    clean_attrs.append((key,clean_value))
-        _BaseHTMLProcessor.unknown_starttag(self, tag, clean_attrs)
-
-    def unknown_endtag(self, tag):
-        if not tag in self.acceptable_elements:
-            if tag in self.unacceptable_elements_with_end_tag:
-                self.unacceptablestack -= 1
-            if self.mathmlOK and tag in self.mathml_elements:
-                if tag == 'math' and self.mathmlOK:
-                    self.mathmlOK -= 1
-            elif self.svgOK and tag in self.svg_elements:
-                tag = self.svg_elem_map.get(tag,tag)
-                if tag == 'svg' and self.svgOK:
-                    self.svgOK -= 1
-            else:
-                return
-        _BaseHTMLProcessor.unknown_endtag(self, tag)
-
-    def handle_pi(self, text):
-        pass
-
-    def handle_decl(self, text):
-        pass
-
-    def handle_data(self, text):
-        if not self.unacceptablestack:
-            _BaseHTMLProcessor.handle_data(self, text)
-
-    def sanitize_style(self, style):
-        # disallow urls
-        style=re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ',style)
-
-        # gauntlet
-        if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style):
-            return ''
-        # This replaced a regexp that used re.match and was prone to pathological back-tracking.
-        if re.sub("\s*[-\w]+\s*:\s*[^:;]*;?", '', style).strip():
-            return ''
-
-        clean = []
-        for prop,value in re.findall("([-\w]+)\s*:\s*([^:;]*)",style):
-            if not value:
-                continue
-            if prop.lower() in self.acceptable_css_properties:
-                clean.append(prop + ': ' + value + ';')
-            elif prop.split('-')[0].lower() in ['background','border','margin','padding']:
-                for keyword in value.split():
-                    if not keyword in self.acceptable_css_keywords and \
-                        not self.valid_css_values.match(keyword):
-                        break
-                else:
-                    clean.append(prop + ': ' + value + ';')
-            elif self.svgOK and prop.lower() in self.acceptable_svg_properties:
-                clean.append(prop + ': ' + value + ';')
-
-        return ' '.join(clean)
-
-    def parse_comment(self, i, report=1):
-        ret = _BaseHTMLProcessor.parse_comment(self, i, report)
-        if ret >= 0:
-            return ret
-        # if ret == -1, this may be a malicious attempt to circumvent
-        # sanitization, or a page-destroying unclosed comment
-        match = re.compile(r'--[^>]*>').search(self.rawdata, i+4)
-        if match:
-            return match.end()
-        # unclosed comment; deliberately fail to handle_data()
-        return len(self.rawdata)
-
-
-def _sanitizeHTML(htmlSource, encoding, _type):
-    if not _SGML_AVAILABLE:
-        return htmlSource
-    p = _HTMLSanitizer(encoding, _type)
-    htmlSource = htmlSource.replace('<![CDATA[', '&lt;![CDATA[')
-    p.feed(htmlSource)
-    data = p.output()
-    data = data.strip().replace('\r\n', '\n')
-    return data
-
-class _FeedURLHandler(urllib2.HTTPDigestAuthHandler, urllib2.HTTPRedirectHandler, urllib2.HTTPDefaultErrorHandler):
-    def http_error_default(self, req, fp, code, msg, headers):
-        # The default implementation just raises HTTPError.
-        # Forget that.
-        fp.status = code
-        return fp
-
-    def http_error_301(self, req, fp, code, msg, hdrs):
-        result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp,
-                                                            code, msg, hdrs)
-        result.status = code
-        result.newurl = result.geturl()
-        return result
-    # The default implementations in urllib2.HTTPRedirectHandler
-    # are identical, so hardcoding a http_error_301 call above
-    # won't affect anything
-    http_error_300 = http_error_301
-    http_error_302 = http_error_301
-    http_error_303 = http_error_301
-    http_error_307 = http_error_301
-
-    def http_error_401(self, req, fp, code, msg, headers):
-        # Check if
-        # - server requires digest auth, AND
-        # - we tried (unsuccessfully) with basic auth, AND
-        # If all conditions hold, parse authentication information
-        # out of the Authorization header we sent the first time
-        # (for the username and password) and the WWW-Authenticate
-        # header the server sent back (for the realm) and retry
-        # the request with the appropriate digest auth headers instead.
-        # This evil genius hack has been brought to you by Aaron Swartz.
-        host = urlparse.urlparse(req.get_full_url())[1]
-        if base64 is None or 'Authorization' not in req.headers \
-                          or 'WWW-Authenticate' not in headers:
-            return self.http_error_default(req, fp, code, msg, headers)
-        auth = _base64decode(req.headers['Authorization'].split(' ')[1])
-        user, passw = auth.split(':')
-        realm = re.findall('realm="([^"]*)"', headers['WWW-Authenticate'])[0]
-        self.add_password(realm, host, user, passw)
-        retry = self.http_error_auth_reqed('www-authenticate', host, req, headers)
-        self.reset_retry_count()
-        return retry
-
-def _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers):
-    """URL, filename, or string --> stream
-
-    This function lets you define parsers that take any input source
-    (URL, pathname to local or network file, or actual data as a string)
-    and deal with it in a uniform manner.  Returned object is guaranteed
-    to have all the basic stdio read methods (read, readline, readlines).
-    Just .close() the object when you're done with it.
-
-    If the etag argument is supplied, it will be used as the value of an
-    If-None-Match request header.
-
-    If the modified argument is supplied, it can be a tuple of 9 integers
-    (as returned by gmtime() in the standard Python time module) or a date
-    string in any format supported by feedparser. Regardless, it MUST
-    be in GMT (Greenwich Mean Time). It will be reformatted into an
-    RFC 1123-compliant date and used as the value of an If-Modified-Since
-    request header.
-
-    If the agent argument is supplied, it will be used as the value of a
-    User-Agent request header.
-
-    If the referrer argument is supplied, it will be used as the value of a
-    Referer[sic] request header.
-
-    If handlers is supplied, it is a list of handlers used to build a
-    urllib2 opener.
-
-    if request_headers is supplied it is a dictionary of HTTP request headers
-    that will override the values generated by FeedParser.
-
-    :return: A :class:`StringIO.StringIO` or :class:`io.BytesIO`.
-    """
-
-    if hasattr(url_file_stream_or_string, 'read'):
-        return url_file_stream_or_string
-
-    if isinstance(url_file_stream_or_string, basestring) \
-       and urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp', 'file', 'feed'):
-        # Deal with the feed URI scheme
-        if url_file_stream_or_string.startswith('feed:http'):
-            url_file_stream_or_string = url_file_stream_or_string[5:]
-        elif url_file_stream_or_string.startswith('feed:'):
-            url_file_stream_or_string = 'http:' + url_file_stream_or_string[5:]
-        if not agent:
-            agent = USER_AGENT
-        # Test for inline user:password credentials for HTTP basic auth
-        auth = None
-        if base64 and not url_file_stream_or_string.startswith('ftp:'):
-            urltype, rest = urllib.splittype(url_file_stream_or_string)
-            realhost, rest = urllib.splithost(rest)
-            if realhost:
-                user_passwd, realhost = urllib.splituser(realhost)
-                if user_passwd:
-                    url_file_stream_or_string = '%s://%s%s' % (urltype, realhost, rest)
-                    auth = base64.standard_b64encode(user_passwd).strip()
-
-        # iri support
-        if isinstance(url_file_stream_or_string, unicode):
-            url_file_stream_or_string = _convert_to_idn(url_file_stream_or_string)
-
-        # try to open with urllib2 (to use optional headers)
-        request = _build_urllib2_request(url_file_stream_or_string, agent, etag, modified, referrer, auth, request_headers)
-        opener = urllib2.build_opener(*tuple(handlers + [_FeedURLHandler()]))
-        opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent
-        try:
-            return opener.open(request)
-        finally:
-            opener.close() # JohnD
-
-    # try to open with native open function (if url_file_stream_or_string is a filename)
-    try:
-        return open(url_file_stream_or_string, 'rb')
-    except (IOError, UnicodeEncodeError, TypeError):
-        # if url_file_stream_or_string is a unicode object that
-        # cannot be converted to the encoding returned by
-        # sys.getfilesystemencoding(), a UnicodeEncodeError
-        # will be thrown
-        # If url_file_stream_or_string is a string that contains NULL
-        # (such as an XML document encoded in UTF-32), TypeError will
-        # be thrown.
-        pass
-
-    # treat url_file_stream_or_string as string
-    if isinstance(url_file_stream_or_string, unicode):
-        return _StringIO(url_file_stream_or_string.encode('utf-8'))
-    return _StringIO(url_file_stream_or_string)
-
-def _convert_to_idn(url):
-    """Convert a URL to IDN notation"""
-    # this function should only be called with a unicode string
-    # strategy: if the host cannot be encoded in ascii, then
-    # it'll be necessary to encode it in idn form
-    parts = list(urlparse.urlsplit(url))
-    try:
-        parts[1].encode('ascii')
-    except UnicodeEncodeError:
-        # the url needs to be converted to idn notation
-        host = parts[1].rsplit(':', 1)
-        newhost = []
-        port = u''
-        if len(host) == 2:
-            port = host.pop()
-        for h in host[0].split('.'):
-            newhost.append(h.encode('idna').decode('utf-8'))
-        parts[1] = '.'.join(newhost)
-        if port:
-            parts[1] += ':' + port
-        return urlparse.urlunsplit(parts)
-    else:
-        return url
-
-def _build_urllib2_request(url, agent, etag, modified, referrer, auth, request_headers):
-    request = urllib2.Request(url)
-    request.add_header('User-Agent', agent)
-    if etag:
-        request.add_header('If-None-Match', etag)
-    if isinstance(modified, basestring):
-        modified = _parse_date(modified)
-    elif isinstance(modified, datetime.datetime):
-        modified = modified.utctimetuple()
-    if modified:
-        # format into an RFC 1123-compliant timestamp. We can't use
-        # time.strftime() since the %a and %b directives can be affected
-        # by the current locale, but RFC 2616 states that dates must be
-        # in English.
-        short_weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-        months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
-        request.add_header('If-Modified-Since', '%s, %02d %s %04d %02d:%02d:%02d GMT' % (short_weekdays[modified[6]], modified[2], months[modified[1] - 1], modified[0], modified[3], modified[4], modified[5]))
-    if referrer:
-        request.add_header('Referer', referrer)
-    if gzip and zlib:
-        request.add_header('Accept-encoding', 'gzip, deflate')
-    elif gzip:
-        request.add_header('Accept-encoding', 'gzip')
-    elif zlib:
-        request.add_header('Accept-encoding', 'deflate')
-    else:
-        request.add_header('Accept-encoding', '')
-    if auth:
-        request.add_header('Authorization', 'Basic %s' % auth)
-    if ACCEPT_HEADER:
-        request.add_header('Accept', ACCEPT_HEADER)
-    # use this for whatever -- cookies, special headers, etc
-    # [('Cookie','Something'),('x-special-header','Another Value')]
-    for header_name, header_value in request_headers.items():
-        request.add_header(header_name, header_value)
-    request.add_header('A-IM', 'feed') # RFC 3229 support
-    return request
-
-def _parse_psc_chapter_start(start):
-    FORMAT = r'^((\d{2}):)?(\d{2}):(\d{2})(\.(\d{3}))?$'
-
-    m = re.compile(FORMAT).match(start)
-    if m is None:
-        return None
-
-    _, h, m, s, _, ms = m.groups()
-    h, m, s, ms = (int(h or 0), int(m), int(s), int(ms or 0))
-    return datetime.timedelta(0, h*60*60 + m*60 + s, ms*1000)
-
-_date_handlers = []
-def registerDateHandler(func):
-    '''Register a date handler function (takes string, returns 9-tuple date in GMT)'''
-    _date_handlers.insert(0, func)
-
-# ISO-8601 date parsing routines written by Fazal Majid.
-# The ISO 8601 standard is very convoluted and irregular - a full ISO 8601
-# parser is beyond the scope of feedparser and would be a worthwhile addition
-# to the Python library.
-# A single regular expression cannot parse ISO 8601 date formats into groups
-# as the standard is highly irregular (for instance is 030104 2003-01-04 or
-# 0301-04-01), so we use templates instead.
-# Please note the order in templates is significant because we need a
-# greedy match.
-_iso8601_tmpl = ['YYYY-?MM-?DD', 'YYYY-0MM?-?DD', 'YYYY-MM', 'YYYY-?OOO',
-                'YY-?MM-?DD', 'YY-?OOO', 'YYYY',
-                '-YY-?MM', '-OOO', '-YY',
-                '--MM-?DD', '--MM',
-                '---DD',
-                'CC', '']
-_iso8601_re = [
-    tmpl.replace(
-    'YYYY', r'(?P<year>\d{4})').replace(
-    'YY', r'(?P<year>\d\d)').replace(
-    'MM', r'(?P<month>[01]\d)').replace(
-    'DD', r'(?P<day>[0123]\d)').replace(
-    'OOO', r'(?P<ordinal>[0123]\d\d)').replace(
-    'CC', r'(?P<century>\d\d$)')
-    + r'(T?(?P<hour>\d{2}):(?P<minute>\d{2})'
-    + r'(:(?P<second>\d{2}))?'
-    + r'(\.(?P<fracsecond>\d+))?'
-    + r'(?P<tz>[+-](?P<tzhour>\d{2})(:(?P<tzmin>\d{2}))?|Z)?)?'
-    for tmpl in _iso8601_tmpl]
-try:
-    del tmpl
-except NameError:
-    pass
-_iso8601_matches = [re.compile(regex).match for regex in _iso8601_re]
-try:
-    del regex
-except NameError:
-    pass
-
-def _parse_date_iso8601(dateString):
-    '''Parse a variety of ISO-8601-compatible formats like 20040105'''
-    m = None
-    for _iso8601_match in _iso8601_matches:
-        m = _iso8601_match(dateString)
-        if m:
-            break
-    if not m:
-        return
-    if m.span() == (0, 0):
-        return
-    params = m.groupdict()
-    ordinal = params.get('ordinal', 0)
-    if ordinal:
-        ordinal = int(ordinal)
-    else:
-        ordinal = 0
-    year = params.get('year', '--')
-    if not year or year == '--':
-        year = time.gmtime()[0]
-    elif len(year) == 2:
-        # ISO 8601 assumes current century, i.e. 93 -> 2093, NOT 1993
-        year = 100 * int(time.gmtime()[0] / 100) + int(year)
-    else:
-        year = int(year)
-    month = params.get('month', '-')
-    if not month or month == '-':
-        # ordinals are NOT normalized by mktime, we simulate them
-        # by setting month=1, day=ordinal
-        if ordinal:
-            month = 1
-        else:
-            month = time.gmtime()[1]
-    month = int(month)
-    day = params.get('day', 0)
-    if not day:
-        # see above
-        if ordinal:
-            day = ordinal
-        elif params.get('century', 0) or \
-                 params.get('year', 0) or params.get('month', 0):
-            day = 1
-        else:
-            day = time.gmtime()[2]
-    else:
-        day = int(day)
-    # special case of the century - is the first year of the 21st century
-    # 2000 or 2001 ? The debate goes on...
-    if 'century' in params:
-        year = (int(params['century']) - 1) * 100 + 1
-    # in ISO 8601 most fields are optional
-    for field in ['hour', 'minute', 'second', 'tzhour', 'tzmin']:
-        if not params.get(field, None):
-            params[field] = 0
-    hour = int(params.get('hour', 0))
-    minute = int(params.get('minute', 0))
-    second = int(float(params.get('second', 0)))
-    # weekday is normalized by mktime(), we can ignore it
-    weekday = 0
-    daylight_savings_flag = -1
-    tm = [year, month, day, hour, minute, second, weekday,
-          ordinal, daylight_savings_flag]
-    # ISO 8601 time zone adjustments
-    tz = params.get('tz')
-    if tz and tz != 'Z':
-        if tz[0] == '-':
-            tm[3] += int(params.get('tzhour', 0))
-            tm[4] += int(params.get('tzmin', 0))
-        elif tz[0] == '+':
-            tm[3] -= int(params.get('tzhour', 0))
-            tm[4] -= int(params.get('tzmin', 0))
-        else:
-            return None
-    # Python's time.mktime() is a wrapper around the ANSI C mktime(3c)
-    # which is guaranteed to normalize d/m/y/h/m/s.
-    # Many implementations have bugs, but we'll pretend they don't.
-    return time.localtime(time.mktime(tuple(tm)))
-registerDateHandler(_parse_date_iso8601)
-
-# 8-bit date handling routines written by ytrewq1.
-_korean_year  = u'\ub144' # b3e2 in euc-kr
-_korean_month = u'\uc6d4' # bff9 in euc-kr
-_korean_day   = u'\uc77c' # c0cf in euc-kr
-_korean_am    = u'\uc624\uc804' # bfc0 c0fc in euc-kr
-_korean_pm    = u'\uc624\ud6c4' # bfc0 c8c4 in euc-kr
-
-_korean_onblog_date_re = \
-    re.compile('(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})' % \
-               (_korean_year, _korean_month, _korean_day))
-_korean_nate_date_re = \
-    re.compile(u'(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})' % \
-               (_korean_am, _korean_pm))
-def _parse_date_onblog(dateString):
-    '''Parse a string according to the OnBlog 8-bit date format'''
-    m = _korean_onblog_date_re.match(dateString)
-    if not m:
-        return
-    w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
-                {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
-                 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\
-                 'zonediff': '+09:00'}
-    return _parse_date_w3dtf(w3dtfdate)
-registerDateHandler(_parse_date_onblog)
-
-def _parse_date_nate(dateString):
-    '''Parse a string according to the Nate 8-bit date format'''
-    m = _korean_nate_date_re.match(dateString)
-    if not m:
-        return
-    hour = int(m.group(5))
-    ampm = m.group(4)
-    if (ampm == _korean_pm):
-        hour += 12
-    hour = str(hour)
-    if len(hour) == 1:
-        hour = '0' + hour
-    w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
-                {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
-                 'hour': hour, 'minute': m.group(6), 'second': m.group(7),\
-                 'zonediff': '+09:00'}
-    return _parse_date_w3dtf(w3dtfdate)
-registerDateHandler(_parse_date_nate)
-
-# Unicode strings for Greek date strings
-_greek_months = \
-  { \
-   u'\u0399\u03b1\u03bd': u'Jan',       # c9e1ed in iso-8859-7
-   u'\u03a6\u03b5\u03b2': u'Feb',       # d6e5e2 in iso-8859-7
-   u'\u039c\u03ac\u03ce': u'Mar',       # ccdcfe in iso-8859-7
-   u'\u039c\u03b1\u03ce': u'Mar',       # cce1fe in iso-8859-7
-   u'\u0391\u03c0\u03c1': u'Apr',       # c1f0f1 in iso-8859-7
-   u'\u039c\u03ac\u03b9': u'May',       # ccdce9 in iso-8859-7
-   u'\u039c\u03b1\u03ca': u'May',       # cce1fa in iso-8859-7
-   u'\u039c\u03b1\u03b9': u'May',       # cce1e9 in iso-8859-7
-   u'\u0399\u03bf\u03cd\u03bd': u'Jun', # c9effded in iso-8859-7
-   u'\u0399\u03bf\u03bd': u'Jun',       # c9efed in iso-8859-7
-   u'\u0399\u03bf\u03cd\u03bb': u'Jul', # c9effdeb in iso-8859-7
-   u'\u0399\u03bf\u03bb': u'Jul',       # c9f9eb in iso-8859-7
-   u'\u0391\u03cd\u03b3': u'Aug',       # c1fde3 in iso-8859-7
-   u'\u0391\u03c5\u03b3': u'Aug',       # c1f5e3 in iso-8859-7
-   u'\u03a3\u03b5\u03c0': u'Sep',       # d3e5f0 in iso-8859-7
-   u'\u039f\u03ba\u03c4': u'Oct',       # cfeaf4 in iso-8859-7
-   u'\u039d\u03bf\u03ad': u'Nov',       # cdefdd in iso-8859-7
-   u'\u039d\u03bf\u03b5': u'Nov',       # cdefe5 in iso-8859-7
-   u'\u0394\u03b5\u03ba': u'Dec',       # c4e5ea in iso-8859-7
-  }
-
-_greek_wdays = \
-  { \
-   u'\u039a\u03c5\u03c1': u'Sun', # caf5f1 in iso-8859-7
-   u'\u0394\u03b5\u03c5': u'Mon', # c4e5f5 in iso-8859-7
-   u'\u03a4\u03c1\u03b9': u'Tue', # d4f1e9 in iso-8859-7
-   u'\u03a4\u03b5\u03c4': u'Wed', # d4e5f4 in iso-8859-7
-   u'\u03a0\u03b5\u03bc': u'Thu', # d0e5ec in iso-8859-7
-   u'\u03a0\u03b1\u03c1': u'Fri', # d0e1f1 in iso-8859-7
-   u'\u03a3\u03b1\u03b2': u'Sat', # d3e1e2 in iso-8859-7
-  }
-
-_greek_date_format_re = \
-    re.compile(u'([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)')
-
-def _parse_date_greek(dateString):
-    '''Parse a string according to a Greek 8-bit date format.'''
-    m = _greek_date_format_re.match(dateString)
-    if not m:
-        return
-    wday = _greek_wdays[m.group(1)]
-    month = _greek_months[m.group(3)]
-    rfc822date = '%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)s' % \
-                 {'wday': wday, 'day': m.group(2), 'month': month, 'year': m.group(4),\
-                  'hour': m.group(5), 'minute': m.group(6), 'second': m.group(7),\
-                  'zonediff': m.group(8)}
-    return _parse_date_rfc822(rfc822date)
-registerDateHandler(_parse_date_greek)
-
-# Unicode strings for Hungarian date strings
-_hungarian_months = \
-  { \
-    u'janu\u00e1r':   u'01',  # e1 in iso-8859-2
-    u'febru\u00e1ri': u'02',  # e1 in iso-8859-2
-    u'm\u00e1rcius':  u'03',  # e1 in iso-8859-2
-    u'\u00e1prilis':  u'04',  # e1 in iso-8859-2
-    u'm\u00e1ujus':   u'05',  # e1 in iso-8859-2
-    u'j\u00fanius':   u'06',  # fa in iso-8859-2
-    u'j\u00falius':   u'07',  # fa in iso-8859-2
-    u'augusztus':     u'08',
-    u'szeptember':    u'09',
-    u'okt\u00f3ber':  u'10',  # f3 in iso-8859-2
-    u'november':      u'11',
-    u'december':      u'12',
-  }
-
-_hungarian_date_format_re = \
-  re.compile(u'(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))')
-
-def _parse_date_hungarian(dateString):
-    '''Parse a string according to a Hungarian 8-bit date format.'''
-    m = _hungarian_date_format_re.match(dateString)
-    if not m or m.group(2) not in _hungarian_months:
-        return None
-    month = _hungarian_months[m.group(2)]
-    day = m.group(3)
-    if len(day) == 1:
-        day = '0' + day
-    hour = m.group(4)
-    if len(hour) == 1:
-        hour = '0' + hour
-    w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)s' % \
-                {'year': m.group(1), 'month': month, 'day': day,\
-                 'hour': hour, 'minute': m.group(5),\
-                 'zonediff': m.group(6)}
-    return _parse_date_w3dtf(w3dtfdate)
-registerDateHandler(_parse_date_hungarian)
-
-timezonenames = {
-    'ut': 0, 'gmt': 0, 'z': 0,
-    'adt': -3, 'ast': -4, 'at': -4,
-    'edt': -4, 'est': -5, 'et': -5,
-    'cdt': -5, 'cst': -6, 'ct': -6,
-    'mdt': -6, 'mst': -7, 'mt': -7,
-    'pdt': -7, 'pst': -8, 'pt': -8,
-    'a': -1, 'n': 1,
-    'm': -12, 'y': 12,
-}
-# W3 date and time format parser
-# http://www.w3.org/TR/NOTE-datetime
-# Also supports MSSQL-style datetimes as defined at:
-# http://msdn.microsoft.com/en-us/library/ms186724.aspx
-# (basically, allow a space as a date/time/timezone separator)
-def _parse_date_w3dtf(datestr):
-    if not datestr.strip():
-        return None
-    parts = datestr.lower().split('t')
-    if len(parts) == 1:
-        # This may be a date only, or may be an MSSQL-style date
-        parts = parts[0].split()
-        if len(parts) == 1:
-            # Treat this as a date only
-            parts.append('00:00:00z')
-    elif len(parts) > 2:
-        return None
-    date = parts[0].split('-', 2)
-    if not date or len(date[0]) != 4:
-        return None
-    # Ensure that `date` has 3 elements. Using '1' sets the default
-    # month to January and the default day to the 1st of the month.
-    date.extend(['1'] * (3 - len(date)))
-    try:
-        year, month, day = [int(i) for i in date]
-    except ValueError:
-        # `date` may have more than 3 elements or may contain
-        # non-integer strings.
-        return None
-    if parts[1].endswith('z'):
-        parts[1] = parts[1][:-1]
-        parts.append('z')
-    # Append the numeric timezone offset, if any, to parts.
-    # If this is an MSSQL-style date then parts[2] already contains
-    # the timezone information, so `append()` will not affect it.
-    # Add 1 to each value so that if `find()` returns -1 it will be
-    # treated as False.
-    loc = parts[1].find('-') + 1 or parts[1].find('+') + 1 or len(parts[1]) + 1
-    loc = loc - 1
-    parts.append(parts[1][loc:])
-    parts[1] = parts[1][:loc]
-    time = parts[1].split(':', 2)
-    # Ensure that time has 3 elements. Using '0' means that the
-    # minutes and seconds, if missing, will default to 0.
-    time.extend(['0'] * (3 - len(time)))
-    tzhour = 0
-    tzmin = 0
-    if parts[2][:1] in ('-', '+'):
-        try:
-            tzhour = int(parts[2][1:3])
-            tzmin = int(parts[2][4:])
-        except ValueError:
-            return None
-        if parts[2].startswith('-'):
-            tzhour = tzhour * -1
-            tzmin = tzmin * -1
-    else:
-        tzhour = timezonenames.get(parts[2], 0)
-    try:
-        hour, minute, second = [int(float(i)) for i in time]
-    except ValueError:
-        return None
-    # Create the datetime object and timezone delta objects
-    try:
-        stamp = datetime.datetime(year, month, day, hour, minute, second)
-    except ValueError:
-        return None
-    delta = datetime.timedelta(0, 0, 0, 0, tzmin, tzhour)
-    # Return the date and timestamp in a UTC 9-tuple
-    try:
-        return (stamp - delta).utctimetuple()
-    except (OverflowError, ValueError):
-        # IronPython throws ValueErrors instead of OverflowErrors
-        return None
-
-registerDateHandler(_parse_date_w3dtf)
-
-def _parse_date_rfc822(date):
-    """Parse RFC 822 dates and times
-    http://tools.ietf.org/html/rfc822#section-5
-
-    There are some formatting differences that are accounted for:
-    1. Years may be two or four digits.
-    2. The month and day can be swapped.
-    3. Additional timezone names are supported.
-    4. A default time and timezone are assumed if only a date is present.
-    """
-    daynames = set(['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'])
-    months = {
-        'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6,
-        'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12,
-    }
-
-    parts = date.lower().split()
-    if len(parts) < 5:
-        # Assume that the time and timezone are missing
-        parts.extend(('00:00:00', '0000'))
-    # Remove the day name
-    if parts[0][:3] in daynames:
-        parts = parts[1:]
-    if len(parts) < 5:
-        # If there are still fewer than five parts, there's not enough
-        # information to interpret this
-        return None
-    try:
-        day = int(parts[0])
-    except ValueError:
-        # Check if the day and month are swapped
-        if months.get(parts[0][:3]):
-            try:
-                day = int(parts[1])
-            except ValueError:
-                return None
-            else:
-                parts[1] = parts[0]
-        else:
-            return None
-    month = months.get(parts[1][:3])
-    if not month:
-        return None
-    try:
-        year = int(parts[2])
-    except ValueError:
-        return None
-    # Normalize two-digit years:
-    # Anything in the 90's is interpreted as 1990 and on
-    # Anything 89 or less is interpreted as 2089 or before
-    if len(parts[2]) <= 2:
-        year += (1900, 2000)[year < 90]
-    timeparts = parts[3].split(':')
-    timeparts = timeparts + ([0] * (3 - len(timeparts)))
-    try:
-        (hour, minute, second) = map(int, timeparts)
-    except ValueError:
-        return None
-    tzhour = 0
-    tzmin = 0
-    # Strip 'Etc/' from the timezone
-    if parts[4].startswith('etc/'):
-        parts[4] = parts[4][4:]
-    # Normalize timezones that start with 'gmt':
-    # GMT-05:00 => -0500
-    # GMT => GMT
-    if parts[4].startswith('gmt'):
-        parts[4] = ''.join(parts[4][3:].split(':')) or 'gmt'
-    # Handle timezones like '-0500', '+0500', and 'EST'
-    if parts[4] and parts[4][0] in ('-', '+'):
-        try:
-            tzhour = int(parts[4][1:3])
-            tzmin = int(parts[4][3:])
-        except ValueError:
-            return None
-        if parts[4].startswith('-'):
-            tzhour = tzhour * -1
-            tzmin = tzmin * -1
-    else:
-        tzhour = timezonenames.get(parts[4], 0)
-    # Create the datetime object and timezone delta objects
-    try:
-        stamp = datetime.datetime(year, month, day, hour, minute, second)
-    except ValueError:
-        return None
-    delta = datetime.timedelta(0, 0, 0, 0, tzmin, tzhour)
-    # Return the date and timestamp in a UTC 9-tuple
-    try:
-        return (stamp - delta).utctimetuple()
-    except (OverflowError, ValueError):
-        # IronPython throws ValueErrors instead of OverflowErrors
-        return None
-registerDateHandler(_parse_date_rfc822)
-
-_months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
-           'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
-def _parse_date_asctime(dt):
-    """Parse asctime-style dates.
-
-    Converts asctime to RFC822-compatible dates and uses the RFC822 parser
-    to do the actual parsing.
-
-    Supported formats (format is standardized to the first one listed):
-
-    * {weekday name} {month name} dd hh:mm:ss {+-tz} yyyy
-    * {weekday name} {month name} dd hh:mm:ss yyyy
-    """
-
-    parts = dt.split()
-
-    # Insert a GMT timezone, if needed.
-    if len(parts) == 5:
-        parts.insert(4, '+0000')
-
-    # Exit if there are not six parts.
-    if len(parts) != 6:
-        return None
-
-    # Reassemble the parts in an RFC822-compatible order and parse them.
-    return _parse_date_rfc822(' '.join([
-        parts[0], parts[2], parts[1], parts[5], parts[3], parts[4],
-    ]))
-registerDateHandler(_parse_date_asctime)
-
-def _parse_date_perforce(aDateString):
-    """parse a date in yyyy/mm/dd hh:mm:ss TTT format"""
-    # Fri, 2006/09/15 08:19:53 EDT
-    _my_date_pattern = re.compile( \
-        r'(\w{,3}), (\d{,4})/(\d{,2})/(\d{2}) (\d{,2}):(\d{2}):(\d{2}) (\w{,3})')
-
-    m = _my_date_pattern.search(aDateString)
-    if m is None:
-        return None
-    dow, year, month, day, hour, minute, second, tz = m.groups()
-    months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
-    dateString = "%s, %s %s %s %s:%s:%s %s" % (dow, day, months[int(month) - 1], year, hour, minute, second, tz)
-    tm = rfc822.parsedate_tz(dateString)
-    if tm:
-        return time.gmtime(rfc822.mktime_tz(tm))
-registerDateHandler(_parse_date_perforce)
-
-def _parse_date(dateString):
-    '''Parses a variety of date formats into a 9-tuple in GMT'''
-    if not dateString:
-        return None
-    for handler in _date_handlers:
-        try:
-            date9tuple = handler(dateString)
-        except (KeyError, OverflowError, ValueError):
-            continue
-        if not date9tuple:
-            continue
-        if len(date9tuple) != 9:
-            continue
-        return date9tuple
-    return None
-
-# Each marker represents some of the characters of the opening XML
-# processing instruction ('<?xm') in the specified encoding.
-EBCDIC_MARKER = _l2bytes([0x4C, 0x6F, 0xA7, 0x94])
-UTF16BE_MARKER = _l2bytes([0x00, 0x3C, 0x00, 0x3F])
-UTF16LE_MARKER = _l2bytes([0x3C, 0x00, 0x3F, 0x00])
-UTF32BE_MARKER = _l2bytes([0x00, 0x00, 0x00, 0x3C])
-UTF32LE_MARKER = _l2bytes([0x3C, 0x00, 0x00, 0x00])
-
-ZERO_BYTES = _l2bytes([0x00, 0x00])
-
-# Match the opening XML declaration.
-# Example: <?xml version="1.0" encoding="utf-8"?>
-RE_XML_DECLARATION = re.compile('^<\?xml[^>]*?>')
-
-# Capture the value of the XML processing instruction's encoding attribute.
-# Example: <?xml version="1.0" encoding="utf-8"?>
-RE_XML_PI_ENCODING = re.compile(_s2bytes('^<\?.*encoding=[\'"](.*?)[\'"].*\?>'))
-
-def convert_to_utf8(http_headers, data):
-    '''Detect and convert the character encoding to UTF-8.
-
-    http_headers is a dictionary
-    data is a raw string (not Unicode)'''
-
-    # This is so much trickier than it sounds, it's not even funny.
-    # According to RFC 3023 ('XML Media Types'), if the HTTP Content-Type
-    # is application/xml, application/*+xml,
-    # application/xml-external-parsed-entity, or application/xml-dtd,
-    # the encoding given in the charset parameter of the HTTP Content-Type
-    # takes precedence over the encoding given in the XML prefix within the
-    # document, and defaults to 'utf-8' if neither are specified.  But, if
-    # the HTTP Content-Type is text/xml, text/*+xml, or
-    # text/xml-external-parsed-entity, the encoding given in the XML prefix
-    # within the document is ALWAYS IGNORED and only the encoding given in
-    # the charset parameter of the HTTP Content-Type header should be
-    # respected, and it defaults to 'us-ascii' if not specified.
-
-    # Furthermore, discussion on the atom-syntax mailing list with the
-    # author of RFC 3023 leads me to the conclusion that any document
-    # served with a Content-Type of text/* and no charset parameter
-    # must be treated as us-ascii.  (We now do this.)  And also that it
-    # must always be flagged as non-well-formed.  (We now do this too.)
-
-    # If Content-Type is unspecified (input was local file or non-HTTP source)
-    # or unrecognized (server just got it totally wrong), then go by the
-    # encoding given in the XML prefix of the document and default to
-    # 'iso-8859-1' as per the HTTP specification (RFC 2616).
-
-    # Then, assuming we didn't find a character encoding in the HTTP headers
-    # (and the HTTP Content-type allowed us to look in the body), we need
-    # to sniff the first few bytes of the XML data and try to determine
-    # whether the encoding is ASCII-compatible.  Section F of the XML
-    # specification shows the way here:
-    # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info
-
-    # If the sniffed encoding is not ASCII-compatible, we need to make it
-    # ASCII compatible so that we can sniff further into the XML declaration
-    # to find the encoding attribute, which will tell us the true encoding.
-
-    # Of course, none of this guarantees that we will be able to parse the
-    # feed in the declared character encoding (assuming it was declared
-    # correctly, which many are not).  iconv_codec can help a lot;
-    # you should definitely install it if you can.
-    # http://cjkpython.i18n.org/
-
-    bom_encoding = u''
-    xml_encoding = u''
-    rfc3023_encoding = u''
-
-    # Look at the first few bytes of the document to guess what
-    # its encoding may be. We only need to decode enough of the
-    # document that we can use an ASCII-compatible regular
-    # expression to search for an XML encoding declaration.
-    # The heuristic follows the XML specification, section F:
-    # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info
-    # Check for BOMs first.
-    if data[:4] == codecs.BOM_UTF32_BE:
-        bom_encoding = u'utf-32be'
-        data = data[4:]
-    elif data[:4] == codecs.BOM_UTF32_LE:
-        bom_encoding = u'utf-32le'
-        data = data[4:]
-    elif data[:2] == codecs.BOM_UTF16_BE and data[2:4] != ZERO_BYTES:
-        bom_encoding = u'utf-16be'
-        data = data[2:]
-    elif data[:2] == codecs.BOM_UTF16_LE and data[2:4] != ZERO_BYTES:
-        bom_encoding = u'utf-16le'
-        data = data[2:]
-    elif data[:3] == codecs.BOM_UTF8:
-        bom_encoding = u'utf-8'
-        data = data[3:]
-    # Check for the characters '<?xm' in several encodings.
-    elif data[:4] == EBCDIC_MARKER:
-        bom_encoding = u'cp037'
-    elif data[:4] == UTF16BE_MARKER:
-        bom_encoding = u'utf-16be'
-    elif data[:4] == UTF16LE_MARKER:
-        bom_encoding = u'utf-16le'
-    elif data[:4] == UTF32BE_MARKER:
-        bom_encoding = u'utf-32be'
-    elif data[:4] == UTF32LE_MARKER:
-        bom_encoding = u'utf-32le'
-
-    tempdata = data
-    try:
-        if bom_encoding:
-            tempdata = data.decode(bom_encoding).encode('utf-8')
-    except (UnicodeDecodeError, LookupError):
-        # feedparser recognizes UTF-32 encodings that aren't
-        # available in Python 2.4 and 2.5, so it's possible to
-        # encounter a LookupError during decoding.
-        xml_encoding_match = None
-    else:
-        xml_encoding_match = RE_XML_PI_ENCODING.match(tempdata)
-
-    if xml_encoding_match:
-        xml_encoding = xml_encoding_match.groups()[0].decode('utf-8').lower()
-        # Normalize the xml_encoding if necessary.
-        if bom_encoding and (xml_encoding in (
-            u'u16', u'utf-16', u'utf16', u'utf_16',
-            u'u32', u'utf-32', u'utf32', u'utf_32',
-            u'iso-10646-ucs-2', u'iso-10646-ucs-4',
-            u'csucs4', u'csunicode', u'ucs-2', u'ucs-4'
-        )):
-            xml_encoding = bom_encoding
-
-    # Find the HTTP Content-Type and, hopefully, a character
-    # encoding provided by the server. The Content-Type is used
-    # to choose the "correct" encoding among the BOM encoding,
-    # XML declaration encoding, and HTTP encoding, following the
-    # heuristic defined in RFC 3023.
-    http_content_type = http_headers.get('content-type') or ''
-    http_content_type, params = cgi.parse_header(http_content_type)
-    http_encoding = params.get('charset', '').replace("'", "")
-    if not isinstance(http_encoding, unicode):
-        http_encoding = http_encoding.decode('utf-8', 'ignore')
-
-    acceptable_content_type = 0
-    application_content_types = (u'application/xml', u'application/xml-dtd',
-                                 u'application/xml-external-parsed-entity')
-    text_content_types = (u'text/xml', u'text/xml-external-parsed-entity')
-    if (http_content_type in application_content_types) or \
-       (http_content_type.startswith(u'application/') and
-        http_content_type.endswith(u'+xml')):
-        acceptable_content_type = 1
-        rfc3023_encoding = http_encoding or xml_encoding or u'utf-8'
-    elif (http_content_type in text_content_types) or \
-         (http_content_type.startswith(u'text/') and
-          http_content_type.endswith(u'+xml')):
-        acceptable_content_type = 1
-        rfc3023_encoding = http_encoding or u'us-ascii'
-    elif http_content_type.startswith(u'text/'):
-        rfc3023_encoding = http_encoding or u'us-ascii'
-    elif http_headers and 'content-type' not in http_headers:
-        rfc3023_encoding = xml_encoding or u'iso-8859-1'
-    else:
-        rfc3023_encoding = xml_encoding or u'utf-8'
-    # gb18030 is a superset of gb2312, so always replace gb2312
-    # with gb18030 for greater compatibility.
-    if rfc3023_encoding.lower() == u'gb2312':
-        rfc3023_encoding = u'gb18030'
-    if xml_encoding.lower() == u'gb2312':
-        xml_encoding = u'gb18030'
-
-    # there are four encodings to keep track of:
-    # - http_encoding is the encoding declared in the Content-Type HTTP header
-    # - xml_encoding is the encoding declared in the <?xml declaration
-    # - bom_encoding is the encoding sniffed from the first 4 bytes of the XML data
-    # - rfc3023_encoding is the actual encoding, as per RFC 3023 and a variety of other conflicting specifications
-    error = None
-
-    if http_headers and (not acceptable_content_type):
-        if 'content-type' in http_headers:
-            msg = '%s is not an XML media type' % http_headers['content-type']
-        else:
-            msg = 'no Content-type specified'
-        error = NonXMLContentType(msg)
-
-    # determine character encoding
-    known_encoding = 0
-    lazy_chardet_encoding = None
-    tried_encodings = []
-    if chardet:
-        def lazy_chardet_encoding():
-            chardet_encoding = chardet.detect(data)['encoding']
-            if not chardet_encoding:
-                chardet_encoding = ''
-            if not isinstance(chardet_encoding, unicode):
-                chardet_encoding = unicode(chardet_encoding, 'ascii', 'ignore')
-            return chardet_encoding
-    # try: HTTP encoding, declared XML encoding, encoding sniffed from BOM
-    for proposed_encoding in (rfc3023_encoding, xml_encoding, bom_encoding,
-                              lazy_chardet_encoding, u'utf-8', u'windows-1252', u'iso-8859-2'):
-        if callable(proposed_encoding):
-            proposed_encoding = proposed_encoding()
-        if not proposed_encoding:
-            continue
-        if proposed_encoding in tried_encodings:
-            continue
-        tried_encodings.append(proposed_encoding)
-        try:
-            data = data.decode(proposed_encoding)
-        except (UnicodeDecodeError, LookupError):
-            pass
-        else:
-            known_encoding = 1
-            # Update the encoding in the opening XML processing instruction.
-            new_declaration = '''<?xml version='1.0' encoding='utf-8'?>'''
-            if RE_XML_DECLARATION.search(data):
-                data = RE_XML_DECLARATION.sub(new_declaration, data)
-            else:
-                data = new_declaration + u'\n' + data
-            data = data.encode('utf-8')
-            break
-    # if still no luck, give up
-    if not known_encoding:
-        error = CharacterEncodingUnknown(
-            'document encoding unknown, I tried ' +
-            '%s, %s, utf-8, windows-1252, and iso-8859-2 but nothing worked' %
-            (rfc3023_encoding, xml_encoding))
-        rfc3023_encoding = u''
-    elif proposed_encoding != rfc3023_encoding:
-        error = CharacterEncodingOverride(
-            'document declared as %s, but parsed as %s' %
-            (rfc3023_encoding, proposed_encoding))
-        rfc3023_encoding = proposed_encoding
-
-    return data, rfc3023_encoding, error
-
-# Match XML entity declarations.
-# Example: <!ENTITY copyright "(C)">
-RE_ENTITY_PATTERN = re.compile(_s2bytes(r'^\s*<!ENTITY([^>]*?)>'), re.MULTILINE)
-
-# Match XML DOCTYPE declarations.
-# Example: <!DOCTYPE feed [ ]>
-RE_DOCTYPE_PATTERN = re.compile(_s2bytes(r'^\s*<!DOCTYPE([^>]*?)>'), re.MULTILINE)
-
-# Match safe entity declarations.
-# This will allow hexadecimal character references through,
-# as well as text, but not arbitrary nested entities.
-# Example: cubed "&#179;"
-# Example: copyright "(C)"
-# Forbidden: explode1 "&explode2;&explode2;"
-RE_SAFE_ENTITY_PATTERN = re.compile(_s2bytes('\s+(\w+)\s+"(&#\w+;|[^&"]*)"'))
-
-def replace_doctype(data):
-    '''Strips and replaces the DOCTYPE, returns (rss_version, stripped_data)
-
-    rss_version may be 'rss091n' or None
-    stripped_data is the same XML document with a replaced DOCTYPE
-    '''
-
-    # Divide the document into two groups by finding the location
-    # of the first element that doesn't begin with '<?' or '<!'.
-    start = re.search(_s2bytes('<\w'), data)
-    start = start and start.start() or -1
-    head, data = data[:start+1], data[start+1:]
-
-    # Save and then remove all of the ENTITY declarations.
-    entity_results = RE_ENTITY_PATTERN.findall(head)
-    head = RE_ENTITY_PATTERN.sub(_s2bytes(''), head)
-
-    # Find the DOCTYPE declaration and check the feed type.
-    doctype_results = RE_DOCTYPE_PATTERN.findall(head)
-    doctype = doctype_results and doctype_results[0] or _s2bytes('')
-    if _s2bytes('netscape') in doctype.lower():
-        version = u'rss091n'
-    else:
-        version = None
-
-    # Re-insert the safe ENTITY declarations if a DOCTYPE was found.
-    replacement = _s2bytes('')
-    if len(doctype_results) == 1 and entity_results:
-        match_safe_entities = lambda e: RE_SAFE_ENTITY_PATTERN.match(e)
-        safe_entities = filter(match_safe_entities, entity_results)
-        if safe_entities:
-            replacement = _s2bytes('<!DOCTYPE feed [\n<!ENTITY') \
-                        + _s2bytes('>\n<!ENTITY ').join(safe_entities) \
-                        + _s2bytes('>\n]>')
-    data = RE_DOCTYPE_PATTERN.sub(replacement, head) + data
-
-    # Precompute the safe entities for the loose parser.
-    safe_entities = dict((k.decode('utf-8'), v.decode('utf-8'))
-                      for k, v in RE_SAFE_ENTITY_PATTERN.findall(replacement))
-    return version, data, safe_entities
-
-
-# GeoRSS geometry parsers. Each return a dict with 'type' and 'coordinates'
-# items, or None in the case of a parsing error.
-
-def _parse_poslist(value, geom_type, swap=True, dims=2):
-    if geom_type == 'linestring':
-        return _parse_georss_line(value, swap, dims)
-    elif geom_type == 'polygon':
-        ring = _parse_georss_line(value, swap, dims)
-        return {'type': u'Polygon', 'coordinates': (ring['coordinates'],)}
-    else:
-        return None
-
-def _gen_georss_coords(value, swap=True, dims=2):
-    # A generator of (lon, lat) pairs from a string of encoded GeoRSS
-    # coordinates. Converts to floats and swaps order.
-    latlons = itertools.imap(float, value.strip().replace(',', ' ').split())
-    nxt = latlons.next
-    while True:
-        t = [nxt(), nxt()][::swap and -1 or 1]
-        if dims == 3:
-            t.append(nxt())
-        yield tuple(t)
-
-def _parse_georss_point(value, swap=True, dims=2):
-    # A point contains a single latitude-longitude pair, separated by
-    # whitespace. We'll also handle comma separators.
-    try:
-        coords = list(_gen_georss_coords(value, swap, dims))
-        return {u'type': u'Point', u'coordinates': coords[0]}
-    except (IndexError, ValueError):
-        return None
-
-def _parse_georss_line(value, swap=True, dims=2):
-    # A line contains a space separated list of latitude-longitude pairs in
-    # WGS84 coordinate reference system, with each pair separated by
-    # whitespace. There must be at least two pairs.
-    try:
-        coords = list(_gen_georss_coords(value, swap, dims))
-        return {u'type': u'LineString', u'coordinates': coords}
-    except (IndexError, ValueError):
-        return None
-
-def _parse_georss_polygon(value, swap=True, dims=2):
-    # A polygon contains a space separated list of latitude-longitude pairs,
-    # with each pair separated by whitespace. There must be at least four
-    # pairs, with the last being identical to the first (so a polygon has a
-    # minimum of three actual points).
-    try:
-        ring = list(_gen_georss_coords(value, swap, dims))
-    except (IndexError, ValueError):
-        return None
-    if len(ring) < 4:
-        return None
-    return {u'type': u'Polygon', u'coordinates': (ring,)}
-
-def _parse_georss_box(value, swap=True, dims=2):
-    # A bounding box is a rectangular region, often used to define the extents
-    # of a map or a rough area of interest. A box contains two space seperate
-    # latitude-longitude pairs, with each pair separated by whitespace. The
-    # first pair is the lower corner, the second is the upper corner.
-    try:
-        coords = list(_gen_georss_coords(value, swap, dims))
-        return {u'type': u'Box', u'coordinates': tuple(coords)}
-    except (IndexError, ValueError):
-        return None
-
-# end geospatial parsers
-
-
-def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=None, request_headers=None, response_headers=None):
-    '''Parse a feed from a URL, file, stream, or string.
-
-    request_headers, if given, is a dict from http header name to value to add
-    to the request; this overrides internally generated values.
-
-    :return: A :class:`FeedParserDict`.
-    '''
-
-    if handlers is None:
-        handlers = []
-    if request_headers is None:
-        request_headers = {}
-    if response_headers is None:
-        response_headers = {}
-
-    result = FeedParserDict()
-    result['feed'] = FeedParserDict()
-    result['entries'] = []
-    result['bozo'] = 0
-    if not isinstance(handlers, list):
-        handlers = [handlers]
-    try:
-        f = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers, request_headers)
-        data = f.read()
-    except Exception, e:
-        result['bozo'] = 1
-        result['bozo_exception'] = e
-        data = None
-        f = None
-
-    if hasattr(f, 'headers'):
-        result['headers'] = dict(f.headers)
-    # overwrite existing headers using response_headers
-    if 'headers' in result:
-        result['headers'].update(response_headers)
-    elif response_headers:
-        result['headers'] = copy.deepcopy(response_headers)
-
-    # lowercase all of the HTTP headers for comparisons per RFC 2616
-    if 'headers' in result:
-        http_headers = dict((k.lower(), v) for k, v in result['headers'].items())
-    else:
-        http_headers = {}
-
-    # if feed is gzip-compressed, decompress it
-    if f and data and http_headers:
-        if gzip and 'gzip' in http_headers.get('content-encoding', ''):
-            try:
-                data = gzip.GzipFile(fileobj=_StringIO(data)).read()
-            except (IOError, struct.error), e:
-                # IOError can occur if the gzip header is bad.
-                # struct.error can occur if the data is damaged.
-                result['bozo'] = 1
-                result['bozo_exception'] = e
-                if isinstance(e, struct.error):
-                    # A gzip header was found but the data is corrupt.
-                    # Ideally, we should re-request the feed without the
-                    # 'Accept-encoding: gzip' header, but we don't.
-                    data = None
-        elif zlib and 'deflate' in http_headers.get('content-encoding', ''):
-            try:
-                data = zlib.decompress(data)
-            except zlib.error, e:
-                try:
-                    # The data may have no headers and no checksum.
-                    data = zlib.decompress(data, -15)
-                except zlib.error, e:
-                    result['bozo'] = 1
-                    result['bozo_exception'] = e
-
-    # save HTTP headers
-    if http_headers:
-        if 'etag' in http_headers:
-            etag = http_headers.get('etag', u'')
-            if not isinstance(etag, unicode):
-                etag = etag.decode('utf-8', 'ignore')
-            if etag:
-                result['etag'] = etag
-        if 'last-modified' in http_headers:
-            modified = http_headers.get('last-modified', u'')
-            if modified:
-                result['modified'] = modified
-                result['modified_parsed'] = _parse_date(modified)
-    if hasattr(f, 'url'):
-        if not isinstance(f.url, unicode):
-            result['href'] = f.url.decode('utf-8', 'ignore')
-        else:
-            result['href'] = f.url
-        result['status'] = 200
-    if hasattr(f, 'status'):
-        result['status'] = f.status
-    if hasattr(f, 'close'):
-        f.close()
-
-    if data is None:
-        return result
-
-    # Stop processing if the server sent HTTP 304 Not Modified.
-    if getattr(f, 'code', 0) == 304:
-        result['version'] = u''
-        result['debug_message'] = 'The feed has not changed since you last checked, ' + \
-            'so the server sent no data.  This is a feature, not a bug!'
-        return result
-
-    data, result['encoding'], error = convert_to_utf8(http_headers, data)
-    use_strict_parser = result['encoding'] and True or False
-    if error is not None:
-        result['bozo'] = 1
-        result['bozo_exception'] = error
-
-    result['version'], data, entities = replace_doctype(data)
-
-    # Ensure that baseuri is an absolute URI using an acceptable URI scheme.
-    contentloc = http_headers.get('content-location', u'')
-    href = result.get('href', u'')
-    baseuri = _makeSafeAbsoluteURI(href, contentloc) or _makeSafeAbsoluteURI(contentloc) or href
-
-    baselang = http_headers.get('content-language', None)
-    if not isinstance(baselang, unicode) and baselang is not None:
-        baselang = baselang.decode('utf-8', 'ignore')
-
-    if not _XML_AVAILABLE:
-        use_strict_parser = 0
-    if use_strict_parser:
-        # initialize the SAX parser
-        feedparser = _StrictFeedParser(baseuri, baselang, 'utf-8')
-        saxparser = xml.sax.make_parser(PREFERRED_XML_PARSERS)
-        saxparser.setFeature(xml.sax.handler.feature_namespaces, 1)
-        try:
-            # disable downloading external doctype references, if possible
-            saxparser.setFeature(xml.sax.handler.feature_external_ges, 0)
-        except xml.sax.SAXNotSupportedException:
-            pass
-        saxparser.setContentHandler(feedparser)
-        saxparser.setErrorHandler(feedparser)
-        source = xml.sax.xmlreader.InputSource()
-        source.setByteStream(_StringIO(data))
-        try:
-            saxparser.parse(source)
-        except xml.sax.SAXException, e:
-            result['bozo'] = 1
-            result['bozo_exception'] = feedparser.exc or e
-            use_strict_parser = 0
-    if not use_strict_parser and _SGML_AVAILABLE:
-        feedparser = _LooseFeedParser(baseuri, baselang, 'utf-8', entities)
-        feedparser.feed(data.decode('utf-8', 'replace'))
-    result['feed'] = feedparser.feeddata
-    result['entries'] = feedparser.entries
-    result['version'] = result['version'] or feedparser.version
-    result['namespaces'] = feedparser.namespacesInUse
-    return result
-
-# The list of EPSG codes for geographic (latitude/longitude) coordinate
-# systems to support decoding of GeoRSS GML profiles.
-_geogCS = [
-3819, 3821, 3824, 3889, 3906, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008,
-4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4018, 4019, 4020, 4021, 4022,
-4023, 4024, 4025, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036,
-4041, 4042, 4043, 4044, 4045, 4046, 4047, 4052, 4053, 4054, 4055, 4075, 4081,
-4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132,
-4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, 4145,
-4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158,
-4159, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171,
-4172, 4173, 4174, 4175, 4176, 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185,
-4188, 4189, 4190, 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199, 4200,
-4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213,
-4214, 4215, 4216, 4218, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227,
-4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, 4240,
-4241, 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, 4251, 4252, 4253,
-4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266,
-4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279,
-4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4291, 4292, 4293,
-4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303, 4304, 4306, 4307,
-4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4322,
-4324, 4326, 4463, 4470, 4475, 4483, 4490, 4555, 4558, 4600, 4601, 4602, 4603,
-4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616,
-4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629,
-4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642,
-4643, 4644, 4645, 4646, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665,
-4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4678,
-4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, 4690, 4691,
-4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699, 4700, 4701, 4702, 4703, 4704,
-4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, 4716, 4717,
-4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726, 4727, 4728, 4729, 4730,
-4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742, 4743,
-4744, 4745, 4746, 4747, 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755, 4756,
-4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4801, 4802, 4803, 4804,
-4805, 4806, 4807, 4808, 4809, 4810, 4811, 4813, 4814, 4815, 4816, 4817, 4818,
-4819, 4820, 4821, 4823, 4824, 4901, 4902, 4903, 4904, 4979 ]

BIN
Lib python/feedparser-5.2.1/dist/feedparser-5.2.1-py2.7.egg


+ 0 - 5
Lib python/feedparser-5.2.1/docs/_static/feedparser.css

@@ -1,5 +0,0 @@
-.pre, .pre * {
-    font-style: normal;
-    font-family: monospace;
-    white-space: pre;
-}

+ 0 - 3
Lib python/feedparser-5.2.1/docs/add_custom_css.py

@@ -1,3 +0,0 @@
-# Makes Sphinx create a <link> to feedparser.css in the HTML output
-def setup(app):
-    app.add_stylesheet('feedparser.css')

+ 0 - 38
Lib python/feedparser-5.2.1/docs/advanced.rst

@@ -1,38 +0,0 @@
-Advanced Features
-#################
-
-.. toctree::
-   :maxdepth: 2
-
-   date-parsing
-   html-sanitization
-   content-normalization
-   namespace-handling
-   resolving-relative-links
-   version-detection
-   character-encoding
-   bozo
-
-
-
-
-
-
-
-
-
-
-
-
-
-.. COMMENT: <section id="advanced.lang">
-            <?dbhtml filename="language-detection.html"?>
-            <sectioninfo>
-            <abstract>
-            <title/>
-            <para>xxx</para>
-            </abstract>
-            </sectioninfo>
-            <title>Language Detection</title>
-            <para>xxx</para>
-            </section>

+ 0 - 87
Lib python/feedparser-5.2.1/docs/annotated-atom03.rst

@@ -1,87 +0,0 @@
-.. _annotated.atom03:
-
-Atom 0.3
-========
-
-This is a sample Atom 0.3 feed, annotated with links that show how each value
-can be accessed once the feed is parsed.
-
-.. caution::
-
-    Even though many of these elements are required according to the specification,
-    real-world feeds may be missing any element.  If an element is not present in
-    the feed, it will not be present in the parsed results.  You should not rely on
-    any particular element being present.
-
-
-.. rubric:: Annotated Atom 0.3 feed
-
-.. container:: pre
-
-    <?xml version="1.0" encoding=":ref:`utf-8 <reference.encoding>`"?>
-    <feed version=":ref:`0.3 <reference.version>`"
-    xmlns="http\://purl.org/atom/ns#"
-    xml:base="http://example.org/"
-    xml:lang="en">
-    <title type=":ref:`text/plain <reference.feed.title_detail.type>`" mode="escaped">
-    :ref:`Sample Feed <reference.feed.title>`
-    </title>
-    <tagline type=":ref:`text/html <reference.feed.subtitle_detail.type>`" mode="escaped">
-    :ref:`For documentation &lt;em&gt;only&lt;/em&gt; <reference.feed.subtitle>`
-    </tagline>
-    <link rel=":ref:`alternate <reference.feed.links.rel>`"
-    type=":ref:`text/html <reference.feed.links.type>`"
-    href=":ref:`/ <reference.feed.links.href>`"/>
-    <copyright type=":ref:`text/html <reference.feed.rights_detail.type>`" mode="escaped">
-    :ref:`&lt;p>Copyright 2004, Mark Pilgrim&lt;/p>&lt; <reference.feed.rights>`
-    </copyright>
-    <generator url=":ref:`http://example.org/generator/ <reference.feed.generator_detail.href>`" version=":ref:`3.0 <reference.feed.generator_detail.version>`">
-    :ref:`Sample Toolkit <reference.feed.generator>`
-    </generator>
-    <id>\ :ref:`tag:feedparser.org,2004-04-20:/docs/examples/atom03.xml <reference.feed.id>`\</id>
-    <modified>\ :ref:`2004-04-20T11:56:34Z <reference.feed.updated>`\</modified>
-    <info type=":ref:`application/xhtml+xml <reference.feed.info_detail.type>`" mode="xml">
-    :ref:`\<div xmlns="http://www.w3.org/1999/xhtml">\<p>This is an Atom syndication feed.\</p>\</div> <reference.feed.info>`
-    </info>
-    <entry>
-    <title>\ :ref:`First entry title <reference.entry.title>`\</title>
-    <link rel=":ref:`alternate <reference.entry.links.rel>`"
-    type=":ref:`text/html <reference.entry.links.type>`"
-    href=":ref:`/entry/3 <reference.entry.links.href>`"/>
-    <link rel=":ref:`service.edit <reference.entry.links.rel>`"
-    type=":ref:`application/atom+xml <reference.entry.links.type>`"
-    title=":ref:`Atom API entrypoint to edit this entry <reference.entry.links.title>`"
-    href=":ref:`/api/edit/3 <reference.entry.links.href>`"/>
-    <link rel=":ref:`service.post <reference.entry.links.rel>`"
-    type=":ref:`application/atom+xml <reference.entry.links.type>`"
-    title=":ref:`Atom API entrypoint to add comments to this entry <reference.entry.links.title>`"
-    href=":ref:`/api/comment/3 <reference.entry.links.href>`"/>
-    <id>\ :ref:`tag:feedparser.org,2004-04-20:/docs/examples/atom03.xml:3 <reference.entry.id>`\</id>
-    <created>\ :ref:`2004-04-19T07:45:00Z <reference.entry.created>`\</created>
-    <issued>\ :ref:`2004-04-20T00:23:47Z <reference.entry.published>`\</issued>
-    <modified>\ :ref:`2004-04-20T11:56:34Z <reference.entry.updated>`\</modified>
-    <author>
-    <name>\ :ref:`Mark Pilgrim <reference.entry.author_detail.name>`\</name>
-    <url>\ :ref:`http://diveintomark.org/ <reference.entry.author_detail.href>`\</url>
-    <email>\ :ref:`mark@example.org <reference.entry.author_detail.email>`\</email>
-    </author>
-    <contributor>
-    <name>\ :ref:`Joe <reference.entry.contributors.name>`\</name>
-    <url>\ :ref:`http://example.org/joe/ <reference.entry.contributors.href>`\</url>
-    <email>\ :ref:`joe@example.org <reference.entry.contributors.email>`\</email>
-    </contributor>
-    <contributor>
-    <name>\ :ref:`Sam <reference.entry.contributors.name>`\</name>
-    <url>\ :ref:`http://example.org/sam/ <reference.entry.contributors.href>`\</url>
-    <email>\ :ref:`sam@example.org <reference.entry.contributors.email>`\</email>
-    </contributor>
-    <summary type=":ref:`text/plain <reference.entry.summary_detail.type>`" mode="escaped">
-    :ref:`Watch out for nasty tricks <reference.entry.summary>`
-    </summary>
-    <content type=":ref:`application/xhtml+xml <reference.entry.content.type>`" mode="xml"
-    xml:base=":ref:`http://example.org/entry/3 <reference.entry.content.base>`"
-    xml:lang=":ref:`en-US <reference.entry.content.language>`">
-    :ref:`\<div xmlns="http://www.w3.org/1999/xhtml">Watch out for \<span style="background-image: url(javascript:window.location='http://example.org/')"> nasty tricks\</span>\</div> <reference.entry.content.value>`
-    </content>
-    </entry>
-    </feed>

+ 0 - 87
Lib python/feedparser-5.2.1/docs/annotated-atom10.rst

@@ -1,87 +0,0 @@
-.. _annotated.atom10:
-
-Atom 1.0
-========
-
-This is a sample Atom 1.0 feed, annotated with links that show how each value
-can be accessed once the feed is parsed.
-
-.. caution::
-
-    Even though many of these elements are required according to the specification,
-    real-world feeds may be missing any element. If an element is not present in
-    the feed, it will not be present in the parsed results. You should not rely on
-    any particular element being present.
-
-.. rubric:: Annotated Atom 1.0 feed
-
-.. container:: pre
-
-    <?xml version="1.0" encoding=":ref:`utf-8 <reference.encoding>`"?>
-    <feed xmlns=":ref:`http://www.w3.org/2005/Atom <reference.version>`"
-    xml:base=":ref:`http://example.org/ <advanced.base>`"
-    xml:lang=":ref:`en <reference.feed.title_detail.language>`">
-    <title type=":ref:`text <reference.feed.title_detail.type>`">
-    :ref:`Sample Feed <reference.feed.title>`
-    </title>
-    <subtitle type=":ref:`html <reference.feed.subtitle_detail.type>`">
-    :ref:`For documentation &lt;em&gt;only&lt;/em&gt; <reference.feed.subtitle>`
-    </subtitle>
-    <link rel=":ref:`alternate <reference.feed.links.rel>`"
-    type=":ref:`html <reference.feed.links.type>`"
-    href=":ref:`/ <reference.feed.links.href>`"/>
-    <link rel=":ref:`self <reference.feed.links.rel>`"
-    type=":ref:`application/atom+xml <reference.feed.links.type>`"
-    href=":ref:`http://www.example.org/atom10.xml <reference.feed.links.href>`"/>
-    <rights type=":ref:`html <reference.feed.rights_detail.type>`">
-    :ref:`&lt;p>Copyright 2005, Mark Pilgrim&lt;/p> <reference.feed.rights>`
-    </rights>
-    <generator uri=":ref:`http://example.org/generator/ <reference.feed.generator_detail.href>`"
-    version=":ref:`4.0 <reference.feed.generator_detail.version>`">
-    :ref:`Sample Toolkit <reference.feed.generator>`
-    </generator>
-    <id>\ :ref:`tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml <reference.feed.id>`\</id>
-    <updated>\ :ref:`2005-11-09T11:56:34Z <reference.feed.updated>`\</updated>
-    <entry>
-    <title>\ :ref:`First entry title <reference.entry.title>`\</title>
-    <link rel=":ref:`alternate <reference.entry.links.type>`"
-    href=":ref:`/entry/3 <reference.entry.links.href>`"/>
-    <link rel=":ref:`related <reference.entry.links.type>`"
-    type=":ref:`text/html <reference.entry.links.type>`"
-    href=":ref:`http://search.example.com/ <reference.entry.links.href>`"/>
-    <link rel=":ref:`via <reference.entry.links.type>`"
-    type=":ref:`text/html <reference.entry.links.type>`"
-    href=":ref:`http://toby.example.com/examples/atom10 <reference.entry.links.href>`"/>
-    <link rel=":ref:`enclosure <reference.entry.enclosures>`"
-    type=":ref:`video/mpeg4 <reference.entry.enclosures.type>`"
-    href=":ref:`http://www.example.com/movie.mp4 <reference.entry.enclosures.href>`"
-    length=":ref:`42301 <reference.entry.enclosures.length>`"/>
-    <id>\ :ref:`tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml:3 <reference.entry.id>`\</id>
-    <published>\ :ref:`2005-11-09T00:23:47Z <reference.entry.published>`\</published>
-    <updated>\ :ref:`2005-11-09T11:56:34Z <reference.entry.updated>`\</updated>
-    <author>
-    <name>\ :ref:`Mark Pilgrim <reference.entry.author_detail.name>`\</name>
-    <uri>\ :ref:`http://diveintomark.org/ <reference.entry.author_detail.href>`\</uri>
-    <email>\ :ref:`mark@example.org <reference.entry.author_detail.email>`\</email>
-    </author>
-    <contributor>
-    <name>\ :ref:`Joe <reference.entry.contributors.name>`\</name>
-    <url>\ :ref:`http://example.org/joe/ <reference.entry.contributors.href>`\</url>
-    <email>\ :ref:`joe@example.org <reference.entry.contributors.email>`\</email>
-    </contributor>
-    <contributor>
-    <name>\ :ref:`Sam <reference.entry.contributors.name>`\</name>
-    <url>\ :ref:`http://example.org/sam/ <reference.entry.contributors.href>`\</url>
-    <email>\ :ref:`sam@example.org <reference.entry.contributors.email>`\</email>
-    </contributor>
-    <summary type=":ref:`text <reference.entry.summary_detail.type>`">
-    :ref:`Watch out for nasty tricks <reference.entry.summary>`
-    </summary>
-    <content type=":ref:`xhtml <reference.entry.content.type>`"
-    xml:base=":ref:`http://example.org/entry/3 <reference.entry.content.base>`"
-    xml:lang=":ref:`en-US <reference.entry.content.language>`">\ :ref:`\<div xmlns="http://www.w3.org/1999/xhtml">Watch out for
-    \<span style="background-image: url(javascript:window.location='http://example.org/')">
-    nasty tricks\</span>\</div> <reference.entry.content.value>`
-    </content>
-    </entry>
-    </feed>

+ 0 - 14
Lib python/feedparser-5.2.1/docs/annotated-examples.rst

@@ -1,14 +0,0 @@
-.. _annotated:
-
-Annotated Examples
-##################
-
-.. toctree::
-   :maxdepth: 2
-
-   annotated-atom10
-   annotated-atom03
-   annotated-rss20
-   annotated-rss20-dc
-   annotated-rss10
-

+ 0 - 55
Lib python/feedparser-5.2.1/docs/annotated-rss10.rst

@@ -1,55 +0,0 @@
-.. _annotated.rss10:
-
-:abbr:`RSS (Rich Site Summary)` 1.0
-===================================
-
-This is a sample :abbr:`RSS (Rich Site Summary)` 1.0 feed, annotated with links that show how each value can be accessed once the feed is parsed.
-
-.. caution::
-
-    Even though many of these elements are required according to the specification,
-    real-world feeds may be missing any element. If an element is not present in
-    the feed, it will not be present in the parsed results. You should not rely on
-    any particular element being present.
-
-.. rubric:: Annotated :abbr:`RSS (Rich Site Summary)` 1.0 feed
-
-.. container:: pre
-
-    <?xml version="1.0" encoding=":ref:`utf-8 <reference.encoding>`"?>
-    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-    xmlns:dc="http://purl.org/dc/elements/1.1/"
-    xmlns:admin="http://webns.net/mvcb/"
-    xmlns:content="http://purl.org/rss/1.0/modules/content/"
-    xmlns:cc="http://web.resource.org/cc/"
-    xmlns=":ref:`http://purl.org/rss/1.0/ <reference.version>`">
-    <channel rdf:about="http://www.example.org/index.rdf">
-    <title>\ :ref:`Sample Feed <reference.feed.title>`\</title>
-    <link>\ :ref:`http://www.example.org/ <reference.feed.link>`\</link>
-    <description>\ :ref:`For documentation only <reference.feed.subtitle>`\</description>
-    <dc:language>\ :ref:`en <reference.feed.language>`\</dc:language>
-    <cc:license rdf:resource=":ref:`http://web.resource.org/cc/PublicDomain <reference.feed.license>`"/>
-    <dc:creator>\ :ref:`Mark Pilgrim <reference.feed.author_detail.name>` (:ref:`mark@example.org <reference.feed.author_detail.email>`)</dc:creator>
-    <dc:date>\ :ref:`2004-06-04T17:40:33-05:00 <reference.feed.updated>`\</dc:date>
-    <admin:generatorAgent rdf:resource=":ref:`http://www.exampletoolkit.org/ <reference.feed.generator_detail.href>`"/>
-    <admin:errorReportsTo rdf:resource=":ref:`mailto:mark@example.org <reference.feed.errorreportsto>`"/>
-    <items>
-    <rdf:Seq>
-    <rdf:li rdf:resource="http://www.example.org/1" />
-    </rdf:Seq>
-    </items>
-    </channel>
-    <item rdf:about=":ref:`http://www.example.org/1 <reference.entry.id>`">
-    <title>\ :ref:`First of all <reference.entry.title>`\</title>
-    <link>\ :ref:`http://example.org/archives/2002/09/04.html#first_of_all <reference.entry.link>`\</link>
-    <description>
-    :ref:`Americans are fat. Smokers are stupid. People who don't speak Perl are irrelevant. <reference.entry.summary>`
-    </description>
-    <dc:subject>\ :ref:`Quotes <reference.entry.tags.term>`\</dc:subject>
-    <dc:date>\ :ref:`2004-05-30T14:23:54-06:00 <reference.entry.updated>`\</dc:date>
-    <content:encoded><![CDATA[\ :ref:`\<cite>Ian Hickson\</cite>: \<q>\<a href="http://ln.hixie.ch/?start=1030823786&count=1">
-    Americans are fat. Smokers are stupid. People who don't speak Perl are irrelevant.
-    \</a>\</q>]]> <reference.entry.content>`
-    </content:encoded>
-    </item>
-    </rdf:RDF>

+ 0 - 54
Lib python/feedparser-5.2.1/docs/annotated-rss20-dc.rst

@@ -1,54 +0,0 @@
-.. _annotated.rss20dc:
-
-RSS 2.0 with Namespaces
-=======================
-
-This is a sample :abbr:`RSS (Rich Site Summary)` 2.0 feed that uses several
-allowable extension modules in namespaces. The feed is annotated with links
-that show how each value can be accessed once the feed is parsed.
-
-.. caution::
-
-    Even though many of these elements are required according to the specification,
-    real-world feeds may be missing any element.  If an element is not present in
-    the feed, it will not be present in the parsed results.  You should not rely on
-    any particular element being present.
-
-.. rubric:: Annotated :abbr:`RSS (Rich Site Summary)` 2.0 feed with namespaces
-
-.. container:: pre
-
-
-    <?xml version="1.0" encoding=":ref:`utf-8 <reference.encoding>`"?>
-    <rss version=":ref:`2.0 <reference.version>`"
-    xmlns:dc="http://purl.org/dc/elements/1.1/"
-    xmlns:admin="http://webns.net/mvcb/"
-    xmlns:content="http://purl.org/rss/1.0/modules/content/"
-    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-    <channel>
-    <title>\ :ref:`Sample Feed <reference.feed.title>`\</title>
-    <link>\ :ref:`http://example.org/ <reference.feed.link>`\</link>
-    <description>\ :ref:`For documentation only <reference.feed.subtitle>`\</description>
-    <dc:language>\ :ref:`en-us <reference.feed.language>`\</dc:language>
-    <dc:creator>\ :ref:`Mark Pilgrim <reference.feed.author_detail.name>` (:ref:`mark@example.org <reference.feed.author_detail.email>`)</dc:creator>
-    <dc:rights>\ :ref:`Copyright 2004 Mark Pilgrim <reference.feed.rights>`\</dc:rights>
-    <dc:date>\ :ref:`2004-06-04T17:40:33-05:00 <reference.feed.updated>`\</dc:date>
-    <admin:generatorAgent rdf:resource=":ref:`http://www.exampletoolkit.org/ <reference.feed.generator_detail.href>`"/>
-    <admin:errorReportsTo rdf:resource=":ref:`mailto:mark@example.org <reference.feed.errorreportsto>`"/>
-    <item>
-    <title>\ :ref:`First of all <reference.entry.title>`\</title>
-    <link>\ :ref:`http://example.org/archives/2002/09/04.html#first_of_all <reference.entry.link>`\</link>
-    <guid isPermaLink="false">\ :ref:`1983@example.org <reference.entry.id>`\</guid>
-    <description>
-    :ref:`Americans are fat. Smokers are stupid. People who don't speak Perl are irrelevant. <reference.entry.summary>`
-    </description>
-    <dc:subject>\ :ref:`Quotes <reference.entry.tags.term>`\</dc:subject>
-    <dc:date>\ :ref:`2002-09-04T13:54:20-05:00 <reference.entry.updated>`\</dc:date>
-    <content:encoded><![CDATA[:ref:`\<cite>Ian Hickson\</cite>: \<q>\<a href="http://ln.hixie.ch/?start=1030823786&amp;count=1?>
-    Americans are fat. Smokers are stupid. People who don't speak Perl are irrelevant.
-    \</a>\</q> <reference.entry.content.value>`
-    ]]>
-    </content:encoded>
-    </item>
-    </channel>
-    </rss>

+ 0 - 68
Lib python/feedparser-5.2.1/docs/annotated-rss20.rst

@@ -1,68 +0,0 @@
-.. _annotated.rss20:
-
-:abbr:`RSS (Rich Site Summary)` 2.0
-===================================
-
-This is a sample :abbr:`RSS (Rich Site Summary)` 2.0 feed, annotated with links
-that show how each value can be accessed once the feed is parsed.
-
-.. caution::
-
-    Even though many of these elements are required according to the specification,
-    real-world feeds may be missing any element. If an element is not present in
-    the feed, it will not be present in the parsed results. You should not rely on
-    any particular element being present.
-
-.. rubric:: Annotated :abbr:`RSS (Rich Site Summary)` 2.0 feed
-
-.. container:: pre
-
-    <?xml version="1.0" encoding=":ref:`utf-8 <reference.encoding>`"?>
-    <rss version=":ref:`2.0 <reference.version>`">
-    <channel>
-    <title>\ :ref:`Sample Feed <reference.feed.title>`\</title>
-    <description>\ :ref:`For documentation &lt;em&gt;only&lt;/em&gt; <reference.feed.subtitle>`\</description>
-    <link>\ :ref:`http://example.org/ <reference.feed.link>`\</link>
-    <language>\ :ref:`en <reference.feed.language>`\</language>
-    <copyright>\ :ref:`Copyright 2004, Mark Pilgrim <reference.feed.rights>`\</copyright>
-    <managingEditor>\ :ref:`editor@example.org <reference.feed.author>`\</managingEditor>
-    <webMaster>\ :ref:`webmaster@example.org <reference.feed.publisher>`\</webMaster>
-    <pubDate>\ :ref:`Sat, 07 Sep 2002 0:00:01 GMT <reference.feed.published>`\</pubDate>
-    <category>\ :ref:`Examples <reference.feed.tags.term>`\</category>
-    <generator>\ :ref:`Sample Toolkit <reference.feed.generator>`\</generator>
-    <docs>\ :ref:`http://feedvalidator.org/docs/rss2.html <reference.feed.docs>`\</docs>
-    <cloud domain=":ref:`rpc.example.com <reference.feed.cloud.domain>`"
-    port=":ref:`80 <reference.feed.cloud.port>`"
-    path=":ref:`/RPC2 <reference.feed.cloud.path>`"
-    registerProcedure=":ref:`pingMe <reference.feed.cloud.registerProcedure>`"
-    protocol=":ref:`soap <reference.feed.cloud.protocol>`"/>
-    <ttl>\ :ref:`60 <reference.feed.ttl>`\</ttl>
-    <image>
-    <url>\ :ref:`http://example.org/banner.png <reference.feed.image.href>`\</url>
-    <title>\ :ref:`Example banner <reference.feed.image.title>`\</title>
-    <link>\ :ref:`http://example.org/ <reference.feed.image.link>`\</link>
-    <width>\ :ref:`80 <reference.feed.image.width>`\</width>
-    <height>\ :ref:`15 <reference.feed.image.height>`\</height>
-    </image>
-    <textInput>
-    <title>\ :ref:`Search <reference.feed.textinput.title>`\</title>
-    <description>\ :ref:`Search this site: <reference.feed.textinput.description>`\</description>
-    <name>\ :ref:`q <reference.feed.textinput.name>`\</name>
-    <link>\ :ref:`http://example.org/mt/mt-search.cgi <reference.feed.textinput.link>`\</link>
-    </textInput>
-    <item>
-    <title>\ :ref:`First item title <reference.entry.title>`\</title>
-    <link>\ :ref:`http://example.org/item/1 <reference.entry.link>`\</link>
-    <description>\ :ref:`Watch out for
-    &lt;span style="background: url(javascript:window.location='http://example.org/')"&gt;
-    nasty tricks&lt;/span&gt; <reference.entry.summary>`
-    </description>
-    <author>\ :ref:`mark@example.org <reference.entry.author>`\</author>
-    <category>\ :ref:`Miscellaneous <reference.entry.tags.term>`\</category>
-    <comments>\ :ref:`http://example.org/comments/1 <reference.entry.comments>`\</comments>
-    <enclosure url=":ref:`http://example.org/audio/demo.mp3 <reference.entry.enclosures.href>`" length=":ref:`1069871 <reference.entry.enclosures.length>`" type=":ref:`audio/mpeg <reference.entry.enclosures.type>`"/>
-    <guid>\ :ref:`http://example.org/guid/1 <reference.entry.id>`\</guid>
-    <pubDate>\ :ref:`Thu, 05 Sep 2002 0:00:01 GMT <reference.entry.published>`\</pubDate>
-    </item>
-    </channel>
-    </rss>

+ 0 - 49
Lib python/feedparser-5.2.1/docs/atom-detail.rst

@@ -1,49 +0,0 @@
-Getting Detailed Information on Atom Elements
-=============================================
-
-Several Atom elements share the Atom content model: title, subtitle, rights,
-summary, and of course content. (Atom 0.3 also had an info element which
-shared this content model.) :program:`Universal Feed Parser` captures all
-relevant metadata about these elements, most importantly the content type and
-the value itself.
-
-Detailed Information on Feed Elements
--------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> d.feed.title_detail
-    {'type': u'text/plain',
-    'base': u'http://example.org/',
-    'language': u'en',
-    'value': u'Sample Feed'}
-    >>> d.feed.subtitle_detail
-    {'type': u'text/html',
-    'base': u'http://example.org/',
-    'language': u'en',
-    'value': u'For documentation <em>only</em>'}
-    >>> d.feed.rights_detail
-    {'type': u'text/html',
-    'base': u'http://example.org/',
-    'language': u'en',
-    'value': u'<p>Copyright 2004, Mark Pilgrim</p>'}
-    >>> d.entries[0].title_detail
-    {'type': 'text/plain',
-    'base': u'http://example.org/',
-    'language': u'en',
-    'value': u'First entry title'}
-    >>> d.entries[0].summary_detail
-    {'type': u'text/plain',
-    'base': u'http://example.org/',
-    'language': u'en',
-    'value': u'Watch out for nasty tricks'}
-    >>> len(d.entries[0].content)
-    1
-    >>> d.entries[0].content[0]
-    {'type': u'application/xhtml+xml',
-    'base': u'http://example.org/entry/3',
-    'language': u'en-US'
-    'value': u'<div>Watch out for <span> nasty tricks</span></div>'}
-

+ 0 - 26
Lib python/feedparser-5.2.1/docs/basic-existence.rst

@@ -1,26 +0,0 @@
-Testing for Existence
-=====================
-
-Feeds in the real world may be missing elements, even elements that are
-required by the specification.  You should always test for the existence of an
-element before getting its value.  Never assume an element is present.
-
-To test whether elements exist, you can use standard :program:`Python`
-dictionary idioms.
-
-Testing if elements are present
--------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> 'title' in d.feed
-    True
-    >>> 'ttl' in d.feed
-    False
-    >>> d.feed.get('title', 'No title')
-    u'Sample feed'
-    >>> d.feed.get('ttl', 60)
-    60
-

+ 0 - 14
Lib python/feedparser-5.2.1/docs/basic.rst

@@ -1,14 +0,0 @@
-Basic Features
-##############
-
-.. toctree::
-   :maxdepth: 2
-
-   introduction
-   common-rss-elements
-   common-atom-elements
-   atom-detail
-   uncommon-rss
-   uncommon-atom
-   basic-existence
-

+ 0 - 36
Lib python/feedparser-5.2.1/docs/bozo.rst

@@ -1,36 +0,0 @@
-.. _advanced.bozo:
-
-Bozo Detection
-==============
-
-:program:`Universal Feed Parser` can parse feeds whether they are well-formed
-:abbr:`XML (Extensible Markup Language)` or not.  However, since some
-applications may wish to reject or warn users about non-well-formed feeds,
-:program:`Universal Feed Parser` sets the ``bozo`` bit when it detects that a
-feed is not well-formed.  Thanks to `Tim Bray
-<http://www.tbray.org/ongoing/When/200x/2004/01/11/PostelPilgrim>`_ for
-suggesting this terminology.
-
-Detecting a non-well-formed feed
---------------------------------
-
-::
-
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> d.bozo
-    0
-    >>> d = feedparser.parse('http://feedparser.org/tests/illformed/rss/aaa_illformed.xml')
-    >>> d.bozo
-    1
-    >>> d.bozo_exception
-    <xml.sax._exceptions.SAXParseException instance at 0x00BAAA08>
-    >>> exc = d.bozo_exception
-    >>> exc.getMessage()
-    "expected '>'\\n"
-    >>> exc.getLineNumber()
-    6
-
-
-There are many reasons an :abbr:`XML (Extensible Markup Language)` document
-could be non-well-formed besides this example (incomplete end tags)  See
-:ref:`advanced.encoding` for some other ways to trip the bozo bit.

+ 0 - 36
Lib python/feedparser-5.2.1/docs/changes-26.rst

@@ -1,36 +0,0 @@
-Changes in version 2.6
-======================
-
-:program:`Ultra-liberal Feed Parser` 2.6 was released on January 1, 2004.
-
-- dc:author support (MarekK)
-
-- fixed bug tracking nested divs within content (JohnD)
-
-- fixed missing :file:`sys` import (JohanS)
-
-- fixed regular expression to capture :abbr:`XML (Extensible Markup Language)` character encoding (Andrei)
-
-- added support for Atom 0.3-style links
-
-- fixed bug with textInput tracking
-
-- added support for cloud (MartijnP)
-
-- added support for multiple category/dc:subject (MartijnP)
-
-- normalize content model: ``description`` gets description (which can come from ``<description>``, ``<summary>``, or full content if no ``<description>``), ``content`` gets dict of ``base``/``language``/``type``/``value`` (which can come from ``<content:encoded>``, ``<xhtml:body>``, ``<content>``, or ``<fullitem>``)
-
-- fixed bug matching arbitrary Userland namespaces
-
-- added xml:base and xml:lang tracking
-
-- fixed bug tracking unknown tags
-
-- fixed bug tracking content when ``<content>`` element is not in default namespace (like Pocketsoap feed)
-
-- resolve relative URLs in ``<link>``, ``<guid>``, ``<docs>``, ``<url>``, ``<comments>``, ``<wfw:comment>``, ``<wfw:commentRSS>``
-
-- resolve relative :abbr:`URI (Uniform Resource Identifier)`s within embedded :abbr:`HTML (HyperText Markup Language)` markup in ``<description>``, ``<xhtml:body>``, ``<content>``, ``<content:encoded>``, ``<title>``, ``<subtitle>``, ``<summary>``, ``<info>``, ``<tagline>``, and ``<copyright>``
-
-- added support for pingback and trackback namespaces

+ 0 - 70
Lib python/feedparser-5.2.1/docs/changes-27.rst

@@ -1,70 +0,0 @@
-Changes in version 2.7.x
-========================
-
-The 2.7 series was a brief but necessary transition towards some of the core ideas in version 3.0.
-
-:program:`Ultra-liberal Feed Parser` 2.7.6 was released on January 16, 2004.
-
-- fixed bug with :file:`StringIO` importing
-
-
-:program:`Ultra-liberal Feed Parser` 2.7.5 was released on January 15, 2004.
-
-- added workaround for malformed DOCTYPE (seen on many ``blogspot.com`` sites)
-
-- added ``_debug`` variable
-
-
-:program:`Ultra-liberal Feed Parser` 2.7.4 was released on January 14, 2004.
-
-- added workaround for improperly formed <br/> tags in encoded :abbr:`HTML (HyperText Markup Language)` (skadz)
-
-- fixed unicode handling in normalize_attrs (ChrisL)
-
-- fixed relative :abbr:`URI (Uniform Resource Identifier)` processing for guid (skadz)
-
-- added ICBM support
-
-- added :file:`base64` support
-
-
-:program:`Ultra-liberal Feed Parser` 2.7.3 was released on January 14, 2004.
-
-- reverted all changes made in 2.7.2
-
-
-:program:`Ultra-liberal Feed Parser` 2.7.2 was released on January 13, 2004.
-
-- "Version 2.7.2 of my feed parser, released today, will by default refuse to parse `this feed <http://intertwingly.net/stories/2004/01/12/broken.rss>`_.  It does a first-pass check for wellformedness, and when that fails it sets the 'bozo' bit in the result to ``1`` and immediately terminates.  You can revert to the previous behavior by passing ``disableWellFormedCheck=1``, but it will print arrogant warning messages to stderr to the effect that anyone who can't create a well-formed :abbr:`XML (Extensible Markup Language)` feed is a bozo and an incompetent fool." `source <http://intertwingly.net/blog/2004/01/12/Scientific-Method#c1074047818>`_
-
-
-:program:`Ultra-liberal Feed Parser` 2.7.1 was released on January 9, 2004.
-
-- fixed bug handling &quot; and &apos;
-
-- fixed memory leak not closing url opener (JohnD)
-
-- added dc:publisher support (MarekK)
-
-- added admin:errorReportsTo support (MarekK)
-
-- :program:`Python` 2.1 ``dict`` support (MarekK)
-
-
-:program:`Ultra-liberal Feed Parser` 2.7 was released on January 5, 2004.
-
-- really added support for trackback and pingback namespaces, as opposed to 2.6 when I said I did but didn't really
-
-- sanitize :abbr:`HTML (HyperText Markup Language)` markup within some elements
-
-- added :file:`mxTidy` support (if installed) to tidy :abbr:`HTML (HyperText Markup Language)` markup within some elements
-
-- fixed indentation bug in ``_parse_date`` (FazalM)
-
-- use ``socket.setdefaulttimeout`` if available (FazalM)
-
-- universal date parsing and normalization (FazalM): ``created``, ``modified``, ``issued`` are parsed into 9-tuple date format and stored in ``created_parsed``, ``modified_parsed``, and ``issued_parsed``
-
-- ``date`` is duplicated in ``modified`` and vice-versa
-
-- ``date_parsed`` is duplicated in ``modified_parsed`` and vice-versa

+ 0 - 226
Lib python/feedparser-5.2.1/docs/changes-30.rst

@@ -1,226 +0,0 @@
-Changes in version 3.0
-======================
-
-
-:program:`Universal Feed Parser` 3.0 was released on June 21, 2004.
-
-- don't try ``iso-8859-1`` (can't distinguish between ``iso-8859-1`` and ``windows-1252`` anyway, and most incorrectly marked feeds are ``windows-1252``)
-
-- fixed regression that could cause the same encoding to be tried twice (even if it failed the first time)
-
-
-:program:`Universal Feed Parser` 3.0fc3 was released on June 18, 2004.
-
-- fixed bug in ``_changeEncodingDeclaration`` that failed to parse UTF-16 encoded feeds
-
-- made ``source`` into a FeedParserDict
-
-- duplicate admin:generatorAgent/@rdf:resource in ``generator_detail.url``
-
-- added support for image
-
-- refactored ``parse()`` fallback logic to try other encodings if SAX parsing fails (previously it would only try other encodings if re-encoding failed)
-
-- remove ``unichr`` madness in normalize_attrs now that we're properly tracking encoding in and out of BaseHTMLProcessor
-
-- set ``feed.language`` from root-level xml:lang
-
-- set ``entry.id`` from rdf:about
-
-- send ``Accept`` header
-
-
-:program:`Universal Feed Parser` 3.0fc2 was released on May 10, 2004.
-
-- added and passed Sam's amp tests
-
-- added and passed my blink tag tests
-
-
-:program:`Universal Feed Parser` 3.0fc1 was released on April 23, 2004.
-
-- made ``results.entries[0].links[0]`` and ``results.entries[0].enclosures[0]`` into FeedParserDict
-
-- fixed typo that could cause the same encoding to be tried twice (even if it failed the first time)
-
-- fixed DOCTYPE stripping when DOCTYPE contained entity declarations
-
-- better textinput and image tracking in illformed :abbr:`RSS (Rich Site Summary)` 1.0 feeds
-
-
-:program:`Universal Feed Parser` 3.0b23 was released on April 21, 2004.
-
-- fixed ``UnicodeDecodeError`` for feeds that contain high-bit characters in attributes in embedded :abbr:`HTML (HyperText Markup Language)` in description (thanks Thijs van de Vossen)
-
-- moved ``guid``, ``date``, and ``date_parsed`` to mapped keys in FeedParserDict
-
-- tweaked FeedParserDict.has_key to return ``True`` if asking about a mapped key
-
-
-:program:`Universal Feed Parser` 3.0b22 was released on April 19, 2004.
-
-- changed ``channel`` to ``feed``, ``item`` to ``entries`` in ``results`` dict
-
-- changed ``results`` dict to allow getting values with ``results.key`` as well as ``results[key]``
-
-- work around embedded illformed :abbr:`HTML (HyperText Markup Language)` with half a DOCTYPE
-
-- work around malformed ``Content-Type`` header
-
-- if character encoding is wrong, try several common ones before falling back to regexes (if this works, ``bozo_exception`` is set to ``CharacterEncodingOverride``
-
-- fixed character encoding issues in BaseHTMLProcessor by tracking encoding and converting from Unicode to raw strings before feeding data to sgmllib.SGMLParser
-
-- convert each value in results to Unicode (if possible), even if using regex-based parsing
-
-
-:program:`Universal Feed Parser` 3.0b21 was released on April 14, 2004.
-
-- added Hot RSS support
-
-
-:program:`Universal Feed Parser` 3.0b20 was released on April 7, 2004.
-
-- added :abbr:`CDF (Channel Definition Format)` support
-
-
-:program:`Universal Feed Parser` 3.0b19 was released on March 15, 2004.
-
-- fixed bug exploding author information when author name was in parentheses
-
-- removed ultra-problematic :file:`mxTidy` support
-
-- patch to workaround crash in PyXML/expat when encountering invalid entities (MarkMoraes)
-
-- support for textinput/textInput
-
-
-:program:`Universal Feed Parser` 3.0b18 was released on February 17, 2004.
-
-- always map description to ``summary_detail`` (Andrei)
-
-- use :file:`libxml2` (if available)
-
-
-:program:`Universal Feed Parser` 3.0b17 was released on February 13, 2004.
-
-- determine character encoding as per `RFC 3023 <http://www.ietf.org/rfc/rfc3023.txt>`_
-
-
-:program:`Universal Feed Parser` 3.0b16 was released on February 12, 2004.
-
-- fixed support for :abbr:`RSS (Rich Site Summary)` 0.90 (broken in b15)
-
-
-:program:`Universal Feed Parser` 3.0b15 was released on February 11, 2004.
-
-- fixed bug resolving relative links in wfw:commentRSS
-
-- fixed bug capturing author and contributor :abbr:`URI (Uniform Resource Identifier)`
-
-- fixed bug resolving relative links in author and contributor :abbr:`URI (Uniform Resource Identifier)`
-
-- fixed bug resolving relative links in generator :abbr:`URI (Uniform Resource Identifier)`
-
-- added support for recognizing :abbr:`RSS (Rich Site Summary)` 1.0
-
-- passed Simon Fell's namespace tests, and included them permanently in the test suite with his permission
-
-- fixed namespace handling under :program:`Python` 2.1
-
-
-:program:`Universal Feed Parser` 3.0b14 was released on February 8, 2004.
-
-- fixed CDATA handling in non-wellformed feeds under :program:`Python` 2.1
-
-
-:program:`Universal Feed Parser` 3.0b13 was released on February 8, 2004.
-
-- better handling of empty :abbr:`HTML (HyperText Markup Language)` tags (br, hr, img, etc.) in embedded markup, in either :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML (Extensible HyperText Markup Language)` form (<br>, <br/>, <br />)
-
-
-:program:`Universal Feed Parser` 3.0b12 was released on February 6, 2004.
-
-- fiddled with ``decodeEntities`` (still not right)
-
-- added support to Atom 0.2 subtitle
-
-- added support for Atom content model in copyright
-
-- better sanitizing of dangerous :abbr:`HTML (HyperText Markup Language)` elements with end tags (script, frameset)
-
-
-:program:`Universal Feed Parser` 3.0b11 was released on February 2, 2004.
-
-- added rights to list of elements that can contain dangerous markup
-
-- fiddled with ``decodeEntities`` (not right)
-
-- liberalized date parsing even further
-
-
-:program:`Universal Feed Parser` 3.0b10 was released on January 31, 2004.
-
-- incorporated ISO-8601 date parsing routines from :file:`xml.util.iso8601`
-
-
-:program:`Universal Feed Parser` 3.0b9 was released on January 29, 2004.
-
-- fixed check for presence of ``dict`` function
-
-- added support for summary
-
-
-:program:`Universal Feed Parser` 3.0b8 was released on January 28, 2004.
-
-- added support for contributor
-
-
-:program:`Universal Feed Parser` 3.0b7 was released on January 28, 2004.
-
-- support Atom-style author element in ``author_detail`` (dictionary of ``name``, ``url``, ``email``)
-
-- map ``author`` to ``author_detail`` if ``author`` contains name + email address
-
-
-:program:`Universal Feed Parser` 3.0b6 was released on January 27, 2004.
-
-- added feed type and version detection, ``result['version']`` will be one of ``SUPPORTED_VERSIONS.keys()`` or empty string if unrecognized
-
-- added support for creativeCommons:license and cc:license
-
-- added support for full Atom content model in title, tagline, info, copyright, summary
-
-- fixed bug with gzip encoding (not always telling server we support it when we do)
-
-
-:program:`Universal Feed Parser` 3.0b5 was released on January 26, 2004.
-
-- fixed bug parsing multiple links at feed level
-
-
-:program:`Universal Feed Parser` 3.0b4 was released on January 26, 2004.
-
-- fixed xml:lang inheritance
-
-- fixed multiple bugs tracking xml:base :abbr:`URI (Uniform Resource Identifier)`, one for documents that don't define one explicitly and one for documents that define an outer and an inner xml:base that goes out of scope before the end of the document
-
-
-:program:`Universal Feed Parser` 3.0b3 was released on January 23, 2004.
-
-- parse entire feed with real :abbr:`XML (Extensible Markup Language)` parser (if available)
-
-- added several new supported namespaces
-
-- fixed bug tracking naked markup in description
-
-- added support for enclosure
-
-- added support for source
-
-- re-added support for cloud which got dropped somehow
-
-- added support for expirationDate
-
-
-:program:`Universal Feed Parser` 3.0b2 and 3.0b1 have been lost in the mists of time.

+ 0 - 23
Lib python/feedparser-5.2.1/docs/changes-301.rst

@@ -1,23 +0,0 @@
-Changes in version 3.0.1
-========================
-
-
-
-
-:program:`Universal Feed Parser` 3.0.1 was released on June 21, 2004.
-
-- default to ``us-ascii`` for all text/* content types
-
-- recover from malformed ``content-type`` header parameter with no equals sign ("text/xml; charset:iso-8859-1")
-
-- docs: added :file:`reference-feed.html` and :file:`reference-entry.html` (bug #977723)
-
-- docs: fixed ``entry[i]`` in documentation (should be ``entries[i]``) (bug #977722)
-
-- docs: added note about Unicode string usage (bug #977716)
-
-- docs: added :file:`basic-existence.html` (bug #977704)
-
-- docs: fixed description of feed title (bug #977685)
-
-- docs: fixed typo in annotated :abbr:`RSS (Rich Site Summary)` 1.0 feed (bug #977682)

+ 0 - 25
Lib python/feedparser-5.2.1/docs/changes-31.rst

@@ -1,25 +0,0 @@
-Changes in version 3.1
-======================
-
-
-
-
-:program:`Universal Feed Parser` 3.1 was released on June 28, 2004.
-
-- added and passed tests for converting :abbr:`HTML (HyperText Markup Language)` entities to Unicode equivalents in illformed feeds (aaronsw)
-
-- added and passed tests for converting character entities to Unicode equivalents in illformed feeds (aaronsw)
-
-- test for valid parsers when setting ``XML_AVAILABLE``
-
-- make version and encoding available when server returns a ``304``
-
-- add ``handlers`` parameter to pass arbitrary :file:`urllib2` handlers (like digest auth or proxy support)
-
-- add code to parse username/password out of url and send as basic authentication
-
-- expose downloading-related exceptions in ``bozo_exception`` (aaronsw)
-
-- added __contains__ method to FeedParserDict (aaronsw)
-
-- added ``publisher_detail`` (aaronsw)

+ 0 - 33
Lib python/feedparser-5.2.1/docs/changes-32.rst

@@ -1,33 +0,0 @@
-Changes in version 3.2
-======================
-
-
-
-
-:program:`Universal Feed Parser` 3.2 was released on July 3, 2004.
-
-- use :file:`cjkcodecs` and :file:`iconv_codec` if available
-
-- always convert feed to UTF-8 before passing to :abbr:`XML (Extensible Markup Language)` parser
-
-- completely revamped logic for determining character encoding and attempting :abbr:`XML (Extensible Markup Language)` parsing (much faster)
-
-- increased default timeout to 20 seconds
-
-- test for presence of ``Location`` header on redirects
-
-- added tests for many alternate character encodings
-
-- support various :abbr:`EBCDIC` encodings
-
-- support UTF-16BE and UTF16-LE with or without a :abbr:`BOM (Byte Order Mark)`
-
-- support UTF-8 with a :abbr:`BOM (Byte Order Mark)`
-
-- support UTF-32BE and UTF-32LE with or without a :abbr:`BOM (Byte Order Mark)`
-
-- fixed crashing bug if no :abbr:`XML (Extensible Markup Language)` parsers are available
-
-- added support for ``Content-encoding: deflate``
-
-- send blank ``Accept-encoding`` header if neither :file:`gzip` nor :file:`zlib` modules are available

+ 0 - 35
Lib python/feedparser-5.2.1/docs/changes-33.rst

@@ -1,35 +0,0 @@
-Changes in version 3.3
-======================
-
-
-
-
-:program:`Universal Feed Parser` 3.3 was released on July 15, 2004.
-
-- optimized :abbr:`EBCDIC` to :abbr:`ASCII` conversion
-
-- fixed obscure problem tracking xml:base and xml:lang if element declares it, child doesn't, first grandchild redeclares it, and second grandchild doesn't
-
-- refactored date parsing
-
-- defined public ``registerDateHandler`` so callers can add support for additional date formats at runtime
-
-- added support for OnBlog, Nate, MSSQL, Greek, and Hungarian dates (ytrewq1)
-
-- added ``zopeCompatibilityHack()`` which turns FeedParserDict into a regular dictionary, required for :program:`Zope` compatibility, and also makes command-line debugging easier because pprint module formats real dictionaries better than dictionary-like objects
-
-- added NonXMLContentType exception, which is stored in ``bozo_exception`` when a feed is served with a non-:abbr:`XML (Extensible Markup Language)` media type such as ``'text/plain'``
-
-- respect ``Content-Language`` as default language if no xml:lang is present
-
-- ``cloud`` dict is now FeedParserDict
-
-- generator dict is now FeedParserDict
-
-- better tracking of xml:lang, including support for xml:lang='' to unset the current language
-
-- recognize :abbr:`RSS (Rich Site Summary)` 1.0 feeds even when :abbr:`RSS (Rich Site Summary)` 1.0 namespace is not the default namespace
-
-- don't overwrite final status on redirects (scenarios: redirecting to a :abbr:`URI (Uniform Resource Identifier)` that returns ``304``, redirecting to a :abbr:`URI (Uniform Resource Identifier)` that redirects to another :abbr:`URI (Uniform Resource Identifier)` with a different type of redirect)
-
-- add support for ``HTTP 303`` redirects

+ 0 - 27
Lib python/feedparser-5.2.1/docs/changes-40.rst

@@ -1,27 +0,0 @@
-Changes in version 4.0
-======================
-
-
-
-
-:program:`Universal Feed Parser` 4.0 was released on December 23, 2005.
-
-- Support for :ref:`annotated.atom10`.
-
-- Support for :program:`iTunes` extensions.
-
-- Support for dc:contributor.
-
-- :program:`Universal Feed Parser` now captures the feed's :ref:`reference.namespaces`.  See :ref:`advanced.namespaces` for details.
-
-- Lots of things have been renamed to match Atom 1.0 terminology.  issued is now :ref:`reference.entry.published`, modified is now :ref:`reference.entry.updated`, and url is now href everywhere.  You can still access these elements with the old names, so you shouldn't need to change any existing code, but don't be surprised if you can't find them during debugging.
-
-- category and categories have been replaced by tags, see :ref:`reference.feed.tags` and :ref:`reference.entry.tags`.  The old names still work.
-
-- mode is gone from all detail and content dictionaries.  It was never terribly useful, since :program:`Universal Feed Parser` unescapes content automatically.
-
-- :ref:`reference.entry.source` is now a dictionary of feed metadata as per section 4.2.11 of RFC 4287.  :program:`Universal Feed Parser` no longer supports the :abbr:`RSS (Rich Site Summary)` 2.0's source element.
-
-- Content in unknown namespaces is no longer discarded (`bug 993305 <http://sourceforge.net/tracker/index.php?func=detail&aid=993305&group_id=112328&atid=661937>`_)
-
-- Lots of other bug fixes.

+ 0 - 9
Lib python/feedparser-5.2.1/docs/changes-401.rst

@@ -1,9 +0,0 @@
-Changes in version 4.0.1
-========================
-
-
-
-
-:program:`Universal Feed Parser` 4.0.1 was released on December 24, 2005.
-
-- bug fixes for :program:`Python` 2.1 compatibility.

+ 0 - 9
Lib python/feedparser-5.2.1/docs/changes-402.rst

@@ -1,9 +0,0 @@
-Changes in version 4.0.2
-========================
-
-
-
-
-:program:`Universal Feed Parser` 4.0.2 was released on December 24, 2005.
-
-- cleared ``_debug`` flag.

+ 0 - 8
Lib python/feedparser-5.2.1/docs/changes-41.rst

@@ -1,8 +0,0 @@
-Changes in version 4.1
-======================
-
-:program:`Universal Feed Parser` 4.1 was released on January 11, 2006.
-
-- Support for the `Universal Encoding Detector <http://chardet.feedparser.org/>`_ to autodetect character encoding of feeds that declare their encoding incorrectly or don't declare it at all.  See :ref:`advanced.encoding` for details of when this gets called.
-
-- :program:`Universal Feed Parser` no longer sets a default socket timeout (SourceForge bug `1392140 <http://sourceforge.net/tracker/index.php?func=detail&aid=1392140&group_id=112328&atid=661937>`_).  If you were relying on this feature, you will need to call socket.setdefaulttimeout(TIMEOUT_IN_SECONDS) yourself.

+ 0 - 22
Lib python/feedparser-5.2.1/docs/changes-42.rst

@@ -1,22 +0,0 @@
-Changes in version 4.2
-======================
-
-:program:`Universal Feed Parser` 4.2 was released on 2008-03-12.
-
-- Support for parsing microformats, including rel=enclosure, rel=tag, XFN, and hCard.
-
-- Updated the whitelist of :ref:`acceptable HTML elements and attributes <advanced.sanitization.html>` based on the latest draft of the :abbr:`HTML (HyperText Markup Language)` 5 specification.
-
-- Support for :ref:`advanced.sanitization.css`.  (Previous versions of :program:`Universal Feed Parser` simply stripped all inline styles.)  Many thanks to Sam Ruby for implementing this, despite my insistence that it was impossible.
-
-- Support for :ref:`advanced.sanitization.svg`.
-
-- Support for :ref:`advanced.sanitization.mathml`.  Many thanks to Jacques Distler for patiently debugging this feature.
-
-- :abbr:`IRI (International Resource Identifier)` support for every element that can contain a :abbr:`URI (Uniform Resource Identifier)`.
-
-- Ability to :ref:`disable relative URI resolution <advanced.base.disable>`.
-
-- Command-line arguments and alternate serializers, for manipulating :program:`Universal Feed Parser` from shell scripts or other non-Python sources.
-
-- More robust parsing of author email addresses, misencoded win-1252 content, rel=self links, and better detection of HTML content in elements with ambiguous content types.

+ 0 - 113
Lib python/feedparser-5.2.1/docs/changes-early.rst

@@ -1,113 +0,0 @@
-Changes in earlier versions
-===========================
-
-
-
-
-:program:`Universal Feed Parser` began as an "ultra-liberal RSS parser" named :file:`rssparser.py`.  It was written as a weapon for battles that no one remembers, to work around problems that no longer exist.
-
-:program:`Ultra-liberal Feed Parser` 2.5.3 was released on August 3, 2003.
-
-- track whether we're inside an image or textInput (TvdV)
-
-- return the character encoding, if specified
-
-
-:program:`Ultra-liberal Feed Parser` 2.5.2 was released on July 28, 2003.
-
-- entity-decode inline :abbr:`XML (Extensible Markup Language)` properly
-
-- added support for inline <xhtml:body> and <xhtml:div> as used in some :abbr:`RSS (Rich Site Summary)` 2.0 feeds
-
-
-:program:`Ultra-liberal Feed Parser` 2.5.1 was released on July 26, 2003.
-
-- clear ``opener.addheaders`` so we only send our custom ``User-Agent`` (otherwise :file:`urllib2` sends two, which confuses some servers) (RMK)
-
-
-:program:`Ultra-liberal Feed Parser` 2.5 was released on July 25, 2003.
-
-- changed to :program:`Python` license (all contributors agree)
-
-- removed unnecessary :file:`>urllib` code -- :file:`urllib2` should always be available anyway
-
-- return actual ``url``, ``status``, and full :abbr:`HTTP (Hypertext Transfer Protocol)` headers (as ``result['url']``, ``result['status']``, and ``result['headers']``) if parsing a remote feed over :abbr:`HTTP (Hypertext Transfer Protocol)`.  This should pass all the `Aggregator client :abbr:`HTTP (Hypertext Transfer Protocol)` tests <http://diveintomark.org/tests/client/http/>`_.
-
-- added the latest namespace-of-the-week for :abbr:`RSS (Rich Site Summary)` 2.0
-
-
-:program:`Ultra-liberal Feed Parser` 2.4 was released on July 9, 2003.
-
-- added preliminary Pie/Atom/Echo support based on `Sam Ruby's snapshot of July 1 <http://www.intertwingly.net/blog/1506.html>`_
-
-- changed project name
-
-
-:program:`Ultra-liberal RSS Parser` 2.3.1 was released on June 12, 2003.
-
-- if item has both link and guid, return both as-is
-
-
-:program:`Ultra-liberal RSS Parser` 2.3 was released on June 11, 2003.
-
-- added ``USER_AGENT`` for default (if caller doesn't specify)
-
-- make sure we send the ``User-Agent`` even if :file:`urllib2` isn't available
-
-- Match any variation of ``backend.userland.com/rss`` namespace
-
-
-:program:`Ultra-liberal RSS Parser` 2.2 was released on January 27, 2003.
-
-- added attribute support and admin:generatorAgent.  start_admingeneratoragent is an example of how to handle elements with only attributes, no content.
-
-
-:program:`Ultra-liberal RSS Parser` 2.1 was released on November 14, 2002.
-
-- added gzip support
-
-
-:program:`Ultra-liberal RSS Parser` 2.0.2 was released on October 21, 2002.
-
-- added the ``inchannel`` to the ``if`` statement, otherwise it's useless.  Fixes the problem JD was addressing by adding it. (JB)
-
-
-:program:`Ultra-liberal RSS Parser` 2.0.1 was released on October 21, 2002.
-
-- changed ``parse()`` so that if we don't get anything because of ``etag``/``modified``, return the old ``etag``/``modified`` to the caller to indicate why nothing is being returned
-
-
-:program:`Ultra-liberal RSS Parser` 2.0 was released on October 19, 2002.
-
-- use ``inchannel`` to watch out for image and textinput elements which can also contain title, link, and description elements (JD)
-
-- check for isPermaLink='false' attribute on guid elements (JD)
-
-- replaced ``openAnything`` with ``open_resource`` supporting ``ETag`` and ``If-Modified-Since`` request headers (JD)
-
-- ``parse`` now accepts ``etag``, ``modified``, ``agent``, and ``referrer`` optional arguments (JD)
-
-- modified ``parse`` to return a dictionary instead of a tuple so that any ``etag`` or ``modified`` information can be returned and cached by the caller
-
-
-:program:`Ultra-liberal RSS Parser` 1.1 was released on September 27, 2002.
-
-- fixed infinite loop on incomplete CDATA sections
-
-
-:program:`Ultra-liberal RSS Parser` 1.0 was released on September 27, 2002.
-
-- fixed namespace processing on prefixed :abbr:`RSS (Rich Site Summary)` 2.0 elements
-
-- added Simon Fell's namespace test suite
-
-
-:program:`Ultra-liberal RSS Parser` was first released on August 13, 2002.
-
-`Announcement <http://diveintomark.org/archives/2002/08/13/ultraliberal_rss_parser>`_:
-
-    Aaron Swartz has been looking for an ultra-liberal :abbr:`RSS (Rich Site Summary)` parser. Now that I'm experimenting with a homegrown :abbr:`RSS (Rich Site Summary)`-to-email news aggregator, so am I. You see, most :abbr:`RSS (Rich Site Summary)` feeds suck. Invalid characters, unescaped ampersands (Blogger feeds), invalid entities (Radio feeds), unescaped and invalid HTML (The Register's feed most days). Or just a bastardized mix of :abbr:`RSS (Rich Site Summary)` 0.9x elements with :abbr:`RSS (Rich Site Summary)` 1.0 elements (Movable Type feeds).
-
-    Then there are feeds, like Aaron's feed, which are too bleeding edge. He puts an excerpt in the description element but puts the full text in the content:encoded element (as CDATA). This is valid :abbr:`RSS (Rich Site Summary)` 1.0, but nobody actually uses it (except Aaron), few news aggregators support it, and many parsers choke on it. Other parsers are confused by the new elements (guid) in :abbr:`RSS (Rich Site Summary)` 0.94 (see Dave Winer's feed for an example). And then there's Jon Udell's feed, with the fullitem element that he just sort of made up.
-
-    :file:`rssparser.py`. GPL-licensed. Tested on 5000 active feeds.

+ 0 - 134
Lib python/feedparser-5.2.1/docs/character-encoding.rst

@@ -1,134 +0,0 @@
-.. _advanced.encoding:
-
-Character Encoding Detection
-============================
-
-.. tip::
-
-    Feeds may be published in any character encoding.  :program:`Python`
-    supports only a few character encodings by default.  To support the maximum
-    number of character encodings (and be able to parse the maximum number of
-    feeds), you should install :file:`cjkcodecs` and :file:`iconv_codec`.  Both are
-    available at `http://cjkpython.i18n.org/ <http://cjkpython.i18n.org/>`_.
-
-`RFC 3023 <http://www.ietf.org/rfc/rfc3023.txt>`_ defines the interaction
-between :abbr:`XML (Extensible Markup Language)` and :abbr:`HTTP (Hypertext Transfer Protocol)`
-as it relates to character encoding.  :abbr:`XML (Extensible Markup Language)`
-and :abbr:`HTTP (Hypertext Transfer Protocol)` have different ways of
-specifying character encoding and different defaults in case no encoding is
-specified, and determining which value takes precedence depends on a variety of
-factors.
-
-
-Introduction to Character Encoding
-----------------------------------
-
-In :abbr:`XML (Extensible Markup Language)`, the character encoding is optional
-and may be given in the :abbr:`XML (Extensible Markup Language)` declaration in
-the first line of the document, like this:
-
-.. sourcecode:: xml
-
-    <?xml version="1.0" encoding="utf-8"?>
-
-If no encoding is given, :abbr:`XML (Extensible Markup Language)` supports the
-use of a Byte Order Mark to identify the document as some flavor of UTF-32,
-UTF-16, or UTF-8.  `Section F of the XML specification <http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info>`_
-outlines the process for determining the character encoding based on unique
-properties of the Byte Order Mark in the first two to four bytes of the
-document.
-
-If no encoding is specified and no Byte Order Mark is present, :abbr:`XML (Extensible Markup Language)`
-defaults to UTF-8.
-
-:abbr:`HTTP (Hypertext Transfer Protocol)` uses :abbr:`MIME` to define a method
-of specifying the character encoding, as part of the Content-Type :abbr:`HTTP (Hypertext Transfer Protocol)`
-header, which looks like this:
-
-::
-
-    Content-Type: text/html; charset="utf-8"
-
-
-If no charset is specified, :abbr:`HTTP (Hypertext Transfer Protocol)` defaults
-to iso-8859-1, but only for text/* media types. For other media types, the
-default encoding is undefined, which is where :abbr:`RFC (Request For Comments)` 3023 comes in.
-
-According to :abbr:`RFC (Request For Comments)` 3023, if the media type given
-in the Content-Type :abbr:`HTTP (Hypertext Transfer Protocol)` header is
-application/xml, application/xml-dtd, application/xml-external-parsed-entity,
-or any one of the subtypes of application/xml such as application/atom+xml or
-application/rss+xml or even application/rdf+xml, then the encoding is
-
-
-#. the encoding given in the ``charset`` parameter of the Content-Type :abbr:`HTTP (Hypertext Transfer Protocol)` header, or
-
-#. the encoding given in the encoding attribute of the :abbr:`XML (Extensible Markup Language)` declaration within the document, or
-
-#. utf-8.
-
-
-On the other hand, if the media type given in the Content-Type
-:abbr:`HTTP (Hypertext Transfer Protocol)` header is text/xml,
-text/xml-external-parsed-entity, or a subtype like text/AnythingAtAll+xml, then
-the encoding attribute of the :abbr:`XML (Extensible Markup Language)`
-declaration within the document is ignored completely, and the encoding is
-
-
-#. the encoding given in the charset parameter of the Content-Type :abbr:`HTTP (Hypertext Transfer Protocol)` header, or
-
-#. us-ascii.
-
-
-Handling Incorrectly-Declared Encodings
----------------------------------------
-
-:program:`Universal Feed Parser` initially uses the rules specified in
-:abbr:`RFC (Request For Comments)` 3023 to determine the character encoding of
-the feed.  If parsing succeeds, then that's that.  If parsing fails,
-:program:`Universal Feed Parser` sets the ``bozo`` bit to ``1`` and sets
-``bozo_exception`` to ``feedparser.CharacterEncodingOverride``.  Then it tries
-to reparse the feed with the following character encodings:
-
-
-#. the encoding specified in the :abbr:`XML (Extensible Markup Language)` declaration
-
-#. the encoding sniffed from the first four bytes of the document (as per `Section F <http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info>`_)
-
-#. the encoding auto-detected by the `Universal Encoding Detector <http://chardet.feedparser.org/>`_, if installed
-
-#. utf-8
-
-#. windows-1252
-
-
-If the character encoding can not be determined, :program:`Universal Feed Parser`
-sets the ``bozo`` bit to ``1`` and sets ``bozo_exception`` to
-``feedparser.CharacterEncodingUnknown``.  In this case, parsed values will be
-strings, not Unicode strings.
-
-
-Handling Incorrectly-Declared Media Types
------------------------------------------
-
-:abbr:`RFC (Request For Comments)` 3023 only applies when the feed is served
-over :abbr:`HTTP (Hypertext Transfer Protocol)` with a Content-Type that
-declares the feed to be some kind of :abbr:`XML (Extensible Markup Language)`.
-However, some web servers are severely misconfigured and serve feeds with a
-Content-Type of text/plain, application/octet-stream, or some completely bogus
-media type.
-
-:program:`Universal Feed Parser` will attempt to parse such feeds, but it will
-set the ``bozo`` bit to ``1`` and set ``bozo_exception`` to
-``feedparser.NonXMLContentType``.
-
-
-.. seealso::
-
-    * `RFC 3023 <http://www.ietf.org/rfc/rfc3023.txt>`_
-
-    * `Section F of the XML specification <http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info>`_
-
-    * `On the well-formedness of XML documents served as text/plain <http://www.imc.org/atom-syntax/mail-archive/msg05575.html>`_
-
-    * `CJKCodecs and iconv_codec <http://cjkpython.i18n.org/>`_

+ 0 - 130
Lib python/feedparser-5.2.1/docs/common-atom-elements.rst

@@ -1,130 +0,0 @@
-Common Atom Elements
-====================
-
-Atom feeds generally contain more information than :abbr:`RSS (Rich Site Summary)`
-feeds (because more elements are required), but the most commonly used elements
-are still title, link, subtitle/description, various dates, and ID.
-
-This sample Atom feed is at `http://feedparser.org/docs/examples/atom10.xml
-<http://feedparser.org/docs/examples/atom10.xml>`_.
-
-.. sourcecode:: xml
-
-    <?xml version="1.0" encoding="utf-8"?>
-    <feed xmlns="http://www.w3.org/2005/Atom"
-    xml:base="http://example.org/"
-    xml:lang="en">
-    <title type="text">Sample Feed</title>
-    <subtitle type="html">
-    For documentation &lt;em&gt;only&lt;/em&gt;
-    </subtitle>
-    <link rel="alternate" href="/"/>
-    <link rel="self"
-    type="application/atom+xml"
-    href="http://www.example.org/atom10.xml"/>
-    <rights type="html">
-    &lt;p>Copyright 2005, Mark Pilgrim&lt;/p>&lt;
-    </rights>
-    <id>tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml</id>
-    <generator
-    uri="http://example.org/generator/"
-    version="4.0">
-    Sample Toolkit
-    </generator>
-    <updated>2005-11-09T11:56:34Z</updated>
-    <entry>
-    <title>First entry title</title>
-    <link rel="alternate"
-    href="/entry/3"/>
-    <link rel="related"
-    type="text/html"
-    href="http://search.example.com/"/>
-    <link rel="via"
-    type="text/html"
-    href="http://toby.example.com/examples/atom10"/>
-    <link rel="enclosure"
-    type="video/mpeg4"
-    href="http://www.example.com/movie.mp4"
-    length="42301"/>
-    <id>tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml:3</id>
-    <published>2005-11-09T00:23:47Z</published>
-    <updated>2005-11-09T11:56:34Z</updated>
-    <summary type="text/plain" mode="escaped">Watch out for nasty tricks</summary>
-    <content type="application/xhtml+xml" mode="xml"
-    xml:base="http://example.org/entry/3" xml:lang="en-US">
-    <div xmlns="http://www.w3.org/1999/xhtml">Watch out for
-    <span style="background: url(javascript:window.location='http://example.org/')">
-    nasty tricks</span></div>
-    </content>
-    </entry>
-    </feed>
-
-The feed elements are available in ``d.feed``.
-
-Accessing Common Feed Elements
-------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> d.feed.title
-    u'Sample feed'
-    >>> d.feed.link
-    u'http://example.org/'
-    >>> d.feed.subtitle
-    u'For documentation <em>only</em>'
-    >>> d.feed.updated
-    u'2005-11-09T11:56:34Z'
-    >>> d.feed.updated_parsed
-    (2005, 11, 9, 11, 56, 34, 2, 313, 0)
-    >>> d.feed.id
-    u'tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml'
-
-Entries are available in ``d.entries``, which is a list. You access entries in
-the order in which they appear in the original feed, so the first entry is
-``d.entries[0]``.
-
-Accessing Common Entry Elements
--------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> d.entries[0].title
-    u'First entry title'
-    >>> d.entries[0].link
-    u'http://example.org/entry/3
-    >>> d.entries[0].id
-    u'tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml:3'
-    >>> d.entries[0].published
-    u'2005-11-09T00:23:47Z'
-    >>> d.entries[0].published_parsed
-    (2005, 11, 9, 0, 23, 47, 2, 313, 0)
-    >>> d.entries[0].updated
-    u'2005-11-09T11:56:34Z'
-    >>> d.entries[0].updated_parsed
-    (2005, 11, 9, 11, 56, 34, 2, 313, 0)
-    >>> d.entries[0].summary
-    u'Watch out for nasty tricks'
-    >>> d.entries[0].content
-    [{'type': u'application/xhtml+xml',
-    'base': u'http://example.org/entry/3',
-    'language': u'en-US',
-    'value': u'<div>Watch out for <span>nasty tricks</span></div>'}]
-
-.. note::
-
-    The parsed summary and content are not the same as they appear in the
-    original feed. The original elements contained dangerous :abbr:`HTML
-    (HyperText Markup Language)` markup which was sanitized. See
-    :ref:`advanced.sanitization` for details.
-
-Because Atom entries can have more than one content element,
-``d.entries[0].content`` is a list of dictionaries. Each dictionary contains
-metadata about a single content element. The two most important values in the
-dictionary are the content type, in ``d.entries[0].content[0].type``, and the
-actual content value, in ``d.entries[0].content[0].value``.
-
-You can get this level of detail on other Atom elements too.

+ 0 - 81
Lib python/feedparser-5.2.1/docs/common-rss-elements.rst

@@ -1,81 +0,0 @@
-Common :abbr:`RSS (Rich Site Summary)` Elements
-===============================================
-
-The most commonly used elements in :abbr:`RSS (Rich Site Summary)` feeds
-(regardless of version) are title, link, description, publication date, and entry
-ID.  The publication date comes from the pubDate element, and the entry ID comes
-from the guid element.
-
-This sample :abbr:`RSS (Rich Site Summary)` feed is at
-`http://feedparser.org/docs/examples/rss20.xml
-<http://feedparser.org/docs/examples/rss20.xml>`_.
-
-.. sourcecode:: xml
-
-    <?xml version="1.0" encoding="utf-8"?>
-    <rss version="2.0">
-    <channel>
-    <title>Sample Feed</title>
-    <description>For documentation &lt;em&gt;only&lt;/em&gt;</description>
-    <link>http://example.org/</link>
-    <pubDate>Sat, 07 Sep 2002 00:00:01 GMT</pubDate>
-    <!-- other elements omitted from this example -->
-    <item>
-    <title>First entry title</title>
-    <link>http://example.org/entry/3</link>
-    <description>Watch out for &lt;span style="background-image:
-    url(javascript:window.location='http://example.org/')"&gt;nasty
-    tricks&lt;/span&gt;</description>
-    <pubDate>Thu, 05 Sep 2002 00:00:01 GMT</pubDate>
-    <guid>http://example.org/entry/3</guid>
-    <!-- other elements omitted from this example -->
-    </item>
-    </channel>
-    </rss>
-
-
-The channel elements are available in ``d.feed``.
-
-Accessing Common Channel Elements
----------------------------------
-::
-
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/rss20.xml')
-    >>> d.feed.title
-    u'Sample Feed'
-    >>> d.feed.link
-    u'http://example.org/'
-    >>> d.feed.description
-    u'For documentation <em>only</em>'
-    >>> d.feed.published
-    u'Sat, 07 Sep 2002 00:00:01 GMT'
-    >>> d.feed.published_parsed
-    (2002, 9, 7, 0, 0, 1, 5, 250, 0)
-
-
-The items are available in ``d.entries``, which is a list.  You access items in the list in the same order in which they appear in the original feed, so the first item is available in ``d.entries[0]``.
-
-Accessing Common Item Elements
-------------------------------
-::
-
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/rss20.xml')
-    >>> d.entries[0].title
-    u'First item title'
-    >>> d.entries[0].link
-    u'http://example.org/item/1'
-    >>> d.entries[0].description
-    u'Watch out for <span>nasty tricks</span>'
-    >>> d.entries[0].published
-    u'Thu, 05 Sep 2002 00:00:01 GMT'
-    >>> d.entries[0].published_parsed
-    (2002, 9, 5, 0, 0, 1, 3, 248, 0)
-    >>> d.entries[0].id
-    u'http://example.org/guid/1'
-
-
-.. tip:: You can also access data from :abbr:`RSS (Rich Site Summary)` feeds using Atom terminology.  See :ref:`advanced.normalization` for details.

+ 0 - 19
Lib python/feedparser-5.2.1/docs/conf.py

@@ -1,19 +0,0 @@
-# project information
-project = u'feedparser'
-copyright = u'2004-2008 Mark Pilgrim, 2010-2015 Kurt McKee'
-version = u'5.2.1'
-release = u'5.2.1'
-language = u'en'
-
-# documentation options
-master_doc = 'index'
-exclude_patterns = ['_build']
-
-# use a custom extension to make Sphinx add a <link> to feedparser.css
-import sys, os.path
-sys.path.append(os.path.dirname(os.path.abspath(__file__)))
-extensions = ['add_custom_css']
-
-# customize the html
-# files in html_static_path will be copied into _static/ when compiled
-html_static_path = ['_static']

+ 0 - 74
Lib python/feedparser-5.2.1/docs/content-normalization.rst

@@ -1,74 +0,0 @@
-.. _advanced.normalization:
-
-Content Normalization
-=====================
-
-:program:`Universal Feed Parser` can parse many different types of feeds: Atom,
-:abbr:`CDF (Channel Definition Format)`, and nine different versions of
-:abbr:`RSS (Rich Site Summary)`.  You should not be forced to learn the
-differences between these formats.  :program:`Universal Feed Parser` does its
-best to ensure that you can treat all feeds the same way, regardless of format
-or version.
-
-You can access the basic elements of an Atom feed using :abbr:`RSS (Rich Site Summary)` terminology.
-
-Accessing an Atom feed as an :abbr:`RSS (Rich Site Summary)` feed
------------------------------------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> d['channel']['title']
-    u'Sample Feed'
-    >>> d['channel']['link']
-    u'http://example.org/'
-    >>> d['channel']['description']
-    u'For documentation <em>only</em>
-    >>> len(d['items'])
-    1
-    >>> e = d['items'][0]
-    >>> e['title']
-    u'First entry title'
-    >>> e['link']
-    u'http://example.org/entry/3'
-    >>> e['description']
-    u'Watch out for nasty tricks'
-    >>> e['author']
-    u'Mark Pilgrim (mark@example.org)'
-
-
-The same thing works in reverse: you can access :abbr:`RSS (Rich Site Summary)` feeds as if they were Atom feeds.
-
-Accessing an :abbr:`RSS (Rich Site Summary)` feed as an Atom feed
------------------------------------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse(' http://feedparser.org/docs/examples/rss20.xml')
-    >>> d.feed.subtitle_detail
-    {'type': 'text/html',
-    'base': 'http://feedparser.org/docs/examples/rss20.xml',
-    'language': None,
-    'value': u'For documentation <em>only</em>'}
-    >>> len(d.entries)
-    1
-    >>> e = d.entries[0]
-    >>> e.links
-    [{'rel': 'alternate',
-    'type': 'text/html',
-    'href': u'http://example.org/item/1'}]
-    >>> e.summary_detail
-    {'type': 'text/html',
-    'base': 'http://feedparser.org/docs/examples/rss20.xml',
-    'language': u'en',
-    'value': u'Watch out for <span>nasty tricks</span>'}
-    >>> e.updated_parsed
-    (2002, 9, 5, 0, 0, 1, 3, 248, 0)
-
-
-.. note::
-
-    For more examples of how :program:`Universal Feed Parser` normalizes
-    content from different formats, see :ref:`annotated`.

+ 0 - 177
Lib python/feedparser-5.2.1/docs/date-parsing.rst

@@ -1,177 +0,0 @@
-.. _advanced.date:
-
-Date Parsing
-============
-
-Different feed types and versions use wildly different date formats.
-:program:`Universal Feed Parser` will attempt to auto-detect the date format
-used in any date element, and parse it into a standard :program:`Python`
-9-tuple, as documented in `the Python time module <http://docs.python.org/lib/module-time.html>`_.
-
-The following elements are parsed as dates:
-
-- :ref:`reference.feed.updated` is parsed into :ref:`reference.feed.updated_parsed`.
-
-- :ref:`reference.entry.published` is parsed into :ref:`reference.entry.published_parsed`.
-
-- :ref:`reference.entry.updated` is parsed into :ref:`reference.entry.updated_parsed`.
-
-- :ref:`reference.entry.created` is parsed into :ref:`reference.entry.created_parsed`.
-
-- :ref:`reference.entry.expired` is parsed into :ref:`reference.entry.expired_parsed`.
-
-
-History of Date Formats
------------------------
-
-
-Here is a brief history of feed date formats:
-
-- :abbr:`CDF (Channel Definition Format)` states that all date values must
-  conform to ISO 8601:1988.  ISO 8601:1988 is not a freely
-  available specification, but a brief (non-normative) description of the date
-  formats it describes is available here: `ISO 8601:1988 Date/Time Representations <http://hydracen.com/dx/iso8601.htm>`_.
-
-- :abbr:`RSS (Rich Site Summary)` 0.90 has no date elements.
-
-- Netscape :abbr:`RSS (Rich Site Summary)` 0.91 does not specify a date format,
-  but examples within the specification show :abbr:`RFC (Request For Comments)`
-  822-style dates with 4-digit years.
-
-- Userland :abbr:`RSS (Rich Site Summary)` 0.91 states, "All date-times in
-  :abbr:`RSS (Rich Site Summary)` conform to the Date and Time Specification of
-  :abbr:`RFC (Request For Comments)` 822." `RFC 822 <http://www.ietf.org/rfc/rfc822.txt>`_
-  mandates 2-digit years; it does not allow 4-digit years.
-
-- :abbr:`RSS (Rich Site Summary)` 1.0 states that all date elements must
-  conform to `W3CDTF <http://www.w3.org/TR/NOTE-datetime>`_,
-  which is a profile of ISO 8601:1988.
-
-- :abbr:`RSS (Rich Site Summary)` 2.0 states, "All date-times in :abbr:`RSS (Rich Site Summary)` conform to the Date and Time Specification of RFC 822, with the exception that the year may be expressed with two characters or four characters (four preferred)."
-
-- Atom 0.3 states that all date elements must conform to
-  `W3CDTF <http://www.w3.org/TR/NOTE-datetime>`_.
-
-- Atom 1.0 states that all date elements "MUST conform to the date-time
-  production in `RFC 3339 <http://www.ietf.org/rfc/rfc3339.txt>`_.
-  In addition, an uppercase T character MUST be used to separate date and time,
-  and an uppercase Z character MUST be present in the absence of a numeric time
-  zone offset."
-
-
-Recognized Date Formats
------------------------
-
-Here is a representative list of the formats that :program:`Universal Feed
-Parser` can recognize in any date element:
-
-
-Recognized Date Formats
-
-
-============================================ ================================= =====================================
-Description                                  Example                           Parsed Value                         
-============================================ ================================= =====================================
-valid RFC 822 (2-digit year)                 Thu, 01 Jan 04 19:48:21 GMT       (2004, 1, 1, 19, 48, 21, 3, 1, 0)    
-valid RFC 822 (4-digit year)                 Thu, 01 Jan 2004 19:48:21 GMT     (2004, 1, 1, 19, 48, 21, 3, 1, 0)    
-invalid RFC 822 (no time)                    01 Jan 2004                       (2004, 1, 1, 0, 0, 0, 3, 1, 0)       
-invalid RFC 822 (no seconds)                 01 Jan 2004 00:00 GMT             (2004, 1, 1, 0, 0, 0, 3, 1, 0)       
-valid W3CDTF (numeric timezone)              2003-12-31T10:14:55-08:00         (2003, 12, 31, 18, 14, 55, 2, 365, 0)
-valid W3CDTF (UTC timezone)                  2003-12-31T10:14:55Z              (2003, 12, 31, 10, 14, 55, 2, 365, 0)
-valid W3CDTF (yyyy)                          2003                              (2003, 1, 1, 0, 0, 0, 2, 1, 0)       
-valid W3CDTF (yyyy-mm)                       2003-12                           (2003, 12, 1, 0, 0, 0, 0, 335, 0)    
-valid W3CDTF (yyyy-mm-dd)                    2003-12-31                        (2003, 12, 31, 0, 0, 0, 2, 365, 0)   
-valid ISO 8601 (yyyymmdd)                    20031231                          (2003, 12, 31, 0, 0, 0, 2, 365, 0)   
-valid ISO 8601 (-yy-mm)                      -03-12                            (2003, 12, 1, 0, 0, 0, 0, 335, 0)    
-valid ISO 8601 (-yymm)                       -0312                             (2003, 12, 1, 0, 0, 0, 0, 335, 0)    
-valid ISO 8601 (-yy-mm-dd)                   -03-12-31                         (2003, 12, 31, 0, 0, 0, 2, 365, 0)   
-valid ISO 8601 (yymmdd)                      031231                            (2003, 12, 31, 0, 0, 0, 2, 365, 0)   
-valid ISO 8601 (yyyy-o)                      2003-335                          (2003, 12, 1, 0, 0, 0, 0, 335, 0)    
-valid ISO 8601 (yyo)                         03335                             (2003, 12, 1, 0, 0, 0, 0, 335, 0)    
-valid asctime                                Sun Jan  4 16:29:06 PST 2004      (2004, 1, 5, 0, 29, 6, 0, 5, 0)      
-bogus RFC 822 (invalid day/month)            Thu, 31 Jun 2004 19:48:21 GMT     (2004, 7, 1, 19, 48, 21, 3, 183, 0)  
-bogus RFC 822 (invalid month)                Mon, 26 January 2004 16:31:00 EST (2004, 1, 26, 21, 31, 0, 0, 26, 0)   
-bogus RFC 822 (invalid timezone)             Mon, 26 Jan 2004 16:31:00 ET      (2004, 1, 26, 21, 31, 0, 0, 26, 0)   
-bogus W3CDTF (invalid hour)                  2003-12-31T25:14:55Z              (2004, 1, 1, 1, 14, 55, 3, 1, 0)     
-bogus W3CDTF (invalid minute)                2003-12-31T10:61:55Z              (2003, 12, 31, 11, 1, 55, 2, 365, 0) 
-bogus W3CDTF (invalid second)                2003-12-31T10:14:61Z              (2003, 12, 31, 10, 15, 1, 2, 365, 0) 
-bogus (MSSQL)                                2004-07-08 23:56:58.0             (2004, 7, 8, 14, 56, 58, 3, 190, 0)  
-bogus (MSSQL-ish, without fractional second) 2004-07-08 23:56:58               (2004, 7, 8, 14, 56, 58, 3, 190, 0)  
-bogus (Korean)                               2004-05-25 오 11:23:17            (2004, 5, 25, 14, 23, 17, 1, 146, 0) 
-bogus (Greek)                                Κυρ, 11 Ιούλ 2004 12:00:00 EST    (2004, 7, 11, 17, 0, 0, 6, 193, 0)   
-bogus (Hungarian)                            július-13T9:15-05:00              (2004, 7, 13, 14, 15, 0, 1, 195, 0)  
-============================================ ================================= =====================================
-
-
-:program:`Universal Feed Parser` recognizes all character-based timezone
-abbreviations defined in :abbr:`RFC (Request For Comments)` 822.  In addition,
-:program:`Universal Feed Parser` recognizes the following invalid timezones:
-
-
-- ``AT`` is treated as ``AST``
-
-- ``ET`` is treated as ``EST``
-
-- ``CT`` is treated as ``CST``
-
-- ``MT`` is treated as ``MST``
-
-- ``PT`` is treated as ``PST``
-
-
-
-Supporting Additional Date Formats
-----------------------------------
-
-:program:`Universal Feed Parser` supports many different date formats, but
-there are probably many more in the wild that are still unsupported.  If you
-find other date formats, you can support them by registering them with
-``registerDateHandler``.  It takes a single argument, a callback function.  The
-callback function should take a single argument, a string, and return a single
-value, a 9-tuple :program:`Python` date in UTC.
-
-
-Registering a third-party date handler
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-::
-
-    import feedparser
-    import re
-
-    _my_date_pattern = re.compile(
-        r'(\d{,2})/(\d{,2})/(\d{4}) (\d{,2}):(\d{2}):(\d{2})')
-
-    def myDateHandler(aDateString):
-        """parse a UTC date in MM/DD/YYYY HH:MM:SS format"""
-        month, day, year, hour, minute, second = \
-            _my_date_pattern.search(aDateString).groups()
-        return (int(year), int(month), int(day), \
-            int(hour), int(minute), int(second), 0, 0, 0)
-
-    feedparser.registerDateHandler(myDateHandler)
-    d = feedparser.parse(...)
-
-
-
-Your newly-registered date handler will be tried before all the other date
-handlers built into :program:`Universal Feed Parser`.  (More specifically, all
-date handlers are tried in "last in, first out" order; i.e. the last handler to
-be registered is the first one tried, and so on in reverse order of
-registration.)
-
-
-If your date handler returns ``None``, or anything other than a
-:program:`Python` 9-tuple date, or raises an exception of any kind, the error
-will be silently ignored and the other registered date handlers will be tried
-in order.  If no date handlers succeed, then the date is not parsed, and the
-\*_parsed value will not be present in the results dictionary.  The original
-date string will still be available in the appropriate element in the results
-dictionary.
-
-
-.. tip::
-
-   If you write a new date handler, you are encouraged (but not required) to
-   `submit a patch <http://sourceforge.net/projects/feedparser/>`_ so it can be
-   integrated into the next version of :program:`Universal Feed Parser`.

+ 0 - 19
Lib python/feedparser-5.2.1/docs/history.rst

@@ -1,19 +0,0 @@
-Revision history
-################
-
-.. toctree::
-   :maxdepth: 2
-
-   changes-42
-   changes-41
-   changes-402
-   changes-401
-   changes-40
-   changes-33
-   changes-32
-   changes-31
-   changes-301
-   changes-30
-   changes-27
-   changes-26
-   changes-early

+ 0 - 815
Lib python/feedparser-5.2.1/docs/html-sanitization.rst

@@ -1,815 +0,0 @@
-.. _advanced.sanitization:
-
-Sanitization
-============
-
-Most feeds embed :abbr:`HTML (HyperText Markup Language)` markup within feed
-elements.  Some feeds even embed other types of markup, such as :abbr:`SVG
-(Scalable Vector Graphics)` or :abbr:`MathML (Mathematical Markup Language)`.
-Since many feed aggregators use a web browser (or browser component) to display
-content, :program:`Universal Feed Parser` sanitizes embedded markup to remove
-things that could pose security risks.
-
-These elements are sanitized by default:
-
-* :ref:`reference.entry.content`
-* :ref:`reference.entry.summary`
-* :ref:`reference.entry.title`
-* :ref:`reference.feed.info`
-* :ref:`reference.feed.rights`
-* :ref:`reference.feed.subtitle`
-* :ref:`reference.feed.title`
-
-
-.. note::
-
-    If the content is declared to be (or is determined to be)
-    :mimetype:`text/plain`, it will not be sanitized. This is to avoid data loss.
-    It is recommended that you check the content type in e.g.
-    :py:attr:`entries[i].summary_detail.type`. If it is :mimetype:`text/plain` then
-    it has not been sanitized (and you should perform HTML escaping before
-    rendering the content).
-
-
-.. _advanced.sanitization.html:
-
-:abbr:`HTML (HyperText Markup Language)` Sanitization
------------------------------------------------------
-
-The following :abbr:`HTML (HyperText Markup Language)` elements are allowed by
-default (all others are stripped):
-
-.. hlist::
-   :columns: 3
-
-   * a
-   * abbr
-   * acronym
-   * address
-   * area
-   * article
-   * aside
-   * audio
-   * b
-   * big
-   * blockquote
-   * br
-   * button
-   * canvas
-   * caption
-   * center
-   * cite
-   * code
-   * col
-   * colgroup
-   * command
-   * datagrid
-   * datalist
-   * dd
-   * del
-   * details
-   * dfn
-   * dialog
-   * dir
-   * div
-   * dl
-   * dt
-   * em
-   * event-source
-   * fieldset
-   * figure
-   * font
-   * footer
-   * form
-   * h1
-   * h2
-   * h3
-   * h4
-   * h5
-   * h6
-   * header
-   * hr
-   * i
-   * img
-   * input
-   * ins
-   * kbd
-   * keygen
-   * label
-   * legend
-   * li
-   * m
-   * map
-   * menu
-   * meter
-   * multicol
-   * nav
-   * nextid
-   * noscript
-   * ol
-   * optgroup
-   * option
-   * output
-   * p
-   * pre
-   * progress
-   * q
-   * s
-   * samp
-   * section
-   * select
-   * small
-   * sound
-   * source
-   * spacer
-   * span
-   * strike
-   * strong
-   * sub
-   * sup
-   * table
-   * tbody
-   * td
-   * textarea
-   * tfoot
-   * th
-   * thead
-   * time
-   * tr
-   * tt
-   * u
-   * ul
-   * var
-   * video
-
-
-The following :abbr:`HTML (HyperText Markup Language)` attributes are allowed
-by default (all others are stripped):
-
-.. hlist::
-   :columns: 3
-
-   * abbr
-   * accept
-   * accept-charset
-   * accesskey
-   * action
-   * align
-   * alt
-   * autocomplete
-   * autofocus
-   * autoplay
-   * axis
-   * background
-   * balance
-   * bgcolor
-   * bgproperties
-   * border
-   * bordercolor
-   * bordercolordark
-   * bordercolorlight
-   * bottompadding
-   * cellpadding
-   * cellspacing
-   * ch
-   * challenge
-   * char
-   * charoff
-   * charset
-   * checked
-   * choff
-   * cite
-   * class
-   * clear
-   * color
-   * cols
-   * colspan
-   * compact
-   * contenteditable
-   * coords
-   * data
-   * datafld
-   * datapagesize
-   * datasrc
-   * datetime
-   * default
-   * delay
-   * dir
-   * disabled
-   * draggable
-   * dynsrc
-   * enctype
-   * end
-   * face
-   * for
-   * form
-   * frame
-   * galleryimg
-   * gutter
-   * headers
-   * height
-   * hidden
-   * hidefocus
-   * high
-   * href
-   * hreflang
-   * hspace
-   * icon
-   * id
-   * inputmode
-   * ismap
-   * keytype
-   * label
-   * lang
-   * leftspacing
-   * list
-   * longdesc
-   * loop
-   * loopcount
-   * loopend
-   * loopstart
-   * low
-   * lowsrc
-   * max
-   * maxlength
-   * media
-   * method
-   * min
-   * multiple
-   * name
-   * nohref
-   * noshade
-   * nowrap
-   * open
-   * optimum
-   * pattern
-   * ping
-   * point-size
-   * poster
-   * pqg
-   * preload
-   * prompt
-   * radiogroup
-   * readonly
-   * rel
-   * repeat-max
-   * repeat-min
-   * replace
-   * required
-   * rev
-   * rightspacing
-   * rows
-   * rowspan
-   * rules
-   * scope
-   * selected
-   * shape
-   * size
-   * span
-   * src
-   * start
-   * step
-   * summary
-   * suppress
-   * tabindex
-   * target
-   * template
-   * title
-   * toppadding
-   * type
-   * unselectable
-   * urn
-   * usemap
-   * valign
-   * value
-   * variable
-   * volume
-   * vrml
-   * vspace
-   * width
-   * wrap
-   * xml:lang
-
-
-.. _advanced.sanitization.svg:
-
-:abbr:`SVG (Scalable Vector Graphics)` Sanitization
----------------------------------------------------
-
-The following SVG elements are allowed by default (all others are stripped):
-
-.. hlist::
-   :columns: 3
-
-   * a
-   * animate
-   * animateColor
-   * animateMotion
-   * animateTransform
-   * circle
-   * defs
-   * desc
-   * ellipse
-   * font-face
-   * font-face-name
-   * font-face-src
-   * foreignObject
-   * g
-   * glyph
-   * hkern
-   * line
-   * linearGradient
-   * marker
-   * metadata
-   * missing-glyph
-   * mpath
-   * path
-   * polygon
-   * polyline
-   * radialGradient
-   * rect
-   * set
-   * stop
-   * svg
-   * switch
-   * text
-   * title
-   * tspan
-   * use
-
-
-The following :abbr:`SVG (Scalable Vector Graphics)` attributes are allowed by
-default (all others are stripped):
-
-.. hlist::
-   :columns: 3
-
-   * accent-height
-   * accumulate
-   * additive
-   * alphabetic
-   * arabic-form
-   * ascent
-   * attributeName
-   * attributeType
-   * baseProfile
-   * bbox
-   * begin
-   * by
-   * calcMode
-   * cap-height
-   * class
-   * color
-   * color-rendering
-   * content
-   * cx
-   * cy
-   * d
-   * descent
-   * display
-   * dur
-   * dx
-   * dy
-   * end
-   * fill
-   * fill-opacity
-   * fill-rule
-   * font-family
-   * font-size
-   * font-stretch
-   * font-style
-   * font-variant
-   * font-weight
-   * from
-   * fx
-   * fy
-   * g1
-   * g2
-   * glyph-name
-   * gradientUnits
-   * hanging
-   * height
-   * horiz-adv-x
-   * horiz-origin-x
-   * id
-   * ideographic
-   * k
-   * keyPoints
-   * keySplines
-   * keyTimes
-   * lang
-   * marker-end
-   * marker-mid
-   * marker-start
-   * markerHeight
-   * markerUnits
-   * markerWidth
-   * mathematical
-   * max
-   * min
-   * name
-   * offset
-   * opacity
-   * orient
-   * origin
-   * overline-position
-   * overline-thickness
-   * panose-1
-   * path
-   * pathLength
-   * points
-   * preserveAspectRatio
-   * r
-   * refX
-   * refY
-   * repeatCount
-   * repeatDur
-   * requiredExtensions
-   * requiredFeatures
-   * restart
-   * rotate
-   * rx
-   * ry
-   * slope
-   * stemh
-   * stemv
-   * stop-color
-   * stop-opacity
-   * strikethrough-position
-   * strikethrough-thickness
-   * stroke
-   * stroke-dasharray
-   * stroke-dashoffset
-   * stroke-linecap
-   * stroke-linejoin
-   * stroke-miterlimit
-   * stroke-opacity
-   * stroke-width
-   * systemLanguage
-   * target
-   * text-anchor
-   * to
-   * transform
-   * type
-   * u1
-   * u2
-   * underline-position
-   * underline-thickness
-   * unicode
-   * unicode-range
-   * units-per-em
-   * values
-   * version
-   * viewBox
-   * visibility
-   * width
-   * widths
-   * x
-   * x-height
-   * x1
-   * x2
-   * xlink:actuate
-   * xlink:arcrole
-   * xlink:href
-   * xlink:role
-   * xlink:show
-   * xlink:title
-   * xlink:type
-   * xml:base
-   * xml:lang
-   * xml:space
-   * xmlns
-   * xmlns:xlink
-   * y
-   * y1
-   * y2
-   * zoomAndPan
-
-
-.. _advanced.sanitization.mathml:
-
-:abbr:`MathML (Mathematical Markup Language)` Sanitization
-----------------------------------------------------------
-
-The following :abbr:`MathML (Mathematical Markup Language)` elements are
-allowed by default (all others are stripped):
-
-.. hlist::
-   :columns: 3
-
-   * annotation
-   * annotation-xml
-   * maction
-   * maligngroup
-   * malignmark
-   * math
-   * menclose
-   * merror
-   * mfenced
-   * mfrac
-   * mglyph
-   * mi
-   * mlabeledtr
-   * mlongdiv
-   * mmultiscripts
-   * mn
-   * mo
-   * mover
-   * mpadded
-   * mphantom
-   * mprescripts
-   * mroot
-   * mrow
-   * ms
-   * mscarries
-   * mscarry
-   * msgroup
-   * msline
-   * mspace
-   * msqrt
-   * msrow
-   * mstack
-   * mstyle
-   * msub
-   * msubsup
-   * msup
-   * mtable
-   * mtd
-   * mtext
-   * mtr
-   * munder
-   * munderover
-   * none
-   * semantics
-
-
-The following :abbr:`MathML (Mathematical Markup Language)` attributes are
-allowed by default (all others are stripped):
-
-.. hlist::
-   :columns: 3
-
-   * accent
-   * accentunder
-   * actiontype
-   * align
-   * alignmentscope
-   * altimg
-   * altimg-height
-   * altimg-valign
-   * altimg-width
-   * alttext
-   * bevelled
-   * charalign
-   * close
-   * columnalign
-   * columnlines
-   * columnspacing
-   * columnspan
-   * columnwidth
-   * crossout
-   * decimalpoint
-   * denomalign
-   * depth
-   * dir
-   * display
-   * displaystyle
-   * edge
-   * encoding
-   * equalcolumns
-   * equalrows
-   * fence
-   * fontstyle
-   * fontweight
-   * form
-   * frame
-   * framespacing
-   * groupalign
-   * height
-   * href
-   * id
-   * indentalign
-   * indentalignfirst
-   * indentalignlast
-   * indentshift
-   * indentshiftfirst
-   * indentshiftlast
-   * indenttarget
-   * infixlinebreakstyle
-   * largeop
-   * length
-   * linebreak
-   * linebreakmultchar
-   * linebreakstyle
-   * lineleading
-   * linethickness
-   * location
-   * longdivstyle
-   * lquote
-   * lspace
-   * mathbackground
-   * mathcolor
-   * mathsize
-   * mathvariant
-   * maxsize
-   * minlabelspacing
-   * minsize
-   * movablelimits
-   * notation
-   * numalign
-   * open
-   * other
-   * overflow
-   * position
-   * rowalign
-   * rowlines
-   * rowspacing
-   * rowspan
-   * rquote
-   * rspace
-   * scriptlevel
-   * scriptminsize
-   * scriptsizemultiplier
-   * selection
-   * separator
-   * separators
-   * shift
-   * side
-   * src
-   * stackalign
-   * stretchy
-   * subscriptshift
-   * superscriptshift
-   * symmetric
-   * voffset
-   * width
-   * xlink:href
-   * xlink:show
-   * xlink:type
-   * xmlns
-   * xmlns:xlink
-
-
-.. _advanced.sanitization.css:
-
-:abbr:`CSS (Cascading Style Sheets)` Sanitization
--------------------------------------------------
-
-The following :abbr:`CSS (Cascading Style Sheets)` properties are allowed by
-default in style attributes (all others are stripped):
-
-.. hlist::
-   :columns: 3
-
-   * azimuth
-   * background-color
-   * border-bottom-color
-   * border-collapse
-   * border-color
-   * border-left-color
-   * border-right-color
-   * border-top-color
-   * clear
-   * color
-   * cursor
-   * direction
-   * display
-   * elevation
-   * float
-   * font
-   * font-family
-   * font-size
-   * font-style
-   * font-variant
-   * font-weight
-   * height
-   * letter-spacing
-   * line-height
-   * overflow
-   * pause
-   * pause-after
-   * pause-before
-   * pitch
-   * pitch-range
-   * richness
-   * speak
-   * speak-header
-   * speak-numeral
-   * speak-punctuation
-   * speech-rate
-   * stress
-   * text-align
-   * text-decoration
-   * text-indent
-   * unicode-bidi
-   * vertical-align
-   * voice-family
-   * volume
-   * white-space
-   * width
-
-
-.. note::
-
-    Not all possible CSS values are allowed for these properties.  The
-    allowable values are restricted by a whitelist and a regular expression that
-    allows color values and lengths.  :abbr:`URI (Uniform Resource Identifier)`\s
-    are not allowed, to prevent `platypus attacks <http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely>`_.
-    See the _HTMLSanitizer class for more details.
-
-
-Whitelist, Don't Blacklist
---------------------------
-
-I am often asked why :program:`Universal Feed Parser` is so hard-assed about
-:abbr:`HTML (HyperText Markup Language)` and :abbr:`CSS (Cascading Style
-Sheets)` sanitizing.  To illustrate the problem, here is an incomplete list of
-potentially dangerous :abbr:`HTML (HyperText Markup Language)` tags and
-attributes:
-
-* script, which can contain malicious script
-* applet, embed, and object, which can automatically download and execute malicious code
-* meta, which can contain malicious redirects
-* onload, onunload, and all other on* attributes, which can contain malicious script
-* style, link, and the style attribute, which can contain malicious script
-
-*style?* Yes, style. :abbr:`CSS (Cascading Style Sheets)` definitions can contain executable code.
-
-
-Embedding Javascript in :abbr:`CSS (Cascading Style Sheets)`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This sample is taken from `http://feedparser.org/docs/examples/rss20.xml <http://feedparser.org/docs/examples/rss20.xml>`_:
-
-.. sourcecode:: html
-
-
-    <description>Watch out for
-    &lt;span style="background: url(javascript:window.location='http://example.org/')"&gt;
-    nasty tricks&lt;/span&gt;</description>
-
-
-This sample is more advanced, and does not contain the keyword javascript: that
-many naive :abbr:`HTML (HyperText Markup Language)` sanitizers scan for:
-
-.. sourcecode:: html
-
-    <description>Watch out for
-    &lt;span style="any: expression(window.location='http://example.org/')"&gt;
-    nasty tricks&lt;/span&gt;</description>
-
-
-Internet Explorer for Windows will execute the Javascript in both of these examples.
-
-Now consider that in :abbr:`HTML (HyperText Markup Language)`, attribute values may be entity-encoded in several different ways.
-
-
-Embedding encoded Javascript in :abbr:`CSS (Cascading Style Sheets)`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-To a browser, this:
-
-.. sourcecode:: html
-
-    <span style="any: expression(window.location='http://example.org/')">
-
-
-is the same as this (without the line breaks):
-
-.. sourcecode:: html
-
-    <span style="&#97;&#110;&#121;&#58;&#32;&#101;&#120;&#112;&#114;&#101;
-    &#115;&#115;&#105;&#111;&#110;&#40;&#119;&#105;&#110;&#100;&#111;&#119;
-    &#46;&#108;&#111;&#99;&#97;&#116;&#105;&#111;&#110;&#61;&#39;&#104;
-    &#116;&#116;&#112;&#58;&#47;&#47;&#101;&#120;&#97;&#109;&#112;&#108;
-    &#101;&#46;&#111;&#114;&#103;&#47;&#39;&#41;">
-
-
-which is the same as this (without the line breaks):
-
-.. sourcecode:: html
-
-    <span style="&#x61;&#x6e;&#x79;&#x3a;&#x20;&#x65;&#x78;&#x70;&#x72;
-    &#x65;&#x73;&#x73;&#x69;&#x6f;&#x6e;&#x28;&#x77;&#x69;&#x6e;
-    &#x64;&#x6f;&#x77;&#x2e;&#x6c;&#x6f;&#x63;&#x61;&#x74;&#x69;
-    &#x6f;&#x6e;&#x3d;&#x27;&#x68;&#x74;&#x74;&#x70;&#x3a;&#x2f;
-    &#x2f;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x6f;
-    &#x72;&#x67;&#x2f;&#x27;&#x29;">
-
-
-And so on, plus several other variations, plus every combination of every
-variation.
-
-The more I investigate, the more cases I find where Internet Explorer for
-Windows will treat seemingly innocuous markup as code and blithely execute it.
-This is why :program:`Universal Feed Parser` uses a whitelist and not a
-blacklist. I am reasonably confident that none of the elements or attributes on
-the whitelist are security risks. I am not at all confident about elements or
-attributes that I have not explicitly investigated. And I have no confidence at
-all in my ability to detect strings within attribute values that Internet
-Explorer for Windows will treat as executable code.
-
-.. seealso::
-
-    `How to consume RSS safely <http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely>`_
-        Explains the platypus attack.

+ 0 - 135
Lib python/feedparser-5.2.1/docs/http-authentication.rst

@@ -1,135 +0,0 @@
-Password-Protected Feeds
-========================
-
-:program:`Universal Feed Parser` supports downloading and parsing
-password-protected feeds that are protected by :abbr:`HTTP (Hypertext Transfer Protocol)`
-authentication.  Both basic and digest authentication are supported.
-
-
-Downloading a feed protected by basic authentication (the easy way)
--------------------------------------------------------------------
-
-The easiest way is to embed the username and password in the feed
-:abbr:`URL (Uniform Resource Locator)` itself.
-
-In this example, the username is test and the password is basic.
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://test:basic@feedparser.org/docs/examples/basic_auth.xml')
-    >>> d.feed.title
-    u'Sample Feed'
-
-The same technique works for digest authentication.  (Technically,
-:program:`Universal Feed Parser` will attempt basic authentication first, but
-if that fails and the server indicates that it requires digest authentication,
-:program:`Universal Feed Parser` will automatically re-request the feed with
-the appropriate digest authentication headers.  *This means that this technique
-will send your password to the server in an easily decryptable form.*)
-
-
-.. _example.auth.inline.digest:
-
-Downloading a feed protected by digest authentication (the easy but horribly insecure way)
-------------------------------------------------------------------------------------------
-
-In this example, the username is test and the password is digest.
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://test:digest@feedparser.org/docs/examples/digest_auth.xml')
-    >>> d.feed.title
-    u'Sample Feed'
-
-
-
-You can also construct a HTTPBasicAuthHandler that contains the password
-information, then pass that as a handler to the ``parse`` function.
-HTTPBasicAuthHandler is part of the standard `urllib2 <http://docs.python.org/lib/module-urllib2.html>`_ module.
-
-Downloading a feed protected by :abbr:`HTTP (Hypertext Transfer Protocol)` basic authentication (the hard way)
---------------------------------------------------------------------------------------------------------------
-
-::
-
-    import urllib2, feedparser
-
-    # Construct the authentication handler
-    auth = urllib2.HTTPBasicAuthHandler()
-
-    # Add password information: realm, host, user, password.
-    # A single handler can contain passwords for multiple sites;
-    # urllib2 will sort out which passwords get sent to which sites
-    # based on the realm and host of the URL you're retrieving
-    auth.add_password('BasicTest', 'feedparser.org', 'test', 'basic')
-
-    # Pass the authentication handler to the feed parser.
-    # handlers is a list because there might be more than one
-    # type of handler (urllib2 defines lots of different ones,
-    # and you can build your own)
-    d = feedparser.parse('http://feedparser.org/docs/examples/basic_auth.xml',
-                         handlers=[auth])
-
-
-
-Digest authentication is handled in much the same way, by constructing an
-HTTPDigestAuthHandler and populating it with the necessary realm, host, user,
-and password information.  This is more secure than 
-:ref:`stuffing the username and password in the URL <example.auth.inline.digest>`,
-since the password will be encrypted before being sent to the server.
-
-
-Downloading a feed protected by :abbr:`HTTP (Hypertext Transfer Protocol)` digest authentication (the secure way)
------------------------------------------------------------------------------------------------------------------
-
-::
-
-    import urllib2, feedparser
-
-    auth = urllib2.HTTPDigestAuthHandler()
-    auth.add_password('DigestTest', 'feedparser.org', 'test', 'digest')
-    d = feedparser.parse('http://feedparser.org/docs/examples/digest_auth.xml',
-                          handlers=[auth])
-
-
-The examples so far have assumed that you know in advance that the feed is
-password-protected.  But what if you don't know?
-
-If you try to download a password-protected feed without sending all the proper
-password information, the server will return an 
-:abbr:`HTTP (Hypertext Transfer Protocol)` status code ``401``.
-:program:`Universal Feed Parser` makes this status code available in
-``d.status``.
-
-Details on the authentication scheme are in ``d.headers['www-authenticate']``.
-:program:`Universal Feed Parser` does not do any further parsing on this field;
-you will need to parse it yourself.  Everything before the first space is the
-type of authentication (probably ``Basic`` or ``Digest``), which controls which
-type of handler you'll need to construct.  The realm name is given as
-realm="foo" -- so foo would be your first argument to auth.add_password.  Other
-information in the www-authenticate header is probably safe to ignore; the
-:file:`urllib2` module will handle it for you.
-
-
-Determining that a feed is password-protected
----------------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/basic_auth.xml')
-    >>> d.status
-    401
-    >>> d.headers['www-authenticate']
-    'Basic realm="Use test/basic"'
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/digest_auth.xml')
-    >>> d.status
-    401
-    >>> d.headers['www-authenticate']
-    'Digest realm="DigestTest",
-    nonce="+LV/uLLdAwA=5d77397291261b9ef256b034e19bcb94f5b7992a",
-    algorithm=MD5,
-    qop="auth"'
-

+ 0 - 92
Lib python/feedparser-5.2.1/docs/http-etag.rst

@@ -1,92 +0,0 @@
-.. _http.etag:
-
-ETag and Last-Modified Headers
-==============================
-
-ETags and Last-Modified headers are two ways that feed publishers can save
-bandwidth, but they only work if clients take advantage of them.
-:program:`Universal Feed Parser` gives you the ability to take advantage of
-these features, but you must use them properly.
-
-The basic concept is that a feed publisher may provide a special
-:abbr:`HTTP (Hypertext Transfer Protocol)` header, called an ETag, when it
-publishes a feed.  You should send this ETag back to the server on subsequent
-requests.  If the feed has not changed since the last time you requested it,
-the server will return a special :abbr:`HTTP (Hypertext Transfer Protocol)`
-status code (``304``) and no feed data.
-
-Using ETags to reduce bandwidth
--------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> d.etag
-    '"6c132-941-ad7e3080"'
-    >>> d2 = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml', etag=d.etag)
-    >>> d2.status
-    304
-    >>> d2.feed
-    {}
-    >>> d2.entries
-    []
-    >>> d2.debug_message
-    'The feed has not changed since you last checked, so
-    the server sent no data.  This is a feature, not a bug!'
-
-There is a related concept which accomplishes the same thing, but slightly
-differently.  In this case, the server publishes the last-modified date of the
-feed in the :abbr:`HTTP (Hypertext Transfer Protocol)` header.  You can send
-this back to the server on subsequent requests, and if the feed has not
-changed, the server will return :abbr:`HTTP (Hypertext Transfer Protocol)`
-status code ``304`` and no feed data.
-
-
-Using Last-Modified headers to reduce bandwidth
------------------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> d.modified
-    Fri, 11 Jun 2012 23:00:34 GMT
-    >>> d.modified_parsed
-    (2004, 6, 11, 23, 0, 34, 4, 163, 0)
-    >>> d2 = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml', modified=d.modified)
-    >>> d2.status
-    304
-    >>> d2.feed
-    {}
-    >>> d2.entries
-    []
-    >>> d2.debug_message
-    'The feed has not changed since you last checked, so
-    the server sent no data.  This is a feature, not a bug!'
-
-Clients should support both ETag and Last-Modified headers, as some servers support one but not the other.
-
-
-.. important::
-
-    If you do not support ETag and Last-Modified headers, you will repeatedly
-    download feeds that have not changed.  This wastes your bandwidth and the
-    publisher's bandwidth, and the publisher may ban you from accessing their
-    server.
-
-
-.. note::
-
-    You can control the behaviour of :abbr:`HTTP (Hypertext Transfer Protocol)`
-    caches between your application and the origin server by using the
-    ``extra_headers`` parameter.  For example, you may want to send
-    ``Cache-control: max-age=60`` to make the caches revalidate against the
-    origin server unless their cached copy is less than a minute old.  Again,
-    this should be used with consideration.
-
-
-.. seealso::
-
-    * `HTTP Conditional Get For RSS Hackers <http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers>`_
-    * `HTTP Web Services <http://diveintopython.org/http_web_services/>`_

+ 0 - 40
Lib python/feedparser-5.2.1/docs/http-other.rst

@@ -1,40 +0,0 @@
-Other :abbr:`HTTP (Hypertext Transfer Protocol)` Headers
-========================================================
-
-You can specify additional :abbr:`HTTP (Hypertext Transfer Protocol)` request
-headers as a dictionary.  When you download a feed from a remote web server,
-:program:`Universal Feed Parser` exposes the complete set of
-:abbr:`HTTP (Hypertext Transfer Protocol)` response headers as a dictionary.
-
-
-.. _example.http.headers.request:
-
-Sending custom :abbr:`HTTP (Hypertext Transfer Protocol)` request headers
--------------------------------------------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom03.xml',
-                              request_headers={'Cache-control': 'max-age=0'})
-
-
-Accessing other :abbr:`HTTP (Hypertext Transfer Protocol)` response headers
----------------------------------------------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom03.xml')
-    >>> d.headers
-    {'date': 'Fri, 11 Jun 2004 23:57:50 GMT',
-    'server': 'Apache/2.0.49 (Debian GNU/Linux)',
-    'last-modified': 'Fri, 11 Jun 2004 23:00:34 GMT',
-    'etag': '"6c132-941-ad7e3080"',
-    'accept-ranges': 'bytes',
-    'vary': 'Accept-Encoding,User-Agent',
-    'content-encoding': 'gzip',
-    'content-length': '883',
-    'connection': 'close',
-    'content-type': 'application/xml'}
-

+ 0 - 82
Lib python/feedparser-5.2.1/docs/http-redirect.rst

@@ -1,82 +0,0 @@
-:abbr:`HTTP (Hypertext Transfer Protocol)` Redirects
-====================================================
-
-When you download a feed from a remote web server, :program:`Universal Feed Parser`
-exposes the :abbr:`HTTP (Hypertext Transfer Protocol)` status code.  You need
-to understand the different codes, including permanent and temporary redirects,
-and feeds that have been marked "gone".
-
-When a feed has temporarily moved to a new location, the web server will return
-a ``302`` status code.  :program:`Universal Feed Parser` makes this available
-in ``d.status``.
-
-There is nothing special you need to do with temporary redirects; by the time
-you learn about it, :program:`Universal Feed Parser` has already followed the
-redirect to the new location (available in ``d.href``), downloaded the feed,
-and parsed it.  Since the redirect is temporary, you should continue requesting
-the original :abbr:`URL (Uniform Resource Locator)` the next time you want to
-parse the feed.
-
-
-Noticing temporary redirects
-----------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/temporary.xml')
-    >>> d.status
-    302
-    >>> d.href
-    'http://feedparser.org/docs/examples/atom10.xml'
-    >>> d.feed.title
-    u'Sample Feed'
-
-When a feed has permanently moved to a new location, the web server will return
-a ``301`` status code.  Again, :program:`Universal Feed Parser` makes this
-available in ``d.status``.
-
-
-If you are polling a feed on a regular basis, it is very important to check the
-status code (``d.status``) every time you download.  If the feed has been
-permanently redirected, you should update your database or configuration file
-with the new address (``d.href``).  Repeatedly requesting the original address
-of a feed that has been permanently redirected is very rude, and may get you
-banned from the server.
-
-
-Noticing permanent redirects
-----------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/permanent.xml')
-    >>> d.status
-    301
-    >>> d.href
-    'http://feedparser.org/docs/examples/atom10.xml'
-    >>> d.feed.title
-    u'Sample Feed'
-
-
-When a feed has been permanently deleted, the web server will return a ``410``
-status code.  If you ever receive a ``410``, you should stop polling the feed
-and inform the end user that the feed is gone for good.
-
-
-Repeatedly requesting a feed that has been marked as "gone" is very rude, and
-may get you banned from the server.
-
-
-Noticing feeds marked "gone"
-----------------------------
-
-::
-
-    
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/gone.xml')
-    >>> d.status
-    410
-

+ 0 - 57
Lib python/feedparser-5.2.1/docs/http-useragent.rst

@@ -1,57 +0,0 @@
-User-Agent and Referer Headers
-==============================
-
-:program:`Universal Feed Parser` sends a default User-Agent string when it
-requests a feed from a web server.
-
-
-The default User-Agent string looks like this:
-
-::
-
-    UniversalFeedParser/5.0.1 +http://feedparser.org/
-
-If you are embedding :program:`Universal Feed Parser` in a larger application,
-you should change the User-Agent to your application name and
-:abbr:`URL (Uniform Resource Locator)`.
-
-
-Customizing the User-Agent
---------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml',
-    agent='MyApp/1.0 +http://example.com/')
-
-You can also set the User-Agent once, globally, and then call the ``parse``
-function normally.
-
-
-Customizing the User-Agent permanently
---------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> feedparser.USER_AGENT = "MyApp/1.0 +http://example.com/"
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-
-
-:program:`Universal Feed Parser` also lets you set the referrer when you
-download a feed from a web server.  This is discouraged, because it is a
-violation of `RFC 2616 <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36>`_.
-The default behavior is to send a blank referrer, and you should never need to
-override this.
-
-
-Customizing the referrer
-------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml',
-    referrer='http://example.com/')
-

+ 0 - 11
Lib python/feedparser-5.2.1/docs/http.rst

@@ -1,11 +0,0 @@
-:abbr:`HTTP (Hypertext Transfer Protocol)` Features
-###################################################
-
-.. toctree::
-   :maxdepth: 2
-
-   http-etag
-   http-useragent
-   http-redirect
-   http-authentication
-   http-other

+ 0 - 24
Lib python/feedparser-5.2.1/docs/index.rst

@@ -1,24 +0,0 @@
-=============
-Documentation
-=============
-
-This documentation claims to describe the behavior of :program:`feedparser` |version|.
-It does not claim to describe the behavior of any other version.
-
-This documentation lives at `https://pythonhosted.org/feedparser/
-<https://pythonhosted.org/feedparser/>`_.  If you're reading it somewhere else, you may
-not have the latest version.
-
-This documentation is provided by the author "as is" without any express or
-implied warranties.  See :ref:`the documentation license <license>` for more details.
-
-.. toctree::
-   :maxdepth: 2
-
-   basic
-   advanced
-   http
-   annotated-examples
-   history
-   reference
-   license

+ 0 - 78
Lib python/feedparser-5.2.1/docs/introduction.rst

@@ -1,78 +0,0 @@
-Introduction
-============
-
-:program:`Universal Feed Parser` is a :program:`Python` module for downloading
-and parsing syndicated feeds.  It can handle :abbr:`RSS (Rich Site Summary)`
-0.90, Netscape :abbr:`RSS (Rich Site Summary)` 0.91, Userland :abbr:`RSS (Rich
-Site Summary)` 0.91, :abbr:`RSS (Rich Site Summary)` 0.92, :abbr:`RSS (Rich
-Site Summary)` 0.93, :abbr:`RSS (Rich Site Summary)` 0.94, :abbr:`RSS (Rich
-Site Summary)` 1.0, :abbr:`RSS (Rich Site Summary)` 2.0, Atom 0.3, Atom 1.0,
-and :abbr:`CDF (Channel Definition Format)` feeds.  It also parses several
-popular extension modules, including Dublin Core and Apple's :program:`iTunes`
-extensions.
-
-To use :program:`Universal Feed Parser`, you will need :program:`Python` 2.4 or
-later (Python 3 is supported).  :program:`Universal Feed Parser` is not meant
-to run standalone; it is a module for you to use as part of a larger
-:program:`Python` program.
-
-:program:`Universal Feed Parser` is easy to use; the module is self-contained
-in a single file, :file:`feedparser.py`, and it has one primary public
-function, ``parse``.  ``parse`` takes a number of arguments, but only one is
-required, and it can be a :abbr:`URL (Uniform Resource Locator)`, a local
-filename, or a raw string containing feed data in any format.
-
-
-Parsing a feed from a remote :abbr:`URL (Uniform Resource Locator)`
--------------------------------------------------------------------
-::
-
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
-    >>> d['feed']['title']
-    u'Sample Feed'
-
-
-The following example assumes you are on Windows, and that you have saved a feed at :file:`c:\\incoming\\atom10.xml`.
-
-.. note::
-
-    :program:`Universal Feed Parser` works on any platform that can run
-    :program:`Python`; use the path syntax appropriate for your platform.
-
-Parsing a feed from a local file
---------------------------------
-::
-
-
-    >>> import feedparser
-    >>> d = feedparser.parse(r'c:\incoming\atom10.xml')
-    >>> d['feed']['title']
-    u'Sample Feed'
-
-
-:program:`Universal Feed Parser` can also parse a feed in memory.
-
-Parsing a feed from a string
-----------------------------
-::
-
-
-    >>> import feedparser
-    >>> rawdata = """<rss version="2.0">
-    <channel>
-    <title>Sample Feed</title>
-    </channel>
-    </rss>"""
-    >>> d = feedparser.parse(rawdata)
-    >>> d['feed']['title']
-    u'Sample Feed'
-
-
-Values are returned as :program:`Python` Unicode strings (except when they're
-not -- see :ref:`advanced.encoding` for all the gory details).
-
-.. seealso::
-
-   `Introduction to Python Unicode strings <http://docs.python.org/tut/node5.html#SECTION005130000000000000000>`_

+ 0 - 28
Lib python/feedparser-5.2.1/docs/license.rst

@@ -1,28 +0,0 @@
-.. _license:
-
-Documentation license
-=====================
-
-Copyright 2004-2008 Mark Pilgrim. All rights reserved.
-
-Redistribution and use in source (Sphinx ReST) and "compiled" forms (HTML, PDF,
-PostScript, RTF and so forth) with or without modification, are permitted
-provided that the following conditions are met:
-
-* Redistributions of source code (Sphinx ReST) must retain the above copyright
-  notice, this list of conditions and the following disclaimer.
-* Redistributions in compiled form (converted to HTML, PDF, PostScript, RTF and
-  other formats) 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.
-
-THIS DOCUMENTATION 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
-DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 0 - 137
Lib python/feedparser-5.2.1/docs/namespace-handling.rst

@@ -1,137 +0,0 @@
-.. _advanced.namespaces:
-
-Namespace Handling
-==================
-
-:program:`Universal Feed Parser` attempts to expose all possible data in feeds,
-including elements in extension namespaces.
-
-Some common namespaced elements are mapped to core elements.  For further
-information about these mappings, see :ref:`reference`.
-
-Other namespaced elements are available as ``prefixelement``.
-
-The namespaces defined in the feed are available in the parsed results as
-``namespaces``, a dictionary of {prefix: namespaceURI}.  If the feed defines a
-default namespace, it is listed as ``namespaces['']``.
-
-
-Accessing namespaced elements
------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/prism.rdf')
-    >>> d.feed.prism_issn
-    u'0028-0836'
-    >>> d.namespaces
-    {'': u'http://purl.org/rss/1.0/',
-    'prism': u'http://prismstandard.org/namespaces/1.2/basic/',
-    'rdf': u'http://www.w3.org/1999/02/22-rdf-syntax-ns#'}
-
-
-The prefix used to construct the variable name is not guaranteed to be the same
-as the prefix of the namespaced element in the original feed.  If
-:program:`Universal Feed Parser` recognizes the namespace, it will use the
-namespace's preferred prefix to construct the variable name.  It will also list
-the namespace in the ``namespaces`` dictionary using the namespace's preferred
-prefix.
-
-In the previous example, the namespace
-(http://prismstandard.org/namespaces/1.2/basic/) was defined with the
-namespace's preferred prefix (prism), so the prism:issn element was accessible
-as the variable ``d.feed.prism_issn``.  However, if the namespace is defined
-with a non-standard prefix, :program:`Universal Feed Parser` will still
-construct the variable name using the preferred prefix, *not* the actual prefix
-that is used in the feed.
-
-This will become clear with an example.
-
-
-Accessing namespaced elements with non-standard prefixes
---------------------------------------------------------
-
-::
-
-    >>> import feedparser
-    >>> d = feedparser.parse('http://feedparser.org/docs/examples/nonstandard_prefix.rdf')
-    >>> d.feed.prism_issn
-    u'0028-0836'
-    >>> d.feed.foo_issn
-    Traceback (most recent call last):
-    File "<stdin>", line 1, in ?
-    File "feedparser.py", line 158, in __getattr__
-    raise AttributeError, "object has no attribute '%s'" % key
-    AttributeError: object has no attribute 'foo_issn'
-    >>> d.namespaces
-    {'': u'http://purl.org/rss/1.0/',
-    'prism': u'http://prismstandard.org/namespaces/1.2/basic/',
-    'rdf': u'http://www.w3.org/1999/02/22-rdf-syntax-ns#'}
-
-
-This is the complete list of namespaces that :program:`Universal Feed Parser`
-recognizes and uses to construct the variable names for data in these
-namespaces:
-
-=============== =====================================================
-Prefix          Namespace                                            
-=============== =====================================================
-admin           http://webns.net/mvcb/                               
-ag              http://purl.org/rss/1.0/modules/aggregation/         
-annotate        http://purl.org/rss/1.0/modules/annotate/            
-audio           http://media.tangent.org/rss/1.0/                    
-blogChannel     http://backend.userland.com/blogChannelModule        
-cc              http://web.resource.org/cc/                          
-co              http://purl.org/rss/1.0/modules/company              
-content         http://purl.org/rss/1.0/modules/content/             
-cp              http://my.theinfo.org/changed/1.0/rss/               
-creativeCommons http://backend.userland.com/creativeCommonsRssModule 
-dc              http://purl.org/dc/elements/1.1/                     
-dcterms         http://purl.org/dc/terms/                            
-email           http://purl.org/rss/1.0/modules/email/               
-ev              http://purl.org/rss/1.0/modules/event/               
-feedburner      http://rssnamespace.org/feedburner/ext/1.0           
-fm              http://freshmeat.net/rss/fm/                         
-foaf            http://xmlns.com/foaf/0.1/                           
-geo             http://www.w3.org/2003/01/geo/wgs84_pos#             
-icbm            http://postneo.com/icbm/                             
-image           http://purl.org/rss/1.0/modules/image/               
-itunes          http://example.com/DTDs/PodCast-1.0.dtd              
-itunes          http://www.itunes.com/DTDs/PodCast-1.0.dtd           
-l               http://purl.org/rss/1.0/modules/link/                
-media           http://search.yahoo.com/mrss                         
-pingback        http://madskills.com/public/xml/rss/module/pingback/ 
-prism           http://prismstandard.org/namespaces/1.2/basic/       
-rdf             http://www.w3.org/1999/02/22-rdf-syntax-ns#          
-rdfs            http://www.w3.org/2000/01/rdf-schema#                
-ref             http://purl.org/rss/1.0/modules/reference/           
-reqv            http://purl.org/rss/1.0/modules/richequiv/           
-search          http://purl.org/rss/1.0/modules/search/              
-slash           http://purl.org/rss/1.0/modules/slash/               
-soap            http://schemas.xmlsoap.org/soap/envelope/            
-ss              http://purl.org/rss/1.0/modules/servicestatus/       
-str             http://hacks.benhammersley.com/rss/streaming/        
-sub             http://purl.org/rss/1.0/modules/subscription/        
-sy              http://purl.org/rss/1.0/modules/syndication/         
-szf             http://schemas.pocketsoap.com/rss/myDescModule/      
-taxo            http://purl.org/rss/1.0/modules/taxonomy/            
-thr             http://purl.org/rss/1.0/modules/threading/           
-ti              http://purl.org/rss/1.0/modules/textinput/           
-trackback       http://madskills.com/public/xml/rss/module/trackback/
-wfw             http://wellformedweb.org/CommentAPI/                 
-wiki            http://purl.org/rss/1.0/modules/wiki/                
-xhtml           http://www.w3.org/1999/xhtml                         
-xlink           http://www.w3.org/1999/xlink                         
-xml             http://www.w3.org/XML/1998/namespace                 
-=============== =====================================================
-
-.. note::
-
-    :program:`Universal Feed Parser` treats namespaces as case-insensitive to
-    match the behavior of certain versions of :program:`iTunes`.
-
-.. warning::
-
-    Data from namespaced elements is not :ref:`sanitized <advanced.sanitization>`
-    (even if it contains :abbr:`HTML (HyperText Markup Language)` markup).

+ 0 - 18
Lib python/feedparser-5.2.1/docs/reference-bozo.rst

@@ -1,18 +0,0 @@
-:py:attr:`bozo`
-===============
-
-An integer, either ``1`` or ``0``.  Set to ``1`` if the feed is not well-formed
-:abbr:`XML (Extensible Markup Language)`, and ``0`` otherwise.
-
-See :ref:`advanced.bozo` for more details on the :py:attr:`bozo` bit.
-
-.. tip::
-
-    :py:attr:`bozo` may not be present.  Some platforms, such as Mac OS X 10.2 and some
-    versions of FreeBSD, do not include an :abbr:`XML (Extensible Markup Language)`
-    parser in their :program:`Python` distributions.  :program:`Universal Feed Parser`
-    will still work on these platforms, but it will not be able to detect whether a
-    feed is well-formed.  However, it *can* detect whether a feed's character
-    encoding is incorrectly declared.  (This is done in :program:`Python`, not by
-    the :abbr:`XML (Extensible Markup Language)` parser.) See
-    :ref:`advanced.encoding` for details.

+ 0 - 10
Lib python/feedparser-5.2.1/docs/reference-bozo_exception.rst

@@ -1,10 +0,0 @@
-:py:attr:`bozo_exception`
-=========================
-
-The exception raised when attempting to parse a non-well-formed feed.
-
-See :ref:`advanced.bozo` for more details.
-
-.. tip::
-
-    :py:attr:`bozo_exception` will only be present if :py:attr:`bozo` is ``1``.

+ 0 - 16
Lib python/feedparser-5.2.1/docs/reference-encoding.rst

@@ -1,16 +0,0 @@
-.. _reference.encoding:
-
-:py:attr:`encoding`
-===================
-
-The character encoding that was used to parse the feed.
-
-.. note::
-
-    The process by which :program:`Universal Feed Parser` determines the character
-    encoding of the feed is explained in :ref:`advanced.encoding`.
-
-.. tip::
-
-    This element always exists, although it may be an empty string if the character
-    encoding cannot be determined.

+ 0 - 20
Lib python/feedparser-5.2.1/docs/reference-entry-author.rst

@@ -1,20 +0,0 @@
-.. _reference.entry.author:
-
-:py:attr:`entries[i].author`
-============================
-
-The author of this entry.
-
-.. seealso::
-
-    * :ref:`reference.entry.author_detail`
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:author
-* /atom03:feed/atom03:entry/atom03:author
-* /rss/channel/item/dc:creator
-* /rss/channel/item/dc:author
-* /rss/channel/itunes:author
-* /rdf:RDF/rdf:item/dc:creator
-* /rdf:RDF/rdf:item/dc:author

+ 0 - 48
Lib python/feedparser-5.2.1/docs/reference-entry-author_detail.rst

@@ -1,48 +0,0 @@
-.. _reference.entry.author_detail:
-
-:py:attr:`entries[i].author_detail`
-===================================
-
-A dictionary with details about the author of this entry.
-
-.. seealso::
-
-    * :ref:`reference.entry.author`
-
-
-.. _reference.entry.author_detail.name:
-
-:py:attr:`entries[i].author_detail.name`
-----------------------------------------
-
-The name of this entry's author.
-
-
-.. _reference.entry.author_detail.href:
-
-:py:attr:`entries[i].author_detail.href`
-----------------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of this entry's author.  This can be
-the author's home page, or a contact page with a webmail form.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.entry.author_detail.email:
-
-:py:attr:`entries[i].author_detail.email`
------------------------------------------
-
-The email address of this entry's author.
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:author
-* /atom03:feed/atom03:entry/atom03:author
-* /rss/channel/item/dc:creator
-* /rss/channel/item/dc:author
-* /rss/channel/itunes:author
-* /rdf:RDF/rdf:item/dc:creator
-* /rdf:RDF/rdf:item/dc:author

+ 0 - 14
Lib python/feedparser-5.2.1/docs/reference-entry-comments.rst

@@ -1,14 +0,0 @@
-.. _reference.entry.comments:
-
-:py:attr:`entries[i].comments`
-==============================
-
-A :abbr:`URL (Uniform Resource Locator)` of the :abbr:`HTML (HyperText Markup Language)`
-comment submission page associated with this entry.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-.. rubric:: Comes from
-
-* /rss/channel/item/comments

+ 0 - 103
Lib python/feedparser-5.2.1/docs/reference-entry-content.rst

@@ -1,103 +0,0 @@
-.. _reference.entry.content:
-
-:py:attr:`entries[i].content`
-=============================
-
-A list of dictionaries with details about the full content of the entry.
-
-Atom feeds may contain multiple content elements.  Clients should render as
-many of them as possible, based on the type and the client's abilities.
-
-
-.. _reference.entry.content.value:
-
-:py:attr:`entries[i].content[j].value`
---------------------------------------
-
-The value of this piece of content.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, it is
-:ref:`sanitized <advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, certain (X)HTML elements
-within this value may contain relative :abbr:`URI (Uniform Resource Identifier)`\s.
-If so, they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.entry.content.type:
-
-:py:attr:`entries[i].content[j].type`
--------------------------------------
-
-The content type of this piece of content.
-
-Most likely values for `type`:
-
-* :mimetype:`text/plain`
-* :mimetype:`text/html`
-* :mimetype:`application/xhtml+xml`
-
-For Atom feeds, the content type is taken from the type attribute, which
-defaults to :mimetype:`text/plain` if not specified.  For
-:abbr:`RSS (Rich Site Summary)` feeds, the content type is auto-determined by
-inspecting the content, and defaults to :mimetype:`text/html`.  Note that this
-may cause silent data loss if the value contains plain text with angle
-brackets.  There is nothing I can do about this problem; it is a limitation of
-:abbr:`RSS (Rich Site Summary)`.
-
-Future enhancement: some versions of :abbr:`RSS (Rich Site Summary)` clearly
-specify that certain values default to :mimetype:`text/plain`, and
-:program:`Universal Feed Parser` should respect this, but it doesn't yet.
-
-
-.. _reference.entry.content.language:
-
-:py:attr:`entries[i].content[j].language`
------------------------------------------
-
-The language of this piece of content.
-
-:py:attr:`~entries[i].content[j].language` is supposed to be a language code,
-as specified by :rfc:`3066`, but publishers have been known to publish random
-values like "English" or "German".  :program:`Universal Feed Parser` does not
-do any parsing or normalization of language codes.
-
-:py:attr:`~entries[i].content[j].language` may come from the element's xml:lang
-attribute, or it may inherit from a parent element's xml:lang, or the
-:mailheader:`Content-Language` :abbr:`HTTP (Hypertext Transfer Protocol)`
-header.  If the feed does not specify a language,
-:py:attr:`~entries[i].content[j].language` will be ``None``, the
-:program:`Python` null value.
-
-
-.. _reference.entry.content.base:
-
-:py:attr:`entries[i].content[j].base`
--------------------------------------
-
-The original base :abbr:`URI (Uniform Resource Identifier)` for links within
-this piece of content.
-
-:py:attr:`~entries[i].content[j].base` is only useful in rare situations and
-can usually be ignored.  It is the original base
-:abbr:`URI (Uniform Resource Identifier)` for this value, as specified by the
-element's xml:base attribute, or a parent element's xml:base, or the
-appropriate :abbr:`HTTP (Hypertext Transfer Protocol)` header, or the
-:abbr:`URI (Uniform Resource Identifier)` of the feed.  (See
-:ref:`advanced.base` for more details.)  By the time you see it,
-:program:`Universal Feed Parser` has already resolved relative links in all
-values where it makes sense to do so.  *Clients should never need to manually
-resolve relative links.*
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:entry/atom03:content
-* /atom10:feed/atom10:entry/atom10:content
-* /rdf:RDF/rdf:item/content:encoded
-* /rss/channel/item/body
-* /rss/channel/item/content:encoded
-* /rss/channel/item/fullitem
-* /rss/channel/item/xhtml:body

+ 0 - 39
Lib python/feedparser-5.2.1/docs/reference-entry-contributors.rst

@@ -1,39 +0,0 @@
-:py:attr:`entries[i].contributors`
-==================================
-
-A list of contributors (secondary authors) to this entry.
-
-
-.. _reference.entry.contributors.name:
-
-:py:attr:`entries[i].contributors[j].name`
-------------------------------------------
-
-The name of this contributor.
-
-
-.. _reference.entry.contributors.href:
-
-:py:attr:`entries[i].contributors[j].href`
-------------------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of this contributor.  This can be
-the contributor's home page, or a contact page with a webmail form.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.entry.contributors.email:
-
-:py:attr:`entries[i].contributors[j].email`
--------------------------------------------
-
-The email address of this contributor.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:entry/atom03:contributor
-* /atom10:feed/atom10:entry/atom10:contributor
-* /rss/channel/item/dc:contributor

+ 0 - 22
Lib python/feedparser-5.2.1/docs/reference-entry-created.rst

@@ -1,22 +0,0 @@
-.. _reference.entry.created:
-
-:py:attr:`entries[i].created`
-=============================
-
-The date this entry was first created (drafted), as a string in the same format
-as it was published in the original feed).
-
-This element is :ref:`parsed as a date <advanced.date>` and stored in
-:ref:`reference.entry.created_parsed`.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:entry/atom03:created
-* /rdf:RDF/rdf:item/dcterms:created
-* /rss/channel/item/dcterms:created
-
-
-.. seealso::
-
-    * :ref:`reference.entry.created_parsed`

+ 0 - 19
Lib python/feedparser-5.2.1/docs/reference-entry-created_parsed.rst

@@ -1,19 +0,0 @@
-.. _reference.entry.created_parsed:
-
-:py:attr:`entries[i].created_parsed`
-====================================
-
-The date this entry was first created (drafted), as a standard
-:program:`Python` 9-tuple.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:entry/atom03:created
-* /rdf:RDF/rdf:item/dcterms:created
-* /rss/channel/item/dcterms:created
-
-
-.. seealso::
-
-    * :ref:`reference.entry.created`

+ 0 - 47
Lib python/feedparser-5.2.1/docs/reference-entry-enclosures.rst

@@ -1,47 +0,0 @@
-.. _reference.entry.enclosures:
-
-:py:attr:`entries[i].enclosures`
-================================
-
-A list of links to external files associated with this entry.
-
-Some aggregators automatically download enclosures (although this technique has
-`known problems <http://gonze.com/weblog/story/5-17-4>`_).  Some aggregators
-render each enclosure as a link.  Most aggregators ignore them.
-
-The :abbr:`RSS (Rich Site Summary)` specification states that there can be at
-most one enclosure per item.  However, because some feeds break this rule,
-:program:`Universal Feed Parser` captures all of them and makes them available
-as a list.
-
-.. rubric:: Comes from
-
-- /atom10:feed/atom10:entry/atom10:link[@rel="enclosure"]
-- /rss/channel/item/enclosure
-
-
-.. _reference.entry.enclosures.href:
-
-:py:attr:`entries[i].enclosures[j].href`
-----------------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of the linked file.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.entry.enclosures.length:
-
-:py:attr:`entries[i].enclosures[j].length`
-------------------------------------------
-
-The length of the linked file.
-
-
-.. _reference.entry.enclosures.type:
-
-:py:attr:`entries[i].enclosures[j].type`
-----------------------------------------
-
-The content type of the linked file.

+ 0 - 24
Lib python/feedparser-5.2.1/docs/reference-entry-expired.rst

@@ -1,24 +0,0 @@
-.. _reference.entry.expired:
-
-:py:attr:`entries[i].expired`
-=============================
-
-The date this entry is set to expire, as a string in the same format as it was
-published in the original feed).
-
-This element is :ref:`parsed as a date <advanced.date>` and stored in
-:ref:`reference.entry.expired_parsed`.
-
-This element is rare.  It only existed in :abbr:`RSS (Rich Site Summary)` 0.93,
-and it was never widely implemented by publishers.  Most clients ignore it in
-favor of user-defined expiration algorithms.
-
-
-.. rubric:: Comes from
-
-* /rss/channel/item/expirationDate
-
-
-.. seealso::
-
-    * :ref:`reference.entry.expired_parsed`

+ 0 - 20
Lib python/feedparser-5.2.1/docs/reference-entry-expired_parsed.rst

@@ -1,20 +0,0 @@
-.. _reference.entry.expired_parsed:
-
-:py:attr:`entries[i].expired_parsed`
-====================================
-
-The date this entry is set to expire, as a standard :program:`Python` 9-tuple.
-
-This element is rare.  It only existed in :abbr:`RSS (Rich Site Summary)` 0.93,
-and it was never widely implemented by publishers.  Most clients ignore it in
-favor of user-defined expiration algorithms.
-
-
-.. rubric:: Comes from
-
-* /rss/channel/item/expirationDate
-
-
-.. seealso::
-
-    * :ref:`reference.entry.expired`

+ 0 - 17
Lib python/feedparser-5.2.1/docs/reference-entry-id.rst

@@ -1,17 +0,0 @@
-.. _reference.entry.id:
-
-:py:attr:`entries[i].id`
-========================
-
-A globally unique identifier for this entry.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:entry/atom03:id
-* /atom10:feed/atom10:entry/atom10:id
-* /rdf:RDF/rdf:item/@rdf:about
-* /rss/channel/item/guid

+ 0 - 16
Lib python/feedparser-5.2.1/docs/reference-entry-license.rst

@@ -1,16 +0,0 @@
-.. _reference.entry.license:
-
-:py:attr:`entries[i].license`
-=============================
-
-A :abbr:`URL (Uniform Resource Locator)` of the license under which this entry
-is distributed.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:link[@rel="license"]/@href
-* /rdf:RDF/rdf:item/cc:license/@rdf:resource
-* /rss/channel/item/creativeCommons:license

+ 0 - 33
Lib python/feedparser-5.2.1/docs/reference-entry-link.rst

@@ -1,33 +0,0 @@
-.. _reference.entry.link:
-
-:py:attr:`entries[i].link`
-==========================
-
-The primary link of this entry.  Most feeds use this as the permanent link to
-the entry in the site's archives.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-Some :abbr:`RSS (Rich Site Summary)` feeds use guid when they mean link.  guid
-can also be used as an opaque identifier that has nothing to do with links.  If
-an :abbr:`RSS (Rich Site Summary)` feed uses guid as the entry link and no link
-is present, :program:`Universal Feed Parser` detects this and makes the guid
-available in :py:attr:`entries[i].link`.
-
-In other words, you can always use :py:attr:`entries[i].link` to get the entry
-link, regardless of how the feed is actually structured.
-
-
-.. rubric:: Comes from
-
-- /atom03:feed/atom03:entry/atom03:link[@rel="alternate"]/@href
-- /atom10:feed/atom10:entry/atom10:link[@rel="alternate"]/@href
-- /atom10:feed/atom10:entry/atom10:link[not(@rel)]/@href
-- /rdf:RDF/rdf:item/rdf:link
-- /rss/channel/item/link
-
-
-.. seealso::
-
-    * :ref:`reference.entry.links`

+ 0 - 67
Lib python/feedparser-5.2.1/docs/reference-entry-links.rst

@@ -1,67 +0,0 @@
-.. _reference.entry.links:
-
-:py:attr:`entries[i].links`
-===========================
-
-A list of dictionaries with details on the links associated with the feed.
-Each link has a rel (relationship), type (content type), and href (the
-:abbr:`URL (Uniform Resource Locator)` that the link points to).  Some links
-may also have a title.
-
-
-.. _reference.entry.links.rel:
-
-:py:attr:`entries[i].links[j].rel`
-----------------------------------
-
-The relationship of this entry link.
-
-Atom 1.0 defines five standard link relationships and describes the process for
-registering others.  Here are the five standard rel values:
-
-* `alternate`
-* `enclosure`
-* `related`
-* `self`
-* `via`
-
-
-.. _reference.entry.links.type:
-
-:py:attr:`entries[i].links[j].type`
------------------------------------
-
-The content type of the page that this entry link points to.
-
-
-.. _reference.entry.links.href:
-
-:py:attr:`entries[i].links[j].href`
------------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of the page that this entry link
-points to.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.entry.links.title:
-
-:py:attr:`entries[i].links[j].title`
-------------------------------------
-
-The title of this entry link.
-
-
-.. rubric:: Comes from
-
-- /atom03:feed/atom03:entry/atom03:link
-- /atom10:feed/atom10:entry/atom10:link
-- /rdf:RDF/rdf:item/rdf:link
-- /rss/channel/item/link
-
-
-.. seealso::
-
-    * :ref:`reference.entry.link`

+ 0 - 24
Lib python/feedparser-5.2.1/docs/reference-entry-published.rst

@@ -1,24 +0,0 @@
-.. _reference.entry.published:
-
-:py:attr:`entries[i].published`
-===============================
-
-The date this entry was first published, as a string in the same format as it
-was published in the original feed.
-
-This element is :ref:`parsed as a date <advanced.date>` and stored in
-:ref:`reference.entry.published_parsed`.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:published
-* /atom03:feed/atom03:entry/atom03:issued
-* /rss/channel/item/dcterms:issued
-* /rss/channel/item/pubDate
-* /rdf:RDF/rdf:item/dcterms:issued
-
-
-.. seealso::
-
-    * :ref:`reference.entry.published_parsed`

+ 0 - 21
Lib python/feedparser-5.2.1/docs/reference-entry-published_parsed.rst

@@ -1,21 +0,0 @@
-.. _reference.entry.published_parsed:
-
-:py:attr:`entries[i].published_parsed`
-======================================
-
-The date this entry was first published, as a standard :program:`Python`
-9-tuple.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:published
-* /atom03:feed/atom03:entry/atom03:issued
-* /rss/channel/item/dcterms:issued
-* /rdf:RDF/rdf:item/dcterms:issued
-* /rss/channel/item/pubDate
-
-
-.. seealso::
-
-    * :ref:`reference.entry.published`

+ 0 - 18
Lib python/feedparser-5.2.1/docs/reference-entry-publisher.rst

@@ -1,18 +0,0 @@
-.. _reference.entry.publisher:
-
-:py:attr:`entries[i].publisher`
-===============================
-
-The publisher of the entry.
-
-
-.. rubric:: Comes from
-
-* /rss/item/dc:publisher
-* /rss/item/itunes:owner
-* /rdf:RDF/rdf:item/dc:publisher
-
-
-.. seealso::
-
-    * :ref:`reference.entry.publisher_detail`

+ 0 - 42
Lib python/feedparser-5.2.1/docs/reference-entry-publisher_detail.rst

@@ -1,42 +0,0 @@
-.. _reference.entry.publisher_detail:
-
-:py:attr:`entries[i].publisher_detail`
-======================================
-
-A dictionary with details about the entry publisher.
-
-
-:py:attr:`entries[i].publisher_detail.name`
--------------------------------------------
-
-The name of this entry's publisher.
-
-
-.. _reference.entry.publisher_detail.href:
-
-:py:attr:`entries[i].publisher_detail.href`
--------------------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of this entry's publisher.  This can
-be the publisher's home page, or a contact page with a webmail form.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`entries[i].publisher_detail.email`
---------------------------------------------
-
-The email address of this entry's publisher.
-
-
-.. rubric:: Comes from
-
-* /rss/item/dc:publisher
-* /rss/item/itunes:owner
-* /rdf:RDF/rdf:item/dc:publisher
-
-
-.. seealso::
-
-    * :ref:`reference.entry.publisher`

+ 0 - 482
Lib python/feedparser-5.2.1/docs/reference-entry-source.rst

@@ -1,482 +0,0 @@
-.. _reference.entry.source:
-
-:py:attr:`entries[i].source`
-============================
-
-A dictionary with details about the source of the entry.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:source
-
-
-:py:attr:`entries[i].source.author`
------------------------------------
-
-The author of the source of this entry.
-
-
-:py:attr:`entries[i].source.author_detail`
-------------------------------------------
-
-A dictionary containing details about the author of the source of this entry.
-
-
-:py:attr:`entries[i].source.author_detail.name`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The name of the author of the source of this entry.
-
-
-.. _reference.entry.source.author_detail.href:
-
-:py:attr:`entries[i].source.author_detail.href`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The :abbr:`URL (Uniform Resource Locator)` of the author of the source of this
-entry.  This can be the author's home page, or a contact page with a webmail
-form.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`entries[i].source.author_detail.email`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The email address of the author of the source of this entry.
-
-
-
-:py:attr:`entries[i].source.contributors`
------------------------------------------
-
-A list of contributors to the source of this entry.
-
-
-:py:attr:`entries[i].source.contributors[j].name`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The name of a contributor to the source of this entry.
-
-
-.. _reference.entry.source.contributors.href:
-
-:py:attr:`entries[i].source.contributors[j].href`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The :abbr:`URL (Uniform Resource Locator)` of a contributor to the source of
-this entry.  This can be the contributor's home page, or a contact page with a
-webmail form.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`entries[i].source.contributors[j].email`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The email address of a contributor to the source of this entry.
-
-
-
-:py:attr:`entries[i].source.icon`
----------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of an icon representing the source
-of this entry.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-
-:py:attr:`entries[i].source.id`
--------------------------------
-
-A globally unique identifier for the source of this entry.
-
-
-
-:py:attr:`entries[i].source.link`
----------------------------------
-
-The primary permanent link of the source of this entry
-
-
-
-:py:attr:`entries[i].source.links`
-----------------------------------
-
-A list of all links defined by the source of this entry.
-
-
-:py:attr:`entries[i].source.links[j].rel`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The relationship of a link defined by the source of this entry.
-
-Atom 1.0 defines five standard link relationships and describes the process for
-registering others.  Here are the five standard rel values:
-
-* ``alternate``
-* ``self``
-* ``related``
-* ``via``
-* ``enclosure``
-
-
-:py:attr:`entries[i].source.links[j].type`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The content type of the page pointed to by a link defined by the source of this
-entry.
-
-
-.. _reference.entry.source.links.href:
-
-:py:attr:`entries[i].source.links[j].href`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The :abbr:`URL (Uniform Resource Locator)` of the page pointed to by a link
-defined by the source of this entry.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`entries[i].source.links[j].title`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The title of a link defined by the source of this entry.
-
-
-
-:py:attr:`entries[i].source.logo`
----------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of a logo representing the source of
-this entry.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-
-.. _reference.entry.source.rights:
-
-:py:attr:`entries[i].source.rights`
------------------------------------
-
-A human-readable copyright statement for the source of this entry.
-
-
-
-:py:attr:`entries[i].source.rights_detail`
-------------------------------------------
-
-A dictionary containing details about the copyright statement for the source of
-this entry.
-
-
-:py:attr:`entries[i].source.rights_detail.value`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Same as :ref:`reference.entry.source.rights`.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, it is
-:ref:`sanitized <advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, certain (X)HTML elements
-within this value may contain relative
-:abbr:`URI (Uniform Resource Identifier)`\s.  If so, they are
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`entries[i].source.rights_detail.type`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The content type of the copyright statement for the source of this entry.
-
-Most likely values for :py:attr:`~entries[i].source.rights_detail.type`:
-
-* :mimetype:`text/plain`
-* :mimetype:`text/html`
-* :mimetype:`application/xhtml+xml`
-
-For Atom feeds, the content type is taken from the type attribute, which
-defaults to :mimetype:`text/plain` if not specified.  For
-:abbr:`RSS (Rich Site Summary)` feeds, the content type is auto-determined by
-inspecting the content, and defaults to :mimetype:`text/html`.  Note that this
-may cause silent data loss if the value contains plain text with angle
-brackets.  There is nothing I can do about this problem; it is a limitation of
-:abbr:`RSS (Rich Site Summary)`.
-
-Future enhancement: some versions of :abbr:`RSS (Rich Site Summary)` clearly
-specify that certain values default to :mimetype:`text/plain`, and
-:program:`Universal Feed Parser` should respect this, but it doesn't yet.
-
-
-:py:attr:`entries[i].source.rights_detail.language`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The language of the copyright statement for the source of this entry.
-
-:py:attr:`~entries[i].source.rights_detail.language` is supposed to be a
-language code, as specified by `RFC 3066`_, but publishers have been known to
-publish random values like "English" or "German".
-:program:`Universal Feed Parser` does not do any parsing or normalization of
-language codes.
-
-.. _RFC 3066: http://www.ietf.org/rfc/rfc3066.txt
-
-:py:attr:`~entries[i].source.rights_detail.language` may come from the
-element's xml:lang attribute, or it may inherit from a parent element's
-xml:lang, or the Content-Language :abbr:`HTTP (Hypertext Transfer Protocol)`
-header.  If the feed does not specify a language,
-:py:attr:`~entries[i].source.rights_detail.language` will be ``None``, the
-:program:`Python` null value.
-
-
-:py:attr:`entries[i].source.rights_detail.base`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The original base :abbr:`URI (Uniform Resource Identifier)` for links within
-the copyright statement for the source of this entry.
-
-:py:attr:`entries[i].source.rights_detail.base` is only useful in rare
-situations and can usually be ignored.  It is the original base
-:abbr:`URI (Uniform Resource Identifier)` for this value, as specified by the
-element's xml:base attribute, or a parent element's xml:base, or the
-appropriate :abbr:`HTTP (Hypertext Transfer Protocol)` header, or the
-:abbr:`URI (Uniform Resource Identifier)` of the feed.  (See
-:ref:`advanced.base` for more details.)  By the time you see it,
-:program:`Universal Feed Parser` has already resolved relative links in all
-values where it makes sense to do so.  *Clients should never need to manually
-resolve relative links.*
-
-
-
-.. _reference.entry.source.subtitle:
-
-:py:attr:`entries[i].source.subtitle`
--------------------------------------
-
-A subtitle, tagline, slogan, or other short description of the source of this
-entry.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, it is
-:ref:`sanitized <advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, certain (X)HTML elements
-within this value may contain relative
-:abbr:`URI (Uniform Resource Identifier)`\s.  If so, they are
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-
-:py:attr:`entries[i].source.subtitle_detail`
---------------------------------------------
-
-A dictionary containing details about the subtitle for the source of this
-entry.
-
-
-:py:attr:`entries[i].source.subtitle_detail.value`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Same as :ref:`reference.entry.source.subtitle`.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, it is
-:ref:`sanitized <advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, certain (X)HTML elements
-within this value may contain relative
-:abbr:`URI (Uniform Resource Identifier)`\s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`entries[i].source.subtitle_detail.type`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The content type of the subtitle of the source of this entry.
-
-Most likely values for :py:attr:`~entries[i].source.subtitle_detail.type`:
-
-* :mimetype:`text/plain``
-* :mimetype:`text/html``
-* :mimetype:`application/xhtml+xml``
-
-For Atom feeds, the content type is taken from the type attribute, which
-defaults to :mimetype:`text/plain`` if not specified.  For
-:abbr:`RSS (Rich Site Summary)` feeds, the content type is auto-determined by
-inspecting the content, and defaults to :mimetype:`text/html``.  Note that this
-may cause silent data loss if the value contains plain text with angle
-brackets.  There is nothing I can do about this problem; it is a limitation of
-:abbr:`RSS (Rich Site Summary)`.
-
-Future enhancement: some versions of :abbr:`RSS (Rich Site Summary)` clearly
-specify that certain values default to :mimetype:`text/plain``, and
-:program:`Universal Feed Parser` should respect this, but it doesn't yet.
-
-
-:py:attr:`entries[i].source.subtitle_detail.language`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The language of the subtitle of the source of this entry.
-
-:py:attr:`~entries[i].source.subtitle_detail.language` is supposed to be a
-language code, as specified by `RFC 3066`_, but publishers have been known to
-publish random values like "English" or "German".
-:program:`Universal Feed Parser` does not do any parsing or normalization of
-language codes.
-
-:py:attr:`~entries[i].source.subtitle_detail.language` may come from the
-element's xml:lang attribute, or it may inherit from a parent element's
-xml:lang, or the Content-Language :abbr:`HTTP (Hypertext Transfer Protocol)`
-header.  If the feed does not specify a language,
-:py:attr:`~entries[i].source.subtitle_detail.language` will be ``None``, the
-:program:`Python` null value.
-
-
-:py:attr:`entries[i].source.subtitle_detail.base`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The original base :abbr:`URI (Uniform Resource Identifier)` for links within
-the subtitle of the source of this entry.
-
-:py:attr:`entries[i].source.subtitle_detail.base` is only useful in rare
-situations and can usually be ignored.  It is the original base
-:abbr:`URI (Uniform Resource Identifier)` for this value, as specified by the
-element's xml:base attribute, or a parent element's xml:base, or the
-appropriate :abbr:`HTTP (Hypertext Transfer Protocol)` header, or the
-:abbr:`URI (Uniform Resource Identifier)` of the feed.  (See
-:ref:`advanced.base` for more details.)  By the time you see it,
-:program:`Universal Feed Parser` has already resolved relative links in all
-values where it makes sense to do so.  *Clients should never need to manually
-resolve relative links.*
-
-
-
-.. _reference.entry.source.title:
-
-:py:attr:`entries[i].source.title`
-----------------------------------
-
-The title of the source of this entry.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, it is
-:ref:`sanitized <advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, certain (X)HTML elements within this
-value may contain relative :abbr:`URI (Uniform Resource Identifier)`\s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-
-:py:attr:`entries[i].source.title_detail`
------------------------------------------
-
-A dictionary containing details about the title for the source of this entry.
-
-
-:py:attr:`entries[i].source.title_detail.value`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Same as :ref:`reference.entry.source.title`.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, it is
-:ref:`sanitized <advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or
-:abbr:`XHTML (Extensible HyperText Markup Language)`, certain (X)HTML elements within this
-value may contain relative :abbr:`URI (Uniform Resource Identifier)`\s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`entries[i].source.title_detail.type`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The content type of the title of the source of this entry.
-
-Most likely values for :py:attr:`entries[i].source.title_detail.type`:
-
-* :mimetype:`text/plain`
-* :mimetype:`text/html`
-* :mimetype:`application/xhtml+xml`
-
-For Atom feeds, the content type is taken from the type attribute, which
-defaults to :mimetype:`text/plain` if not specified.  For
-:abbr:`RSS (Rich Site Summary)` feeds, the content type is auto-determined by
-inspecting the content, and defaults to :mimetype:`text/html`.  Note that this
-may cause silent data loss if the value contains plain text with angle
-brackets.  There is nothing I can do about this problem; it is a limitation of
-:abbr:`RSS (Rich Site Summary)`.
-
-Future enhancement: some versions of :abbr:`RSS (Rich Site Summary)` clearly
-specify that certain values default to :mimetype:`text/plain`, and
-:program:`Universal Feed Parser` should respect this, but it doesn't yet.
-
-
-:py:attr:`entries[i].source.title_detail.language`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The language of the title of the source of this entry.
-
-:py:attr:`~entries[i].source.title_detail.language` is supposed to be a
-language code, as specified by `RFC 3066`_, but publishers have been known to
-publish random values like "English" or "German".
-:program:`Universal Feed Parser` does not do any parsing or normalization of language codes.
-
-:py:attr:`~entries[i].source.title_detail.language` may come from the element's
-xml:lang attribute, or it may inherit from a parent element's xml:lang, or the
-Content-Language :abbr:`HTTP (Hypertext Transfer Protocol)` header.  If the
-feed does not specify a language,
-:py:attr:`~entries[i].source.title_detail.language` will be ``None``, the
-:program:`Python` null value.
-
-
-:py:attr:`entries[i].source.title_detail.base`
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The original base :abbr:`URI (Uniform Resource Identifier)` for links within
-the title of the source of this entry.
-
-:py:attr:`entries[i].source.title_detail.base` is only useful in rare
-situations and can usually be ignored.  It is the original base
-:abbr:`URI (Uniform Resource Identifier)` for this value, as specified by the element's
-xml:base attribute, or a parent element's xml:base, or the appropriate
-:abbr:`HTTP (Hypertext Transfer Protocol)` header, or the
-:abbr:`URI (Uniform Resource Identifier)` of the feed.  (See :ref:`advanced.base` for more
-details.)  By the time you see it, :program:`Universal Feed Parser` has already
-resolved relative links in all values where it makes sense to do so.  *Clients
-should never need to manually resolve relative links.*
-
-
-:py:attr:`entries[i].source.updated`
-------------------------------------
-
-The date the source of this entry was last updated, as a string in the same
-format as it was published in the original feed.
-
-This element is :ref:`parsed as a date <advanced.date>` and stored in
-:ref:`reference.entry.source.updated_parsed`.
-
-
-
-.. _reference.entry.source.updated_parsed:
-
-:py:attr:`entries[i].source.updated_parsed`
--------------------------------------------
-
-The date this entry was last updated, as a standard :program:`Python` 9-tuple.

+ 0 - 43
Lib python/feedparser-5.2.1/docs/reference-entry-summary.rst

@@ -1,43 +0,0 @@
-.. _reference.entry.summary:
-
-:py:attr:`entries[i].summary`
-=============================
-
-A summary of the entry.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, it is :ref:`sanitized
-<advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, certain (X)HTML elements within this
-value may contain relative :abbr:`URI (Uniform Resource Identifier)`\s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-Some publishing systems auto-generate this value from the first few words or
-first paragraph of the entry.  Other publishing systems misuse it to include
-the full content.  In the latter cases, :program:`Universal Feed Parser` ought
-to detect it and put the value in :ref:`reference.entry.content` instead, but
-it doesn't.
-
-
-.. note::
-
-    Some feeds include both a summary and description element for each entry.  In
-    this case, the first element will be available in ``entry['summary']`` and the
-    second will be available in ``entry['content'][0]``.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:summary
-* /atom03:feed/atom03:entry/atom03:summary
-* /rss/channel/item/description
-* /rss/channel/item/dc:description
-* /rdf:RDF/rdf:item/rdf:description
-* /rdf:RDF/rdf:item/dc:description
-
-
-.. seealso::
-
-    * :ref:`reference.entry.summary_detail`

+ 0 - 101
Lib python/feedparser-5.2.1/docs/reference-entry-summary_detail.rst

@@ -1,101 +0,0 @@
-.. _reference.entry.summary_detail:
-
-:py:attr:`entries[i].summary_detail`
-====================================
-
-A dictionary with details about the entry summary.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:summary
-* /atom03:feed/atom03:entry/atom03:summary
-* /rss/channel/item/description
-* /rss/channel/item/dc:description
-* /rdf:RDF/rdf:item/rdf:description
-* /rdf:RDF/rdf:item/dc:description
-
-
-.. seealso::
-
-    * :ref:`reference.entry.summary`
-
-
-.. _reference.entry.summary_detail.value:
-
-:py:attr:`entries[i].summary_detail.value`
-------------------------------------------
-
-Same as :ref:`reference.entry.summary`.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, it is :ref:`sanitized
-<advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, certain (X)HTML elements within this
-value may contain relative :abbr:`URI (Uniform Resource Identifier)`\s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.entry.summary_detail.type:
-
-:py:attr:`entries[i].summary_detail.type`
------------------------------------------
-
-The content type of the entry summary.
-
-Most likely values for :py:attr:`~entries[i].summary_detail.type`:
-
-* :mimetype:`text/plain`
-* :mimetype:`text/html`
-* :mimetype:`application/xhtml+xml`
-
-For Atom feeds, the content type is taken from the type attribute, which
-defaults to :mimetype:`text/plain` if not specified.  For :abbr:`RSS (Rich Site
-Summary)` feeds, the content type is auto-determined by inspecting the content,
-and defaults to :mimetype:`text/html`.  Note that this may cause silent data
-loss if the value contains plain text with angle brackets.  There is nothing I
-can do about this problem; it is a limitation of :abbr:`RSS (Rich Site
-Summary)`.
-
-Future enhancement: some versions of :abbr:`RSS (Rich Site Summary)` clearly
-specify that certain values default to :mimetype:`text/plain`, and
-:program:`Universal Feed Parser` should respect this, but it doesn't yet.
-
-
-:py:attr:`entries[i].summary_detail.language`
----------------------------------------------
-
-The language of the entry summary.
-
-:py:attr:`~entries[i].summary_detail.language` is supposed to be a language
-code, as specified by `RFC 3066`_, but publishers have been known to
-publish random values like "English" or "German".  :program:`Universal Feed
-Parser` does not do any parsing or normalization of language codes.
-
-.. _RFC 3066: http://www.ietf.org/rfc/rfc3066.txt
-
-:py:attr:`~entries[i].summary_detail.language` may come from the element's
-xml:lang attribute, or it may inherit from a parent element's xml:lang, or the
-Content-Language :abbr:`HTTP (Hypertext Transfer Protocol)` header.  If the
-feed does not specify a language,
-:py:attr:`~entries[i].summary_detail.language` will be ``None``, the
-:program:`Python` null value.
-
-
-:py:attr:`entries[i].summary_detail.base`
------------------------------------------
-
-The original base :abbr:`URI (Uniform Resource Identifier)` for links within
-the entry summary.
-
-:py:attr:`~entries[i].summary_detail.base` is only useful in rare situations
-and can usually be ignored.  It is the original base :abbr:`URI (Uniform
-Resource Identifier)` for this value, as specified by the element's xml:base
-attribute, or a parent element's xml:base, or the appropriate :abbr:`HTTP
-(Hypertext Transfer Protocol)` header, or the :abbr:`URI (Uniform Resource
-Identifier)` of the feed.  (See :ref:`advanced.base` for more details.)  By the
-time you see it, :program:`Universal Feed Parser` has already resolved relative
-links in all values where it makes sense to do so.  *Clients should never need
-to manually resolve relative links.*

+ 0 - 46
Lib python/feedparser-5.2.1/docs/reference-entry-tags.rst

@@ -1,46 +0,0 @@
-.. _reference.entry.tags:
-
-:py:attr:`entries[i].tags`
-==========================
-
-A list of dictionaries that contain details of the categories for the entry.
-
-
-.. note::
-
-    Prior to version 4.0, :program:`Universal Feed Parser` exposed categories in
-    ``feed.category`` (the primary category) and ``feed.categories`` (a list of
-    tuples containing the domain and term of each category).  These uses are still
-    supported for backward compatibility, but you will not see them in the parsed
-    results unless you explicitly ask for them.
-
-
-.. _reference.entry.tags.term:
-
-:py:attr:`entries[i].tags[j].term`
-----------------------------------
-
-The category term (keyword).
-
-
-:py:attr:`entries[i].tags[j].scheme`
-------------------------------------
-
-The category scheme (domain).
-
-
-:py:attr:`entries[i].tags[j].label`
------------------------------------
-
-A human-readable label for the category.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/category
-* /atom03:feed/atom03:entry/dc:subject
-* /rss/channel/item/category
-* /rss/channel/item/dc:subject
-* /rss/channel/item/itunes:category
-* /rss/channel/item/itunes:keywords
-* /rdf:RDF/rdf:channel/rdf:item/dc:subject

+ 0 - 30
Lib python/feedparser-5.2.1/docs/reference-entry-title.rst

@@ -1,30 +0,0 @@
-.. _reference.entry.title:
-
-:py:attr:`entries[i].title`
-===========================
-
-The title of the entry.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, it is :ref:`sanitized
-<advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, certain (X)HTML elements within this
-value may contain relative :abbr:`URI (Uniform Resource Identifier)`s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:entry/atom03:title
-* /atom10:feed/atom10:entry/atom10:title
-* /rdf:RDF/rdf:item/dc:title
-* /rdf:RDF/rdf:item/rdf:title
-* /rss/channel/item/dc:title
-* /rss/channel/item/title
-
-
-.. seealso::
-
-    * :ref:`reference.entry.title_detail`

+ 0 - 98
Lib python/feedparser-5.2.1/docs/reference-entry-title_detail.rst

@@ -1,98 +0,0 @@
-.. _reference.entry.title_detail:
-
-:py:attr:`entries[i].title_detail`
-==================================
-
-A dictionary with details about the entry title.
-
-
-.. _reference.entry.title_detail.value:
-
-:py:attr:`entries[i].title_detail.value`
-----------------------------------------
-
-Same as :ref:`reference.entry.title`.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, it is :ref:`sanitized
-<advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, certain (X)HTML elements within this
-value may contain relative :abbr:`URI (Uniform Resource Identifier)`\s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`entries[i].title_detail.type`
----------------------------------------
-
-The content type of the entry title.
-
-Most likely values for :py:attr:`~entries[i].title_detail.type`:
-
-* :mimetype:`text/plain`
-* :mimetype:`text/html`
-* :mimetype:`application/xhtml+xml`
-
-For Atom feeds, the content type is taken from the type attribute, which
-defaults to :mimetype:`text/plain` if not specified.  For :abbr:`RSS (Rich Site
-Summary)` feeds, the content type is auto-determined by inspecting the content,
-and defaults to :mimetype:`text/html`.  Note that this may cause silent data
-loss if the value contains plain text with angle brackets.  There is nothing I
-can do about this problem; it is a limitation of :abbr:`RSS (Rich Site
-Summary)`.
-
-Future enhancement: some versions of :abbr:`RSS (Rich Site Summary)` clearly
-specify that certain values default to :mimetype:`text/plain`, and
-:program:`Universal Feed Parser` should respect this, but it doesn't yet.
-
-
-:py:attr:`entries[i].title_detail.language`
--------------------------------------------
-
-The language of the entry title.
-
-:py:attr:`~entries[i].title_detail.language` is supposed to be a language code,
-as specified by `RFC 3066`_, but publishers have been known to
-publish random values like "English" or "German".  :program:`Universal Feed
-Parser` does not do any parsing or normalization of language codes.
-
-.. _RFC 3066: http://www.ietf.org/rfc/rfc3066.txt
-
-:py:attr:`~entries[i].title_detail.language` may come from the element's
-xml:lang attribute, or it may inherit from a parent element's xml:lang, or the
-Content-Language :abbr:`HTTP (Hypertext Transfer Protocol)` header.  If the
-feed does not specify a language, :py:attr:`~entries[i].title_detail.language`
-will be ``None``, the :program:`Python` null value.
-
-
-:py:attr:`entries[i].title_detail.base`
----------------------------------------
-
-The original base :abbr:`URI (Uniform Resource Identifier)` for links within
-the entry title.
-
-:py:attr:`~entries[i].title_detail.base` is only useful in rare situations and
-can usually be ignored.  It is the original base :abbr:`URI (Uniform Resource
-Identifier)` for this value, as specified by the element's xml:base attribute,
-or a parent element's xml:base, or the appropriate :abbr:`HTTP (Hypertext
-Transfer Protocol)` header, or the :abbr:`URI (Uniform Resource Identifier)` of
-the feed.  (See :ref:`advanced.base` for more details.)  By the time you see
-it, :program:`Universal Feed Parser` has already resolved relative links in all
-values where it makes sense to do so.  *Clients should never need to manually
-resolve relative links.*
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:title
-* /atom03:feed/atom03:entry/atom03:title
-* /rss/channel/item/title
-* /rss/channel/item/dc:title
-* /rdf:RDF/rdf:item/rdf:title
-* /rdf:RDF/rdf:item/dc:title
-
-
-.. seealso::
-
-    * :ref:`reference.entry.title`

+ 0 - 41
Lib python/feedparser-5.2.1/docs/reference-entry-updated.rst

@@ -1,41 +0,0 @@
-.. _reference.entry.updated:
-
-:py:attr:`entries[i].updated`
-=============================
-
-The date this entry was last updated, as a string in the same format as it was
-published in the original feed).
-
-This element is :ref:`parsed as a date <advanced.date>` and stored in
-:ref:`reference.entry.updated_parsed`.
-
-
-.. note::
-
-    As of version 5.1.1, if this key doesn't exist but
-    :py:attr:`entries[i].published` does, the value of
-    :py:attr:`entries[i].published` will be returned.
-
-    In the past the RSS pubDate element was stored in `updated`, but this incorrect
-    behavior was reported in issue 310. However, developers may have come to rely
-    on this incorrect behavior -- as was reported in issue 328 -- so to help avoid
-    hurting their users' experience, this mapping from `updated` to `published` was
-    temporarily introduced to give developers time to update their software, and to
-    give users time to upgrade.
-
-    This mapping is temporary and will be removed in a future version of
-    feedparser.
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:entry/atom03:modified
-* /atom10:feed/atom10:entry/atom10:updated
-* /rdf:RDF/rdf:item/dc:date
-* /rdf:RDF/rdf:item/dcterms:modified
-* /rss/channel/item/dc:date
-* /rss/channel/item/dcterms:modified
-
-
-.. seealso::
-
-    * :ref:`reference.entry.updated_parsed`

+ 0 - 38
Lib python/feedparser-5.2.1/docs/reference-entry-updated_parsed.rst

@@ -1,38 +0,0 @@
-.. _reference.entry.updated_parsed:
-
-:py:attr:`entries[i].updated_parsed`
-====================================
-
-The date this entry was last updated, as a standard :program:`Python` 9-tuple.
-
-
-.. note::
-
-    As of version 5.1.1, if this key doesn't exist but
-    :py:attr:`entries[i].published_parsed` does, the value of
-    :py:attr:`entries[i].published_parsed` will be returned.
-
-    In the past the RSS pubDate element was stored in `updated`, but this incorrect
-    behavior was reported in issue 310. However, developers may have come to rely
-    on this incorrect behavior -- as was reported in issue 328 -- so to help avoid
-    hurting their users' experience, this mapping from `updated_parsed` to
-    `published_parsed` was temporarily introduced to give developers time to update
-    their software, and to give users time to upgrade.
-
-    This mapping is temporary and will be removed in a future version of
-    feedparser.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:entry/atom10:updated
-* /atom03:feed/atom03:entry/atom03:modified
-* /rss/channel/item/dc:date
-* /rss/channel/item/dcterms:modified
-* /rdf:RDF/rdf:item/dc:date
-* /rdf:RDF/rdf:item/dcterms:modified
-
-
-.. seealso::
-
-    * :ref:`reference.entry.updated`

+ 0 - 18
Lib python/feedparser-5.2.1/docs/reference-entry.rst

@@ -1,18 +0,0 @@
-:py:attr:`entries`
-==================
-
-A list of dictionaries.  Each dictionary contains data from a different entry.
-Entries are listed in the order in which they appear in the original feed.
-
-
-.. tip::
-
-    This element always exists, although it may be an empty list.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:entry
-* /atom10:feed/atom10:entry
-* /rdf:RDF/rdf:item
-* /rss/channel/item

+ 0 - 13
Lib python/feedparser-5.2.1/docs/reference-etag.rst

@@ -1,13 +0,0 @@
-:py:attr:`etag`
-===============
-
-The ETag of the feed, as specified in the :abbr:`HTTP (Hypertext Transfer Protocol)` headers.
-
-The purpose of :py:attr:`etag` is explained more fully in :ref:`http.etag`.
-
-.. tip::
-
-    :py:attr:`etag` will only be present if the feed was retrieved from a web server, and
-    only if the web server provided an ETag :abbr:`HTTP (Hypertext Transfer Protocol)`
-    header for the feed.  If the feed was parsed from a local file or from a string
-    in memory, :py:attr:`etag` will not be present.

+ 0 - 23
Lib python/feedparser-5.2.1/docs/reference-feed-author.rst

@@ -1,23 +0,0 @@
-.. _reference.feed.author:
-
-:py:attr:`feed.author`
-======================
-
-The author of this feed.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:author
-* /atom10:feed/atom10:author
-* /rdf:RDF/rdf:channel/dc:author
-* /rdf:RDF/rdf:channel/dc:creator
-* /rss/channel/dc:author
-* /rss/channel/dc:creator
-* /rss/channel/itunes:author
-* /rss/channel/managingEditor
-
-
-.. seealso::
-
-    * :ref:`reference.feed.author_detail`

+ 0 - 51
Lib python/feedparser-5.2.1/docs/reference-feed-author_detail.rst

@@ -1,51 +0,0 @@
-.. _reference.feed.author_detail:
-
-:py:attr:`feed.author_detail`
-=============================
-
-A dictionary with details about the feed author.
-
-
-.. _reference.feed.author_detail.name:
-
-:py:attr:`feed.author_detail.name`
-----------------------------------
-
-The name of the feed author.
-
-
-.. _reference.feed.author_detail.href:
-
-:py:attr:`feed.author_detail.href`
-----------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of the feed author.  This can be the
-author's home page, or a contact page with a webmail form.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.feed.author_detail.email:
-
-:py:attr:`feed.author_detail.email`
------------------------------------
-
-The email address of the feed author.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:author
-* /atom10:feed/atom10:author
-* /rdf:RDF/rdf:channel/dc:author
-* /rdf:RDF/rdf:channel/dc:creator
-* /rss/channel/dc:author
-* /rss/channel/dc:creator
-* /rss/channel/itunes:author
-* /rss/channel/managingEditor
-
-
-.. seealso::
-
-    * :ref:`reference.feed.author`

+ 0 - 65
Lib python/feedparser-5.2.1/docs/reference-feed-cloud.rst

@@ -1,65 +0,0 @@
-:py:attr:`feed.cloud`
-=====================
-
-No one really knows what a cloud is.  It is vaguely documented in `:abbr:`SOAP
-(Simple Object Access Protocol)` meets :abbr:`RSS (Rich Site Summary)`
-<http://www.thetwowayweb.com/soapmeetsrss>`_.
-
-
-.. _reference.feed.cloud.domain:
-
-:py:attr:`feed.cloud.domain`
-----------------------------
-
-The domain of the cloud.  Should be just the domain name, not including the
-http:// protocol.  All clouds are presumed to operate over :abbr:`HTTP
-(Hypertext Transfer Protocol)`.  The cloud specification does not support
-secure clouds over :abbr:`HTTPS`, nor can clouds operate over other protocols.
-
-
-.. _reference.feed.cloud.port:
-
-:py:attr:`feed.cloud.port`
---------------------------
-
-The port of the cloud.  Should be an integer, but :program:`Universal Feed
-Parser` currently returns it as a string.
-
-
-.. _reference.feed.cloud.path:
-
-:py:attr:`feed.cloud.path`
---------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` path of the cloud.
-
-
-.. _reference.feed.cloud.registerProcedure:
-
-:py:attr:`feed.cloud.registerProcedure`
----------------------------------------
-
-The name of the procedure to call on the cloud.
-
-
-.. _reference.feed.cloud.protocol:
-
-:py:attr:`feed.cloud.protocol`
-------------------------------
-
-The protocol of the cloud.  Documentation differs on what the acceptable values
-are.  Acceptable values definitely include xml-rpc and soap, although only in
-lowercase, despite both being acronyms.
-
-There is no way for a publisher to specify the version number of the protocol
-to use.  soap refers to :abbr:`SOAP (Simple Object Access Protocol)` 1.1; the
-cloud interface does not support :abbr:`SOAP (Simple Object Access Protocol)`
-1.0 or 1.2.
-
-post or http-post might also be acceptable values; nobody really knows for
-sure.
-
-
-.. rubric:: Comes from
-
-* /rss/channel/cloud

+ 0 - 35
Lib python/feedparser-5.2.1/docs/reference-feed-contributors.rst

@@ -1,35 +0,0 @@
-:py:attr:`feed.contributors`
-============================
-
-A list of contributors (secondary authors) to this feed.
-
-
-:py:attr:`feed.contributors[i].name`
-------------------------------------
-
-The name of this contributor.
-
-
-.. _reference.feed.contributors.href:
-
-:py:attr:`feed.contributors[i].href`
-------------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of this contributor.  This can be
-the contributor's home page, or a contact page with a webmail form.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`feed.contributors[i].email`
--------------------------------------
-
-The email address of this contributor.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:contributor
-* /atom10:feed/atom10:contributor
-* /rss/channel/dc:contributor

+ 0 - 20
Lib python/feedparser-5.2.1/docs/reference-feed-docs.rst

@@ -1,20 +0,0 @@
-.. _reference.feed.docs:
-
-:py:attr:`feed.docs`
-====================
-
-A :abbr:`URL (Uniform Resource Locator)` pointing to the specification which
-this feed conforms to.
-
-This element is rare.  The reasoning was that in 25 years, someone will stumble
-on an :abbr:`RSS (Rich Site Summary)` feed and not know what it is, so we
-should waste everyone's bandwidth with useless links until then.  Most
-publishers skip it, and all clients ignore it.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. rubric:: Comes from
-
-* /rss/channel/docs

+ 0 - 10
Lib python/feedparser-5.2.1/docs/reference-feed-errorreportsto.rst

@@ -1,10 +0,0 @@
-.. _reference.feed.errorreportsto:
-
-:py:attr:`feed.errorreportsto`
-==============================
-
-An email address for reporting errors in the feed itself.
-
-.. rubric:: Comes from
-
-* /rdf:RDF/admin:errorReportsTo/@rdf:resource

+ 0 - 19
Lib python/feedparser-5.2.1/docs/reference-feed-generator.rst

@@ -1,19 +0,0 @@
-.. _reference.feed.generator:
-
-:py:attr:`feed.generator`
-=========================
-
-A human-readable name of the application used to generate the feed.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:generator
-* /atom10:feed/atom10:generator
-* /rdf:RDF/rdf:channel/admin:generatorAgent/@rdf:resource
-* /rss/channel/generator
-
-
-.. seealso::
-
-    * :ref:`reference.feed.generator_detail`

+ 0 - 48
Lib python/feedparser-5.2.1/docs/reference-feed-generator_detail.rst

@@ -1,48 +0,0 @@
-.. _reference.feed.generator_detail:
-
-:py:attr:`feed.generator_detail`
-================================
-
-A dictionary with details about the feed generator.
-
-
-
-:py:attr:`feed.generator_detail.name`
--------------------------------------
-
-Same as :ref:`reference.feed.generator`.
-
-
-.. _reference.feed.generator_detail.href:
-
-:py:attr:`feed.generator_detail.href`
--------------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of the application used to generate
-the feed.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.feed.generator_detail.version:
-
-:py:attr:`feed.generator_detail.version`
-----------------------------------------
-
-The version number of the application used to generate the feed.  There is no
-required format for this, but most applications use a MAJOR.MINOR version
-number.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:generator
-* /atom10:feed/atom10:generator
-* /rdf:RDF/rdf:channel/admin:generatorAgent/@rdf:resource
-* /rss/channel/generator
-
-
-.. seealso::
-
-    * :ref:`reference.feed.generator`

+ 0 - 12
Lib python/feedparser-5.2.1/docs/reference-feed-icon.rst

@@ -1,12 +0,0 @@
-:py:attr:`feed.icon`
-====================
-
-A URL to a small icon representing the feed.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:icon

+ 0 - 15
Lib python/feedparser-5.2.1/docs/reference-feed-id.rst

@@ -1,15 +0,0 @@
-.. _reference.feed.id:
-
-:py:attr:`feed.id`
-==================
-
-A globally unique identifier for this feed.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:id
-* /atom10:feed/atom10:id

+ 0 - 107
Lib python/feedparser-5.2.1/docs/reference-feed-image.rst

@@ -1,107 +0,0 @@
-:py:attr:`feed.image`
-=====================
-
-A dictionary with details about the feed image.  A feed image can be a logo,
-banner, or a picture of the author.
-
-
-.. _reference.feed.image.title:
-
-:py:attr:`feed.image.title`
-----------------===========
-
-The alternate text of the feed image, which would go in the alt attribute if
-you rendered the feed image as an :abbr:`HTML (HyperText Markup Language)` img
-element.
-
-
-.. _reference.feed.image.href:
-
-:py:attr:`feed.image.href`
---------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of the feed image itself, which
-would go in the src attribute if you rendered the feed image as an :abbr:`HTML
-(HyperText Markup Language)` img element.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.feed.image.link:
-
-:py:attr:`feed.image.link`
---------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` which the feed image would point to.
-If you rendered the feed image as an :abbr:`HTML (HyperText Markup Language)`
-img element, you would wrap it in an a element and put this in the href
-attribute.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.feed.image.width:
-
-:py:attr:`feed.image.width`
----------------------------
-
-The width of the feed image, which would go in the width attribute if you
-rendered the feed image as an :abbr:`HTML (HyperText Markup Language)` img
-element.
-
-
-.. _reference.feed.image.height:
-
-:py:attr:`feed.image.height`
-----------------------------
-
-The height of the feed image, which would go in the height attribute if you
-rendered the feed image as an :abbr:`HTML (HyperText Markup Language)` img
-element.
-
-
-:py:attr:`feed.image.description`
----------------------------------
-
-A short description of the feed image, which would go in the title attribute if
-you rendered the feed image as an :abbr:`HTML (HyperText Markup Language)` img
-element.  This element is rare; it was available in Netscape :abbr:`RSS (Rich
-Site Summary)` 0.91 but was dropped from Userland :abbr:`RSS (Rich Site
-Summary)` 0.91.
-
-
-.. rubric:: Annotated example
-
-This is a feed image:
-::
-
-
-    <image>
-    <title>Feed logo</title>
-    <url>http://example.org/logo.png</url>
-    <link>http://example.org/</link>
-    <width>80</width>
-    <height>15</height>
-    <description>Visit my home page</description>
-    </image>
-
-
-This feed image could be rendered in :abbr:`HTML (HyperText Markup Language)` as this:
-::
-
-
-    <a href="http://example.org/">
-    <img src="http://example.org/logo.png"
-    width="80"
-    height="15"
-    alt="Feed logo"
-    title="Visit my home page">
-    </a>
-
-
-.. rubric:: Comes from
-
-* /rdf:RDF/rdf:image
-* /rss/channel/image

+ 0 - 94
Lib python/feedparser-5.2.1/docs/reference-feed-info-detail.rst

@@ -1,94 +0,0 @@
-.. _reference.feed.info_detail:
-
-:py:attr:`feed.info_detail`
-===========================
-
-A dictionary with details about the feed info.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:info
-
-
-.. seealso::
-
-    * :ref:`reference.feed.info`
-
-
-.. _reference.feed.info_detail.value:
-
-:py:attr:`feed.info_detail.value`
----------------------------------
-
-Same as :ref:`reference.feed.info`.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, it is :ref:`sanitized
-<advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, certain (X)HTML elements within this
-value may contain relative :abbr:`URI (Uniform Resource Identifier)`s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. _reference.feed.info_detail.type:
-
-:py:attr:`feed.info_detail.type`
---------------------------------
-
-The content type of the feed info.
-
-Most likely values for :py:attr:`~feed.info_detail.type`:
-
-* :mimetype:`text/plain`
-* :mimetype:`text/html`
-* :mimetype:`application/xhtml+xml`
-
-For Atom feeds, the content type is taken from the type attribute, which
-defaults to :mimetype:`text/plain` if not specified.  For :abbr:`RSS (Rich Site
-Summary)` feeds, the content type is auto-determined by inspecting the content,
-and defaults to :mimetype:`text/html`.  Note that this may cause silent data
-loss if the value contains plain text with angle brackets.  There is nothing I
-can do about this problem; it is a limitation of :abbr:`RSS (Rich Site
-Summary)`.
-
-Future enhancement: some versions of :abbr:`RSS (Rich Site Summary)` clearly
-specify that certain values default to :mimetype:`text/plain`, and
-:program:`Universal Feed Parser` should respect this, but it doesn't yet.
-
-
-:py:attr:`feed.info_detail.language`
-------------------------------------
-
-The language of the feed info.
-
-:py:attr:`~feed.info_detail.language` is supposed to be a language code, as
-specified by `:abbr:`RFC (Request For Comments)` 3066
-<http://www.ietf.org/rfc/rfc3066.txt>`_, but publishers have been known to
-publish random values like "English" or "German".  :program:`Universal Feed
-Parser` does not do any parsing or normalization of language codes.
-
-:py:attr:`~feed.info_detail.language` may come from the element's xml:lang
-attribute, or it may inherit from a parent element's xml:lang, or the
-Content-Language :abbr:`HTTP (Hypertext Transfer Protocol)` header.  If the
-feed does not specify a language, :py:attr:`~feed.info_detail.language` will be
-``None``, the :program:`Python` null value.
-
-
-:py:attr:`feed.info_detail.base`
---------------------------------
-
-The original base :abbr:`URI (Uniform Resource Identifier)` for links within
-the feed copyright.
-
-:py:attr:`~feed.info_detail.base` is only useful in rare situations and can
-usually be ignored.  It is the original base :abbr:`URI (Uniform Resource
-Identifier)` for this value, as specified by the element's xml:base attribute,
-or a parent element's xml:base, or the appropriate :abbr:`HTTP (Hypertext
-Transfer Protocol)` header, or the :abbr:`URI (Uniform Resource Identifier)` of
-the feed.  (See :ref:`advanced.base` for more details.)  By the time you see
-it, :program:`Universal Feed Parser` has already resolved relative links in all
-values where it makes sense to do so.  *Clients should never need to manually
-resolve relative links.*

+ 0 - 28
Lib python/feedparser-5.2.1/docs/reference-feed-info.rst

@@ -1,28 +0,0 @@
-.. _reference.feed.info:
-
-:py:attr:`feed.info`
-====================
-
-Free-form human-readable description of the feed format itself.  Intended for
-people who view the feed in a browser, to explain what they just clicked on.
-This element is generally ignored by feed readers.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, it is :ref:`sanitized
-<advanced.sanitization>` by default.
-
-If this contains :abbr:`HTML (HyperText Markup Language)` or :abbr:`XHTML
-(Extensible HyperText Markup Language)`, certain (X)HTML elements within this
-value may contain relative :abbr:`URI (Uniform Resource Identifier)`s.  If so,
-they are :ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:info
-* /rss/channel/feedburner:browserFriendly
-
-
-.. seealso::
-
-    * :ref:`reference.feed.info_detail`

+ 0 - 15
Lib python/feedparser-5.2.1/docs/reference-feed-language.rst

@@ -1,15 +0,0 @@
-.. _reference.feed.language:
-
-:py:attr:`feed.language`
-========================
-
-The primary language of the feed.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/@xml:lang
-* /atom10:feed/@xml:lang
-* /rdf:RDF/rdf:channel/dc:language
-* /rss/channel/dc:language
-* /rss/channel/language

+ 0 - 17
Lib python/feedparser-5.2.1/docs/reference-feed-license.rst

@@ -1,17 +0,0 @@
-.. _reference.feed.license:
-
-:py:attr:`feed.license`
-=======================
-
-A :abbr:`URL (Uniform Resource Locator)` of the license under which this feed
-is distributed.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. rubric:: Comes from
-
-* /atom10:feed/atom10:link[@rel="license"]/@href
-* /rdf:RDF/cc:license/@rdf:resource
-* /rss/channel/creativeCommons:license

+ 0 - 29
Lib python/feedparser-5.2.1/docs/reference-feed-link.rst

@@ -1,29 +0,0 @@
-.. _reference.feed.link:
-
-:py:attr:`feed.link`
-====================
-
-The :abbr:`URL (Uniform Resource Locator)` of the :abbr:`HTML (HyperText Markup
-Language)` page associated with this feed.
-
-For site feeds, this is probably the home page of the site.  For category
-feeds, this is probably the category's archive page.  For search feeds, this is
-probably the web page that displays the search results for the given search
-parameters.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:link[@rel="alternate"]/@href
-* /atom10:feed/atom10:link[@rel="alternate"]/@href
-* /atom10:feed/atom10:link[not(@rel)]/@href
-* /rdf:RDF/rdf:channel/rdf:link
-* /rss/channel/link
-
-
-.. seealso::
-
-    * :ref:`reference.feed.links`

+ 0 - 65
Lib python/feedparser-5.2.1/docs/reference-feed-links.rst

@@ -1,65 +0,0 @@
-.. _reference.feed.links:
-
-:py:attr:`feed.links`
-=====================
-
-A list of dictionaries with details on the links associated with the feed.
-Each link has a rel (relationship), type (content type), and href (the
-:abbr:`URL (Uniform Resource Locator)` that the link points to).  Some links
-may also have a title.
-
-
-.. _reference.feed.links.rel:
-
-:py:attr:`feed.links[i].rel`
-----------------------------
-
-The relationship of this feed link.
-
-Atom 1.0 defines five standard link relationships and describes the process for
-registering others.  Here are the five standard rel values:
-
-- `alternate`
-- `enclosure`
-- `related`
-- `self`
-- `via`
-
-
-.. _reference.feed.links.type:
-
-:py:attr:`feed.links[i].type`
------------------------------
-
-The content type of the page that this feed link points to.
-
-
-.. _reference.feed.links.href:
-
-:py:attr:`feed.links[i].href`
------------------------------
-
-The :abbr:`URL (Uniform Resource Locator)` of the page that this feed link
-points to.
-
-If this is a relative :abbr:`URI (Uniform Resource Identifier)`, it is
-:ref:`resolved according to a set of rules <advanced.base>`.
-
-
-:py:attr:`feed.links[i].title`
-------------------------------
-
-The title of this feed link.
-
-
-.. rubric:: Comes from
-
-* /atom03:feed/atom03:link
-* /atom10:feed/atom10:link
-* /rdf:RDF/rdf:channel/rdf:link
-* /rss/channel/link
-
-
-.. seealso::
-
-    * :ref:`reference.feed.link`

Неке датотеке нису приказане због велике количине промена